From fe05e7319f4b1ba194ab37d619b9ceb4b1af0413 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 16 Mar 2022 23:20:06 +1000 Subject: [PATCH 01/57] resolve binary build for v046 update --- app/app.go | 103 +- app/params/amino.go | 2 +- app/test_helpers.go | 8 +- cmd/liquidstakingd/cmd/genaccounts.go | 10 +- cmd/liquidstakingd/cmd/root.go | 27 +- cmd/liquidstakingd/cmd/testnet.go | 257 +- cmd/liquidstakingd/cmd/testnet_test.go | 17 +- cmd/liquidstakingd/main.go | 6 +- go.mod | 18 +- go.sum | 1075 ++- x/distribution/client/cli/tx.go | 2 +- x/distribution/client/proposal_handler.go | 3 +- x/distribution/client/rest/grpc_query_test.go | 464 -- x/distribution/client/rest/query.go | 309 - x/distribution/client/rest/rest.go | 57 - x/distribution/client/rest/tx.go | 222 - x/distribution/client/rest/utils.go | 20 - x/distribution/handler.go | 2 +- x/distribution/keeper/keeper.go | 5 +- x/distribution/keeper/migrations.go | 2 +- x/distribution/legacy/v034/types.go | 100 - x/distribution/legacy/v036/types.go | 136 - x/distribution/legacy/v038/types.go | 59 - x/distribution/legacy/v040/keys.go | 196 - x/distribution/legacy/v040/migrate.go | 108 - x/distribution/legacy/v043/helpers.go | 71 - x/distribution/legacy/v043/store.go | 23 - x/distribution/legacy/v043/store_test.go | 99 - x/distribution/module.go | 7 +- x/distribution/types/codec.go | 2 +- x/distribution/types/proposal.go | 2 +- x/slashing/client/rest/grpc_query_test.go | 134 - x/slashing/client/rest/query.go | 111 - x/slashing/client/rest/rest.go | 15 - x/slashing/client/rest/tx.go | 63 - x/slashing/keeper/keeper.go | 5 +- x/slashing/keeper/migrations.go | 2 +- x/slashing/legacy/v039/types.go | 79 - x/slashing/legacy/v040/keys.go | 69 - x/slashing/legacy/v040/migrate.go | 64 - x/slashing/legacy/v040/migrate_test.go | 140 - x/slashing/legacy/v043/store.go | 20 - x/slashing/legacy/v043/store_test.go | 68 - x/slashing/module.go | 5 +- x/slashing/simulation/operations.go | 2 +- x/staking/client/rest/grpc_query_test.go | 828 --- x/staking/client/rest/query.go | 400 - x/staking/client/rest/rest.go | 14 - x/staking/client/rest/rest_test.go | 63 - x/staking/client/rest/tx.go | 149 - x/staking/client/rest/utils.go | 144 - x/staking/keeper/keeper.go | 5 +- x/staking/keeper/migrations.go | 12 +- x/staking/legacy/v034/types.go | 190 - x/staking/legacy/v036/types.go | 137 - x/staking/legacy/v038/types.go | 163 - x/staking/legacy/v040/genesis.pb.go | 944 --- x/staking/legacy/v040/keys.go | 330 - x/staking/legacy/v040/migrate.go | 140 - x/staking/legacy/v040/migrate_test.go | 96 - x/staking/legacy/v040/staking.pb.go | 6525 ----------------- x/staking/legacy/v040/types.go | 201 - x/staking/legacy/v043/store.go | 78 - x/staking/legacy/v043/store_test.go | 138 - x/staking/module.go | 2 - 65 files changed, 1244 insertions(+), 13504 deletions(-) delete mode 100644 x/distribution/client/rest/grpc_query_test.go delete mode 100644 x/distribution/client/rest/query.go delete mode 100644 x/distribution/client/rest/rest.go delete mode 100644 x/distribution/client/rest/tx.go delete mode 100644 x/distribution/client/rest/utils.go delete mode 100644 x/distribution/legacy/v034/types.go delete mode 100644 x/distribution/legacy/v036/types.go delete mode 100644 x/distribution/legacy/v038/types.go delete mode 100644 x/distribution/legacy/v040/keys.go delete mode 100644 x/distribution/legacy/v040/migrate.go delete mode 100644 x/distribution/legacy/v043/helpers.go delete mode 100644 x/distribution/legacy/v043/store.go delete mode 100644 x/distribution/legacy/v043/store_test.go delete mode 100644 x/slashing/client/rest/grpc_query_test.go delete mode 100644 x/slashing/client/rest/query.go delete mode 100644 x/slashing/client/rest/rest.go delete mode 100644 x/slashing/client/rest/tx.go delete mode 100644 x/slashing/legacy/v039/types.go delete mode 100644 x/slashing/legacy/v040/keys.go delete mode 100644 x/slashing/legacy/v040/migrate.go delete mode 100644 x/slashing/legacy/v040/migrate_test.go delete mode 100644 x/slashing/legacy/v043/store.go delete mode 100644 x/slashing/legacy/v043/store_test.go delete mode 100644 x/staking/client/rest/grpc_query_test.go delete mode 100644 x/staking/client/rest/query.go delete mode 100644 x/staking/client/rest/rest.go delete mode 100644 x/staking/client/rest/rest_test.go delete mode 100644 x/staking/client/rest/tx.go delete mode 100644 x/staking/client/rest/utils.go delete mode 100644 x/staking/legacy/v034/types.go delete mode 100644 x/staking/legacy/v036/types.go delete mode 100644 x/staking/legacy/v038/types.go delete mode 100644 x/staking/legacy/v040/genesis.pb.go delete mode 100644 x/staking/legacy/v040/keys.go delete mode 100644 x/staking/legacy/v040/migrate.go delete mode 100644 x/staking/legacy/v040/migrate_test.go delete mode 100644 x/staking/legacy/v040/staking.pb.go delete mode 100644 x/staking/legacy/v040/types.go delete mode 100644 x/staking/legacy/v043/store.go delete mode 100644 x/staking/legacy/v043/store_test.go diff --git a/app/app.go b/app/app.go index ca28aa29..3dcbb493 100644 --- a/app/app.go +++ b/app/app.go @@ -18,21 +18,21 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" - "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" + storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + authmiddleware "github.com/cosmos/cosmos-sdk/x/auth/middleware" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -59,8 +59,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/gov" + govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + govv1beta2 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta2" "github.com/cosmos/cosmos-sdk/x/mint" mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" @@ -106,7 +109,7 @@ var ( mint.AppModuleBasic{}, distr.AppModuleBasic{}, gov.NewAppModuleBasic( - paramsclient.ProposalHandler, distrclient.ProposalHandler, upgradeclient.ProposalHandler, upgradeclient.CancelProposalHandler, + []govclient.ProposalHandler{paramsclient.ProposalHandler, distrclient.ProposalHandler, upgradeclient.LegacyProposalHandler, upgradeclient.LegacyCancelProposalHandler}, ), params.AppModuleBasic{}, crisis.AppModuleBasic{}, @@ -142,13 +145,15 @@ type SimApp struct { legacyAmino *codec.LegacyAmino appCodec codec.Codec interfaceRegistry types.InterfaceRegistry + msgSvcRouter *authmiddleware.MsgServiceRouter + legacyRouter sdk.Router invCheckPeriod uint // keys to access the substores - keys map[string]*sdk.KVStoreKey - tkeys map[string]*sdk.TransientStoreKey - memKeys map[string]*sdk.MemoryStoreKey + keys map[string]*storetypes.KVStoreKey + tkeys map[string]*storetypes.TransientStoreKey + memKeys map[string]*storetypes.MemoryStoreKey // keepers AccountKeeper authkeeper.AccountKeeper @@ -192,11 +197,11 @@ func NewSimApp( appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *SimApp { - appCodec := encodingConfig.Marshaler + appCodec := encodingConfig.Codec legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry - bApp := baseapp.NewBaseApp(appName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) + bApp := baseapp.NewBaseApp(appName, logger, db, baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetVersion(version.Version) bApp.SetInterfaceRegistry(interfaceRegistry) @@ -227,7 +232,7 @@ func NewSimApp( app.ParamsKeeper = initParamsKeeper(appCodec, legacyAmino, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) // set the BaseApp's parameter store - bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable())) + bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramstypes.ConsensusParamsKeyTable())) app.CapabilityKeeper = capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey]) // Applications that wish to enforce statically created ScopedKeepers should call `Seal` after creating @@ -236,7 +241,7 @@ func NewSimApp( // add keepers app.AccountKeeper = authkeeper.NewAccountKeeper( - appCodec, keys[authtypes.StoreKey], app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, + appCodec, keys[authtypes.StoreKey], app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, sdk.Bech32MainPrefix, ) app.BankKeeper = bankkeeper.NewBaseKeeper( appCodec, keys[banktypes.StoreKey], app.AccountKeeper, app.GetSubspace(banktypes.ModuleName), app.ModuleAccountAddrs(), @@ -260,7 +265,7 @@ func NewSimApp( ) app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) - app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp) + app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, authtypes.NewModuleAddress(govtypes.ModuleName).String()) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks @@ -268,17 +273,22 @@ func NewSimApp( stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()), ) - app.AuthzKeeper = authzkeeper.NewKeeper(keys[authzkeeper.StoreKey], appCodec, app.BaseApp.MsgServiceRouter()) + app.AuthzKeeper = authzkeeper.NewKeeper(keys[authzkeeper.StoreKey], appCodec, app.msgSvcRouter, app.AccountKeeper) // register the proposal types - govRouter := govtypes.NewRouter() - govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). + govRouter := govv1beta1.NewRouter() + govRouter.AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)) + govConfig := govtypes.DefaultConfig() + /* + Example of setting gov params: + govConfig.MaxMetadataLen = 10000 + */ govKeeper := govkeeper.NewKeeper( appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, govRouter, + &stakingKeeper, govRouter, app.msgSvcRouter, govConfig, ) app.GovKeeper = *govKeeper.SetHooks( @@ -314,7 +324,7 @@ func NewSimApp( crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil), slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), @@ -348,8 +358,8 @@ func NewSimApp( ) app.mm.RegisterInvariants(&app.CrisisKeeper) - app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) - app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) + app.mm.RegisterRoutes(app.legacyRouter, app.QueryRouter(), encodingConfig.Amino) + app.configurator = module.NewConfigurator(app.appCodec, app.msgSvcRouter, app.GRPCQueryRouter()) app.mm.RegisterServices(app.configurator) // add test gRPC service for testing gRPC queries in isolation @@ -365,7 +375,7 @@ func NewSimApp( capability.NewAppModule(appCodec, *app.CapabilityKeeper), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper), + mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), @@ -385,22 +395,8 @@ func NewSimApp( app.SetInitChainer(app.InitChainer) app.SetBeginBlocker(app.BeginBlocker) - anteHandler, err := ante.NewAnteHandler( - ante.HandlerOptions{ - AccountKeeper: app.AccountKeeper, - BankKeeper: app.BankKeeper, - SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), - FeegrantKeeper: app.FeeGrantKeeper, - SigGasConsumer: ante.DefaultSigVerificationGasConsumer, - }, - ) - - if err != nil { - panic(err) - } - - app.SetAnteHandler(anteHandler) app.SetEndBlocker(app.EndBlocker) + app.setTxHandler(encodingConfig.TxConfig, cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))) if loadLatest { if err := app.LoadLatestVersion(); err != nil { @@ -411,6 +407,30 @@ func NewSimApp( return app } +func (app *SimApp) setTxHandler(txConfig client.TxConfig, indexEventsStr []string) { + indexEvents := map[string]struct{}{} + for _, e := range indexEventsStr { + indexEvents[e] = struct{}{} + } + txHandler, err := authmiddleware.NewDefaultTxHandler(authmiddleware.TxHandlerOptions{ + Debug: app.Trace(), + IndexEvents: indexEvents, + LegacyRouter: app.legacyRouter, + MsgServiceRouter: app.msgSvcRouter, + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + FeegrantKeeper: app.FeeGrantKeeper, + SignModeHandler: txConfig.SignModeHandler(), + SigGasConsumer: authmiddleware.DefaultSigVerificationGasConsumer, + TxDecoder: txConfig.TxDecoder(), + }) + if err != nil { + panic(err) + } + + app.SetTxHandler(txHandler) +} + // Name returns the name of the App func (app *SimApp) Name() string { return app.BaseApp.Name() } @@ -473,21 +493,21 @@ func (app *SimApp) InterfaceRegistry() types.InterfaceRegistry { // GetKey returns the KVStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *SimApp) GetKey(storeKey string) *sdk.KVStoreKey { +func (app *SimApp) GetKey(storeKey string) *storetypes.KVStoreKey { return app.keys[storeKey] } // GetTKey returns the TransientStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. -func (app *SimApp) GetTKey(storeKey string) *sdk.TransientStoreKey { +func (app *SimApp) GetTKey(storeKey string) *storetypes.TransientStoreKey { return app.tkeys[storeKey] } // GetMemKey returns the MemStoreKey for the provided mem key. // // NOTE: This is solely used for testing purposes. -func (app *SimApp) GetMemKey(storeKey string) *sdk.MemoryStoreKey { +func (app *SimApp) GetMemKey(storeKey string) *storetypes.MemoryStoreKey { return app.memKeys[storeKey] } @@ -508,9 +528,6 @@ func (app *SimApp) SimulationManager() *module.SimulationManager { // API server. func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { clientCtx := apiSvr.ClientCtx - rpc.RegisterRoutes(clientCtx, apiSvr.Router) - // Register legacy tx routes. - authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) // Register new tx routes from grpc-gateway. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register new tendermint queries routes from grpc-gateway. @@ -557,7 +574,7 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { +func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) paramsKeeper.Subspace(authtypes.ModuleName) @@ -566,7 +583,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(minttypes.ModuleName) paramsKeeper.Subspace(distrtypes.ModuleName) paramsKeeper.Subspace(slashingtypes.ModuleName) - paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1beta2.ParamKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) return paramsKeeper diff --git a/app/params/amino.go b/app/params/amino.go index 440c29f8..cdf86d0e 100644 --- a/app/params/amino.go +++ b/app/params/amino.go @@ -5,7 +5,7 @@ package params import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx" + "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" ) // MakeTestEncodingConfig creates an EncodingConfig for an amino based test configuration. diff --git a/app/test_helpers.go b/app/test_helpers.go index b5ac1d66..8f94f4b6 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -35,8 +35,8 @@ import ( // DefaultConsensusParams defines the default Tendermint consensus params used in // SimApp testing. -var DefaultConsensusParams = &abci.ConsensusParams{ - Block: &abci.BlockParams{ +var DefaultConsensusParams = &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ MaxBytes: 200000, MaxGas: 2000000, }, @@ -57,7 +57,7 @@ func setup(withGenesis bool, invCheckPeriod uint) (*SimApp, GenesisState) { encCdc := MakeTestEncodingConfig() app := NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, invCheckPeriod, encCdc, EmptyAppOptions{}) if withGenesis { - return app, NewDefaultGenesisState(encCdc.Marshaler) + return app, NewDefaultGenesisState(encCdc.Codec) } return app, GenesisState{} } @@ -354,7 +354,7 @@ func SignCheckDeliver( // Simulate a sending a transaction and committing a block app.BeginBlock(abci.RequestBeginBlock{Header: header}) - gInfo, res, err := app.Deliver(txCfg.TxEncoder(), tx) + gInfo, res, err := app.SimDeliver(txCfg.TxEncoder(), tx) if expPass { require.NoError(t, err) diff --git a/cmd/liquidstakingd/cmd/genaccounts.go b/cmd/liquidstakingd/cmd/genaccounts.go index 9e586943..d54f3cd9 100644 --- a/cmd/liquidstakingd/cmd/genaccounts.go +++ b/cmd/liquidstakingd/cmd/genaccounts.go @@ -52,7 +52,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) if keyringBackend != "" && clientCtx.Keyring == nil { var err error - kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf) + kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf, clientCtx.Codec) if err != nil { return err } @@ -60,11 +60,15 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa kr = clientCtx.Keyring } - info, err := kr.Key(args[0]) + k, err := kr.Key(args[0]) if err != nil { return fmt.Errorf("failed to get address from Keyring: %w", err) } - addr = info.GetAddress() + + addr, err = k.GetAddress() + if err != nil { + return err + } } coins, err := sdk.ParseCoinsNormalized(args[1]) diff --git a/cmd/liquidstakingd/cmd/root.go b/cmd/liquidstakingd/cmd/root.go index 616fc215..d1425eb8 100644 --- a/cmd/liquidstakingd/cmd/root.go +++ b/cmd/liquidstakingd/cmd/root.go @@ -6,9 +6,9 @@ import ( "os" "path/filepath" - serverconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/spf13/cast" "github.com/spf13/cobra" + tmcfg "github.com/tendermint/tendermint/config" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" @@ -21,7 +21,9 @@ import ( "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/snapshots" "github.com/cosmos/cosmos-sdk/store" @@ -31,7 +33,6 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - simapp "github.com/iqlusioninc/liquidity-staking-module/app" ) // NewRootCmd creates a new root command for simd. It is called once in the @@ -39,7 +40,7 @@ import ( func NewRootCmd() (*cobra.Command, params.EncodingConfig) { encodingConfig := simapp.MakeTestEncodingConfig() initClientCtx := client.Context{}. - WithCodec(encodingConfig.Marshaler). + WithCodec(encodingConfig.Codec). WithInterfaceRegistry(encodingConfig.InterfaceRegistry). WithTxConfig(encodingConfig.TxConfig). WithLegacyAmino(encodingConfig.Amino). @@ -71,8 +72,9 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { } customAppTemplate, customAppConfig := initAppConfig() + customTMConfig := initTendermintConfig() - return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig) + return server.InterceptConfigsPreRunHandler(cmd, customAppTemplate, customAppConfig, customTMConfig) }, } @@ -81,6 +83,18 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { return rootCmd, encodingConfig } +// initTendermintConfig helps to override default Tendermint Config values. +// return tmcfg.DefaultConfig if no custom configuration is required for the application. +func initTendermintConfig() *tmcfg.Config { + cfg := tmcfg.DefaultConfig() + + // these values put a higher strain on node memory + // cfg.P2P.MaxNumInboundPeers = 100 + // cfg.P2P.MaxNumOutboundPeers = 40 + + return cfg +} + // initAppConfig helps to override default appConfig template and configs. // return "", nil if no custom configuration is required for the application. func initAppConfig() (string, interface{}) { @@ -149,7 +163,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { genutilcli.ValidateGenesisCmd(simapp.ModuleBasics), AddGenesisAccountCmd(simapp.DefaultNodeHome), tmcli.NewCompletionCmd(rootCmd, true), - testnetCmd(simapp.ModuleBasics, banktypes.GenesisBalancesIterator{}), + NewTestnetCmd(simapp.ModuleBasics, banktypes.GenesisBalancesIterator{}), debug.Cmd(), config.Cmd(), ) @@ -166,7 +180,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { ) // add rosetta - rootCmd.AddCommand(server.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Marshaler)) + rootCmd.AddCommand(server.RosettaCommand(encodingConfig.InterfaceRegistry, encodingConfig.Codec)) } func addModuleInitFlags(startCmd *cobra.Command) { @@ -215,6 +229,7 @@ func txCommand() *cobra.Command { authcmd.GetBroadcastCommand(), authcmd.GetEncodeCommand(), authcmd.GetDecodeCommand(), + authcmd.GetAuxToFeeCommand(), ) simapp.ModuleBasics.AddTxCommands(cmd) diff --git a/cmd/liquidstakingd/cmd/testnet.go b/cmd/liquidstakingd/cmd/testnet.go index 071d9364..d8c61fe1 100644 --- a/cmd/liquidstakingd/cmd/testnet.go +++ b/cmd/liquidstakingd/cmd/testnet.go @@ -6,6 +6,7 @@ import ( "bufio" "encoding/json" "fmt" + "io/ioutil" "net" "os" "path/filepath" @@ -14,8 +15,8 @@ import ( tmconfig "github.com/tendermint/tendermint/config" tmos "github.com/tendermint/tendermint/libs/os" tmrand "github.com/tendermint/tendermint/libs/rand" + tmtime "github.com/tendermint/tendermint/libs/time" "github.com/tendermint/tendermint/types" - tmtime "github.com/tendermint/tendermint/types/time" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -25,6 +26,8 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/server" srvconfig "github.com/cosmos/cosmos-sdk/server/config" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -40,20 +43,75 @@ var ( flagOutputDir = "output-dir" flagNodeDaemonHome = "node-daemon-home" flagStartingIPAddress = "starting-ip-address" + flagEnableLogging = "enable-logging" + flagGRPCAddress = "grpc.address" + flagRPCAddress = "rpc.address" + flagAPIAddress = "api.address" + flagPrintMnemonic = "print-mnemonic" ) +type initArgs struct { + algo string + chainID string + keyringBackend string + minGasPrices string + nodeDaemonHome string + nodeDirPrefix string + numValidators int + outputDir string + startingIPAddress string +} + +type startArgs struct { + algo string + apiAddress string + chainID string + enableLogging bool + grpcAddress string + minGasPrices string + numValidators int + outputDir string + printMnemonic bool + rpcAddress string +} + +func addTestnetFlagsToCmd(cmd *cobra.Command) { + cmd.Flags().Int(flagNumValidators, 4, "Number of validators to initialize the testnet with") + cmd.Flags().StringP(flagOutputDir, "o", "./.testnets", "Directory to store initialization data for the testnet") + cmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") + cmd.Flags().String(server.FlagMinGasPrices, fmt.Sprintf("0.000006%s", sdk.DefaultBondDenom), "Minimum gas prices to accept for transactions; All fees in a tx must meet this minimum (e.g. 0.01photino,0.001stake)") + cmd.Flags().String(flags.FlagKeyAlgorithm, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for") +} + +// NewTestnetCmd creates a root testnet command with subcommands to run an in-process testnet or initialize +// validator configuration files for running a multi-validator testnet in a separate process +func NewTestnetCmd(mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator) *cobra.Command { + testnetCmd := &cobra.Command{ + Use: "testnet", + Short: "subcommands for starting or configuring local testnets", + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + testnetCmd.AddCommand(testnetStartCmd()) + testnetCmd.AddCommand(testnetInitFilesCmd(mbm, genBalIterator)) + + return testnetCmd +} + // get cmd to initialize all files for tendermint testnet and application -func testnetCmd(mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator) *cobra.Command { +func testnetInitFilesCmd(mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator) *cobra.Command { cmd := &cobra.Command{ - Use: "testnet", - Short: "Initialize files for a simapp testnet", - Long: `testnet will create "v" number of directories and populate each with -necessary files (private validator, genesis, config, etc.). - + Use: "init-files", + Short: "Initialize config directories & files for a multi-validator testnet running locally via separate processes (e.g. Docker Compose or similar)", + Long: `init-files will setup "v" number of directories and populate each with +necessary files (private validator, genesis, config, etc.) for running "v" validator nodes. +Booting up a network with these validator folders is intended to be used with Docker Compose, +or a similar setup where each node has a manually configurable IP address. Note, strict routability for addresses is turned off in the config file. - Example: - simd testnet --v 4 --output-dir ./output --starting-ip-address 192.168.10.2 + simd testnet init-files --v 4 --output-dir ./.testnets --starting-ip-address 192.168.10.2 `, RunE: func(cmd *cobra.Command, _ []string) error { clientCtx, err := client.GetClientQueryContext(cmd) @@ -64,70 +122,94 @@ Example: serverCtx := server.GetServerContextFromCmd(cmd) config := serverCtx.Config - outputDir, _ := cmd.Flags().GetString(flagOutputDir) - keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) - chainID, _ := cmd.Flags().GetString(flags.FlagChainID) - minGasPrices, _ := cmd.Flags().GetString(server.FlagMinGasPrices) - nodeDirPrefix, _ := cmd.Flags().GetString(flagNodeDirPrefix) - nodeDaemonHome, _ := cmd.Flags().GetString(flagNodeDaemonHome) - startingIPAddress, _ := cmd.Flags().GetString(flagStartingIPAddress) - numValidators, _ := cmd.Flags().GetInt(flagNumValidators) - algo, _ := cmd.Flags().GetString(flags.FlagKeyAlgorithm) - - return InitTestnet( - clientCtx, cmd, config, mbm, genBalIterator, outputDir, chainID, minGasPrices, - nodeDirPrefix, nodeDaemonHome, startingIPAddress, keyringBackend, algo, numValidators, - ) + args := initArgs{} + args.outputDir, _ = cmd.Flags().GetString(flagOutputDir) + args.keyringBackend, _ = cmd.Flags().GetString(flags.FlagKeyringBackend) + args.chainID, _ = cmd.Flags().GetString(flags.FlagChainID) + args.minGasPrices, _ = cmd.Flags().GetString(server.FlagMinGasPrices) + args.nodeDirPrefix, _ = cmd.Flags().GetString(flagNodeDirPrefix) + args.nodeDaemonHome, _ = cmd.Flags().GetString(flagNodeDaemonHome) + args.startingIPAddress, _ = cmd.Flags().GetString(flagStartingIPAddress) + args.numValidators, _ = cmd.Flags().GetInt(flagNumValidators) + args.algo, _ = cmd.Flags().GetString(flags.FlagKeyAlgorithm) + + return initTestnetFiles(clientCtx, cmd, config, mbm, genBalIterator, args) + }, } - cmd.Flags().Int(flagNumValidators, 4, "Number of validators to initialize the testnet with") - cmd.Flags().StringP(flagOutputDir, "o", "./mytestnet", "Directory to store initialization data for the testnet") + addTestnetFlagsToCmd(cmd) cmd.Flags().String(flagNodeDirPrefix, "node", "Prefix the directory name for each node with (node results in node0, node1, ...)") cmd.Flags().String(flagNodeDaemonHome, "simd", "Home directory of the node's daemon configuration") cmd.Flags().String(flagStartingIPAddress, "192.168.0.1", "Starting IP address (192.168.0.1 results in persistent peers list ID0@192.168.0.1:46656, ID1@192.168.0.2:46656, ...)") - cmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") - cmd.Flags().String(server.FlagMinGasPrices, fmt.Sprintf("0.000006%s", sdk.DefaultBondDenom), "Minimum gas prices to accept for transactions; All fees in a tx must meet this minimum (e.g. 0.01photino,0.001stake)") cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)") - cmd.Flags().String(flags.FlagKeyAlgorithm, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for") return cmd } +// get cmd to start multi validator in-process testnet +func testnetStartCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "start", + Short: "Launch an in-process multi-validator testnet", + Long: `testnet will launch an in-process multi-validator testnet, +and generate "v" directories, populated with necessary validator configuration files +(private validator, genesis, config, etc.). +Example: + simd testnet --v 4 --output-dir ./.testnets + `, + RunE: func(cmd *cobra.Command, _ []string) error { + + args := startArgs{} + args.outputDir, _ = cmd.Flags().GetString(flagOutputDir) + args.chainID, _ = cmd.Flags().GetString(flags.FlagChainID) + args.minGasPrices, _ = cmd.Flags().GetString(server.FlagMinGasPrices) + args.numValidators, _ = cmd.Flags().GetInt(flagNumValidators) + args.algo, _ = cmd.Flags().GetString(flags.FlagKeyAlgorithm) + args.enableLogging, _ = cmd.Flags().GetBool(flagEnableLogging) + args.rpcAddress, _ = cmd.Flags().GetString(flagRPCAddress) + args.apiAddress, _ = cmd.Flags().GetString(flagAPIAddress) + args.grpcAddress, _ = cmd.Flags().GetString(flagGRPCAddress) + args.printMnemonic, _ = cmd.Flags().GetBool(flagPrintMnemonic) + + return startTestnet(cmd, args) + + }, + } + + addTestnetFlagsToCmd(cmd) + cmd.Flags().Bool(flagEnableLogging, false, "Enable INFO logging of tendermint validator nodes") + cmd.Flags().String(flagRPCAddress, "tcp://0.0.0.0:26657", "the RPC address to listen on") + cmd.Flags().String(flagAPIAddress, "tcp://0.0.0.0:1317", "the address to listen on for REST API") + cmd.Flags().String(flagGRPCAddress, "0.0.0.0:9090", "the gRPC server address to listen on") + cmd.Flags().Bool(flagPrintMnemonic, true, "print mnemonic of first validator to stdout for manual testing") + return cmd +} + const nodeDirPerm = 0755 -// Initialize the testnet -func InitTestnet( +// initTestnetFiles initializes testnet files for a testnet to be run in a separate process +func initTestnetFiles( clientCtx client.Context, cmd *cobra.Command, nodeConfig *tmconfig.Config, mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator, - outputDir, - chainID, - minGasPrices, - nodeDirPrefix, - nodeDaemonHome, - startingIPAddress, - keyringBackend, - algoStr string, - numValidators int, + args initArgs, ) error { - - if chainID == "" { - chainID = "chain-" + tmrand.NewRand().Str(6) + if args.chainID == "" { + args.chainID = "chain-" + tmrand.Str(6) } - - nodeIDs := make([]string, numValidators) - valPubKeys := make([]cryptotypes.PubKey, numValidators) + nodeIDs := make([]string, args.numValidators) + valPubKeys := make([]cryptotypes.PubKey, args.numValidators) simappConfig := srvconfig.DefaultConfig() - simappConfig.MinGasPrices = minGasPrices + simappConfig.MinGasPrices = args.minGasPrices simappConfig.API.Enable = true simappConfig.Telemetry.Enabled = true simappConfig.Telemetry.PrometheusRetentionTime = 60 simappConfig.Telemetry.EnableHostnameLabel = false - simappConfig.Telemetry.GlobalLabels = [][]string{{"chain_id", chainID}} + simappConfig.Telemetry.GlobalLabels = [][]string{{"chain_id", args.chainID}} var ( genAccounts []authtypes.GenesisAccount @@ -137,50 +219,50 @@ func InitTestnet( inBuf := bufio.NewReader(cmd.InOrStdin()) // generate private keys, node IDs, and initial transactions - for i := 0; i < numValidators; i++ { - nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i) - nodeDir := filepath.Join(outputDir, nodeDirName, nodeDaemonHome) - gentxsDir := filepath.Join(outputDir, "gentxs") + for i := 0; i < args.numValidators; i++ { + nodeDirName := fmt.Sprintf("%s%d", args.nodeDirPrefix, i) + nodeDir := filepath.Join(args.outputDir, nodeDirName, args.nodeDaemonHome) + gentxsDir := filepath.Join(args.outputDir, "gentxs") nodeConfig.SetRoot(nodeDir) + nodeConfig.Moniker = nodeDirName nodeConfig.RPC.ListenAddress = "tcp://0.0.0.0:26657" + nodeConfig.Mode = tmconfig.ModeValidator if err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm); err != nil { - _ = os.RemoveAll(outputDir) + _ = os.RemoveAll(args.outputDir) return err } - nodeConfig.Moniker = nodeDirName - - ip, err := getIP(i, startingIPAddress) + ip, err := getIP(i, args.startingIPAddress) if err != nil { - _ = os.RemoveAll(outputDir) + _ = os.RemoveAll(args.outputDir) return err } nodeIDs[i], valPubKeys[i], err = genutil.InitializeNodeValidatorFiles(nodeConfig) if err != nil { - _ = os.RemoveAll(outputDir) + _ = os.RemoveAll(args.outputDir) return err } memo := fmt.Sprintf("%s@%s:26656", nodeIDs[i], ip) genFiles = append(genFiles, nodeConfig.GenesisFile()) - kb, err := keyring.New(sdk.KeyringServiceName(), keyringBackend, nodeDir, inBuf) + kb, err := keyring.New(sdk.KeyringServiceName(), args.keyringBackend, nodeDir, inBuf, clientCtx.Codec) if err != nil { return err } keyringAlgos, _ := kb.SupportedAlgorithms() - algo, err := keyring.NewSigningAlgoFromString(algoStr, keyringAlgos) + algo, err := keyring.NewSigningAlgoFromString(args.algo, keyringAlgos) if err != nil { return err } - addr, secret, err := server.GenerateSaveCoinKey(kb, nodeDirName, true, algo) + addr, secret, err := testutil.GenerateSaveCoinKey(kb, nodeDirName, "", true, algo) if err != nil { - _ = os.RemoveAll(outputDir) + _ = os.RemoveAll(args.outputDir) return err } @@ -228,7 +310,7 @@ func InitTestnet( txFactory := tx.Factory{} txFactory = txFactory. - WithChainID(chainID). + WithChainID(args.chainID). WithMemo(memo). WithKeybase(kb). WithTxConfig(clientCtx.TxConfig) @@ -246,22 +328,22 @@ func InitTestnet( return err } - srvconfig.WriteConfigFile(filepath.Join(nodeDir, "config/app.toml"), simappConfig) + srvconfig.WriteConfigFile(filepath.Join(nodeDir, "config", "app.toml"), simappConfig) } - if err := initGenFiles(clientCtx, mbm, chainID, genAccounts, genBalances, genFiles, numValidators); err != nil { + if err := initGenFiles(clientCtx, mbm, args.chainID, genAccounts, genBalances, genFiles, args.numValidators); err != nil { return err } err := collectGenFiles( - clientCtx, nodeConfig, chainID, nodeIDs, valPubKeys, numValidators, - outputDir, nodeDirPrefix, nodeDaemonHome, genBalIterator, + clientCtx, nodeConfig, args.chainID, nodeIDs, valPubKeys, args.numValidators, + args.outputDir, args.nodeDirPrefix, args.nodeDaemonHome, genBalIterator, ) if err != nil { return err } - cmd.PrintErrf("Successfully initialized %d node directories\n", numValidators) + cmd.PrintErrf("Successfully initialized %d node directories\n", args.numValidators) return nil } @@ -394,10 +476,49 @@ func writeFile(name string, dir string, contents []byte) error { return err } - err = tmos.WriteFile(file, contents, 0644) + err = ioutil.WriteFile(file, contents, 0644) // nolint: gosec + if err != nil { + return err + } + + return nil +} + +// startTestnet starts an in-process testnet +func startTestnet(cmd *cobra.Command, args startArgs) error { + networkConfig := network.DefaultConfig() + + // Default networkConfig.ChainID is random, and we should only override it if chainID provided + // is non-empty + if args.chainID != "" { + networkConfig.ChainID = args.chainID + } + networkConfig.SigningAlgo = args.algo + networkConfig.MinGasPrices = args.minGasPrices + networkConfig.NumValidators = args.numValidators + networkConfig.EnableTMLogging = args.enableLogging + networkConfig.RPCAddress = args.rpcAddress + networkConfig.APIAddress = args.apiAddress + networkConfig.GRPCAddress = args.grpcAddress + networkConfig.PrintMnemonic = args.printMnemonic + networkLogger := network.NewCLILogger(cmd) + + baseDir := fmt.Sprintf("%s/%s", args.outputDir, networkConfig.ChainID) + if _, err := os.Stat(baseDir); !os.IsNotExist(err) { + return fmt.Errorf( + "testnests directory already exists for chain-id '%s': %s, please remove or select a new --chain-id", + networkConfig.ChainID, baseDir) + } + + testnet, err := network.New(networkLogger, baseDir, networkConfig) if err != nil { return err } + testnet.WaitForHeight(1) + cmd.Println("press the Enter Key to terminate") + fmt.Scanln() // wait for Enter Key + testnet.Cleanup() + return nil } diff --git a/cmd/liquidstakingd/cmd/testnet_test.go b/cmd/liquidstakingd/cmd/testnet_test.go index d7f692a0..09134383 100644 --- a/cmd/liquidstakingd/cmd/testnet_test.go +++ b/cmd/liquidstakingd/cmd/testnet_test.go @@ -5,16 +5,17 @@ import ( "fmt" "testing" + "github.com/spf13/viper" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/libs/log" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/simapp" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - simapp "github.com/iqlusioninc/liquidity-staking-module/app" - "github.com/spf13/viper" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/log" ) func Test_TestnetCmd(t *testing.T) { @@ -24,19 +25,19 @@ func Test_TestnetCmd(t *testing.T) { cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) - err = genutiltest.ExecInitCmd(simapp.ModuleBasics, home, encodingConfig.Marshaler) + err = genutiltest.ExecInitCmd(simapp.ModuleBasics, home, encodingConfig.Codec) require.NoError(t, err) serverCtx := server.NewContext(viper.New(), cfg, logger) clientCtx := client.Context{}. - WithCodec(encodingConfig.Marshaler). + WithCodec(encodingConfig.Codec). WithHomeDir(home). WithTxConfig(encodingConfig.TxConfig) ctx := context.Background() ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) - cmd := testnetCmd(simapp.ModuleBasics, banktypes.GenesisBalancesIterator{}) + cmd := testnetInitFilesCmd(simapp.ModuleBasics, banktypes.GenesisBalancesIterator{}) cmd.SetArgs([]string{fmt.Sprintf("--%s=test", flags.FlagKeyringBackend), fmt.Sprintf("--output-dir=%s", home)}) err = cmd.ExecuteContext(ctx) require.NoError(t, err) @@ -45,6 +46,6 @@ func Test_TestnetCmd(t *testing.T) { appState, _, err := genutiltypes.GenesisStateFromGenFile(genFile) require.NoError(t, err) - bankGenState := banktypes.GetGenesisStateFromAppState(encodingConfig.Marshaler, appState) + bankGenState := banktypes.GetGenesisStateFromAppState(encodingConfig.Codec, appState) require.NotEmpty(t, bankGenState.Supply.String()) } diff --git a/cmd/liquidstakingd/main.go b/cmd/liquidstakingd/main.go index dca3fadd..6ac86d18 100644 --- a/cmd/liquidstakingd/main.go +++ b/cmd/liquidstakingd/main.go @@ -5,14 +5,14 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - simapp "github.com/iqlusioninc/liquidity-staking-module/app" - "github.com/iqlusioninc/liquidity-staking-module/cmd/liquidstakingd/cmd" + "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/simapp/simd/cmd" ) func main() { rootCmd, _ := cmd.NewRootCmd() - if err := svrcmd.Execute(rootCmd, simapp.DefaultNodeHome); err != nil { + if err := svrcmd.Execute(rootCmd, "", simapp.DefaultNodeHome); err != nil { switch e := err.(type) { case server.ErrorCode: os.Exit(e.Code) diff --git a/go.mod b/go.mod index c6a7d184..6c549e2a 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/iqlusioninc/liquidity-staking-module go 1.16 require ( - github.com/armon/go-metrics v0.3.9 - github.com/cosmos/cosmos-sdk v0.44.3 + github.com/armon/go-metrics v0.3.10 + github.com/cosmos/cosmos-sdk v0.46.0-alpha3 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 @@ -13,20 +13,18 @@ require ( github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 github.com/spf13/cast v1.4.1 - github.com/spf13/cobra v1.2.1 + github.com/spf13/cobra v1.3.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.8.1 + github.com/spf13/viper v1.10.1 github.com/stretchr/testify v1.7.0 - github.com/tendermint/tendermint v0.34.14 - github.com/tendermint/tm-db v0.6.4 - google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c - google.golang.org/grpc v1.40.0 + github.com/tendermint/tendermint v0.35.2 + github.com/tendermint/tm-db v0.6.6 + google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 + google.golang.org/grpc v1.44.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 ) -replace google.golang.org/grpc => google.golang.org/grpc v1.33.2 - replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 replace github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 diff --git a/go.sum b/go.sum index 3115dcc6..52dcb7f9 100644 --- a/go.sum +++ b/go.sum @@ -1,44 +1,73 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0 h1:6RRlFMv1omScs6iq2hfE3IvgE+l6RfJPampq8UZc5TU= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= +github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= @@ -56,65 +85,114 @@ github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.1.0/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.52 h1:PLSK6pwn8mYdaoaCZEMsXBpBotr4HHn9abU0yMQt0NI= github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= +github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= +github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= -github.com/adlio/schema v1.1.13 h1:LeNMVg5Z1FX+Qgz8tJUijBLRdcpbFUElz+d1489On98= github.com/adlio/schema v1.1.13/go.mod h1:L5Z7tw+7lRK1Fnpi/LT/ooCP1elkXn0krMWBQHUhEDE= +github.com/adlio/schema v1.2.3 h1:GfKThfEsjS9cCz7gaF8zdXv4cpTdUqdljkKGDTbJjys= +github.com/adlio/schema v1.2.3/go.mod h1:nD7ZWmMMbwU12Pqwg+qL0rTvHBrBXfNz+5UQxTfy38M= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/ashanbrown/makezero v1.1.0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= +github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= +github.com/blizzy78/varnamelen v0.6.0/go.mod h1:zy2Eic4qWqjrxa60jG34cfL0VXcSwzUrIx68eJPb4Q8= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/breml/bidichk v0.2.2/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= +github.com/breml/errchkjson v0.2.3/go.mod h1:jZEATw/jF69cL1iy7//Yih8yp/mXp2CBoBr9GJwCAsY= github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= @@ -135,37 +213,61 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coinbase/rosetta-sdk-go v0.6.10 h1:rgHD/nHjxLh0lMEdfGDqpTtlvtSBwULqrrZ2qPdNaCM= -github.com/coinbase/rosetta-sdk-go v0.6.10/go.mod h1:J/JFMsfcePrjJZkwQFLh+hJErkAmdm9Iyy3D5Y0LfXo= -github.com/confio/ics23/go v0.0.0-20200817220745-f173e6211efb/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= -github.com/confio/ics23/go v0.6.3/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= -github.com/confio/ics23/go v0.6.6 h1:pkOy18YxxJ/r0XFDCnrl4Bjv6h4LkBSpLS6F38mrKL8= +github.com/coinbase/rosetta-sdk-go v0.7.2 h1:uCNrASIyt7rV9bA3gzPG3JDlxVP5v/zLgi01GWngncM= +github.com/coinbase/rosetta-sdk-go v0.7.2/go.mod h1:wk9dvjZFSZiWSNkFuj3dMleTA1adLFotg5y71PhqKB4= github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= +github.com/confio/ics23/go v0.7.0 h1:00d2kukk7sPoHWL4zZBZwzxnpA2pec1NPdwbSokJ5w8= +github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= +github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.1 h1:/EeEo2EtN3umhbbgCveyjifoMYg0pS+nMMEemaYw634= +github.com/containerd/continuity v0.2.1/go.mod h1:wCYX+dRqZdImhGucXOqTQn05AhX6EUDaGEMUzTFFpLg= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -174,19 +276,28 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/cosmos-sdk v0.44.3 h1:F71n1jCqPi4F0wXg8AU4AUdUF8llw0x3D3o6aLt/j2A= -github.com/cosmos/cosmos-sdk v0.44.3/go.mod h1:bA3+VenaR/l/vDiYzaiwbWvRPWHMBX2jG0ygiFtiBp0= +github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= +github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= +github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= +github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= +github.com/cosmos/cosmos-sdk v0.46.0-alpha3 h1:HzMdLPOP5OvCg8HVGyPP1HdAq7LKTIW6iOOoT8qyfxM= +github.com/cosmos/cosmos-sdk v0.46.0-alpha3/go.mod h1:wz5yINqwETrxb6OXY6srEBUj6y8mG2oIsADgaWT5RFk= +github.com/cosmos/cosmos-sdk/api v0.1.0-alpha5 h1:UlK7NOHGlEbvbDTCM0cN7BJN6hhqeXZIuLv6KapFYTc= +github.com/cosmos/cosmos-sdk/api v0.1.0-alpha5/go.mod h1:gZu6sOu2vl4Fd7I+BjDSx2bxndwPgFLGfOegek3SQQo= +github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1 h1:6YvzjQtc+cDwCe9XwYPPa8zFCxNG79N7vmCjpK+vGOg= +github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1/go.mod h1:JUMM2MxF9wuwzRWZJjb8BjXsn1BmPmdBd3a75pIct4I= +github.com/cosmos/cosmos-sdk/errors v1.0.0-beta.2 h1:bBglNlra8ZHb4dmbEE8V85ihLA+DkriSm7tcx6x/JWo= +github.com/cosmos/cosmos-sdk/errors v1.0.0-beta.2/go.mod h1:Gi7pzVRnvZ1N16JAXpLADzng0ePoE7YeEHaULSFB2Ts= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/iavl v0.15.0-rc3.0.20201009144442-230e9bdf52cd/go.mod h1:3xOIaNNX19p0QrX0VqWa6voPRoJRGGYtny+DH8NEPvE= -github.com/cosmos/iavl v0.15.0-rc5/go.mod h1:WqoPL9yPTQ85QBMT45OOUzPxG/U/JcJoN7uMjgxke/I= -github.com/cosmos/iavl v0.15.3/go.mod h1:OLjQiAQ4fGD2KDZooyJG9yz+p2ao2IAYSbke8mVvSA4= -github.com/cosmos/iavl v0.17.1 h1:b/Cl8h1PRMvsu24+TYNlKchIu7W6tmxIBGe6E9u2Ybw= -github.com/cosmos/iavl v0.17.1/go.mod h1:7aisPZK8yCpQdy3PMvKeO+bhq1NwDjUwjzxwwROUxFk= +github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= +github.com/cosmos/iavl v0.17.3 h1:s2N819a2olOmiauVa0WAhoIJq9EhSXE9HDBAoR9k+8Y= +github.com/cosmos/iavl v0.17.3/go.mod h1:prJoErZFABYZGDHka1R6Oay4z9PrNeFFiMKHDAMOi4w= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76/go.mod h1:0mkLWIoZuQ7uBoospo5Q9zIpqq6rYCPJDSUdeCJvPM8= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= @@ -196,92 +307,136 @@ github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/daixiang0/gci v0.3.1-0.20220208004058-76d765e3ab48/go.mod h1:jaASoJmv/ykO9dAAPy31iJnreV19248qKDdVWf3QgC4= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v2 v2.2007.1/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b h1:HBah4D48ypg3J7Np4N+HY/ZR76fx3HEUGxDU6Uk39oQ= github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/enigmampc/btcutil v1.0.3-0.20200723161021-e2fb6adb2a25 h1:2vLKys4RBU4pn2T/hjXMbvwTr1Cvy5THHrQkbeY9HRk= -github.com/enigmampc/btcutil v1.0.3-0.20200723161021-e2fb6adb2a25/go.mod h1:hTr8+TLQmkUkgcuh3mcr5fjrT9c64ZzsBCdCEC6UppY= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= -github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= +github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fzipp/gocyclo v0.4.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-critic/go-critic v0.6.2/go.mod h1:td1s27kfmLpe5G/DPjlnFI7o1UCzePptwU7Az0V5iCM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -289,11 +444,26 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= @@ -303,14 +473,25 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= @@ -320,6 +501,7 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -341,11 +523,29 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3 h1:ur2rms48b3Ep1dxh7aUV2FZEQ8jEVO2F6ILKx8ofkAg= -github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.44.2/go.mod h1:KjBgkLvsTWDkhfu12iCrv0gwL1kON5KNhbyjQ6qN7Jo= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -356,15 +556,20 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -373,20 +578,37 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= @@ -396,87 +618,161 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.1/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.14.7/go.mod h1:oYZKL012gGh6LMyg/xA7Q2yq6j8bu0wa+9w14EEthWU= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.5.11 h1:wioTuNmaBU3IE9vdFtFMcmZWj0QzLc6DYaP6sNe5onY= +github.com/hashicorp/go-getter v1.5.11/go.mod h1:9i48BP6wpWweI/0/+FBjqLrp9S8XtwUGjiu0QkWHEaY= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= -github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/improbable-eng/grpc-web v0.14.1 h1:NrN4PY71A6tAz2sKDvC5JCauENWp0ykG8Oq1H3cpFvw= -github.com/improbable-eng/grpc-web v0.14.1/go.mod h1:zEjGHa8DAlkoOXmswrNvhUGEYQA9UI7DhrGeHR1DMGU= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= +github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jhump/protoreflect v1.9.0 h1:npqHz788dryJiR/l6K/RUQAyh2SwV91+d1dnh4RjO9w= -github.com/jhump/protoreflect v1.9.0/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.0 h1:1NQ4FpWMgn3by/n1X0fbeKEUxP1wBt7+Oitpv01HR10= +github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -484,183 +780,298 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/kkdai/bstream v1.0.0/go.mod h1:FDnDOHt5Yx4p3FaHcioFT0QjDOtgUpvjeZqAs+NVZZA= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= +github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.5.1/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= +github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/lazyledger/smt v0.2.1-0.20210709230900-03ea40719554/go.mod h1:9+Pb2/tg1PvEgW7aFx4bFhDE4bvbI03zuJ8kb7nJ9Jc= +github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= +github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.1.4/go.mod h1:ZZq2bmyssGh8MSPz3VVziqRNIMYTJXzP8MUKG90vZ9A= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mroth/weightedrand v0.4.1/go.mod h1:3p2SIcC8al1YMzGhAIoXD+r9olo/g/cdJgAD905gyNE= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/neilotoole/errgroup v0.1.5/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= +github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/nishanths/exhaustive v0.7.11/go.mod h1:gX+MP7DWMKJmNa1HfMozK+u04hQd3na9i0hyqf3/dOI= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oasisprotocol/curve25519-voi v0.0.0-20210609091139-0a56a4bca00b h1:MKwruh+HeCSKWphkxuzvRzU4QzDkg7yiPkDVV0cDFgI= +github.com/oasisprotocol/curve25519-voi v0.0.0-20210609091139-0a56a4bca00b/go.mod h1:TLJifjWF6eotcfzDjKZsDqWJ+73Uvj/N85MvVyrvynM= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.0.3 h1:1hbqejyQWCJBvtKAfdO0b1FmaEf2z/bxnjqbARass5k= +github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= -github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v0.0.0-20211125173453-6d6d39c5bb8b/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -669,8 +1080,9 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -682,14 +1094,16 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0 h1:3jqPBvKT4OHAbje2Ql7KeaaSicDBCxMYwEJU1zRJceE= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -698,10 +1112,22 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.15/go.mod h1:NhuWhnlVEM1gT1A4VJHYfy9MuYSxxwHgxWoPsn9llB4= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.12-0.20220101150716-969a394a9451/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.12/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.17/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/gogrep v0.0.0-20220103110004-ffaa07af02e3/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -711,28 +1137,46 @@ github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzy github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.23.0 h1:UskrK+saS9P9Y789yNNulYKdARjPZuS35B8gJF2x60g= -github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI916Qo= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= +github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= +github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/securego/gosec/v2 v2.9.6/go.mod h1:EESY9Ywxo/Zc5NyF/qIj6Cop+4PSWM0F0OfGD7FdIXc= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.22.1/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -741,29 +1185,32 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/sivchari/containedctx v1.0.1/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= +github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60= +github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -775,18 +1222,24 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= +github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= +github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= -github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -796,9 +1249,12 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= @@ -807,23 +1263,36 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RM github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/tendermint v0.34.0-rc4/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxmPUrT4hNuOQWX9XUwB4= -github.com/tendermint/tendermint v0.34.0-rc6/go.mod h1:ugzyZO5foutZImv0Iyx/gOFCX6mjJTgbLHTwi17VDVg= -github.com/tendermint/tendermint v0.34.0/go.mod h1:Aj3PIipBFSNO21r+Lq3TtzQ+uKESxkbA3yo/INM4QwQ= -github.com/tendermint/tendermint v0.34.13/go.mod h1:6RVVRBqwtKhA+H59APKumO+B7Nye4QXSFc6+TYxAxCI= -github.com/tendermint/tendermint v0.34.14 h1:GCXmlS8Bqd2Ix3TQCpwYLUNHe+Y+QyJsm5YE+S/FkPo= github.com/tendermint/tendermint v0.34.14/go.mod h1:FrwVm3TvsVicI9Z7FlucHV6Znfd5KBc/Lpp69cCwtk0= -github.com/tendermint/tm-db v0.6.2/go.mod h1:GYtQ67SUvATOcoY8/+x6ylk8Qo02BQyLrAs+yAcLvGI= -github.com/tendermint/tm-db v0.6.3/go.mod h1:lfA1dL9/Y/Y8wwyPp2NMLyn5P5Ptr/gvDFNWtrCWSf8= -github.com/tendermint/tm-db v0.6.4 h1:3N2jlnYQkXNQclQwd/eKV/NzlqPlfK21cpRRIx80XXQ= +github.com/tendermint/tendermint v0.35.2 h1:AhPjef5hptLQP5i8vs+8zMCu9mczX5fvBd2F575QXVk= +github.com/tendermint/tendermint v0.35.2/go.mod h1:0sVA1nOm5KKaxHar3aIzmMGKH9F/nBMn7T5ruQGZuHg= github.com/tendermint/tm-db v0.6.4/go.mod h1:dptYhIpJ2M5kUuenLr+Yyf3zQOv1SgBZcl8/BmWlMBw= -github.com/tidwall/gjson v1.6.7/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= -github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/sjson v1.1.4/go.mod h1:wXpKXu8CtDjKAZ+3DrKY5ROCorDFahq8l0tey/Lx1fg= +github.com/tendermint/tm-db v0.6.6 h1:EzhaOfR0bdKyATqcd5PNeyeq8r+V4bRPHBfyFdD9kGM= +github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.12.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.3/go.mod h1:5WdjKx3AQMvCJ4RG6/2UYT7dLrGvJUV1x4jdTAyGvZs= +github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= +github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd/v2 v2.5.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -832,31 +1301,65 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= +github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vektra/mockery/v2 v2.10.0/go.mod h1:m/WO2UzWzqgVX3nvqpRQq70I4Z7jbSCRhdmkgtp+Ab4= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vmihailenco/msgpack/v5 v5.1.4/go.mod h1:C5gboKD0TJPqWDTVTtrQNfRbiBwHZGo8UTqP/9/XvLI= -github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= +github.com/yeya24/promlinter v0.1.1-0.20210918184747-d757024714a1/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 h1:O9XLFXGkVswDFmH9LaYpqu+r/AAFWqr0DL6V00KEVFg= +github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +gitlab.com/bosi/decorder v0.2.1/go.mod h1:6C/nhLSbF6qZbYD8bRmISBwc6vcWdNsiIBkRvjJFrH0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -865,19 +1368,28 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -888,22 +1400,34 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -912,8 +1436,10 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -927,21 +1453,21 @@ golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -979,20 +1505,30 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f h1:w6wWR0H+nyVpbSAQbzVEIACVyr/h8l/BEkY6Sokc7Eg= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b h1:MWaHNqZy3KTpuTMAGvv+Kw+ylsEpmyJZizz1dqxnu28= +golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1004,20 +1540,28 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1027,6 +1571,7 @@ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1038,21 +1583,28 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1069,34 +1621,66 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b h1:3Dq0eVHn0uaQJmPO+/aYPI/fRMqdrVDbu7MQcku54gg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1104,17 +1688,30 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1123,21 +1720,28 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1147,37 +1751,75 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= @@ -1195,28 +1837,48 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= +google.golang.org/api v0.63.0 h1:n2bqqK895ygnBpdPDYetfy23K7fJ22wsrZKCyfuRkkA= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= @@ -1234,26 +1896,93 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201111145450-ac7456db90a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201119123407-9b1e624d6bc4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 h1:zzNejm+EgrbLfDZ6lu9Uud2IVvHySPl8vQzf04laR5Q= +google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1264,7 +1993,6 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= @@ -1274,15 +2002,20 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w= +gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1296,6 +2029,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -1304,6 +2038,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1311,10 +2046,22 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +honnef.co/go/tools v0.2.2/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= +mvdan.cc/gofumpt v0.2.1/go.mod h1:a/rvZPhsNaedOJBzqRD9omnwVwHZsBdJirXHa9Gh9Ig= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20211214103731-d0ef000c54e5/go.mod h1:b8RRCBm0eeiWR8cfN88xeq2G5SG3VKGO+5UPWi5FSOY= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/x/distribution/client/cli/tx.go b/x/distribution/client/cli/tx.go index a2b924ef..a740dac9 100644 --- a/x/distribution/client/cli/tx.go +++ b/x/distribution/client/cli/tx.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/tx" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) diff --git a/x/distribution/client/proposal_handler.go b/x/distribution/client/proposal_handler.go index 8a23ad8f..a261e59c 100644 --- a/x/distribution/client/proposal_handler.go +++ b/x/distribution/client/proposal_handler.go @@ -3,10 +3,9 @@ package client import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client/cli" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client/rest" ) // ProposalHandler is the community spend proposal handler. var ( - ProposalHandler = govclient.NewProposalHandler(cli.GetCmdSubmitProposal, rest.ProposalRESTHandler) + ProposalHandler = govclient.NewProposalHandler(cli.GetCmdSubmitProposal) ) diff --git a/x/distribution/client/rest/grpc_query_test.go b/x/distribution/client/rest/grpc_query_test.go deleted file mode 100644 index df361356..00000000 --- a/x/distribution/client/rest/grpc_query_test.go +++ /dev/null @@ -1,464 +0,0 @@ -package rest_test - -import ( - "fmt" - "testing" - - "github.com/gogo/protobuf/proto" - "github.com/stretchr/testify/suite" - - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/network" - sdk "github.com/cosmos/cosmos-sdk/types" - grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" - "github.com/cosmos/cosmos-sdk/types/query" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" -) - -type IntegrationTestSuite struct { - suite.Suite - - cfg network.Config - network *network.Network -} - -func (s *IntegrationTestSuite) SetupSuite() { - s.T().Log("setting up integration test suite") - - cfg := network.DefaultConfig() - cfg.NumValidators = 1 - - s.cfg = cfg - s.network = network.New(s.T(), cfg) - - _, err := s.network.WaitForHeight(1) - s.Require().NoError(err) -} - -func (s *IntegrationTestSuite) TestQueryParamsGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - respType proto.Message - expected proto.Message - }{ - { - "gRPC request params", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/params", baseURL), - &types.QueryParamsResponse{}, - &types.QueryParamsResponse{ - Params: types.DefaultParams(), - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := rest.GetRequest(tc.url) - s.Run(tc.name, func() { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected, tc.respType) - }) - } -} - -func (s *IntegrationTestSuite) TestQueryOutstandingRewardsGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - rewards, err := sdk.ParseDecCoins("19.6stake") - s.Require().NoError(err) - - testCases := []struct { - name string - url string - headers map[string]string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "gRPC request params with wrong validator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/outstanding_rewards", baseURL, "wrongAddress"), - map[string]string{}, - true, - &types.QueryValidatorOutstandingRewardsResponse{}, - &types.QueryValidatorOutstandingRewardsResponse{}, - }, - { - "gRPC request params valid address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/outstanding_rewards", baseURL, val.ValAddress.String()), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "2", - }, - false, - &types.QueryValidatorOutstandingRewardsResponse{}, - &types.QueryValidatorOutstandingRewardsResponse{ - Rewards: types.ValidatorOutstandingRewards{ - Rewards: rewards, - }, - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) - s.Run(tc.name, func() { - if tc.expErr { - s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - } else { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryValidatorCommissionGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - commission, err := sdk.ParseDecCoins("9.8stake") - s.Require().NoError(err) - - testCases := []struct { - name string - url string - headers map[string]string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "gRPC request params with wrong validator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/commission", baseURL, "wrongAddress"), - map[string]string{}, - true, - &types.QueryValidatorCommissionResponse{}, - &types.QueryValidatorCommissionResponse{}, - }, - { - "gRPC request params valid address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/commission", baseURL, val.ValAddress.String()), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "2", - }, - false, - &types.QueryValidatorCommissionResponse{}, - &types.QueryValidatorCommissionResponse{ - Commission: types.ValidatorAccumulatedCommission{ - Commission: commission, - }, - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) - s.Run(tc.name, func() { - if tc.expErr { - s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - } else { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQuerySlashesGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "invalid validator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/slashes", baseURL, ""), - true, - &types.QueryValidatorSlashesResponse{}, - nil, - }, - { - "invalid start height", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/slashes?starting_height=%s&ending_height=%s", baseURL, val.ValAddress.String(), "-1", "3"), - true, - &types.QueryValidatorSlashesResponse{}, - nil, - }, - { - "invalid start height", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/slashes?starting_height=%s&ending_height=%s", baseURL, val.ValAddress.String(), "1", "-3"), - true, - &types.QueryValidatorSlashesResponse{}, - nil, - }, - { - "valid request get slashes", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/slashes?starting_height=%s&ending_height=%s", baseURL, val.ValAddress.String(), "1", "3"), - false, - &types.QueryValidatorSlashesResponse{}, - &types.QueryValidatorSlashesResponse{ - Pagination: &query.PageResponse{}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := rest.GetRequest(tc.url) - - s.Run(tc.name, func() { - if tc.expErr { - s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - } else { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryDelegatorRewardsGRPC() { - val := s.network.Validators[0] - baseUrl := val.APIAddress - - rewards, err := sdk.ParseDecCoins("9.8stake") - s.Require().NoError(err) - - testCases := []struct { - name string - url string - headers map[string]string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "wrong delegator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/rewards", baseUrl, "wrongDelegatorAddress"), - map[string]string{}, - true, - &types.QueryDelegationTotalRewardsResponse{}, - nil, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/rewards", baseUrl, val.Address.String()), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "2", - }, - false, - &types.QueryDelegationTotalRewardsResponse{}, - &types.QueryDelegationTotalRewardsResponse{ - Rewards: []types.DelegationDelegatorReward{ - types.NewDelegationDelegatorReward(val.ValAddress, rewards), - }, - Total: rewards, - }, - }, - { - "wrong validator address(specific validator rewards)", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/rewards/%s", baseUrl, val.Address.String(), "wrongValAddress"), - map[string]string{}, - true, - &types.QueryDelegationTotalRewardsResponse{}, - nil, - }, - { - "valid request(specific validator rewards)", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/rewards/%s", baseUrl, val.Address.String(), val.ValAddress.String()), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "2", - }, - false, - &types.QueryDelegationRewardsResponse{}, - &types.QueryDelegationRewardsResponse{ - Rewards: rewards, - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) - - s.Run(tc.name, func() { - if tc.expErr { - s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - } else { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryDelegatorValidatorsGRPC() { - val := s.network.Validators[0] - baseUrl := val.APIAddress - - testCases := []struct { - name string - url string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "empty delegator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/validators", baseUrl, ""), - true, - &types.QueryDelegatorValidatorsResponse{}, - nil, - }, - { - "wrong delegator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/validators", baseUrl, "wrongDelegatorAddress"), - true, - &types.QueryDelegatorValidatorsResponse{}, - nil, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/validators", baseUrl, val.Address.String()), - false, - &types.QueryDelegatorValidatorsResponse{}, - &types.QueryDelegatorValidatorsResponse{ - Validators: []string{val.ValAddress.String()}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := rest.GetRequest(tc.url) - - s.Run(tc.name, func() { - if tc.expErr { - s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - } else { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryWithdrawAddressGRPC() { - val := s.network.Validators[0] - baseUrl := val.APIAddress - - testCases := []struct { - name string - url string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "empty delegator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/withdraw_address", baseUrl, ""), - true, - &types.QueryDelegatorWithdrawAddressResponse{}, - nil, - }, - { - "wrong delegator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/withdraw_address", baseUrl, "wrongDelegatorAddress"), - true, - &types.QueryDelegatorWithdrawAddressResponse{}, - nil, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/withdraw_address", baseUrl, val.Address.String()), - false, - &types.QueryDelegatorWithdrawAddressResponse{}, - &types.QueryDelegatorWithdrawAddressResponse{ - WithdrawAddress: val.Address.String(), - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := rest.GetRequest(tc.url) - - s.Run(tc.name, func() { - if tc.expErr { - s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - } else { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryValidatorCommunityPoolGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - communityPool, err := sdk.ParseDecCoins("0.4stake") - s.Require().NoError(err) - - testCases := []struct { - name string - url string - headers map[string]string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "gRPC request params with wrong validator address", - fmt.Sprintf("%s/cosmos/distribution/v1beta1/community_pool", baseURL), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "2", - }, - false, - &types.QueryCommunityPoolResponse{}, - &types.QueryCommunityPoolResponse{ - Pool: communityPool, - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) - - s.Run(tc.name, func() { - if tc.expErr { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func TestIntegrationTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} diff --git a/x/distribution/client/rest/query.go b/x/distribution/client/rest/query.go deleted file mode 100644 index 825f001f..00000000 --- a/x/distribution/client/rest/query.go +++ /dev/null @@ -1,309 +0,0 @@ -package rest - -import ( - "fmt" - "net/http" - - "github.com/gorilla/mux" - - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client/common" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" - - "github.com/cosmos/cosmos-sdk/client" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" -) - -func registerQueryRoutes(clientCtx client.Context, r *mux.Router) { - // Get the total rewards balance from all delegations - r.HandleFunc( - "/distribution/delegators/{delegatorAddr}/rewards", - delegatorRewardsHandlerFn(clientCtx), - ).Methods("GET") - - // Query a delegation reward - r.HandleFunc( - "/distribution/delegators/{delegatorAddr}/rewards/{validatorAddr}", - delegationRewardsHandlerFn(clientCtx), - ).Methods("GET") - - // Get the rewards withdrawal address - r.HandleFunc( - "/distribution/delegators/{delegatorAddr}/withdraw_address", - delegatorWithdrawalAddrHandlerFn(clientCtx), - ).Methods("GET") - - // Validator distribution information - r.HandleFunc( - "/distribution/validators/{validatorAddr}", - validatorInfoHandlerFn(clientCtx), - ).Methods("GET") - - // Commission and self-delegation rewards of a single a validator - r.HandleFunc( - "/distribution/validators/{validatorAddr}/rewards", - validatorRewardsHandlerFn(clientCtx), - ).Methods("GET") - - // Outstanding rewards of a single validator - r.HandleFunc( - "/distribution/validators/{validatorAddr}/outstanding_rewards", - outstandingRewardsHandlerFn(clientCtx), - ).Methods("GET") - - // Get the current distribution parameter values - r.HandleFunc( - "/distribution/parameters", - paramsHandlerFn(clientCtx), - ).Methods("GET") - - // Get the amount held in the community pool - r.HandleFunc( - "/distribution/community_pool", - communityPoolHandler(clientCtx), - ).Methods("GET") - -} - -// HTTP request handler to query the total rewards balance from all delegations -func delegatorRewardsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - delegatorAddr, ok := checkDelegatorAddressVar(w, r) - if !ok { - return - } - - params := types.NewQueryDelegatorParams(delegatorAddr) - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal params: %s", err)) - return - } - - route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegatorTotalRewards) - res, height, err := clientCtx.QueryWithData(route, bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -// HTTP request handler to query a delegation rewards -func delegationRewardsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - delAddr := mux.Vars(r)["delegatorAddr"] - valAddr := mux.Vars(r)["validatorAddr"] - - // query for rewards from a particular delegation - res, height, ok := checkResponseQueryDelegationRewards(w, clientCtx, delAddr, valAddr) - if !ok { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -// HTTP request handler to query a delegation rewards -func delegatorWithdrawalAddrHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - delegatorAddr, ok := checkDelegatorAddressVar(w, r) - if !ok { - return - } - - clientCtx, ok = rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - bz := clientCtx.LegacyAmino.MustMarshalJSON(types.NewQueryDelegatorWithdrawAddrParams(delegatorAddr)) - res, height, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/withdraw_addr", types.QuerierRoute), bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -// ValidatorDistInfo defines the properties of -// validator distribution information response. -type ValidatorDistInfo struct { - OperatorAddress sdk.AccAddress `json:"operator_address" yaml:"operator_address"` - SelfBondRewards sdk.DecCoins `json:"self_bond_rewards" yaml:"self_bond_rewards"` - ValidatorCommission types.ValidatorAccumulatedCommission `json:"val_commission" yaml:"val_commission"` -} - -// NewValidatorDistInfo creates a new instance of ValidatorDistInfo. -func NewValidatorDistInfo(operatorAddr sdk.AccAddress, rewards sdk.DecCoins, - commission types.ValidatorAccumulatedCommission) ValidatorDistInfo { - return ValidatorDistInfo{ - OperatorAddress: operatorAddr, - SelfBondRewards: rewards, - ValidatorCommission: commission, - } -} - -// HTTP request handler to query validator's distribution information -func validatorInfoHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - valAddr, ok := checkValidatorAddressVar(w, r) - if !ok { - return - } - - clientCtx, ok = rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - // query commission - bz, err := common.QueryValidatorCommission(clientCtx, valAddr) - if rest.CheckInternalServerError(w, err) { - return - } - - var commission types.ValidatorAccumulatedCommission - if rest.CheckInternalServerError(w, clientCtx.LegacyAmino.UnmarshalJSON(bz, &commission)) { - return - } - - // self bond rewards - delAddr := sdk.AccAddress(valAddr) - bz, height, ok := checkResponseQueryDelegationRewards(w, clientCtx, delAddr.String(), valAddr.String()) - if !ok { - return - } - - var rewards sdk.DecCoins - if rest.CheckInternalServerError(w, clientCtx.LegacyAmino.UnmarshalJSON(bz, &rewards)) { - return - } - - bz, err = clientCtx.LegacyAmino.MarshalJSON(NewValidatorDistInfo(delAddr, rewards, commission)) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, bz) - } -} - -// HTTP request handler to query validator's commission and self-delegation rewards -func validatorRewardsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - valAddr := mux.Vars(r)["validatorAddr"] - validatorAddr, ok := checkValidatorAddressVar(w, r) - if !ok { - return - } - - clientCtx, ok = rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - delAddr := sdk.AccAddress(validatorAddr).String() - bz, height, ok := checkResponseQueryDelegationRewards(w, clientCtx, delAddr, valAddr) - if !ok { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, bz) - } -} - -// HTTP request handler to query the distribution params values -func paramsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryParams) - res, height, err := clientCtx.QueryWithData(route, nil) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -func communityPoolHandler(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - res, height, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/community_pool", types.QuerierRoute), nil) - if rest.CheckInternalServerError(w, err) { - return - } - - var result sdk.DecCoins - if rest.CheckInternalServerError(w, clientCtx.LegacyAmino.UnmarshalJSON(res, &result)) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, result) - } -} - -// HTTP request handler to query the outstanding rewards -func outstandingRewardsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - validatorAddr, ok := checkValidatorAddressVar(w, r) - if !ok { - return - } - - clientCtx, ok = rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - bin := clientCtx.LegacyAmino.MustMarshalJSON(types.NewQueryValidatorOutstandingRewardsParams(validatorAddr)) - res, height, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/validator_outstanding_rewards", types.QuerierRoute), bin) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -func checkResponseQueryDelegationRewards( - w http.ResponseWriter, clientCtx client.Context, delAddr, valAddr string, -) (res []byte, height int64, ok bool) { - - res, height, err := common.QueryDelegationRewards(clientCtx, delAddr, valAddr) - if rest.CheckInternalServerError(w, err) { - return nil, 0, false - } - - return res, height, true -} diff --git a/x/distribution/client/rest/rest.go b/x/distribution/client/rest/rest.go deleted file mode 100644 index af3e018d..00000000 --- a/x/distribution/client/rest/rest.go +++ /dev/null @@ -1,57 +0,0 @@ -package rest - -import ( - "net/http" - - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - clientrest "github.com/cosmos/cosmos-sdk/client/rest" - "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/types/rest" - govrest "github.com/cosmos/cosmos-sdk/x/gov/client/rest" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" -) - -func RegisterHandlers(clientCtx client.Context, rtr *mux.Router) { - r := clientrest.WithHTTPDeprecationHeaders(rtr) - - registerQueryRoutes(clientCtx, r) - registerTxHandlers(clientCtx, r) -} - -// TODO add proto compatible Handler after x/gov migration -// ProposalRESTHandler returns a ProposalRESTHandler that exposes the community pool spend REST handler with a given sub-route. -func ProposalRESTHandler(clientCtx client.Context) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "community_pool_spend", - Handler: postProposalHandlerFn(clientCtx), - } -} - -func postProposalHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req CommunityPoolSpendProposalReq - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - content := types.NewCommunityPoolSpendProposal(req.Title, req.Description, req.Recipient, req.Amount) - - msg, err := govtypes.NewMsgSubmitProposal(content, req.Deposit, req.Proposer) - if rest.CheckBadRequestError(w, err) { - return - } - if rest.CheckBadRequestError(w, msg.ValidateBasic()) { - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg) - } -} diff --git a/x/distribution/client/rest/tx.go b/x/distribution/client/rest/tx.go deleted file mode 100644 index 78ddfcd4..00000000 --- a/x/distribution/client/rest/tx.go +++ /dev/null @@ -1,222 +0,0 @@ -package rest - -import ( - "net/http" - - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client/common" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" -) - -type ( - withdrawRewardsReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - } - - setWithdrawalAddrReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - WithdrawAddress sdk.AccAddress `json:"withdraw_address" yaml:"withdraw_address"` - } - - fundCommunityPoolReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - Amount sdk.Coins `json:"amount" yaml:"amount"` - } -) - -func registerTxHandlers(clientCtx client.Context, r *mux.Router) { - // Withdraw all delegator rewards - r.HandleFunc( - "/distribution/delegators/{delegatorAddr}/rewards", - newWithdrawDelegatorRewardsHandlerFn(clientCtx), - ).Methods("POST") - - // Withdraw delegation rewards - r.HandleFunc( - "/distribution/delegators/{delegatorAddr}/rewards/{validatorAddr}", - newWithdrawDelegationRewardsHandlerFn(clientCtx), - ).Methods("POST") - - // Replace the rewards withdrawal address - r.HandleFunc( - "/distribution/delegators/{delegatorAddr}/withdraw_address", - newSetDelegatorWithdrawalAddrHandlerFn(clientCtx), - ).Methods("POST") - - // Withdraw validator rewards and commission - r.HandleFunc( - "/distribution/validators/{validatorAddr}/rewards", - newWithdrawValidatorRewardsHandlerFn(clientCtx), - ).Methods("POST") - - // Fund the community pool - r.HandleFunc( - "/distribution/community_pool", - newFundCommunityPoolHandlerFn(clientCtx), - ).Methods("POST") -} - -func newWithdrawDelegatorRewardsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req withdrawRewardsReq - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - // read and validate URL's variables - delAddr, ok := checkDelegatorAddressVar(w, r) - if !ok { - return - } - - msgs, err := common.WithdrawAllDelegatorRewards(clientCtx, delAddr) - if rest.CheckInternalServerError(w, err) { - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msgs...) - } -} - -func newWithdrawDelegationRewardsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req withdrawRewardsReq - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - // read and validate URL's variables - delAddr, ok := checkDelegatorAddressVar(w, r) - if !ok { - return - } - - valAddr, ok := checkValidatorAddressVar(w, r) - if !ok { - return - } - - msg := types.NewMsgWithdrawDelegatorReward(delAddr, valAddr) - if rest.CheckBadRequestError(w, msg.ValidateBasic()) { - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg) - } -} - -func newSetDelegatorWithdrawalAddrHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req setWithdrawalAddrReq - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - // read and validate URL's variables - delAddr, ok := checkDelegatorAddressVar(w, r) - if !ok { - return - } - - msg := types.NewMsgSetWithdrawAddress(delAddr, req.WithdrawAddress) - if rest.CheckBadRequestError(w, msg.ValidateBasic()) { - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg) - } -} - -func newWithdrawValidatorRewardsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req withdrawRewardsReq - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - // read and validate URL's variable - valAddr, ok := checkValidatorAddressVar(w, r) - if !ok { - return - } - - // prepare multi-message transaction - msgs, err := common.WithdrawValidatorRewardsAndCommission(valAddr) - if rest.CheckBadRequestError(w, err) { - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msgs...) - } -} - -func newFundCommunityPoolHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req fundCommunityPoolReq - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From) - if rest.CheckBadRequestError(w, err) { - return - } - - msg := types.NewMsgFundCommunityPool(req.Amount, fromAddr) - if rest.CheckBadRequestError(w, msg.ValidateBasic()) { - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg) - } -} - -// Auxiliary - -func checkDelegatorAddressVar(w http.ResponseWriter, r *http.Request) (sdk.AccAddress, bool) { - addr, err := sdk.AccAddressFromBech32(mux.Vars(r)["delegatorAddr"]) - if rest.CheckBadRequestError(w, err) { - return nil, false - } - - return addr, true -} - -func checkValidatorAddressVar(w http.ResponseWriter, r *http.Request) (sdk.ValAddress, bool) { - addr, err := sdk.ValAddressFromBech32(mux.Vars(r)["validatorAddr"]) - if rest.CheckBadRequestError(w, err) { - return nil, false - } - - return addr, true -} diff --git a/x/distribution/client/rest/utils.go b/x/distribution/client/rest/utils.go deleted file mode 100644 index 3f7a3d00..00000000 --- a/x/distribution/client/rest/utils.go +++ /dev/null @@ -1,20 +0,0 @@ -package rest - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" -) - -type ( - // CommunityPoolSpendProposalReq defines a community pool spend proposal request body. - CommunityPoolSpendProposalReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - Recipient sdk.AccAddress `json:"recipient" yaml:"recipient"` - Amount sdk.Coins `json:"amount" yaml:"amount"` - Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - } -) diff --git a/x/distribution/handler.go b/x/distribution/handler.go index b73149c5..23907562 100644 --- a/x/distribution/handler.go +++ b/x/distribution/handler.go @@ -3,7 +3,7 @@ package distribution import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) diff --git a/x/distribution/keeper/keeper.go b/x/distribution/keeper/keeper.go index 60bd8e9c..c0f83871 100644 --- a/x/distribution/keeper/keeper.go +++ b/x/distribution/keeper/keeper.go @@ -6,6 +6,7 @@ import ( "github.com/tendermint/tendermint/libs/log" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" @@ -14,7 +15,7 @@ import ( // Keeper of the distribution store type Keeper struct { - storeKey sdk.StoreKey + storeKey storetypes.StoreKey cdc codec.BinaryCodec paramSpace paramtypes.Subspace authKeeper types.AccountKeeper @@ -28,7 +29,7 @@ type Keeper struct { // NewKeeper creates a new distribution Keeper instance func NewKeeper( - cdc codec.BinaryCodec, key sdk.StoreKey, paramSpace paramtypes.Subspace, + cdc codec.BinaryCodec, key storetypes.StoreKey, paramSpace paramtypes.Subspace, ak types.AccountKeeper, bk types.BankKeeper, sk types.StakingKeeper, feeCollectorName string, blockedAddrs map[string]bool, ) Keeper { diff --git a/x/distribution/keeper/migrations.go b/x/distribution/keeper/migrations.go index 43724bc1..7439dfbe 100644 --- a/x/distribution/keeper/migrations.go +++ b/x/distribution/keeper/migrations.go @@ -2,7 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v043 "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v043" + v043 "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v043" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/distribution/legacy/v034/types.go b/x/distribution/legacy/v034/types.go deleted file mode 100644 index e32b92a5..00000000 --- a/x/distribution/legacy/v034/types.go +++ /dev/null @@ -1,100 +0,0 @@ -// Package v034 is used for legacy migration scripts. Actual migration scripts -// for v034 have been removed, but the v039->v042 migration script still -// references types from this file, so we're keeping it for now. -// DONTCOVER -package v034 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// ---------------------------------------------------------------------------- -// Types and Constants -// ---------------------------------------------------------------------------- - -const ( - ModuleName = "distr" -) - -type ( - ValidatorAccumulatedCommission = sdk.DecCoins - - DelegatorStartingInfo struct { - PreviousPeriod uint64 `json:"previous_period"` - Stake sdk.Dec `json:"stake"` - Height uint64 `json:"height"` - } - - DelegatorWithdrawInfo struct { - DelegatorAddress sdk.AccAddress `json:"delegator_address"` - WithdrawAddress sdk.AccAddress `json:"withdraw_address"` - } - - ValidatorOutstandingRewardsRecord struct { - ValidatorAddress sdk.ValAddress `json:"validator_address"` - OutstandingRewards sdk.DecCoins `json:"outstanding_rewards"` - } - - ValidatorAccumulatedCommissionRecord struct { - ValidatorAddress sdk.ValAddress `json:"validator_address"` - Accumulated ValidatorAccumulatedCommission `json:"accumulated"` - } - - ValidatorHistoricalRewardsRecord struct { - ValidatorAddress sdk.ValAddress `json:"validator_address"` - Period uint64 `json:"period"` - Rewards ValidatorHistoricalRewards `json:"rewards"` - } - - ValidatorHistoricalRewards struct { - CumulativeRewardRatio sdk.DecCoins `json:"cumulative_reward_ratio"` - ReferenceCount uint16 `json:"reference_count"` - } - - ValidatorCurrentRewards struct { - Rewards sdk.DecCoins `json:"rewards"` - Period uint64 `json:"period"` - } - - ValidatorCurrentRewardsRecord struct { - ValidatorAddress sdk.ValAddress `json:"validator_address"` - Rewards ValidatorCurrentRewards `json:"rewards"` - } - - DelegatorStartingInfoRecord struct { - DelegatorAddress sdk.AccAddress `json:"delegator_address"` - ValidatorAddress sdk.ValAddress `json:"validator_address"` - StartingInfo DelegatorStartingInfo `json:"starting_info"` - } - - ValidatorSlashEventRecord struct { - ValidatorAddress sdk.ValAddress `json:"validator_address"` - Height uint64 `json:"height"` - Event ValidatorSlashEvent `json:"validator_slash_event"` - } - - FeePool struct { - CommunityPool sdk.DecCoins `json:"community_pool"` - } - - ValidatorSlashEvent struct { - ValidatorPeriod uint64 `json:"validator_period"` - Fraction sdk.Dec `json:"fraction"` - } - - GenesisState struct { - FeePool FeePool `json:"fee_pool"` - CommunityTax sdk.Dec `json:"community_tax"` - BaseProposerReward sdk.Dec `json:"base_proposer_reward"` - BonusProposerReward sdk.Dec `json:"bonus_proposer_reward"` - WithdrawAddrEnabled bool `json:"withdraw_addr_enabled"` - DelegatorWithdrawInfos []DelegatorWithdrawInfo `json:"delegator_withdraw_infos"` - PreviousProposer sdk.ConsAddress `json:"previous_proposer"` - OutstandingRewards []ValidatorOutstandingRewardsRecord `json:"outstanding_rewards"` - ValidatorAccumulatedCommissions []ValidatorAccumulatedCommissionRecord `json:"validator_accumulated_commissions"` - ValidatorHistoricalRewards []ValidatorHistoricalRewardsRecord `json:"validator_historical_rewards"` - ValidatorCurrentRewards []ValidatorCurrentRewardsRecord `json:"validator_current_rewards"` - DelegatorStartingInfos []DelegatorStartingInfoRecord `json:"delegator_starting_infos"` - ValidatorSlashEvents []ValidatorSlashEventRecord `json:"validator_slash_events"` - } -) diff --git a/x/distribution/legacy/v036/types.go b/x/distribution/legacy/v036/types.go deleted file mode 100644 index 08fab911..00000000 --- a/x/distribution/legacy/v036/types.go +++ /dev/null @@ -1,136 +0,0 @@ -// Package v036 is used for legacy migration scripts. Actual migration scripts -// for v036 have been removed, but the v039->v042 migration script still -// references types from this file, so we're keeping it for now. -// DONTCOVER -package v036 - -import ( - "fmt" - "strings" - - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036" - v034distr "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v034" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" -) - -// ---------------------------------------------------------------------------- -// Types and Constants -// ---------------------------------------------------------------------------- - -const ( - ModuleName = "distribution" - - // RouterKey is the message route for distribution - RouterKey = ModuleName - - // ProposalTypeCommunityPoolSpend defines the type for a CommunityPoolSpendProposal - ProposalTypeCommunityPoolSpend = "CommunityPoolSpend" -) - -type ( - ValidatorAccumulatedCommission = sdk.DecCoins - - ValidatorSlashEventRecord struct { - ValidatorAddress sdk.ValAddress `json:"validator_address"` - Height uint64 `json:"height"` - Period uint64 `json:"period"` - Event v034distr.ValidatorSlashEvent `json:"validator_slash_event"` - } - - GenesisState struct { - FeePool v034distr.FeePool `json:"fee_pool"` - CommunityTax sdk.Dec `json:"community_tax"` - BaseProposerReward sdk.Dec `json:"base_proposer_reward"` - BonusProposerReward sdk.Dec `json:"bonus_proposer_reward"` - WithdrawAddrEnabled bool `json:"withdraw_addr_enabled"` - DelegatorWithdrawInfos []v034distr.DelegatorWithdrawInfo `json:"delegator_withdraw_infos"` - PreviousProposer sdk.ConsAddress `json:"previous_proposer"` - OutstandingRewards []v034distr.ValidatorOutstandingRewardsRecord `json:"outstanding_rewards"` - ValidatorAccumulatedCommissions []v034distr.ValidatorAccumulatedCommissionRecord `json:"validator_accumulated_commissions"` - ValidatorHistoricalRewards []v034distr.ValidatorHistoricalRewardsRecord `json:"validator_historical_rewards"` - ValidatorCurrentRewards []v034distr.ValidatorCurrentRewardsRecord `json:"validator_current_rewards"` - DelegatorStartingInfos []v034distr.DelegatorStartingInfoRecord `json:"delegator_starting_infos"` - ValidatorSlashEvents []ValidatorSlashEventRecord `json:"validator_slash_events"` - } - - // CommunityPoolSpendProposal spends from the community pool - CommunityPoolSpendProposal struct { - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - Recipient sdk.AccAddress `json:"recipient" yaml:"recipient"` - Amount sdk.Coins `json:"amount" yaml:"amount"` - } -) - -func NewGenesisState( - feePool v034distr.FeePool, communityTax, baseProposerReward, bonusProposerReward sdk.Dec, - withdrawAddrEnabled bool, dwis []v034distr.DelegatorWithdrawInfo, pp sdk.ConsAddress, - r []v034distr.ValidatorOutstandingRewardsRecord, acc []v034distr.ValidatorAccumulatedCommissionRecord, - historical []v034distr.ValidatorHistoricalRewardsRecord, cur []v034distr.ValidatorCurrentRewardsRecord, - dels []v034distr.DelegatorStartingInfoRecord, slashes []ValidatorSlashEventRecord, -) GenesisState { - - return GenesisState{ - FeePool: feePool, - CommunityTax: communityTax, - BaseProposerReward: baseProposerReward, - BonusProposerReward: bonusProposerReward, - WithdrawAddrEnabled: withdrawAddrEnabled, - DelegatorWithdrawInfos: dwis, - PreviousProposer: pp, - OutstandingRewards: r, - ValidatorAccumulatedCommissions: acc, - ValidatorHistoricalRewards: historical, - ValidatorCurrentRewards: cur, - DelegatorStartingInfos: dels, - ValidatorSlashEvents: slashes, - } -} - -var _ v036gov.Content = CommunityPoolSpendProposal{} - -// GetTitle returns the title of a community pool spend proposal. -func (csp CommunityPoolSpendProposal) GetTitle() string { return csp.Title } - -// GetDescription returns the description of a community pool spend proposal. -func (csp CommunityPoolSpendProposal) GetDescription() string { return csp.Description } - -// GetDescription returns the routing key of a community pool spend proposal. -func (csp CommunityPoolSpendProposal) ProposalRoute() string { return RouterKey } - -// ProposalType returns the type of a community pool spend proposal. -func (csp CommunityPoolSpendProposal) ProposalType() string { return ProposalTypeCommunityPoolSpend } - -// ValidateBasic runs basic stateless validity checks -func (csp CommunityPoolSpendProposal) ValidateBasic() error { - err := v036gov.ValidateAbstract(csp) - if err != nil { - return err - } - if !csp.Amount.IsValid() { - return types.ErrInvalidProposalAmount - } - if csp.Recipient.Empty() { - return types.ErrEmptyProposalRecipient - } - - return nil -} - -// String implements the Stringer interface. -func (csp CommunityPoolSpendProposal) String() string { - var b strings.Builder - b.WriteString(fmt.Sprintf(`Community Pool Spend Proposal: - Title: %s - Description: %s - Recipient: %s - Amount: %s -`, csp.Title, csp.Description, csp.Recipient, csp.Amount)) - return b.String() -} - -func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - cdc.RegisterConcrete(CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil) -} diff --git a/x/distribution/legacy/v038/types.go b/x/distribution/legacy/v038/types.go deleted file mode 100644 index 090675f2..00000000 --- a/x/distribution/legacy/v038/types.go +++ /dev/null @@ -1,59 +0,0 @@ -// Package v038 is used for legacy migration scripts. Actual migration scripts -// for v038 have been removed, but the v039->v042 migration script still -// references types from this file, so we're keeping it for now. -package v038 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v034distr "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v034" - v036distr "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v036" -) - -// DONTCOVER - -const ( - ModuleName = "distribution" -) - -type ( - GenesisState struct { - Params Params `json:"params" yaml:"params"` - FeePool v034distr.FeePool `json:"fee_pool"` - DelegatorWithdrawInfos []v034distr.DelegatorWithdrawInfo `json:"delegator_withdraw_infos"` - PreviousProposer sdk.ConsAddress `json:"previous_proposer" yaml:"previous_proposer"` - OutstandingRewards []v034distr.ValidatorOutstandingRewardsRecord `json:"outstanding_rewards"` - ValidatorAccumulatedCommissions []v034distr.ValidatorAccumulatedCommissionRecord `json:"validator_accumulated_commissions"` - ValidatorHistoricalRewards []v034distr.ValidatorHistoricalRewardsRecord `json:"validator_historical_rewards"` - ValidatorCurrentRewards []v034distr.ValidatorCurrentRewardsRecord `json:"validator_current_rewards"` - DelegatorStartingInfos []v034distr.DelegatorStartingInfoRecord `json:"delegator_starting_infos"` - ValidatorSlashEvents []v036distr.ValidatorSlashEventRecord `json:"validator_slash_events" yaml:"validator_slash_events"` - } - - Params struct { - CommunityTax sdk.Dec `json:"community_tax" yaml:"community_tax"` - BaseProposerReward sdk.Dec `json:"base_proposer_reward" yaml:"base_proposer_reward"` - BonusProposerReward sdk.Dec `json:"bonus_proposer_reward" yaml:"bonus_proposer_reward"` - WithdrawAddrEnabled bool `json:"withdraw_addr_enabled" yaml:"withdraw_addr_enabled"` - } -) - -func NewGenesisState( - params Params, feePool v034distr.FeePool, dwis []v034distr.DelegatorWithdrawInfo, pp sdk.ConsAddress, - r []v034distr.ValidatorOutstandingRewardsRecord, acc []v034distr.ValidatorAccumulatedCommissionRecord, - historical []v034distr.ValidatorHistoricalRewardsRecord, cur []v034distr.ValidatorCurrentRewardsRecord, - dels []v034distr.DelegatorStartingInfoRecord, slashes []v036distr.ValidatorSlashEventRecord, -) GenesisState { - - return GenesisState{ - FeePool: feePool, - Params: params, - DelegatorWithdrawInfos: dwis, - PreviousProposer: pp, - OutstandingRewards: r, - ValidatorAccumulatedCommissions: acc, - ValidatorHistoricalRewards: historical, - ValidatorCurrentRewards: cur, - DelegatorStartingInfos: dels, - ValidatorSlashEvents: slashes, - } -} diff --git a/x/distribution/legacy/v040/keys.go b/x/distribution/legacy/v040/keys.go deleted file mode 100644 index 88a3c780..00000000 --- a/x/distribution/legacy/v040/keys.go +++ /dev/null @@ -1,196 +0,0 @@ -// Package v040 is copy-pasted from: -// https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/distribution/types/keys.go -package v040 - -import ( - "encoding/binary" - - sdk "github.com/cosmos/cosmos-sdk/types" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" -) - -const ( - // ModuleName is the module name constant used in many places - ModuleName = "distribution" - - // StoreKey is the store key string for distribution - StoreKey = ModuleName - - // RouterKey is the message route for distribution - RouterKey = ModuleName - - // QuerierRoute is the querier route for distribution - QuerierRoute = ModuleName -) - -// Keys for distribution store -// Items are stored with the following key: values -// -// - 0x00: FeePol -// -// - 0x01: sdk.ConsAddress -// -// - 0x02: ValidatorOutstandingRewards -// -// - 0x03: sdk.AccAddress -// -// - 0x04: DelegatorStartingInfo -// -// - 0x05: ValidatorHistoricalRewards -// -// - 0x06: ValidatorCurrentRewards -// -// - 0x07: ValidatorCurrentRewards -// -// - 0x08: ValidatorSlashEvent -var ( - FeePoolKey = []byte{0x00} // key for global distribution state - ProposerKey = []byte{0x01} // key for the proposer operator address - ValidatorOutstandingRewardsPrefix = []byte{0x02} // key for outstanding rewards - - DelegatorWithdrawAddrPrefix = []byte{0x03} // key for delegator withdraw address - DelegatorStartingInfoPrefix = []byte{0x04} // key for delegator starting info - ValidatorHistoricalRewardsPrefix = []byte{0x05} // key for historical validators rewards / stake - ValidatorCurrentRewardsPrefix = []byte{0x06} // key for current validator rewards - ValidatorAccumulatedCommissionPrefix = []byte{0x07} // key for accumulated validator commission - ValidatorSlashEventPrefix = []byte{0x08} // key for validator slash fraction -) - -// gets an address from a validator's outstanding rewards key -func GetValidatorOutstandingRewardsAddress(key []byte) (valAddr sdk.ValAddress) { - addr := key[1:] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - return sdk.ValAddress(addr) -} - -// gets an address from a delegator's withdraw info key -func GetDelegatorWithdrawInfoAddress(key []byte) (delAddr sdk.AccAddress) { - addr := key[1:] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - return sdk.AccAddress(addr) -} - -// gets the addresses from a delegator starting info key -func GetDelegatorStartingInfoAddresses(key []byte) (valAddr sdk.ValAddress, delAddr sdk.AccAddress) { - addr := key[1 : 1+v040auth.AddrLen] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - valAddr = sdk.ValAddress(addr) - addr = key[1+v040auth.AddrLen:] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - delAddr = sdk.AccAddress(addr) - return -} - -// gets the address & period from a validator's historical rewards key -func GetValidatorHistoricalRewardsAddressPeriod(key []byte) (valAddr sdk.ValAddress, period uint64) { - addr := key[1 : 1+v040auth.AddrLen] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - valAddr = sdk.ValAddress(addr) - b := key[1+v040auth.AddrLen:] - if len(b) != 8 { - panic("unexpected key length") - } - period = binary.LittleEndian.Uint64(b) - return -} - -// gets the address from a validator's current rewards key -func GetValidatorCurrentRewardsAddress(key []byte) (valAddr sdk.ValAddress) { - addr := key[1:] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - return sdk.ValAddress(addr) -} - -// gets the address from a validator's accumulated commission key -func GetValidatorAccumulatedCommissionAddress(key []byte) (valAddr sdk.ValAddress) { - addr := key[1:] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - return sdk.ValAddress(addr) -} - -// gets the height from a validator's slash event key -func GetValidatorSlashEventAddressHeight(key []byte) (valAddr sdk.ValAddress, height uint64) { - addr := key[1 : 1+v040auth.AddrLen] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - valAddr = sdk.ValAddress(addr) - startB := 1 + v040auth.AddrLen - b := key[startB : startB+8] // the next 8 bytes represent the height - height = binary.BigEndian.Uint64(b) - return -} - -// gets the outstanding rewards key for a validator -func GetValidatorOutstandingRewardsKey(valAddr sdk.ValAddress) []byte { - return append(ValidatorOutstandingRewardsPrefix, valAddr.Bytes()...) -} - -// gets the key for a delegator's withdraw addr -func GetDelegatorWithdrawAddrKey(delAddr sdk.AccAddress) []byte { - return append(DelegatorWithdrawAddrPrefix, delAddr.Bytes()...) -} - -// gets the key for a delegator's starting info -func GetDelegatorStartingInfoKey(v sdk.ValAddress, d sdk.AccAddress) []byte { - return append(append(DelegatorStartingInfoPrefix, v.Bytes()...), d.Bytes()...) -} - -// gets the prefix key for a validator's historical rewards -func GetValidatorHistoricalRewardsPrefix(v sdk.ValAddress) []byte { - return append(ValidatorHistoricalRewardsPrefix, v.Bytes()...) -} - -// gets the key for a validator's historical rewards -func GetValidatorHistoricalRewardsKey(v sdk.ValAddress, k uint64) []byte { - b := make([]byte, 8) - binary.LittleEndian.PutUint64(b, k) - return append(append(ValidatorHistoricalRewardsPrefix, v.Bytes()...), b...) -} - -// gets the key for a validator's current rewards -func GetValidatorCurrentRewardsKey(v sdk.ValAddress) []byte { - return append(ValidatorCurrentRewardsPrefix, v.Bytes()...) -} - -// gets the key for a validator's current commission -func GetValidatorAccumulatedCommissionKey(v sdk.ValAddress) []byte { - return append(ValidatorAccumulatedCommissionPrefix, v.Bytes()...) -} - -// gets the prefix key for a validator's slash fractions -func GetValidatorSlashEventPrefix(v sdk.ValAddress) []byte { - return append(ValidatorSlashEventPrefix, v.Bytes()...) -} - -// gets the prefix key for a validator's slash fraction (ValidatorSlashEventPrefix + height) -func GetValidatorSlashEventKeyPrefix(v sdk.ValAddress, height uint64) []byte { - heightBz := make([]byte, 8) - binary.BigEndian.PutUint64(heightBz, height) - return append( - ValidatorSlashEventPrefix, - append(v.Bytes(), heightBz...)..., - ) -} - -// gets the key for a validator's slash fraction -func GetValidatorSlashEventKey(v sdk.ValAddress, height, period uint64) []byte { - periodBz := make([]byte, 8) - binary.BigEndian.PutUint64(periodBz, period) - prefix := GetValidatorSlashEventKeyPrefix(v, height) - return append(prefix, periodBz...) -} diff --git a/x/distribution/legacy/v040/migrate.go b/x/distribution/legacy/v040/migrate.go deleted file mode 100644 index c92d3551..00000000 --- a/x/distribution/legacy/v040/migrate.go +++ /dev/null @@ -1,108 +0,0 @@ -package v040 - -import ( - v038distribution "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v038" - v040distribution "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" -) - -// Migrate accepts exported x/distribution genesis state from v0.38 and migrates it -// to v0.40 x/distribution genesis state. The migration includes: -// -// - Convert addresses from bytes to bech32 strings. -// - Re-encode in v0.40 GenesisState. -func Migrate(oldDistributionState v038distribution.GenesisState) *v040distribution.GenesisState { - newDelegatorWithdrawInfos := make([]v040distribution.DelegatorWithdrawInfo, len(oldDistributionState.DelegatorWithdrawInfos)) - for i, oldDelegatorWithdrawInfo := range oldDistributionState.DelegatorWithdrawInfos { - newDelegatorWithdrawInfos[i] = v040distribution.DelegatorWithdrawInfo{ - DelegatorAddress: oldDelegatorWithdrawInfo.DelegatorAddress.String(), - WithdrawAddress: oldDelegatorWithdrawInfo.WithdrawAddress.String(), - } - } - - newValidatorOutstandingRewards := make([]v040distribution.ValidatorOutstandingRewardsRecord, len(oldDistributionState.OutstandingRewards)) - for i, oldValidatorOutstandingReward := range oldDistributionState.OutstandingRewards { - newValidatorOutstandingRewards[i] = v040distribution.ValidatorOutstandingRewardsRecord{ - ValidatorAddress: oldValidatorOutstandingReward.ValidatorAddress.String(), - OutstandingRewards: oldValidatorOutstandingReward.OutstandingRewards, - } - } - - newValidatorAccumulatedCommissions := make([]v040distribution.ValidatorAccumulatedCommissionRecord, len(oldDistributionState.ValidatorAccumulatedCommissions)) - for i, oldValidatorAccumulatedCommission := range oldDistributionState.ValidatorAccumulatedCommissions { - newValidatorAccumulatedCommissions[i] = v040distribution.ValidatorAccumulatedCommissionRecord{ - ValidatorAddress: oldValidatorAccumulatedCommission.ValidatorAddress.String(), - Accumulated: v040distribution.ValidatorAccumulatedCommission{ - Commission: oldValidatorAccumulatedCommission.Accumulated, - }, - } - } - - newValidatorHistoricalRewards := make([]v040distribution.ValidatorHistoricalRewardsRecord, len(oldDistributionState.ValidatorHistoricalRewards)) - for i, oldValidatorHistoricalReward := range oldDistributionState.ValidatorHistoricalRewards { - newValidatorHistoricalRewards[i] = v040distribution.ValidatorHistoricalRewardsRecord{ - ValidatorAddress: oldValidatorHistoricalReward.ValidatorAddress.String(), - Period: oldValidatorHistoricalReward.Period, - Rewards: v040distribution.ValidatorHistoricalRewards{ - CumulativeRewardRatio: oldValidatorHistoricalReward.Rewards.CumulativeRewardRatio, - ReferenceCount: uint32(oldValidatorHistoricalReward.Rewards.ReferenceCount), - }, - } - } - - newValidatorCurrentRewards := make([]v040distribution.ValidatorCurrentRewardsRecord, len(oldDistributionState.ValidatorCurrentRewards)) - for i, oldValidatorCurrentReward := range oldDistributionState.ValidatorCurrentRewards { - newValidatorCurrentRewards[i] = v040distribution.ValidatorCurrentRewardsRecord{ - ValidatorAddress: oldValidatorCurrentReward.ValidatorAddress.String(), - Rewards: v040distribution.ValidatorCurrentRewards{ - Rewards: oldValidatorCurrentReward.Rewards.Rewards, - Period: oldValidatorCurrentReward.Rewards.Period, - }, - } - } - - newDelegatorStartingInfos := make([]v040distribution.DelegatorStartingInfoRecord, len(oldDistributionState.DelegatorStartingInfos)) - for i, oldDelegatorStartingInfo := range oldDistributionState.DelegatorStartingInfos { - newDelegatorStartingInfos[i] = v040distribution.DelegatorStartingInfoRecord{ - DelegatorAddress: oldDelegatorStartingInfo.DelegatorAddress.String(), - ValidatorAddress: oldDelegatorStartingInfo.ValidatorAddress.String(), - StartingInfo: v040distribution.DelegatorStartingInfo{ - PreviousPeriod: oldDelegatorStartingInfo.StartingInfo.PreviousPeriod, - Stake: oldDelegatorStartingInfo.StartingInfo.Stake, - Height: oldDelegatorStartingInfo.StartingInfo.Height, - }, - } - } - - newValidatorSlashEvents := make([]v040distribution.ValidatorSlashEventRecord, len(oldDistributionState.ValidatorSlashEvents)) - for i, oldValidatorSlashEvent := range oldDistributionState.ValidatorSlashEvents { - newValidatorSlashEvents[i] = v040distribution.ValidatorSlashEventRecord{ - ValidatorAddress: oldValidatorSlashEvent.ValidatorAddress.String(), - Height: oldValidatorSlashEvent.Height, - Period: oldValidatorSlashEvent.Period, - ValidatorSlashEvent: v040distribution.ValidatorSlashEvent{ - ValidatorPeriod: oldValidatorSlashEvent.Event.ValidatorPeriod, - Fraction: oldValidatorSlashEvent.Event.Fraction, - }, - } - } - - return &v040distribution.GenesisState{ - Params: v040distribution.Params{ - CommunityTax: oldDistributionState.Params.CommunityTax, - BaseProposerReward: oldDistributionState.Params.BaseProposerReward, - BonusProposerReward: oldDistributionState.Params.BonusProposerReward, - WithdrawAddrEnabled: oldDistributionState.Params.WithdrawAddrEnabled, - }, - FeePool: v040distribution.FeePool{ - CommunityPool: oldDistributionState.FeePool.CommunityPool, - }, - DelegatorWithdrawInfos: newDelegatorWithdrawInfos, - PreviousProposer: oldDistributionState.PreviousProposer.String(), - OutstandingRewards: newValidatorOutstandingRewards, - ValidatorAccumulatedCommissions: newValidatorAccumulatedCommissions, - ValidatorHistoricalRewards: newValidatorHistoricalRewards, - ValidatorCurrentRewards: newValidatorCurrentRewards, - DelegatorStartingInfos: newDelegatorStartingInfos, - ValidatorSlashEvents: newValidatorSlashEvents, - } -} diff --git a/x/distribution/legacy/v043/helpers.go b/x/distribution/legacy/v043/helpers.go deleted file mode 100644 index 141863be..00000000 --- a/x/distribution/legacy/v043/helpers.go +++ /dev/null @@ -1,71 +0,0 @@ -package v043 - -import ( - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/address" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" -) - -// MigratePrefixAddress is a helper function that migrates all keys of format: -// prefix_bytes | address_bytes -// into format: -// prefix_bytes | address_len (1 byte) | address_bytes -func MigratePrefixAddress(store sdk.KVStore, prefixBz []byte) { - oldStore := prefix.NewStore(store, prefixBz) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - addr := oldStoreIter.Key() - var newStoreKey []byte = prefixBz - newStoreKey = append(newStoreKey, address.MustLengthPrefix(addr)...) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} - -// MigratePrefixAddressBytes is a helper function that migrates all keys of format: -// prefix_bytes | address_bytes | arbitrary_bytes -// into format: -// prefix_bytes | address_len (1 byte) | address_bytes | arbitrary_bytes -func MigratePrefixAddressBytes(store sdk.KVStore, prefixBz []byte) { - oldStore := prefix.NewStore(store, prefixBz) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - addr := oldStoreIter.Key()[:v040auth.AddrLen] - endBz := oldStoreIter.Key()[v040auth.AddrLen:] - newStoreKey := append(append(prefixBz, address.MustLengthPrefix(addr)...), endBz...) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} - -// MigratePrefixAddressAddress is a helper function that migrates all keys of format: -// prefix_bytes | address_1_bytes | address_2_bytes -// into format: -// prefix_bytes | address_1_len (1 byte) | address_1_bytes | address_2_len (1 byte) | address_2_bytes -func MigratePrefixAddressAddress(store sdk.KVStore, prefixBz []byte) { - oldStore := prefix.NewStore(store, prefixBz) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - addr1 := oldStoreIter.Key()[:v040auth.AddrLen] - addr2 := oldStoreIter.Key()[v040auth.AddrLen:] - newStoreKey := append(append(prefixBz, address.MustLengthPrefix(addr1)...), address.MustLengthPrefix(addr2)...) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} diff --git a/x/distribution/legacy/v043/store.go b/x/distribution/legacy/v043/store.go deleted file mode 100644 index bb698134..00000000 --- a/x/distribution/legacy/v043/store.go +++ /dev/null @@ -1,23 +0,0 @@ -package v043 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v040distribution "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v040" -) - -// MigrateStore performs in-place store migrations from v0.40 to v0.43. The -// migration includes: -// -// - Change addresses to be length-prefixed. -func MigrateStore(ctx sdk.Context, storeKey sdk.StoreKey) error { - store := ctx.KVStore(storeKey) - MigratePrefixAddress(store, v040distribution.ValidatorOutstandingRewardsPrefix) - MigratePrefixAddress(store, v040distribution.DelegatorWithdrawAddrPrefix) - MigratePrefixAddressAddress(store, v040distribution.DelegatorStartingInfoPrefix) - MigratePrefixAddressBytes(store, v040distribution.ValidatorHistoricalRewardsPrefix) - MigratePrefixAddress(store, v040distribution.ValidatorCurrentRewardsPrefix) - MigratePrefixAddress(store, v040distribution.ValidatorAccumulatedCommissionPrefix) - MigratePrefixAddressBytes(store, v040distribution.ValidatorSlashEventPrefix) - - return nil -} diff --git a/x/distribution/legacy/v043/store_test.go b/x/distribution/legacy/v043/store_test.go deleted file mode 100644 index cb40bc40..00000000 --- a/x/distribution/legacy/v043/store_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package v043_test - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - v040distribution "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v040" - v043distribution "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v043" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" -) - -func TestStoreMigration(t *testing.T) { - distributionKey := sdk.NewKVStoreKey("distribution") - ctx := testutil.DefaultContext(distributionKey, sdk.NewTransientStoreKey("transient_test")) - store := ctx.KVStore(distributionKey) - - _, _, addr1 := testdata.KeyTestPubAddr() - valAddr := sdk.ValAddress(addr1) - _, _, addr2 := testdata.KeyTestPubAddr() - // Use dummy value for all keys. - value := []byte("foo") - - testCases := []struct { - name string - oldKey []byte - newKey []byte - }{ - { - "FeePoolKey", - v040distribution.FeePoolKey, - types.FeePoolKey, - }, - { - "ProposerKey", - v040distribution.ProposerKey, - types.ProposerKey, - }, - { - "ValidatorOutstandingRewards", - v040distribution.GetValidatorOutstandingRewardsKey(valAddr), - types.GetValidatorOutstandingRewardsKey(valAddr), - }, - { - "DelegatorWithdrawAddr", - v040distribution.GetDelegatorWithdrawAddrKey(addr2), - types.GetDelegatorWithdrawAddrKey(addr2), - }, - { - "DelegatorStartingInfo", - v040distribution.GetDelegatorStartingInfoKey(valAddr, addr2), - types.GetDelegatorStartingInfoKey(valAddr, addr2), - }, - { - "ValidatorHistoricalRewards", - v040distribution.GetValidatorHistoricalRewardsKey(valAddr, 6), - types.GetValidatorHistoricalRewardsKey(valAddr, 6), - }, - { - "ValidatorCurrentRewards", - v040distribution.GetValidatorCurrentRewardsKey(valAddr), - types.GetValidatorCurrentRewardsKey(valAddr), - }, - { - "ValidatorAccumulatedCommission", - v040distribution.GetValidatorAccumulatedCommissionKey(valAddr), - types.GetValidatorAccumulatedCommissionKey(valAddr), - }, - { - "ValidatorSlashEvent", - v040distribution.GetValidatorSlashEventKey(valAddr, 6, 8), - types.GetValidatorSlashEventKey(valAddr, 6, 8), - }, - } - - // Set all the old keys to the store - for _, tc := range testCases { - store.Set(tc.oldKey, value) - } - - // Run migrations. - err := v043distribution.MigrateStore(ctx, distributionKey) - require.NoError(t, err) - - // Make sure the new keys are set and old keys are deleted. - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - if !bytes.Equal(tc.oldKey, tc.newKey) { - require.Nil(t, store.Get(tc.oldKey)) - } - require.Equal(t, value, store.Get(tc.newKey)) - }) - } -} diff --git a/x/distribution/module.go b/x/distribution/module.go index 79e2226e..38e184a4 100644 --- a/x/distribution/module.go +++ b/x/distribution/module.go @@ -19,7 +19,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client/cli" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client/rest" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -64,9 +63,9 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config sdkclient.TxEn } // RegisterRESTRoutes registers the REST routes for the distribution module. -func (AppModuleBasic) RegisterRESTRoutes(clientCtx sdkclient.Context, rtr *mux.Router) { - rest.RegisterHandlers(clientCtx, rtr) -} +// Deprecated: RegisterRESTRoutes is deprecated. `x/distribution` legacy REST implementation +// has been removed from the SDK. +func (AppModuleBasic) RegisterRESTRoutes(_ sdkclient.Context, _ *mux.Router) {} // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the distribution module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx sdkclient.Context, mux *runtime.ServeMux) { diff --git a/x/distribution/types/codec.go b/x/distribution/types/codec.go index 029c0955..e64a9cf4 100644 --- a/x/distribution/types/codec.go +++ b/x/distribution/types/codec.go @@ -6,7 +6,7 @@ import ( cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/msgservice" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) // RegisterLegacyAminoCodec registers the necessary x/distribution interfaces and concrete types diff --git a/x/distribution/types/proposal.go b/x/distribution/types/proposal.go index e263d855..74c2a0d0 100644 --- a/x/distribution/types/proposal.go +++ b/x/distribution/types/proposal.go @@ -5,7 +5,7 @@ import ( "strings" sdk "github.com/cosmos/cosmos-sdk/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) const ( diff --git a/x/slashing/client/rest/grpc_query_test.go b/x/slashing/client/rest/grpc_query_test.go deleted file mode 100644 index 49390ec5..00000000 --- a/x/slashing/client/rest/grpc_query_test.go +++ /dev/null @@ -1,134 +0,0 @@ -package rest_test - -import ( - "fmt" - "testing" - "time" - - "github.com/gogo/protobuf/proto" - "github.com/stretchr/testify/suite" - - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/network" - sdk "github.com/cosmos/cosmos-sdk/types" - grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" - "github.com/cosmos/cosmos-sdk/types/query" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" -) - -type IntegrationTestSuite struct { - suite.Suite - - cfg network.Config - network *network.Network -} - -func (s *IntegrationTestSuite) SetupSuite() { - s.T().Log("setting up integration test suite") - - cfg := network.DefaultConfig() - cfg.NumValidators = 1 - - s.cfg = cfg - s.network = network.New(s.T(), cfg) - - _, err := s.network.WaitForHeight(1) - s.Require().NoError(err) -} - -func (s *IntegrationTestSuite) TearDownSuite() { - s.T().Log("tearing down integration test suite") - s.network.Cleanup() -} - -func (s *IntegrationTestSuite) TestGRPCQueries() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - consAddr := sdk.ConsAddress(val.PubKey.Address()).String() - - testCases := []struct { - name string - url string - headers map[string]string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "get signing infos (height specific)", - fmt.Sprintf("%s/cosmos/slashing/v1beta1/signing_infos", baseURL), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "1", - }, - false, - &types.QuerySigningInfosResponse{}, - &types.QuerySigningInfosResponse{ - Info: []types.ValidatorSigningInfo{ - { - Address: sdk.ConsAddress(val.PubKey.Address()).String(), - JailedUntil: time.Unix(0, 0), - }, - }, - Pagination: &query.PageResponse{ - Total: uint64(1), - }, - }, - }, - { - "get signing info (height specific)", - fmt.Sprintf("%s/cosmos/slashing/v1beta1/signing_infos/%s", baseURL, consAddr), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "1", - }, - false, - &types.QuerySigningInfoResponse{}, - &types.QuerySigningInfoResponse{ - ValSigningInfo: types.ValidatorSigningInfo{ - Address: sdk.ConsAddress(val.PubKey.Address()).String(), - JailedUntil: time.Unix(0, 0), - }, - }, - }, - { - "get signing info wrong address", - fmt.Sprintf("%s/cosmos/slashing/v1beta1/signing_infos/%s", baseURL, "wrongAddress"), - map[string]string{}, - true, - &types.QuerySigningInfoResponse{}, - nil, - }, - { - "params", - fmt.Sprintf("%s/cosmos/slashing/v1beta1/params", baseURL), - map[string]string{}, - false, - &types.QueryParamsResponse{}, - &types.QueryParamsResponse{ - Params: types.DefaultParams(), - }, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) - s.Require().NoError(err) - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType) - - if tc.expErr { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func TestIntegrationTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} diff --git a/x/slashing/client/rest/query.go b/x/slashing/client/rest/query.go deleted file mode 100644 index 4235ca42..00000000 --- a/x/slashing/client/rest/query.go +++ /dev/null @@ -1,111 +0,0 @@ -package rest - -import ( - "fmt" - "net/http" - - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" //nolint:staticcheck - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" -) - -func registerQueryRoutes(clientCtx client.Context, r *mux.Router) { - r.HandleFunc( - "/slashing/validators/{validatorPubKey}/signing_info", - signingInfoHandlerFn(clientCtx), - ).Methods("GET") - - r.HandleFunc( - "/slashing/signing_infos", - signingInfoHandlerListFn(clientCtx), - ).Methods("GET") - - r.HandleFunc( - "/slashing/parameters", - queryParamsHandlerFn(clientCtx), - ).Methods("GET") -} - -// Deprecated: http request handler to query signing info -func signingInfoHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - pk, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, vars["validatorPubKey"]) - if rest.CheckBadRequestError(w, err) { - return - } - - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - params := types.QuerySigningInfoRequest{ConsAddress: pk.Address().String()} - - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if rest.CheckBadRequestError(w, err) { - return - } - - route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QuerySigningInfo) - res, height, err := clientCtx.QueryWithData(route, bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -// http request handler to query signing info -func signingInfoHandlerListFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) - if rest.CheckBadRequestError(w, err) { - return - } - - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - params := types.NewQuerySigningInfosParams(page, limit) - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if rest.CheckInternalServerError(w, err) { - return - } - - route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QuerySigningInfos) - res, height, err := clientCtx.QueryWithData(route, bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -func queryParamsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/parameters", types.QuerierRoute) - - res, height, err := clientCtx.QueryWithData(route, nil) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} diff --git a/x/slashing/client/rest/rest.go b/x/slashing/client/rest/rest.go deleted file mode 100644 index 059cb17c..00000000 --- a/x/slashing/client/rest/rest.go +++ /dev/null @@ -1,15 +0,0 @@ -package rest - -import ( - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/rest" -) - -func RegisterHandlers(clientCtx client.Context, rtr *mux.Router) { - r := rest.WithHTTPDeprecationHeaders(rtr) - - registerQueryRoutes(clientCtx, r) - registerTxHandlers(clientCtx, r) -} diff --git a/x/slashing/client/rest/tx.go b/x/slashing/client/rest/tx.go deleted file mode 100644 index 2f163978..00000000 --- a/x/slashing/client/rest/tx.go +++ /dev/null @@ -1,63 +0,0 @@ -package rest - -import ( - "bytes" - "net/http" - - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" -) - -func registerTxHandlers(clientCtx client.Context, r *mux.Router) { - r.HandleFunc("/slashing/validators/{validatorAddr}/unjail", NewUnjailRequestHandlerFn(clientCtx)).Methods("POST") -} - -// Unjail TX body -type UnjailReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` -} - -// NewUnjailRequestHandlerFn returns an HTTP REST handler for creating a MsgUnjail -// transaction. -func NewUnjailRequestHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - bech32Validator := vars["validatorAddr"] - - var req UnjailReq - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From) - if rest.CheckBadRequestError(w, err) { - return - } - - valAddr, err := sdk.ValAddressFromBech32(bech32Validator) - if rest.CheckInternalServerError(w, err) { - return - } - - if !bytes.Equal(fromAddr, valAddr) { - rest.WriteErrorResponse(w, http.StatusUnauthorized, "must use own validator address") - return - } - - msg := types.NewMsgUnjail(valAddr) - if rest.CheckBadRequestError(w, msg.ValidateBasic()) { - return - } - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg) - } -} diff --git a/x/slashing/keeper/keeper.go b/x/slashing/keeper/keeper.go index 035a060a..9f1663a6 100644 --- a/x/slashing/keeper/keeper.go +++ b/x/slashing/keeper/keeper.go @@ -7,20 +7,21 @@ import ( "github.com/cosmos/cosmos-sdk/codec" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" ) // Keeper of the slashing store type Keeper struct { - storeKey sdk.StoreKey + storeKey storetypes.StoreKey cdc codec.BinaryCodec sk types.StakingKeeper paramspace types.ParamSubspace } // NewKeeper creates a slashing keeper -func NewKeeper(cdc codec.BinaryCodec, key sdk.StoreKey, sk types.StakingKeeper, paramspace types.ParamSubspace) Keeper { +func NewKeeper(cdc codec.BinaryCodec, key storetypes.StoreKey, sk types.StakingKeeper, paramspace types.ParamSubspace) Keeper { // set KeyTable if it has not already been set if !paramspace.HasKeyTable() { paramspace = paramspace.WithKeyTable(types.ParamKeyTable()) diff --git a/x/slashing/keeper/migrations.go b/x/slashing/keeper/migrations.go index 8db82718..a9f74f6a 100644 --- a/x/slashing/keeper/migrations.go +++ b/x/slashing/keeper/migrations.go @@ -2,7 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v043 "github.com/iqlusioninc/liquidity-staking-module/x/slashing/legacy/v043" + v043 "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v043" ) // Migrator is a struct for handling in-place store migrations. diff --git a/x/slashing/legacy/v039/types.go b/x/slashing/legacy/v039/types.go deleted file mode 100644 index 34eed337..00000000 --- a/x/slashing/legacy/v039/types.go +++ /dev/null @@ -1,79 +0,0 @@ -package v039 - -import ( - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - ModuleName = "slashing" -) - -// Default parameter namespace -const ( - DefaultParamspace = ModuleName - DefaultSignedBlocksWindow = int64(100) - DefaultDowntimeJailDuration = 60 * 10 * time.Second -) - -var ( - DefaultMinSignedPerWindow = sdk.NewDecWithPrec(5, 1) - DefaultSlashFractionDoubleSign = sdk.NewDec(1).Quo(sdk.NewDec(20)) - DefaultSlashFractionDowntime = sdk.NewDec(1).Quo(sdk.NewDec(100)) -) - -// Params - used for initializing default parameter for slashing at genesis -type Params struct { - SignedBlocksWindow int64 `json:"signed_blocks_window" yaml:"signed_blocks_window"` - MinSignedPerWindow sdk.Dec `json:"min_signed_per_window" yaml:"min_signed_per_window"` - DowntimeJailDuration time.Duration `json:"downtime_jail_duration" yaml:"downtime_jail_duration"` - SlashFractionDoubleSign sdk.Dec `json:"slash_fraction_double_sign" yaml:"slash_fraction_double_sign"` - SlashFractionDowntime sdk.Dec `json:"slash_fraction_downtime" yaml:"slash_fraction_downtime"` -} - -// NewParams creates a new Params object -func NewParams( - signedBlocksWindow int64, minSignedPerWindow sdk.Dec, downtimeJailDuration time.Duration, - slashFractionDoubleSign, slashFractionDowntime sdk.Dec, -) Params { - - return Params{ - SignedBlocksWindow: signedBlocksWindow, - MinSignedPerWindow: minSignedPerWindow, - DowntimeJailDuration: downtimeJailDuration, - SlashFractionDoubleSign: slashFractionDoubleSign, - SlashFractionDowntime: slashFractionDowntime, - } -} - -// DefaultParams defines the parameters for this module -func DefaultParams() Params { - return NewParams( - DefaultSignedBlocksWindow, DefaultMinSignedPerWindow, DefaultDowntimeJailDuration, - DefaultSlashFractionDoubleSign, DefaultSlashFractionDowntime, - ) -} - -// ValidatorSigningInfo defines the signing info for a validator -type ValidatorSigningInfo struct { - Address sdk.ConsAddress `json:"address" yaml:"address"` // validator consensus address - StartHeight int64 `json:"start_height" yaml:"start_height"` // height at which validator was first a candidate OR was unjailed - IndexOffset int64 `json:"index_offset" yaml:"index_offset"` // index offset into signed block bit array - JailedUntil time.Time `json:"jailed_until" yaml:"jailed_until"` // timestamp validator cannot be unjailed until - Tombstoned bool `json:"tombstoned" yaml:"tombstoned"` // whether or not a validator has been tombstoned (killed out of validator set) - MissedBlocksCounter int64 `json:"missed_blocks_counter" yaml:"missed_blocks_counter"` // missed blocks counter (to avoid scanning the array every time) -} - -// MissedBlock -type MissedBlock struct { - Index int64 `json:"index" yaml:"index"` - Missed bool `json:"missed" yaml:"missed"` -} - -// GenesisState - all slashing state that must be provided at genesis -type GenesisState struct { - Params Params `json:"params" yaml:"params"` - SigningInfos map[string]ValidatorSigningInfo `json:"signing_infos" yaml:"signing_infos"` - MissedBlocks map[string][]MissedBlock `json:"missed_blocks" yaml:"missed_blocks"` -} diff --git a/x/slashing/legacy/v040/keys.go b/x/slashing/legacy/v040/keys.go deleted file mode 100644 index 02cefbc4..00000000 --- a/x/slashing/legacy/v040/keys.go +++ /dev/null @@ -1,69 +0,0 @@ -// Package v040 is copy-pasted from: -// https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/slashing/types/keys.go -package v040 - -import ( - "encoding/binary" - - sdk "github.com/cosmos/cosmos-sdk/types" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" -) - -const ( - // ModuleName is the name of the module - ModuleName = "slashing" - - // StoreKey is the store key string for slashing - StoreKey = ModuleName - - // RouterKey is the message route for slashing - RouterKey = ModuleName - - // QuerierRoute is the querier route for slashing - QuerierRoute = ModuleName -) - -// Keys for slashing store -// Items are stored with the following key: values -// -// - 0x01: ValidatorSigningInfo -// -// - 0x02: bool -// -// - 0x03: crypto.PubKey -var ( - ValidatorSigningInfoKeyPrefix = []byte{0x01} // Prefix for signing info - ValidatorMissedBlockBitArrayKeyPrefix = []byte{0x02} // Prefix for missed block bit array - AddrPubkeyRelationKeyPrefix = []byte{0x03} // Prefix for address-pubkey relation -) - -// ValidatorSigningInfoKey - stored by *Consensus* address (not operator address) -func ValidatorSigningInfoKey(v sdk.ConsAddress) []byte { - return append(ValidatorSigningInfoKeyPrefix, v.Bytes()...) -} - -// ValidatorSigningInfoAddress - extract the address from a validator signing info key -func ValidatorSigningInfoAddress(key []byte) (v sdk.ConsAddress) { - addr := key[1:] - if len(addr) != v040auth.AddrLen { - panic("unexpected key length") - } - return sdk.ConsAddress(addr) -} - -// ValidatorMissedBlockBitArrayPrefixKey - stored by *Consensus* address (not operator address) -func ValidatorMissedBlockBitArrayPrefixKey(v sdk.ConsAddress) []byte { - return append(ValidatorMissedBlockBitArrayKeyPrefix, v.Bytes()...) -} - -// ValidatorMissedBlockBitArrayKey - stored by *Consensus* address (not operator address) -func ValidatorMissedBlockBitArrayKey(v sdk.ConsAddress, i int64) []byte { - b := make([]byte, 8) - binary.LittleEndian.PutUint64(b, uint64(i)) - return append(ValidatorMissedBlockBitArrayPrefixKey(v), b...) -} - -// AddrPubkeyRelationKey gets pubkey relation key used to get the pubkey from the address -func AddrPubkeyRelationKey(address []byte) []byte { - return append(AddrPubkeyRelationKeyPrefix, address...) -} diff --git a/x/slashing/legacy/v040/migrate.go b/x/slashing/legacy/v040/migrate.go deleted file mode 100644 index 489c8d11..00000000 --- a/x/slashing/legacy/v040/migrate.go +++ /dev/null @@ -1,64 +0,0 @@ -package v040 - -import ( - "sort" - - v039slashing "github.com/iqlusioninc/liquidity-staking-module/x/slashing/legacy/v039" - v040slashing "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" -) - -// Migrate accepts exported x/slashing genesis state from v0.39 and migrates it -// to v0.40 x/slashing genesis state. The migration includes: -// -// - Chaning SigningInfos and MissedBlocks from map to array. -// - Convert addresses from bytes to bech32 strings. -// - Re-encode in v0.40 GenesisState. -func Migrate(oldGenState v039slashing.GenesisState) *v040slashing.GenesisState { - // Note that the two following `for` loop over a map's keys, so are not - // deterministic. - var newSigningInfos = make([]v040slashing.SigningInfo, 0, len(oldGenState.SigningInfos)) - for address, signingInfo := range oldGenState.SigningInfos { - newSigningInfos = append(newSigningInfos, v040slashing.SigningInfo{ - Address: address, - ValidatorSigningInfo: v040slashing.ValidatorSigningInfo{ - Address: signingInfo.Address.String(), - StartHeight: signingInfo.StartHeight, - IndexOffset: signingInfo.IndexOffset, - JailedUntil: signingInfo.JailedUntil, - Tombstoned: signingInfo.Tombstoned, - MissedBlocksCounter: signingInfo.MissedBlocksCounter, - }, - }) - } - var newValidatorMissedBlocks = make([]v040slashing.ValidatorMissedBlocks, 0, len(oldGenState.MissedBlocks)) - for address, validatorMissedBlocks := range oldGenState.MissedBlocks { - var newMissedBlocks = make([]v040slashing.MissedBlock, len(validatorMissedBlocks)) - for i, missedBlock := range validatorMissedBlocks { - newMissedBlocks[i] = v040slashing.MissedBlock{ - Index: missedBlock.Index, - Missed: missedBlock.Missed, - } - } - - newValidatorMissedBlocks = append(newValidatorMissedBlocks, v040slashing.ValidatorMissedBlocks{ - Address: address, - MissedBlocks: newMissedBlocks, - }) - } - - // We sort these two arrays by address, so that we get determinstic states. - sort.Slice(newSigningInfos, func(i, j int) bool { return newSigningInfos[i].Address < newSigningInfos[j].Address }) - sort.Slice(newValidatorMissedBlocks, func(i, j int) bool { return newValidatorMissedBlocks[i].Address < newValidatorMissedBlocks[j].Address }) - - return &v040slashing.GenesisState{ - Params: v040slashing.Params{ - SignedBlocksWindow: oldGenState.Params.SignedBlocksWindow, - MinSignedPerWindow: oldGenState.Params.MinSignedPerWindow, - DowntimeJailDuration: oldGenState.Params.DowntimeJailDuration, - SlashFractionDoubleSign: oldGenState.Params.SlashFractionDoubleSign, - SlashFractionDowntime: oldGenState.Params.SlashFractionDowntime, - }, - SigningInfos: newSigningInfos, - MissedBlocks: newValidatorMissedBlocks, - } -} diff --git a/x/slashing/legacy/v040/migrate_test.go b/x/slashing/legacy/v040/migrate_test.go deleted file mode 100644 index 2e611be0..00000000 --- a/x/slashing/legacy/v040/migrate_test.go +++ /dev/null @@ -1,140 +0,0 @@ -package v040_test - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/client" - sdk "github.com/cosmos/cosmos-sdk/types" - simapp "github.com/iqlusioninc/liquidity-staking-module/app" - v039slashing "github.com/iqlusioninc/liquidity-staking-module/x/slashing/legacy/v039" - v040slashing "github.com/iqlusioninc/liquidity-staking-module/x/slashing/legacy/v040" -) - -func TestMigrate(t *testing.T) { - encodingConfig := simapp.MakeTestEncodingConfig() - clientCtx := client.Context{}. - WithInterfaceRegistry(encodingConfig.InterfaceRegistry). - WithTxConfig(encodingConfig.TxConfig). - WithLegacyAmino(encodingConfig.Amino). - WithJSONCodec(encodingConfig.Marshaler) - - addr1, err := sdk.ConsAddressFromBech32("cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685") - require.NoError(t, err) - addr2, err := sdk.ConsAddressFromBech32("cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph") - require.NoError(t, err) - - gs := v039slashing.GenesisState{ - Params: v039slashing.DefaultParams(), - SigningInfos: map[string]v039slashing.ValidatorSigningInfo{ - "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph": { - Address: addr2, - IndexOffset: 615501, - MissedBlocksCounter: 1, - Tombstoned: false, - }, - "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685": { - Address: addr1, - IndexOffset: 2, - MissedBlocksCounter: 2, - Tombstoned: false, - }, - }, - MissedBlocks: map[string][]v039slashing.MissedBlock{ - "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph": { - { - Index: 2, - Missed: true, - }, - }, - "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685": { - { - Index: 3, - Missed: true, - }, - { - Index: 4, - Missed: true, - }, - }, - }, - } - - migrated := v040slashing.Migrate(gs) - // Check that in `signing_infos` and `missed_blocks`, the address - // cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685 - // should always come before the address - // cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph - // (in alphabetic order, basically). - expected := `{ - "missed_blocks": [ - { - "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", - "missed_blocks": [ - { - "index": "3", - "missed": true - }, - { - "index": "4", - "missed": true - } - ] - }, - { - "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", - "missed_blocks": [ - { - "index": "2", - "missed": true - } - ] - } - ], - "params": { - "downtime_jail_duration": "600s", - "min_signed_per_window": "0.500000000000000000", - "signed_blocks_window": "100", - "slash_fraction_double_sign": "0.050000000000000000", - "slash_fraction_downtime": "0.010000000000000000" - }, - "signing_infos": [ - { - "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", - "validator_signing_info": { - "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", - "index_offset": "2", - "jailed_until": "0001-01-01T00:00:00Z", - "missed_blocks_counter": "2", - "start_height": "0", - "tombstoned": false - } - }, - { - "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", - "validator_signing_info": { - "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", - "index_offset": "615501", - "jailed_until": "0001-01-01T00:00:00Z", - "missed_blocks_counter": "1", - "start_height": "0", - "tombstoned": false - } - } - ] -}` - - bz, err := clientCtx.Codec.MarshalJSON(migrated) - require.NoError(t, err) - - // Indent the JSON bz correctly. - var jsonObj map[string]interface{} - err = json.Unmarshal(bz, &jsonObj) - require.NoError(t, err) - indentedBz, err := json.MarshalIndent(jsonObj, "", " ") - require.NoError(t, err) - - require.Equal(t, expected, string(indentedBz)) -} diff --git a/x/slashing/legacy/v043/store.go b/x/slashing/legacy/v043/store.go deleted file mode 100644 index 683f530e..00000000 --- a/x/slashing/legacy/v043/store.go +++ /dev/null @@ -1,20 +0,0 @@ -package v043 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v043distribution "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v043" - v040slashing "github.com/iqlusioninc/liquidity-staking-module/x/slashing/legacy/v040" -) - -// MigrateStore performs in-place store migrations from v0.40 to v0.43. The -// migration includes: -// -// - Change addresses to be length-prefixed. -func MigrateStore(ctx sdk.Context, storeKey sdk.StoreKey) error { - store := ctx.KVStore(storeKey) - v043distribution.MigratePrefixAddress(store, v040slashing.ValidatorSigningInfoKeyPrefix) - v043distribution.MigratePrefixAddressBytes(store, v040slashing.ValidatorMissedBlockBitArrayKeyPrefix) - v043distribution.MigratePrefixAddress(store, v040slashing.AddrPubkeyRelationKeyPrefix) - - return nil -} diff --git a/x/slashing/legacy/v043/store_test.go b/x/slashing/legacy/v043/store_test.go deleted file mode 100644 index 8d984928..00000000 --- a/x/slashing/legacy/v043/store_test.go +++ /dev/null @@ -1,68 +0,0 @@ -package v043_test - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - v040slashing "github.com/iqlusioninc/liquidity-staking-module/x/slashing/legacy/v040" - v043slashing "github.com/iqlusioninc/liquidity-staking-module/x/slashing/legacy/v043" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" -) - -func TestStoreMigration(t *testing.T) { - slashingKey := sdk.NewKVStoreKey("slashing") - ctx := testutil.DefaultContext(slashingKey, sdk.NewTransientStoreKey("transient_test")) - store := ctx.KVStore(slashingKey) - - _, _, addr1 := testdata.KeyTestPubAddr() - consAddr := sdk.ConsAddress(addr1) - // Use dummy value for all keys. - value := []byte("foo") - - testCases := []struct { - name string - oldKey []byte - newKey []byte - }{ - { - "ValidatorSigningInfoKey", - v040slashing.ValidatorSigningInfoKey(consAddr), - types.ValidatorSigningInfoKey(consAddr), - }, - { - "ValidatorMissedBlockBitArrayKey", - v040slashing.ValidatorMissedBlockBitArrayKey(consAddr, 2), - types.ValidatorMissedBlockBitArrayKey(consAddr, 2), - }, - { - "AddrPubkeyRelationKey", - v040slashing.AddrPubkeyRelationKey(consAddr), - types.AddrPubkeyRelationKey(consAddr), - }, - } - - // Set all the old keys to the store - for _, tc := range testCases { - store.Set(tc.oldKey, value) - } - - // Run migrations. - err := v043slashing.MigrateStore(ctx, slashingKey) - require.NoError(t, err) - - // Make sure the new keys are set and old keys are deleted. - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - if !bytes.Equal(tc.oldKey, tc.newKey) { - require.Nil(t, store.Get(tc.oldKey)) - } - require.Equal(t, value, store.Get(tc.newKey)) - }) - } -} diff --git a/x/slashing/module.go b/x/slashing/module.go index 221dd710..312adbd9 100644 --- a/x/slashing/module.go +++ b/x/slashing/module.go @@ -20,7 +20,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/client/cli" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/client/rest" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" @@ -72,9 +71,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncod } // RegisterRESTRoutes registers the REST routes for the slashing module. -func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { - rest.RegisterHandlers(clientCtx, rtr) -} +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) {} // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the slashig module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { diff --git a/x/slashing/simulation/operations.go b/x/slashing/simulation/operations.go index 4546f096..88c73660 100644 --- a/x/slashing/simulation/operations.go +++ b/x/slashing/simulation/operations.go @@ -103,7 +103,7 @@ func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Kee return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err } - _, res, err := app.Deliver(txGen.TxEncoder(), tx) + _, res, err := app.SimDeliver(txGen.TxEncoder(), tx) // result should fail if: // - validator cannot be unjailed due to tombstone diff --git a/x/staking/client/rest/grpc_query_test.go b/x/staking/client/rest/grpc_query_test.go deleted file mode 100644 index fd0dfece..00000000 --- a/x/staking/client/rest/grpc_query_test.go +++ /dev/null @@ -1,828 +0,0 @@ -//go:build norace -// +build norace - -package rest_test - -import ( - "fmt" - "testing" - - "github.com/gogo/protobuf/proto" - "github.com/stretchr/testify/suite" - - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/network" - sdk "github.com/cosmos/cosmos-sdk/types" - grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" - "github.com/cosmos/cosmos-sdk/types/query" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" - stakingtestutil "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/testutil" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -type IntegrationTestSuite struct { - suite.Suite - - cfg network.Config - network *network.Network -} - -func (s *IntegrationTestSuite) SetupSuite() { - s.T().Log("setting up integration test suite") - - cfg := network.DefaultConfig() - cfg.NumValidators = 2 - - s.cfg = cfg - s.network = network.New(s.T(), cfg) - - _, err := s.network.WaitForHeight(1) - s.Require().NoError(err) - - unbond, err := sdk.ParseCoinNormalized("10stake") - s.Require().NoError(err) - - val := s.network.Validators[0] - val2 := s.network.Validators[1] - - // redelegate - _, err = stakingtestutil.MsgRedelegateExec( - val.ClientCtx, - val.Address, - val.ValAddress, - val2.ValAddress, - unbond, - fmt.Sprintf("--%s=%d", flags.FlagGas, 254000), - ) // expected gas is 202987 - - s.Require().NoError(err) - _, err = s.network.WaitForHeight(1) - s.Require().NoError(err) - - // unbonding - _, err = stakingtestutil.MsgUnbondExec(val.ClientCtx, val.Address, val.ValAddress, unbond) - s.Require().NoError(err) - _, err = s.network.WaitForHeight(1) - s.Require().NoError(err) -} - -func (s *IntegrationTestSuite) TearDownSuite() { - s.T().Log("tearing down integration test suite") - s.network.Cleanup() -} - -func (s *IntegrationTestSuite) TestQueryValidatorsGRPCHandler() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - }{ - { - "test query validators gRPC route with invalid status", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators?status=active", baseURL), - true, - }, - { - "test query validators gRPC route without status query param", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators", baseURL), - false, - }, - { - "test query validators gRPC route with valid status", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators?status=%s", baseURL, types.Bonded.String()), - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - var valRes types.QueryValidatorsResponse - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &valRes) - - if tc.error { - s.Require().Error(err) - s.Require().Nil(valRes.Validators) - s.Require().Equal(0, len(valRes.Validators)) - } else { - s.Require().NoError(err) - s.Require().NotNil(valRes.Validators) - s.Require().Equal(len(s.network.Validators), len(valRes.Validators)) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryValidatorGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - }{ - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s", baseURL, "wrongValidatorAddress"), - true, - }, - { - "with no validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s", baseURL, ""), - true, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s", baseURL, val.ValAddress.String()), - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - var validator types.QueryValidatorResponse - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &validator) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().NotNil(validator.Validator) - s.Require().Equal(s.network.Validators[0].ValAddress.String(), validator.Validator.OperatorAddress) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryValidatorDelegationsGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - headers map[string]string - error bool - respType proto.Message - expectedResp proto.Message - }{ - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations", baseURL, "wrongValAddress"), - map[string]string{}, - true, - &types.QueryValidatorDelegationsResponse{}, - nil, - }, - { - "with no validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations", baseURL, ""), - map[string]string{}, - true, - &types.QueryValidatorDelegationsResponse{}, - nil, - }, - { - "valid request(height specific)", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations", baseURL, val.ValAddress.String()), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "1", - }, - false, - &types.QueryValidatorDelegationsResponse{}, - &types.QueryValidatorDelegationsResponse{ - DelegationResponses: types.DelegationResponses{ - types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), - }, - Pagination: &query.PageResponse{Total: 1}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) - s.Require().NoError(err) - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().Equal(tc.expectedResp.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryValidatorUnbondingDelegationsGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - }{ - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/unbonding_delegations", baseURL, "wrongValAddress"), - true, - }, - { - "with no validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/unbonding_delegations", baseURL, ""), - true, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/unbonding_delegations", baseURL, val.ValAddress.String()), - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - var ubds types.QueryValidatorUnbondingDelegationsResponse - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubds) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().Len(ubds.UnbondingResponses, 1) - s.Require().Equal(ubds.UnbondingResponses[0].ValidatorAddress, val.ValAddress.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryDelegationGRPC() { - val := s.network.Validators[0] - val2 := s.network.Validators[1] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - respType proto.Message - expectedResp proto.Message - }{ - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, "wrongValAddress", val.Address.String()), - true, - &types.QueryDelegationResponse{}, - nil, - }, - { - "wrong account address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, val.ValAddress.String(), "wrongAccAddress"), - true, - &types.QueryDelegationResponse{}, - nil, - }, - { - "with no validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, "", val.Address.String()), - true, - &types.QueryDelegationResponse{}, - nil, - }, - { - "with no account address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, val.ValAddress.String(), ""), - true, - &types.QueryDelegationResponse{}, - nil, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, val2.ValAddress.String(), val.Address.String()), - false, - &types.QueryDelegationResponse{}, - &types.QueryDelegationResponse{ - DelegationResponse: &types.DelegationResponse{ - Delegation: types.Delegation{ - DelegatorAddress: val.Address.String(), - ValidatorAddress: val2.ValAddress.String(), - Shares: sdk.NewDec(10), - }, - Balance: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), - }, - }, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - s.T().Logf("%s", resp) - err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().Equal(tc.expectedResp.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryUnbondingDelegationGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - }{ - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, "wrongValAddress", val.Address.String()), - true, - }, - { - "wrong account address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, val.ValAddress.String(), "wrongAccAddress"), - true, - }, - { - "with no validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, "", val.Address.String()), - true, - }, - { - "with no account address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, val.ValAddress.String(), ""), - true, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, val.ValAddress.String(), val.Address.String()), - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - var ubd types.QueryUnbondingDelegationResponse - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubd) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().Equal(ubd.Unbond.DelegatorAddress, val.Address.String()) - s.Require().Equal(ubd.Unbond.ValidatorAddress, val.ValAddress.String()) - s.Require().Len(ubd.Unbond.Entries, 1) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryDelegatorDelegationsGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - // Create new account in the keyring for address without delegations. - info, _, err := val.ClientCtx.Keyring.NewMnemonic("test", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) - s.Require().NoError(err) - newAddr := sdk.AccAddress(info.GetPubKey().Address()) - - testCases := []struct { - name string - url string - headers map[string]string - error bool - respType proto.Message - expectedResp proto.Message - }{ - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", baseURL, "wrongValAddress"), - map[string]string{}, - true, - &types.QueryDelegatorDelegationsResponse{}, - nil, - }, - { - "with no validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", baseURL, ""), - map[string]string{}, - true, - &types.QueryDelegatorDelegationsResponse{}, - nil, - }, - { - "valid request (height specific)", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", baseURL, val.Address.String()), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "1", - }, - false, - &types.QueryDelegatorDelegationsResponse{}, - &types.QueryDelegatorDelegationsResponse{ - DelegationResponses: types.DelegationResponses{ - types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), - }, - Pagination: &query.PageResponse{Total: 1}, - }, - }, - { - "address without delegations", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", baseURL, newAddr.String()), - map[string]string{ - grpctypes.GRPCBlockHeightHeader: "1", - }, - false, - &types.QueryDelegatorDelegationsResponse{}, - &types.QueryDelegatorDelegationsResponse{ - DelegationResponses: types.DelegationResponses{}, - Pagination: &query.PageResponse{Total: 0}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) - s.Require().NoError(err) - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().Equal(tc.expectedResp.String(), tc.respType.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryDelegatorUnbondingDelegationsGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - ubdsLength int - }{ - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", baseURL, "wrongValAddress"), - true, - 0, - }, - { - "with no validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", baseURL, ""), - true, - 0, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", baseURL, val.Address.String()), - false, - 1, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - var ubds types.QueryDelegatorUnbondingDelegationsResponse - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubds) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().Len(ubds.UnbondingResponses, tc.ubdsLength) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryRedelegationsGRPC() { - val := s.network.Validators[0] - val2 := s.network.Validators[1] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - }{ - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations", baseURL, "wrongValAddress"), - true, - }, - { - "with no validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations", baseURL, ""), - true, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations", baseURL, val.Address.String()), - false, - }, - { - "valid request with src address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations?src_validator_addr=%s", baseURL, val.Address.String(), val.ValAddress.String()), - false, - }, - { - "valid request with dst address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations?dst_validator_addr=%s", baseURL, val.Address.String(), val2.ValAddress.String()), - false, - }, - { - "valid request with dst address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations?src_validator_addr=%s&dst_validator_addr=%s", baseURL, val.Address.String(), val.ValAddress.String(), val2.ValAddress.String()), - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - var redelegations types.QueryRedelegationsResponse - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &redelegations) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - - s.Require().Len(redelegations.RedelegationResponses, 1) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryDelegatorValidatorsGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - }{ - { - "wrong delegator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators", baseURL, "wrongDelAddress"), - true, - }, - { - "with no delegator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators", baseURL, ""), - true, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators", baseURL, val.Address.String()), - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - var validators types.QueryDelegatorValidatorsResponse - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &validators) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().Len(validators.Validators, len(s.network.Validators)) - s.Require().Equal(int(validators.Pagination.Total), len(s.network.Validators)) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryDelegatorValidatorGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - }{ - { - "wrong delegator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, "wrongAccAddress", val.ValAddress.String()), - true, - }, - { - "wrong validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, val.Address.String(), "wrongValAddress"), - true, - }, - { - "with empty delegator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, "", val.ValAddress.String()), - true, - }, - { - "with empty validator address", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, val.Address.String(), ""), - true, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, val.Address.String(), val.ValAddress.String()), - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - var validator types.QueryDelegatorValidatorResponse - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &validator) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().NotNil(validator) - s.Require().Equal(validator.Validator.OperatorAddress, val.ValAddress.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryHistoricalInfoGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - error bool - }{ - { - "wrong height", - fmt.Sprintf("%s/cosmos/staking/v1beta1/historical_info/%s", baseURL, "-1"), - true, - }, - { - "with no height", - fmt.Sprintf("%s/cosmos/staking/v1beta1/historical_info/%s", baseURL, ""), - true, - }, - { - "valid request", - fmt.Sprintf("%s/cosmos/staking/v1beta1/historical_info/%s", baseURL, "2"), - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - resp, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - var historicalInfo types.QueryHistoricalInfoResponse - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &historicalInfo) - - if tc.error { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().NotNil(historicalInfo) - } - }) - } -} - -func (s *IntegrationTestSuite) TestQueryParamsGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - respType proto.Message - expected proto.Message - }{ - { - "gRPC request params", - fmt.Sprintf("%s/cosmos/staking/v1beta1/params", baseURL), - &types.QueryParamsResponse{}, - &types.QueryParamsResponse{ - Params: types.DefaultParams(), - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := rest.GetRequest(tc.url) - s.Run(tc.name, func() { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected, tc.respType) - }) - } -} - -func (s *IntegrationTestSuite) TestQueryPoolGRPC() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - respType proto.Message - expected proto.Message - }{ - { - "gRPC request params", - fmt.Sprintf("%s/cosmos/staking/v1beta1/pool", baseURL), - &types.QueryPoolResponse{}, - &types.QueryPoolResponse{ - Pool: types.Pool{ - NotBondedTokens: sdk.NewInt(10), - BondedTokens: cli.DefaultTokens.Mul(sdk.NewInt(2)).Sub(sdk.NewInt(10)), - }, - }, - }, - } - - for _, tc := range testCases { - tc := tc - resp, err := rest.GetRequest(tc.url) - s.Run(tc.name, func() { - s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) - s.Require().Equal(tc.expected, tc.respType) - }) - } -} - -func TestIntegrationTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} diff --git a/x/staking/client/rest/query.go b/x/staking/client/rest/query.go deleted file mode 100644 index 13dbcaab..00000000 --- a/x/staking/client/rest/query.go +++ /dev/null @@ -1,400 +0,0 @@ -package rest - -import ( - "fmt" - "net/http" - "strconv" - "strings" - - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - clientrest "github.com/cosmos/cosmos-sdk/client/rest" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -func registerQueryRoutes(clientCtx client.Context, r *mux.Router) { - // Get all delegations from a delegator - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/delegations", - delegatorDelegationsHandlerFn(clientCtx), - ).Methods("GET") - - // Get all unbonding delegations from a delegator - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/unbonding_delegations", - delegatorUnbondingDelegationsHandlerFn(clientCtx), - ).Methods("GET") - - // Get all staking txs (i.e msgs) from a delegator - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/txs", - delegatorTxsHandlerFn(clientCtx), - ).Methods("GET") - - // Query all validators that a delegator is bonded to - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/validators", - delegatorValidatorsHandlerFn(clientCtx), - ).Methods("GET") - - // Query a validator that a delegator is bonded to - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/validators/{validatorAddr}", - delegatorValidatorHandlerFn(clientCtx), - ).Methods("GET") - - // Query a delegation between a delegator and a validator - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/delegations/{validatorAddr}", - delegationHandlerFn(clientCtx), - ).Methods("GET") - - // Query all unbonding delegations between a delegator and a validator - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/unbonding_delegations/{validatorAddr}", - unbondingDelegationHandlerFn(clientCtx), - ).Methods("GET") - - // Query redelegations (filters in query params) - r.HandleFunc( - "/staking/redelegations", - redelegationsHandlerFn(clientCtx), - ).Methods("GET") - - // Get all validators - r.HandleFunc( - "/staking/validators", - validatorsHandlerFn(clientCtx), - ).Methods("GET") - - // Get a single validator info - r.HandleFunc( - "/staking/validators/{validatorAddr}", - validatorHandlerFn(clientCtx), - ).Methods("GET") - - // Get all delegations to a validator - r.HandleFunc( - "/staking/validators/{validatorAddr}/delegations", - validatorDelegationsHandlerFn(clientCtx), - ).Methods("GET") - - // Get all unbonding delegations from a validator - r.HandleFunc( - "/staking/validators/{validatorAddr}/unbonding_delegations", - validatorUnbondingDelegationsHandlerFn(clientCtx), - ).Methods("GET") - - // Get HistoricalInfo at a given height - r.HandleFunc( - "/staking/historical_info/{height}", - historicalInfoHandlerFn(clientCtx), - ).Methods("GET") - - // Get the current state of the staking pool - r.HandleFunc( - "/staking/pool", - poolHandlerFn(clientCtx), - ).Methods("GET") - - // Get the current staking parameter values - r.HandleFunc( - "/staking/parameters", - paramsHandlerFn(clientCtx), - ).Methods("GET") -} - -// HTTP request handler to query a delegator delegations -func delegatorDelegationsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return queryDelegator(clientCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegatorDelegations)) -} - -// HTTP request handler to query a delegator unbonding delegations -func delegatorUnbondingDelegationsHandlerFn(cliCtx client.Context) http.HandlerFunc { - return queryDelegator(cliCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegatorUnbondingDelegations)) -} - -// HTTP request handler to query all staking txs (msgs) from a delegator -func delegatorTxsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var typesQuerySlice []string - - vars := mux.Vars(r) - delegatorAddr := vars["delegatorAddr"] - - if _, err := sdk.AccAddressFromBech32(delegatorAddr); rest.CheckBadRequestError(w, err) { - return - } - - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - typesQuery := r.URL.Query().Get("type") - trimmedQuery := strings.TrimSpace(typesQuery) - - if len(trimmedQuery) != 0 { - typesQuerySlice = strings.Split(trimmedQuery, " ") - } - - noQuery := len(typesQuerySlice) == 0 - isBondTx := contains(typesQuerySlice, "bond") - isUnbondTx := contains(typesQuerySlice, "unbond") - isRedTx := contains(typesQuerySlice, "redelegate") - - var ( - txs []*sdk.SearchTxsResult - actions []string - ) - - // For each case, we search txs for both: - // - legacy messages: their Type() is a custom string, e.g. "delegate" - // - service Msgs: their Type() is their FQ method name, e.g. "/cosmos.staking.v1beta1.MsgDelegate" - // and we combine the results. - switch { - case isBondTx: - actions = append(actions, types.TypeMsgDelegate) - - case isUnbondTx: - actions = append(actions, types.TypeMsgUndelegate) - - case isRedTx: - actions = append(actions, types.TypeMsgBeginRedelegate) - - case noQuery: - actions = append(actions, types.TypeMsgDelegate) - actions = append(actions, types.TypeMsgUndelegate) - actions = append(actions, types.TypeMsgBeginRedelegate) - - default: - w.WriteHeader(http.StatusNoContent) - return - } - - for _, action := range actions { - foundTxs, errQuery := queryTxs(clientCtx, action, delegatorAddr) - if rest.CheckInternalServerError(w, errQuery) { - return - } - - txs = append(txs, foundTxs) - } - - res, err := clientCtx.LegacyAmino.MarshalJSON(txs) - if rest.CheckInternalServerError(w, err) { - return - } - - rest.PostProcessResponseBare(w, clientCtx, res) - } -} - -// HTTP request handler to query an unbonding-delegation -func unbondingDelegationHandlerFn(cliCtx client.Context) http.HandlerFunc { - return queryBonds(cliCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryUnbondingDelegation)) -} - -// HTTP request handler to query redelegations -func redelegationsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var params types.QueryRedelegationParams - - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - bechDelegatorAddr := r.URL.Query().Get("delegator") - bechSrcValidatorAddr := r.URL.Query().Get("validator_from") - bechDstValidatorAddr := r.URL.Query().Get("validator_to") - - if len(bechDelegatorAddr) != 0 { - delegatorAddr, err := sdk.AccAddressFromBech32(bechDelegatorAddr) - if rest.CheckBadRequestError(w, err) { - return - } - - params.DelegatorAddr = delegatorAddr - } - - if len(bechSrcValidatorAddr) != 0 { - srcValidatorAddr, err := sdk.ValAddressFromBech32(bechSrcValidatorAddr) - if rest.CheckBadRequestError(w, err) { - return - } - - params.SrcValidatorAddr = srcValidatorAddr - } - - if len(bechDstValidatorAddr) != 0 { - dstValidatorAddr, err := sdk.ValAddressFromBech32(bechDstValidatorAddr) - if rest.CheckBadRequestError(w, err) { - return - } - - params.DstValidatorAddr = dstValidatorAddr - } - - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if rest.CheckBadRequestError(w, err) { - return - } - - res, height, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryRedelegations), bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -// HTTP request handler to query a delegation -func delegationHandlerFn(clientCtx client.Context) http.HandlerFunc { - return queryBonds(clientCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegation)) -} - -// HTTP request handler to query all delegator bonded validators -func delegatorValidatorsHandlerFn(cliCtx client.Context) http.HandlerFunc { - return queryDelegator(cliCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegatorValidators)) -} - -// HTTP request handler to get information from a currently bonded validator -func delegatorValidatorHandlerFn(cliCtx client.Context) http.HandlerFunc { - return queryBonds(cliCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegatorValidator)) -} - -// HTTP request handler to query list of validators -func validatorsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) - if rest.CheckBadRequestError(w, err) { - return - } - - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - status := r.FormValue("status") - // These are query params that were available in =<0.39. We show a nice - // error message for this breaking change. - if status == "bonded" || status == "unbonding" || status == "unbonded" { - err := fmt.Errorf("cosmos sdk v0.40 introduces a breaking change on this endpoint:"+ - " instead of querying using `?status=%s`, please use `status=BOND_STATUS_%s`. For more"+ - " info, please see our REST endpoint migration guide at %s", status, strings.ToUpper(status), clientrest.DeprecationURL) - - if rest.CheckBadRequestError(w, err) { - return - } - - } - - if status == "" { - status = types.BondStatusBonded - } - - params := types.NewQueryValidatorsParams(page, limit, status) - - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if rest.CheckBadRequestError(w, err) { - return - } - - route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryValidators) - - res, height, err := clientCtx.QueryWithData(route, bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -// HTTP request handler to query the validator information from a given validator address -func validatorHandlerFn(cliCtx client.Context) http.HandlerFunc { - return queryValidator(cliCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryValidator)) -} - -// HTTP request handler to query all unbonding delegations from a validator -func validatorDelegationsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return queryValidator(clientCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryValidatorDelegations)) -} - -// HTTP request handler to query all unbonding delegations from a validator -func validatorUnbondingDelegationsHandlerFn(cliCtx client.Context) http.HandlerFunc { - return queryValidator(cliCtx, fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryValidatorUnbondingDelegations)) -} - -// HTTP request handler to query historical info at a given height -func historicalInfoHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - heightStr := vars["height"] - - height, err := strconv.ParseInt(heightStr, 10, 64) - if err != nil || height < 0 { - rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("Must provide non-negative integer for height: %v", err)) - return - } - - params := types.QueryHistoricalInfoRequest{Height: height} - - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if rest.CheckInternalServerError(w, err) { - return - } - - res, height, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryHistoricalInfo), bz) - if rest.CheckBadRequestError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -// HTTP request handler to query the pool information -func poolHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - res, height, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryPool), nil) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -// HTTP request handler to query the staking params values -func paramsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - res, height, err := clientCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryParameters), nil) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} diff --git a/x/staking/client/rest/rest.go b/x/staking/client/rest/rest.go deleted file mode 100644 index 6f9b7e1e..00000000 --- a/x/staking/client/rest/rest.go +++ /dev/null @@ -1,14 +0,0 @@ -package rest - -import ( - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/rest" -) - -func RegisterHandlers(clientCtx client.Context, rtr *mux.Router) { - r := rest.WithHTTPDeprecationHeaders(rtr) - registerQueryRoutes(clientCtx, r) - registerTxHandlers(clientCtx, r) -} diff --git a/x/staking/client/rest/rest_test.go b/x/staking/client/rest/rest_test.go deleted file mode 100644 index ac7fc7aa..00000000 --- a/x/staking/client/rest/rest_test.go +++ /dev/null @@ -1,63 +0,0 @@ -//go:build norace -// +build norace - -package rest_test - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -func (s *IntegrationTestSuite) TestLegacyGetValidators() { - val := s.network.Validators[0] - baseURL := val.APIAddress - - testCases := []struct { - name string - url string - expErr bool - expErrMsg string - }{ - { - "old status should show error message", - fmt.Sprintf("%s/staking/validators?status=bonded", baseURL), - true, "cosmos sdk v0.40 introduces a breaking change on this endpoint: instead of" + - " querying using `?status=bonded`, please use `status=BOND_STATUS_BONDED`. For more" + - " info, please see our REST endpoint migration guide at https://docs.cosmos.network/master/migrations/rest.html", - }, - { - "new status should work", - fmt.Sprintf("%s/staking/validators?status=BOND_STATUS_BONDED", baseURL), - false, "", - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - respJSON, err := rest.GetRequest(tc.url) - s.Require().NoError(err) - - if tc.expErr { - var errResp rest.ErrorResponse - s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(respJSON, &errResp)) - - s.Require().Equal(errResp.Error, tc.expErrMsg) - } else { - var resp = rest.ResponseWithHeight{} - err = val.ClientCtx.LegacyAmino.UnmarshalJSON(respJSON, &resp) - s.Require().NoError(err) - - // Check result is not empty. - var validators []types.Validator - s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(resp.Result, &validators)) - s.Require().Greater(len(validators), 0) - // While we're at it, also check that the consensus_pubkey is - // an Any, and not bech32 anymore. - s.Require().Contains(string(resp.Result), "\"consensus_pubkey\": {\n \"type\": \"tendermint/PubKeyEd25519\",") - } - }) - } -} diff --git a/x/staking/client/rest/tx.go b/x/staking/client/rest/tx.go deleted file mode 100644 index 5f12dc6a..00000000 --- a/x/staking/client/rest/tx.go +++ /dev/null @@ -1,149 +0,0 @@ -package rest - -import ( - "bytes" - "net/http" - - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -func registerTxHandlers(clientCtx client.Context, r *mux.Router) { - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/delegations", - newPostDelegationsHandlerFn(clientCtx), - ).Methods("POST") - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/unbonding_delegations", - newPostUnbondingDelegationsHandlerFn(clientCtx), - ).Methods("POST") - r.HandleFunc( - "/staking/delegators/{delegatorAddr}/redelegations", - newPostRedelegationsHandlerFn(clientCtx), - ).Methods("POST") -} - -type ( - // DelegateRequest defines the properties of a delegation request's body. - DelegateRequest struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - DelegatorAddress sdk.AccAddress `json:"delegator_address" yaml:"delegator_address"` // in bech32 - ValidatorAddress sdk.ValAddress `json:"validator_address" yaml:"validator_address"` // in bech32 - Amount sdk.Coin `json:"amount" yaml:"amount"` - } - - // RedelegateRequest defines the properties of a redelegate request's body. - RedelegateRequest struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - DelegatorAddress sdk.AccAddress `json:"delegator_address" yaml:"delegator_address"` // in bech32 - ValidatorSrcAddress sdk.ValAddress `json:"validator_src_address" yaml:"validator_src_address"` // in bech32 - ValidatorDstAddress sdk.ValAddress `json:"validator_dst_address" yaml:"validator_dst_address"` // in bech32 - Amount sdk.Coin `json:"amount" yaml:"amount"` - } - - // UndelegateRequest defines the properties of a undelegate request's body. - UndelegateRequest struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - DelegatorAddress sdk.AccAddress `json:"delegator_address" yaml:"delegator_address"` // in bech32 - ValidatorAddress sdk.ValAddress `json:"validator_address" yaml:"validator_address"` // in bech32 - Amount sdk.Coin `json:"amount" yaml:"amount"` - } -) - -func newPostDelegationsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req DelegateRequest - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - msg := types.NewMsgDelegate(req.DelegatorAddress, req.ValidatorAddress, req.Amount) - if rest.CheckBadRequestError(w, msg.ValidateBasic()) { - return - } - - fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From) - if rest.CheckBadRequestError(w, err) { - return - } - - if !bytes.Equal(fromAddr, req.DelegatorAddress) { - rest.WriteErrorResponse(w, http.StatusUnauthorized, "must use own delegator address") - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg) - } -} - -func newPostRedelegationsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req RedelegateRequest - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - msg := types.NewMsgBeginRedelegate(req.DelegatorAddress, req.ValidatorSrcAddress, req.ValidatorDstAddress, req.Amount) - if rest.CheckBadRequestError(w, msg.ValidateBasic()) { - return - } - - fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From) - if rest.CheckBadRequestError(w, err) { - return - } - - if !bytes.Equal(fromAddr, req.DelegatorAddress) { - rest.WriteErrorResponse(w, http.StatusUnauthorized, "must use own delegator address") - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg) - } -} - -func newPostUnbondingDelegationsHandlerFn(clientCtx client.Context) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req UndelegateRequest - if !rest.ReadRESTReq(w, r, clientCtx.LegacyAmino, &req) { - return - } - - req.BaseReq = req.BaseReq.Sanitize() - if !req.BaseReq.ValidateBasic(w) { - return - } - - msg := types.NewMsgUndelegate(req.DelegatorAddress, req.ValidatorAddress, req.Amount) - if rest.CheckBadRequestError(w, msg.ValidateBasic()) { - return - } - - fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From) - if rest.CheckBadRequestError(w, err) { - return - } - - if !bytes.Equal(fromAddr, req.DelegatorAddress) { - rest.WriteErrorResponse(w, http.StatusUnauthorized, "must use own delegator address") - return - } - - tx.WriteGeneratedTxResponse(clientCtx, w, req.BaseReq, msg) - } -} diff --git a/x/staking/client/rest/utils.go b/x/staking/client/rest/utils.go deleted file mode 100644 index 70376848..00000000 --- a/x/staking/client/rest/utils.go +++ /dev/null @@ -1,144 +0,0 @@ -package rest - -import ( - "fmt" - "net/http" - - "github.com/gorilla/mux" - - "github.com/cosmos/cosmos-sdk/client" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -// contains checks if the a given query contains one of the tx types -func contains(stringSlice []string, txType string) bool { - for _, word := range stringSlice { - if word == txType { - return true - } - } - - return false -} - -// queries staking txs -func queryTxs(clientCtx client.Context, action string, delegatorAddr string) (*sdk.SearchTxsResult, error) { - page := 1 - limit := 100 - events := []string{ - fmt.Sprintf("%s.%s='%s'", sdk.EventTypeMessage, sdk.AttributeKeyAction, action), - fmt.Sprintf("%s.%s='%s'", sdk.EventTypeMessage, sdk.AttributeKeySender, delegatorAddr), - } - - return authtx.QueryTxsByEvents(clientCtx, events, page, limit, "") -} - -func queryBonds(clientCtx client.Context, endpoint string) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - bech32delegator := vars["delegatorAddr"] - bech32validator := vars["validatorAddr"] - - delegatorAddr, err := sdk.AccAddressFromBech32(bech32delegator) - if rest.CheckBadRequestError(w, err) { - return - } - - validatorAddr, err := sdk.ValAddressFromBech32(bech32validator) - if rest.CheckBadRequestError(w, err) { - return - } - - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - params := types.QueryDelegatorValidatorRequest{DelegatorAddr: delegatorAddr.String(), ValidatorAddr: validatorAddr.String()} - - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if rest.CheckBadRequestError(w, err) { - return - } - - res, height, err := clientCtx.QueryWithData(endpoint, bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -func queryDelegator(clientCtx client.Context, endpoint string) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - bech32delegator := vars["delegatorAddr"] - - delegatorAddr, err := sdk.AccAddressFromBech32(bech32delegator) - if rest.CheckBadRequestError(w, err) { - return - } - - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - params := types.NewQueryDelegatorParams(delegatorAddr) - - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if rest.CheckBadRequestError(w, err) { - return - } - - res, height, err := clientCtx.QueryWithData(endpoint, bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} - -func queryValidator(clientCtx client.Context, endpoint string) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - bech32validatorAddr := vars["validatorAddr"] - - _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) - if rest.CheckBadRequestError(w, err) { - return - } - - validatorAddr, err := sdk.ValAddressFromBech32(bech32validatorAddr) - if rest.CheckBadRequestError(w, err) { - return - } - - clientCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, clientCtx, r) - if !ok { - return - } - - params := types.NewQueryValidatorParams(validatorAddr, page, limit) - - bz, err := clientCtx.LegacyAmino.MarshalJSON(params) - if rest.CheckBadRequestError(w, err) { - return - } - - res, height, err := clientCtx.QueryWithData(endpoint, bz) - if rest.CheckInternalServerError(w, err) { - return - } - - clientCtx = clientCtx.WithHeight(height) - rest.PostProcessResponse(w, clientCtx, res) - } -} diff --git a/x/staking/keeper/keeper.go b/x/staking/keeper/keeper.go index 4c2d73c2..2866825c 100644 --- a/x/staking/keeper/keeper.go +++ b/x/staking/keeper/keeper.go @@ -6,6 +6,7 @@ import ( "github.com/tendermint/tendermint/libs/log" "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" @@ -19,7 +20,7 @@ var _ types.DelegationSet = Keeper{} // keeper of the staking store type Keeper struct { - storeKey sdk.StoreKey + storeKey storetypes.StoreKey cdc codec.BinaryCodec authKeeper types.AccountKeeper bankKeeper types.BankKeeper @@ -29,7 +30,7 @@ type Keeper struct { // NewKeeper creates a new staking Keeper instance func NewKeeper( - cdc codec.BinaryCodec, key sdk.StoreKey, ak types.AccountKeeper, bk types.BankKeeper, + cdc codec.BinaryCodec, key storetypes.StoreKey, ak types.AccountKeeper, bk types.BankKeeper, ps paramtypes.Subspace, ) Keeper { // set KeyTable if it has not already been set diff --git a/x/staking/keeper/migrations.go b/x/staking/keeper/migrations.go index 6d5bf212..1d1f019f 100644 --- a/x/staking/keeper/migrations.go +++ b/x/staking/keeper/migrations.go @@ -2,7 +2,8 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v043 "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v043" + v043 "github.com/cosmos/cosmos-sdk/x/staking/migrations/v043" + v046 "github.com/cosmos/cosmos-sdk/x/staking/migrations/v046" ) // Migrator is a struct for handling in-place store migrations. @@ -12,10 +13,17 @@ type Migrator struct { // NewMigrator returns a new Migrator. func NewMigrator(keeper Keeper) Migrator { - return Migrator{keeper: keeper} + return Migrator{ + keeper: keeper, + } } // Migrate1to2 migrates from version 1 to 2. func (m Migrator) Migrate1to2(ctx sdk.Context) error { return v043.MigrateStore(ctx, m.keeper.storeKey) } + +// Migrate2to3 migrates x/staking state from consensus version 2 to 3. +func (m Migrator) Migrate2to3(ctx sdk.Context) error { + return v046.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc, m.keeper.paramstore) +} diff --git a/x/staking/legacy/v034/types.go b/x/staking/legacy/v034/types.go deleted file mode 100644 index 868a6901..00000000 --- a/x/staking/legacy/v034/types.go +++ /dev/null @@ -1,190 +0,0 @@ -// Package v034 is used for legacy migration scripts. Actual migration scripts -// for v034 have been removed, but the v039->v042 migration script still -// references types from this file, so we're keeping it for now. -// DONTCOVER -package v034 - -import ( - "time" - - "github.com/cosmos/cosmos-sdk/codec/legacy" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" -) - -const ( - ModuleName = "staking" -) - -// staking constants -const ( - Unbonded BondStatus = 0x00 - Unbonding BondStatus = 0x01 - Bonded BondStatus = 0x02 - - BondStatusUnbonded = "Unbonded" - BondStatusUnbonding = "Unbonding" - BondStatusBonded = "Bonded" -) - -type ( - // BondStatus is the status of a validator - BondStatus byte - - Pool struct { - NotBondedTokens sdk.Int `json:"not_bonded_tokens"` - BondedTokens sdk.Int `json:"bonded_tokens"` - } - - Params struct { - UnbondingTime time.Duration `json:"unbonding_time"` - MaxValidators uint16 `json:"max_validators"` - MaxEntries uint16 `json:"max_entries"` - BondDenom string `json:"bond_denom"` - } - - LastValidatorPower struct { - Address sdk.ValAddress - Power int64 - } - - Description struct { - Moniker string `json:"moniker"` - Identity string `json:"identity"` - Website string `json:"website"` - Details string `json:"details"` - } - - Commission struct { - Rate sdk.Dec `json:"rate"` - MaxRate sdk.Dec `json:"max_rate"` - MaxChangeRate sdk.Dec `json:"max_change_rate"` - UpdateTime time.Time `json:"update_time"` - } - - bechValidator struct { - OperatorAddress sdk.ValAddress `json:"operator_address"` // the bech32 address of the validator's operator - ConsPubKey string `json:"consensus_pubkey"` // the bech32 consensus public key of the validator - Jailed bool `json:"jailed"` // has the validator been jailed from bonded status? - Status BondStatus `json:"status"` // validator status (bonded/unbonding/unbonded) - Tokens sdk.Int `json:"tokens"` // delegated tokens (incl. self-delegation) - DelegatorShares sdk.Dec `json:"delegator_shares"` // total shares issued to a validator's delegators - Description Description `json:"description"` // description terms for the validator - UnbondingHeight int64 `json:"unbonding_height"` // if unbonding, height at which this validator has begun unbonding - UnbondingCompletionTime time.Time `json:"unbonding_time"` // if unbonding, min time for the validator to complete unbonding - Commission Commission `json:"commission"` // commission parameters - MinSelfDelegation sdk.Int `json:"min_self_delegation"` // minimum self delegation - } - - Validator struct { - OperatorAddress sdk.ValAddress `json:"operator_address"` - ConsPubKey cryptotypes.PubKey `json:"consensus_pubkey"` - Jailed bool `json:"jailed"` - Status BondStatus `json:"status"` - Tokens sdk.Int `json:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares"` - Description Description `json:"description"` - UnbondingHeight int64 `json:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time"` - Commission Commission `json:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation"` - } - - Validators []Validator - - Delegation struct { - DelegatorAddress sdk.AccAddress `json:"delegator_address"` - ValidatorAddress sdk.ValAddress `json:"validator_address"` - Shares sdk.Dec `json:"shares"` - } - - Delegations []Delegation - - UnbondingDelegationEntry struct { - CreationHeight int64 `json:"creation_height"` - CompletionTime time.Time `json:"completion_time"` - InitialBalance sdk.Int `json:"initial_balance"` - Balance sdk.Int `json:"balance"` - } - - UnbondingDelegation struct { - DelegatorAddress sdk.AccAddress `json:"delegator_address"` - ValidatorAddress sdk.ValAddress `json:"validator_address"` - Entries []UnbondingDelegationEntry `json:"entries"` - } - - RedelegationEntry struct { - CreationHeight int64 `json:"creation_height"` - CompletionTime time.Time `json:"completion_time"` - InitialBalance sdk.Int `json:"initial_balance"` - SharesDst sdk.Dec `json:"shares_dst"` - } - - Redelegation struct { - DelegatorAddress sdk.AccAddress `json:"delegator_address"` - ValidatorSrcAddress sdk.ValAddress `json:"validator_src_address"` - ValidatorDstAddress sdk.ValAddress `json:"validator_dst_address"` - Entries []RedelegationEntry `json:"entries"` - } - - GenesisState struct { - Pool Pool `json:"pool"` - Params Params `json:"params"` - LastTotalPower sdk.Int `json:"last_total_power"` - LastValidatorPowers []LastValidatorPower `json:"last_validator_powers"` - Validators Validators `json:"validators"` - Delegations Delegations `json:"delegations"` - UnbondingDelegations []UnbondingDelegation `json:"unbonding_delegations"` - Redelegations []Redelegation `json:"redelegations"` - Exported bool `json:"exported"` - } -) - -func (v Validator) MarshalJSON() ([]byte, error) { - bechConsPubKey, err := legacybech32.MarshalPubKey(legacybech32.ConsPK, v.ConsPubKey) - if err != nil { - return nil, err - } - - return legacy.Cdc.MarshalJSON(bechValidator{ - OperatorAddress: v.OperatorAddress, - ConsPubKey: bechConsPubKey, - Jailed: v.Jailed, - Status: v.Status, - Tokens: v.Tokens, - DelegatorShares: v.DelegatorShares, - Description: v.Description, - UnbondingHeight: v.UnbondingHeight, - UnbondingCompletionTime: v.UnbondingCompletionTime, - MinSelfDelegation: v.MinSelfDelegation, - Commission: v.Commission, - }) -} - -// UnmarshalJSON unmarshals the validator from JSON using Bech32 -func (v *Validator) UnmarshalJSON(data []byte) error { - bv := &bechValidator{} - if err := legacy.Cdc.UnmarshalJSON(data, bv); err != nil { - return err - } - consPubKey, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, bv.ConsPubKey) - if err != nil { - return err - } - - *v = Validator{ - OperatorAddress: bv.OperatorAddress, - ConsPubKey: consPubKey, - Jailed: bv.Jailed, - Tokens: bv.Tokens, - Status: bv.Status, - DelegatorShares: bv.DelegatorShares, - Description: bv.Description, - UnbondingHeight: bv.UnbondingHeight, - UnbondingCompletionTime: bv.UnbondingCompletionTime, - Commission: bv.Commission, - MinSelfDelegation: bv.MinSelfDelegation, - } - return nil -} diff --git a/x/staking/legacy/v036/types.go b/x/staking/legacy/v036/types.go deleted file mode 100644 index 3e4ee779..00000000 --- a/x/staking/legacy/v036/types.go +++ /dev/null @@ -1,137 +0,0 @@ -// Package v036 is used for legacy migration scripts. Actual migration scripts -// for v036 have been removed, but the v039->v042 migration script still -// references types from this file, so we're keeping it for now. -// DONTCOVER -package v036 - -import ( - "time" - - "github.com/cosmos/cosmos-sdk/codec/legacy" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" - v034staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v034" -) - -const ( - ModuleName = "staking" -) - -type ( - Commission struct { - CommissionRates `json:"commission_rates" yaml:"commission_rates"` - UpdateTime time.Time `json:"update_time" yaml:"update_time"` - } - - CommissionRates struct { - Rate sdk.Dec `json:"rate" yaml:"rate"` - MaxRate sdk.Dec `json:"max_rate" yaml:"max_rate"` - MaxChangeRate sdk.Dec `json:"max_change_rate" yaml:"max_change_rate"` - } - - Validator struct { - OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` - ConsPubKey cryptotypes.PubKey `json:"consensus_pubkey" yaml:"consensus_pubkey"` - Jailed bool `json:"jailed" yaml:"jailed"` - Status v034staking.BondStatus `json:"status" yaml:"status"` - Tokens sdk.Int `json:"tokens" yaml:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` - Description v034staking.Description `json:"description" yaml:"description"` - UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` - Commission Commission `json:"commission" yaml:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` - } - - bechValidator struct { - OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` - ConsPubKey string `json:"consensus_pubkey" yaml:"consensus_pubkey"` - Jailed bool `json:"jailed" yaml:"jailed"` - Status v034staking.BondStatus `json:"status" yaml:"status"` - Tokens sdk.Int `json:"tokens" yaml:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` - Description v034staking.Description `json:"description" yaml:"description"` - UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` - Commission Commission `json:"commission" yaml:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` - } - - Validators []Validator - - GenesisState struct { - Params v034staking.Params `json:"params"` - LastTotalPower sdk.Int `json:"last_total_power"` - LastValidatorPowers []v034staking.LastValidatorPower `json:"last_validator_powers"` - Validators Validators `json:"validators"` - Delegations v034staking.Delegations `json:"delegations"` - UnbondingDelegations []v034staking.UnbondingDelegation `json:"unbonding_delegations"` - Redelegations []v034staking.Redelegation `json:"redelegations"` - Exported bool `json:"exported"` - } -) - -func NewGenesisState( - params v034staking.Params, lastTotalPower sdk.Int, lastValPowers []v034staking.LastValidatorPower, - validators Validators, delegations v034staking.Delegations, - ubds []v034staking.UnbondingDelegation, reds []v034staking.Redelegation, exported bool, -) GenesisState { - - return GenesisState{ - Params: params, - LastTotalPower: lastTotalPower, - LastValidatorPowers: lastValPowers, - Validators: validators, - Delegations: delegations, - UnbondingDelegations: ubds, - Redelegations: reds, - Exported: exported, - } -} - -func (v Validator) MarshalJSON() ([]byte, error) { - bechConsPubKey, err := legacybech32.MarshalPubKey(legacybech32.ConsPK, v.ConsPubKey) - if err != nil { - return nil, err - } - - return legacy.Cdc.MarshalJSON(bechValidator{ - OperatorAddress: v.OperatorAddress, - ConsPubKey: bechConsPubKey, - Jailed: v.Jailed, - Status: v.Status, - Tokens: v.Tokens, - DelegatorShares: v.DelegatorShares, - Description: v.Description, - UnbondingHeight: v.UnbondingHeight, - UnbondingCompletionTime: v.UnbondingCompletionTime, - MinSelfDelegation: v.MinSelfDelegation, - Commission: v.Commission, - }) -} - -func (v *Validator) UnmarshalJSON(data []byte) error { - bv := &bechValidator{} - if err := legacy.Cdc.UnmarshalJSON(data, bv); err != nil { - return err - } - consPubKey, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, bv.ConsPubKey) - if err != nil { - return err - } - *v = Validator{ - OperatorAddress: bv.OperatorAddress, - ConsPubKey: consPubKey, - Jailed: bv.Jailed, - Tokens: bv.Tokens, - Status: bv.Status, - DelegatorShares: bv.DelegatorShares, - Description: bv.Description, - UnbondingHeight: bv.UnbondingHeight, - UnbondingCompletionTime: bv.UnbondingCompletionTime, - Commission: bv.Commission, - MinSelfDelegation: bv.MinSelfDelegation, - } - return nil -} diff --git a/x/staking/legacy/v038/types.go b/x/staking/legacy/v038/types.go deleted file mode 100644 index a2d6b711..00000000 --- a/x/staking/legacy/v038/types.go +++ /dev/null @@ -1,163 +0,0 @@ -// Package v038 is used for legacy migration scripts. Actual migration scripts -// for v038 have been removed, but the v039->v042 migration script still -// references types from this file, so we're keeping it for now. -// DONTCOVER -package v038 - -import ( - "time" - - "github.com/cosmos/cosmos-sdk/codec/legacy" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" - v034staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v034" - v036staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v036" -) - -const ( - ModuleName = "staking" -) - -type ( - Description struct { - Moniker string `json:"moniker" yaml:"moniker"` - Identity string `json:"identity" yaml:"identity"` - Website string `json:"website" yaml:"website"` - SecurityContact string `json:"security_contact" yaml:"security_contact"` - Details string `json:"details" yaml:"details"` - } - - Validator struct { - OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` - ConsPubKey cryptotypes.PubKey `json:"consensus_pubkey" yaml:"consensus_pubkey"` - Jailed bool `json:"jailed" yaml:"jailed"` - Status v034staking.BondStatus `json:"status" yaml:"status"` - Tokens sdk.Int `json:"tokens" yaml:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` - Description Description `json:"description" yaml:"description"` - UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` - Commission v036staking.Commission `json:"commission" yaml:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` - } - - bechValidator struct { - OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` - ConsPubKey string `json:"consensus_pubkey" yaml:"consensus_pubkey"` - Jailed bool `json:"jailed" yaml:"jailed"` - Status v034staking.BondStatus `json:"status" yaml:"status"` - Tokens sdk.Int `json:"tokens" yaml:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` - Description Description `json:"description" yaml:"description"` - UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` - Commission v036staking.Commission `json:"commission" yaml:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` - } - - Validators []Validator - - Params struct { - UnbondingTime time.Duration `json:"unbonding_time" yaml:"unbonding_time"` // time duration of unbonding - MaxValidators uint16 `json:"max_validators" yaml:"max_validators"` // maximum number of validators (max uint16 = 65535) - MaxEntries uint16 `json:"max_entries" yaml:"max_entries"` // max entries for either unbonding delegation or redelegation (per pair/trio) - HistoricalEntries uint16 `json:"historical_entries" yaml:"historical_entries"` // number of historical entries to persist - BondDenom string `json:"bond_denom" yaml:"bond_denom"` // bondable coin denomination - } - - GenesisState struct { - Params Params `json:"params"` - LastTotalPower sdk.Int `json:"last_total_power"` - LastValidatorPowers []v034staking.LastValidatorPower `json:"last_validator_powers"` - Validators Validators `json:"validators"` - Delegations v034staking.Delegations `json:"delegations"` - UnbondingDelegations []v034staking.UnbondingDelegation `json:"unbonding_delegations"` - Redelegations []v034staking.Redelegation `json:"redelegations"` - Exported bool `json:"exported"` - } -) - -// NewDescription creates a new Description object -func NewDescription(moniker, identity, website, securityContact, details string) Description { - return Description{ - Moniker: moniker, - Identity: identity, - Website: website, - SecurityContact: securityContact, - Details: details, - } -} - -// NewGenesisState creates a new GenesisState object -func NewGenesisState( - params v034staking.Params, lastTotalPower sdk.Int, lastValPowers []v034staking.LastValidatorPower, - validators Validators, delegations v034staking.Delegations, - ubds []v034staking.UnbondingDelegation, reds []v034staking.Redelegation, exported bool, -) GenesisState { - - return GenesisState{ - Params: Params{ - UnbondingTime: params.UnbondingTime, - MaxValidators: params.MaxValidators, - MaxEntries: params.MaxEntries, - BondDenom: params.BondDenom, - HistoricalEntries: 0, - }, - LastTotalPower: lastTotalPower, - LastValidatorPowers: lastValPowers, - Validators: validators, - Delegations: delegations, - UnbondingDelegations: ubds, - Redelegations: reds, - Exported: exported, - } -} - -// MarshalJSON marshals the validator to JSON using Bech32 -func (v Validator) MarshalJSON() ([]byte, error) { - bechConsPubKey, err := legacybech32.MarshalPubKey(legacybech32.ConsPK, v.ConsPubKey) - if err != nil { - return nil, err - } - - return legacy.Cdc.MarshalJSON(bechValidator{ - OperatorAddress: v.OperatorAddress, - ConsPubKey: bechConsPubKey, - Jailed: v.Jailed, - Status: v.Status, - Tokens: v.Tokens, - DelegatorShares: v.DelegatorShares, - Description: v.Description, - UnbondingHeight: v.UnbondingHeight, - UnbondingCompletionTime: v.UnbondingCompletionTime, - MinSelfDelegation: v.MinSelfDelegation, - Commission: v.Commission, - }) -} - -// UnmarshalJSON unmarshals the validator from JSON using Bech32 -func (v *Validator) UnmarshalJSON(data []byte) error { - bv := &bechValidator{} - if err := legacy.Cdc.UnmarshalJSON(data, bv); err != nil { - return err - } - consPubKey, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, bv.ConsPubKey) - if err != nil { - return err - } - *v = Validator{ - OperatorAddress: bv.OperatorAddress, - ConsPubKey: consPubKey, - Jailed: bv.Jailed, - Tokens: bv.Tokens, - Status: bv.Status, - DelegatorShares: bv.DelegatorShares, - Description: bv.Description, - UnbondingHeight: bv.UnbondingHeight, - UnbondingCompletionTime: bv.UnbondingCompletionTime, - Commission: bv.Commission, - MinSelfDelegation: bv.MinSelfDelegation, - } - return nil -} diff --git a/x/staking/legacy/v040/genesis.pb.go b/x/staking/legacy/v040/genesis.pb.go deleted file mode 100644 index af9e607d..00000000 --- a/x/staking/legacy/v040/genesis.pb.go +++ /dev/null @@ -1,944 +0,0 @@ -// Package v040 is taken from: -// https://github.com/cosmos/cosmos-sdk/blob/v0.40.1/x/staking/types/genesis.pb.go -// by copy-pasted only the relevants parts for Genesis. -// nolint -package v040 - -import ( - fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the staking module's genesis state. -type GenesisState struct { - // params defines all the paramaters of related to deposit. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - // last_total_power tracks the total amounts of bonded tokens recorded during - // the previous end block. - LastTotalPower github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=last_total_power,json=lastTotalPower,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"last_total_power" yaml:"last_total_power"` - // last_validator_powers is a special index that provides a historical list - // of the last-block's bonded validators. - LastValidatorPowers []LastValidatorPower `protobuf:"bytes,3,rep,name=last_validator_powers,json=lastValidatorPowers,proto3" json:"last_validator_powers" yaml:"last_validator_powers"` - // delegations defines the validator set at genesis. - Validators []Validator `protobuf:"bytes,4,rep,name=validators,proto3" json:"validators"` - // delegations defines the delegations active at genesis. - Delegations []Delegation `protobuf:"bytes,5,rep,name=delegations,proto3" json:"delegations"` - // unbonding_delegations defines the unbonding delegations active at genesis. - UnbondingDelegations []UnbondingDelegation `protobuf:"bytes,6,rep,name=unbonding_delegations,json=unbondingDelegations,proto3" json:"unbonding_delegations" yaml:"unbonding_delegations"` - // redelegations defines the redelegations active at genesis. - Redelegations []Redelegation `protobuf:"bytes,7,rep,name=redelegations,proto3" json:"redelegations"` - Exported bool `protobuf:"varint,8,opt,name=exported,proto3" json:"exported,omitempty"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_9b3dec8894f2831b, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.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 *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -func (m *GenesisState) GetLastValidatorPowers() []LastValidatorPower { - if m != nil { - return m.LastValidatorPowers - } - return nil -} - -func (m *GenesisState) GetValidators() []Validator { - if m != nil { - return m.Validators - } - return nil -} - -func (m *GenesisState) GetDelegations() []Delegation { - if m != nil { - return m.Delegations - } - return nil -} - -func (m *GenesisState) GetUnbondingDelegations() []UnbondingDelegation { - if m != nil { - return m.UnbondingDelegations - } - return nil -} - -func (m *GenesisState) GetRedelegations() []Redelegation { - if m != nil { - return m.Redelegations - } - return nil -} - -func (m *GenesisState) GetExported() bool { - if m != nil { - return m.Exported - } - return false -} - -// LastValidatorPower required for validator set update logic. -type LastValidatorPower struct { - // address is the address of the validator. - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // power defines the power of the validator. - Power int64 `protobuf:"varint,2,opt,name=power,proto3" json:"power,omitempty"` -} - -func (m *LastValidatorPower) Reset() { *m = LastValidatorPower{} } -func (m *LastValidatorPower) String() string { return proto.CompactTextString(m) } -func (*LastValidatorPower) ProtoMessage() {} -func (*LastValidatorPower) Descriptor() ([]byte, []int) { - return fileDescriptor_9b3dec8894f2831b, []int{1} -} -func (m *LastValidatorPower) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *LastValidatorPower) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LastValidatorPower.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 *LastValidatorPower) XXX_Merge(src proto.Message) { - xxx_messageInfo_LastValidatorPower.Merge(m, src) -} -func (m *LastValidatorPower) XXX_Size() int { - return m.Size() -} -func (m *LastValidatorPower) XXX_DiscardUnknown() { - xxx_messageInfo_LastValidatorPower.DiscardUnknown(m) -} - -var xxx_messageInfo_LastValidatorPower proto.InternalMessageInfo - -func init() { - // proto.RegisterType((*GenesisState)(nil), "cosmos.staking.v1beta1.GenesisState") - // proto.RegisterType((*LastValidatorPower)(nil), "cosmos.staking.v1beta1.LastValidatorPower") -} - -func init() { - // proto.RegisterFile("cosmos/staking/v1beta1/genesis.proto", fileDescriptor_9b3dec8894f2831b) -} - -var fileDescriptor_9b3dec8894f2831b = []byte{ - // 493 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0x3d, 0x6f, 0xd3, 0x40, - 0x18, 0xc7, 0x7d, 0xa4, 0x49, 0xc3, 0xa5, 0x20, 0x74, 0xa4, 0x60, 0x45, 0xc8, 0x0e, 0x56, 0x84, - 0x22, 0x5e, 0x6c, 0xb5, 0x6c, 0x15, 0x53, 0x84, 0xa8, 0x8a, 0x10, 0x8a, 0x8e, 0x97, 0x81, 0x25, - 0xba, 0xd4, 0x27, 0x63, 0xd5, 0xf1, 0x59, 0x7e, 0x2e, 0xa5, 0xdd, 0x11, 0x62, 0xe4, 0x23, 0xf4, - 0xe3, 0x74, 0xec, 0xc0, 0x80, 0x18, 0x2c, 0x94, 0x2c, 0xcc, 0xfd, 0x04, 0xc8, 0xe7, 0x17, 0x4c, - 0x52, 0x33, 0x25, 0x77, 0xfa, 0xfd, 0x7f, 0x7f, 0xfb, 0xfc, 0x1c, 0x1e, 0x1c, 0x0a, 0x98, 0x09, - 0x70, 0x40, 0xb2, 0x23, 0x3f, 0xf4, 0x9c, 0xe3, 0x9d, 0x29, 0x97, 0x6c, 0xc7, 0xf1, 0x78, 0xc8, - 0xc1, 0x07, 0x3b, 0x8a, 0x85, 0x14, 0xe4, 0x4e, 0x46, 0xd9, 0x39, 0x65, 0xe7, 0x54, 0xaf, 0xeb, - 0x09, 0x4f, 0x28, 0xc4, 0x49, 0xff, 0x65, 0x74, 0xaf, 0xce, 0x59, 0xa4, 0x15, 0x65, 0x7d, 0x6f, - 0xe2, 0xad, 0xfd, 0xac, 0xe5, 0x8d, 0x64, 0x92, 0x93, 0x67, 0xb8, 0x15, 0xb1, 0x98, 0xcd, 0x40, - 0x47, 0x7d, 0x34, 0xec, 0xec, 0x1a, 0xf6, 0xd5, 0xad, 0xf6, 0x58, 0x51, 0xa3, 0x8d, 0xf3, 0xc4, - 0xd4, 0x68, 0x9e, 0x21, 0x80, 0x6f, 0x05, 0x0c, 0xe4, 0x44, 0x0a, 0xc9, 0x82, 0x49, 0x24, 0x3e, - 0xf1, 0x58, 0xbf, 0xd6, 0x47, 0xc3, 0xad, 0xd1, 0x41, 0xca, 0xfd, 0x4c, 0xcc, 0x07, 0x9e, 0x2f, - 0x3f, 0xce, 0xa7, 0xf6, 0xa1, 0x98, 0x39, 0xf9, 0x13, 0x66, 0x3f, 0x4f, 0xc0, 0x3d, 0x72, 0xe4, - 0x69, 0xc4, 0xc1, 0x3e, 0x08, 0xe5, 0x65, 0x62, 0xde, 0x3d, 0x65, 0xb3, 0x60, 0xcf, 0x5a, 0xf5, - 0x59, 0xf4, 0x66, 0xba, 0xf5, 0x36, 0xdd, 0x19, 0xa7, 0x1b, 0xe4, 0x33, 0xc2, 0xdb, 0x8a, 0x3a, - 0x66, 0x81, 0xef, 0x32, 0x29, 0xe2, 0x8c, 0x04, 0xbd, 0xd1, 0x6f, 0x0c, 0x3b, 0xbb, 0x0f, 0xeb, - 0x5e, 0xe1, 0x15, 0x03, 0xf9, 0xbe, 0xc8, 0x28, 0xd7, 0x68, 0x90, 0x3e, 0xe6, 0x65, 0x62, 0xde, - 0xab, 0x94, 0xaf, 0x6a, 0x2d, 0x7a, 0x3b, 0x58, 0x4b, 0x02, 0xd9, 0xc7, 0xb8, 0x24, 0x41, 0xdf, - 0x50, 0xd5, 0xf7, 0xeb, 0xaa, 0xcb, 0x70, 0x7e, 0x80, 0x95, 0x28, 0x79, 0x89, 0x3b, 0x2e, 0x0f, - 0xb8, 0xc7, 0xa4, 0x2f, 0x42, 0xd0, 0x9b, 0xca, 0x64, 0xd5, 0x99, 0x9e, 0x97, 0x68, 0xae, 0xaa, - 0x86, 0xc9, 0x17, 0x84, 0xb7, 0xe7, 0xe1, 0x54, 0x84, 0xae, 0x1f, 0x7a, 0x93, 0xaa, 0xb6, 0xa5, - 0xb4, 0x8f, 0xea, 0xb4, 0xef, 0x8a, 0x50, 0xc5, 0xbf, 0x72, 0x38, 0x57, 0x7a, 0x2d, 0xda, 0x9d, - 0xaf, 0x47, 0x81, 0x8c, 0xf1, 0x8d, 0x98, 0x57, 0xfb, 0x37, 0x55, 0xff, 0xa0, 0xae, 0x9f, 0x56, - 0xe0, 0xfc, 0xc5, 0xfe, 0x15, 0x90, 0x1e, 0x6e, 0xf3, 0x93, 0x48, 0xc4, 0x92, 0xbb, 0x7a, 0xbb, - 0x8f, 0x86, 0x6d, 0x5a, 0xae, 0xad, 0xd7, 0x98, 0xac, 0x7f, 0x5c, 0xa2, 0xe3, 0x4d, 0xe6, 0xba, - 0x31, 0x87, 0x6c, 0xb8, 0xaf, 0xd3, 0x62, 0x49, 0xba, 0xb8, 0xf9, 0x77, 0x58, 0x1b, 0x34, 0x5b, - 0xec, 0xb5, 0xbf, 0x9e, 0x99, 0xda, 0xef, 0x33, 0x53, 0x1b, 0xbd, 0x38, 0x5f, 0x18, 0xe8, 0x62, - 0x61, 0xa0, 0x5f, 0x0b, 0x03, 0x7d, 0x5b, 0x1a, 0xda, 0xc5, 0xd2, 0xd0, 0x7e, 0x2c, 0x0d, 0xed, - 0xc3, 0xe3, 0xff, 0xce, 0xf3, 0x49, 0x79, 0xfd, 0xd4, 0x64, 0x4f, 0x5b, 0xea, 0xd6, 0x3d, 0xfd, - 0x13, 0x00, 0x00, 0xff, 0xff, 0xff, 0x85, 0xad, 0xc8, 0xf1, 0x03, 0x00, 0x00, -} - -func (m *GenesisState) 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 *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Exported { - i-- - if m.Exported { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - } - if len(m.Redelegations) > 0 { - for iNdEx := len(m.Redelegations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Redelegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - } - if len(m.UnbondingDelegations) > 0 { - for iNdEx := len(m.UnbondingDelegations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.UnbondingDelegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.Delegations) > 0 { - for iNdEx := len(m.Delegations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Delegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - } - if len(m.Validators) > 0 { - for iNdEx := len(m.Validators) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Validators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.LastValidatorPowers) > 0 { - for iNdEx := len(m.LastValidatorPowers) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.LastValidatorPowers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - { - size := m.LastTotalPower.Size() - i -= size - if _, err := m.LastTotalPower.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *LastValidatorPower) 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 *LastValidatorPower) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *LastValidatorPower) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Power != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.Power)) - i-- - dAtA[i] = 0x10 - } - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintGenesis(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - l = m.LastTotalPower.Size() - n += 1 + l + sovGenesis(uint64(l)) - if len(m.LastValidatorPowers) > 0 { - for _, e := range m.LastValidatorPowers { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.Validators) > 0 { - for _, e := range m.Validators { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.Delegations) > 0 { - for _, e := range m.Delegations { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.UnbondingDelegations) > 0 { - for _, e := range m.UnbondingDelegations { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.Redelegations) > 0 { - for _, e := range m.Redelegations { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if m.Exported { - n += 2 - } - return n -} - -func (m *LastValidatorPower) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - if m.Power != 0 { - n += 1 + sovGenesis(uint64(m.Power)) - } - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) 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 ErrIntOverflowGenesis - } - 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: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: 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 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 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastTotalPower", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LastTotalPower.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastValidatorPowers", 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 - } - m.LastValidatorPowers = append(m.LastValidatorPowers, LastValidatorPower{}) - if err := m.LastValidatorPowers[len(m.LastValidatorPowers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validators", 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 - } - m.Validators = append(m.Validators, Validator{}) - if err := m.Validators[len(m.Validators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Delegations", 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 - } - m.Delegations = append(m.Delegations, Delegation{}) - if err := m.Delegations[len(m.Delegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UnbondingDelegations", 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 - } - m.UnbondingDelegations = append(m.UnbondingDelegations, UnbondingDelegation{}) - if err := m.UnbondingDelegations[len(m.UnbondingDelegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Redelegations", 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 - } - m.Redelegations = append(m.Redelegations, Redelegation{}) - if err := m.Redelegations[len(m.Redelegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Exported", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Exported = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *LastValidatorPower) 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 ErrIntOverflowGenesis - } - 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: LastValidatorPower: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LastValidatorPower: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - 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 ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Power", wireType) - } - m.Power = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Power |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(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, ErrIntOverflowGenesis - } - 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, ErrIntOverflowGenesis - } - 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, ErrIntOverflowGenesis - } - 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, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/staking/legacy/v040/keys.go b/x/staking/legacy/v040/keys.go deleted file mode 100644 index 1c48da3e..00000000 --- a/x/staking/legacy/v040/keys.go +++ /dev/null @@ -1,330 +0,0 @@ -// Package v040 is copy-pasted from: -// https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/staking/types/keys.go -package v040 - -import ( - "bytes" - "encoding/binary" - "fmt" - "strconv" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -const ( - // ModuleName is the name of the staking module - ModuleName = "staking" - - // StoreKey is the string store representation - StoreKey = ModuleName - - // QuerierRoute is the querier route for the staking module - QuerierRoute = ModuleName - - // RouterKey is the msg router key for the staking module - RouterKey = ModuleName -) - -var ( - // Keys for store prefixes - // Last* values are constant during a block. - LastValidatorPowerKey = []byte{0x11} // prefix for each key to a validator index, for bonded validators - LastTotalPowerKey = []byte{0x12} // prefix for the total power - - ValidatorsKey = []byte{0x21} // prefix for each key to a validator - ValidatorsByConsAddrKey = []byte{0x22} // prefix for each key to a validator index, by pubkey - ValidatorsByPowerIndexKey = []byte{0x23} // prefix for each key to a validator index, sorted by power - - DelegationKey = []byte{0x31} // key for a delegation - UnbondingDelegationKey = []byte{0x32} // key for an unbonding-delegation - UnbondingDelegationByValIndexKey = []byte{0x33} // prefix for each key for an unbonding-delegation, by validator operator - RedelegationKey = []byte{0x34} // key for a redelegation - RedelegationByValSrcIndexKey = []byte{0x35} // prefix for each key for an redelegation, by source validator operator - RedelegationByValDstIndexKey = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator - - UnbondingQueueKey = []byte{0x41} // prefix for the timestamps in unbonding queue - RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue - ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue - - HistoricalInfoKey = []byte{0x50} // prefix for the historical info -) - -// gets the key for the validator with address -// VALUE: staking/Validator -func GetValidatorKey(operatorAddr sdk.ValAddress) []byte { - return append(ValidatorsKey, operatorAddr.Bytes()...) -} - -// gets the key for the validator with pubkey -// VALUE: validator operator address ([]byte) -func GetValidatorByConsAddrKey(addr sdk.ConsAddress) []byte { - return append(ValidatorsByConsAddrKey, addr.Bytes()...) -} - -// Get the validator operator address from LastValidatorPowerKey -func AddressFromLastValidatorPowerKey(key []byte) []byte { - return key[1:] // remove prefix bytes -} - -// get the validator by power index. -// Power index is the key used in the power-store, and represents the relative -// power ranking of the validator. -// VALUE: validator operator address ([]byte) -func GetValidatorsByPowerIndexKey(validator types.Validator) []byte { - // NOTE the address doesn't need to be stored because counter bytes must always be different - // NOTE the larger values are of higher value - - consensusPower := sdk.TokensToConsensusPower(validator.Tokens, sdk.DefaultPowerReduction) - consensusPowerBytes := make([]byte, 8) - binary.BigEndian.PutUint64(consensusPowerBytes, uint64(consensusPower)) - - powerBytes := consensusPowerBytes - powerBytesLen := len(powerBytes) // 8 - - // key is of format prefix || powerbytes || addrBytes - key := make([]byte, 1+powerBytesLen+v040auth.AddrLen) - - key[0] = ValidatorsByPowerIndexKey[0] - copy(key[1:powerBytesLen+1], powerBytes) - addr, err := sdk.ValAddressFromBech32(validator.OperatorAddress) - if err != nil { - panic(err) - } - operAddrInvr := sdk.CopyBytes(addr) - - for i, b := range operAddrInvr { - operAddrInvr[i] = ^b - } - - copy(key[powerBytesLen+1:], operAddrInvr) - - return key -} - -// get the bonded validator index key for an operator address -func GetLastValidatorPowerKey(operator sdk.ValAddress) []byte { - return append(LastValidatorPowerKey, operator...) -} - -// parse the validators operator address from power rank key -func ParseValidatorPowerRankKey(key []byte) (operAddr []byte) { - powerBytesLen := 8 - if len(key) != 1+powerBytesLen+v040auth.AddrLen { - panic("Invalid validator power rank key length") - } - - operAddr = sdk.CopyBytes(key[powerBytesLen+1:]) - - for i, b := range operAddr { - operAddr[i] = ^b - } - - return operAddr -} - -// GetValidatorQueueKey returns the prefix key used for getting a set of unbonding -// validators whose unbonding completion occurs at the given time and height. -func GetValidatorQueueKey(timestamp time.Time, height int64) []byte { - heightBz := sdk.Uint64ToBigEndian(uint64(height)) - timeBz := sdk.FormatTimeBytes(timestamp) - timeBzL := len(timeBz) - prefixL := len(ValidatorQueueKey) - - bz := make([]byte, prefixL+8+timeBzL+8) - - // copy the prefix - copy(bz[:prefixL], ValidatorQueueKey) - - // copy the encoded time bytes length - copy(bz[prefixL:prefixL+8], sdk.Uint64ToBigEndian(uint64(timeBzL))) - - // copy the encoded time bytes - copy(bz[prefixL+8:prefixL+8+timeBzL], timeBz) - - // copy the encoded height - copy(bz[prefixL+8+timeBzL:], heightBz) - - return bz -} - -// ParseValidatorQueueKey returns the encoded time and height from a key created -// from GetValidatorQueueKey. -func ParseValidatorQueueKey(bz []byte) (time.Time, int64, error) { - prefixL := len(ValidatorQueueKey) - if prefix := bz[:prefixL]; !bytes.Equal(prefix, ValidatorQueueKey) { - return time.Time{}, 0, fmt.Errorf("invalid prefix; expected: %X, got: %X", ValidatorQueueKey, prefix) - } - - timeBzL := sdk.BigEndianToUint64(bz[prefixL : prefixL+8]) - ts, err := sdk.ParseTimeBytes(bz[prefixL+8 : prefixL+8+int(timeBzL)]) - if err != nil { - return time.Time{}, 0, err - } - - height := sdk.BigEndianToUint64(bz[prefixL+8+int(timeBzL):]) - - return ts, int64(height), nil -} - -// gets the key for delegator bond with validator -// VALUE: staking/Delegation -func GetDelegationKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append(GetDelegationsKey(delAddr), valAddr.Bytes()...) -} - -// gets the prefix for a delegator for all validators -func GetDelegationsKey(delAddr sdk.AccAddress) []byte { - return append(DelegationKey, delAddr.Bytes()...) -} - -// gets the key for an unbonding delegation by delegator and validator addr -// VALUE: staking/UnbondingDelegation -func GetUBDKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append( - GetUBDsKey(delAddr.Bytes()), - valAddr.Bytes()...) -} - -// gets the index-key for an unbonding delegation, stored by validator-index -// VALUE: none (key rearrangement used) -func GetUBDByValIndexKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append(GetUBDsByValIndexKey(valAddr), delAddr.Bytes()...) -} - -// rearranges the ValIndexKey to get the UBDKey -func GetUBDKeyFromValIndexKey(indexKey []byte) []byte { - addrs := indexKey[1:] // remove prefix bytes - if len(addrs) != 2*v040auth.AddrLen { - panic("unexpected key length") - } - - valAddr := addrs[:v040auth.AddrLen] - delAddr := addrs[v040auth.AddrLen:] - - return GetUBDKey(delAddr, valAddr) -} - -// gets the prefix for all unbonding delegations from a delegator -func GetUBDsKey(delAddr sdk.AccAddress) []byte { - return append(UnbondingDelegationKey, delAddr.Bytes()...) -} - -// gets the prefix keyspace for the indexes of unbonding delegations for a validator -func GetUBDsByValIndexKey(valAddr sdk.ValAddress) []byte { - return append(UnbondingDelegationByValIndexKey, valAddr.Bytes()...) -} - -// gets the prefix for all unbonding delegations from a delegator -func GetUnbondingDelegationTimeKey(timestamp time.Time) []byte { - bz := sdk.FormatTimeBytes(timestamp) - return append(UnbondingQueueKey, bz...) -} - -// GetREDKey returns a key prefix for indexing a redelegation from a delegator -// and source validator to a destination validator. -func GetREDKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - key := make([]byte, 1+v040auth.AddrLen*3) - - copy(key[0:v040auth.AddrLen+1], GetREDsKey(delAddr.Bytes())) - copy(key[v040auth.AddrLen+1:2*v040auth.AddrLen+1], valSrcAddr.Bytes()) - copy(key[2*v040auth.AddrLen+1:3*v040auth.AddrLen+1], valDstAddr.Bytes()) - - return key -} - -// gets the index-key for a redelegation, stored by source-validator-index -// VALUE: none (key rearrangement used) -func GetREDByValSrcIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - REDSFromValsSrcKey := GetREDsFromValSrcIndexKey(valSrcAddr) - offset := len(REDSFromValsSrcKey) - - // key is of the form REDSFromValsSrcKey || delAddr || valDstAddr - key := make([]byte, len(REDSFromValsSrcKey)+2*v040auth.AddrLen) - copy(key[0:offset], REDSFromValsSrcKey) - copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) - copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valDstAddr.Bytes()) - - return key -} - -// gets the index-key for a redelegation, stored by destination-validator-index -// VALUE: none (key rearrangement used) -func GetREDByValDstIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - REDSToValsDstKey := GetREDsToValDstIndexKey(valDstAddr) - offset := len(REDSToValsDstKey) - - // key is of the form REDSToValsDstKey || delAddr || valSrcAddr - key := make([]byte, len(REDSToValsDstKey)+2*v040auth.AddrLen) - copy(key[0:offset], REDSToValsDstKey) - copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) - copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valSrcAddr.Bytes()) - - return key -} - -// GetREDKeyFromValSrcIndexKey rearranges the ValSrcIndexKey to get the REDKey -func GetREDKeyFromValSrcIndexKey(indexKey []byte) []byte { - // note that first byte is prefix byte - if len(indexKey) != 3*v040auth.AddrLen+1 { - panic("unexpected key length") - } - - valSrcAddr := indexKey[1 : v040auth.AddrLen+1] - delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] - valDstAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] - - return GetREDKey(delAddr, valSrcAddr, valDstAddr) -} - -// GetREDKeyFromValDstIndexKey rearranges the ValDstIndexKey to get the REDKey -func GetREDKeyFromValDstIndexKey(indexKey []byte) []byte { - // note that first byte is prefix byte - if len(indexKey) != 3*v040auth.AddrLen+1 { - panic("unexpected key length") - } - - valDstAddr := indexKey[1 : v040auth.AddrLen+1] - delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] - valSrcAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] - - return GetREDKey(delAddr, valSrcAddr, valDstAddr) -} - -// GetRedelegationTimeKey returns a key prefix for indexing an unbonding -// redelegation based on a completion time. -func GetRedelegationTimeKey(timestamp time.Time) []byte { - bz := sdk.FormatTimeBytes(timestamp) - return append(RedelegationQueueKey, bz...) -} - -// GetREDsKey returns a key prefix for indexing a redelegation from a delegator -// address. -func GetREDsKey(delAddr sdk.AccAddress) []byte { - return append(RedelegationKey, delAddr.Bytes()...) -} - -// GetREDsFromValSrcIndexKey returns a key prefix for indexing a redelegation to -// a source validator. -func GetREDsFromValSrcIndexKey(valSrcAddr sdk.ValAddress) []byte { - return append(RedelegationByValSrcIndexKey, valSrcAddr.Bytes()...) -} - -// GetREDsToValDstIndexKey returns a key prefix for indexing a redelegation to a -// destination (target) validator. -func GetREDsToValDstIndexKey(valDstAddr sdk.ValAddress) []byte { - return append(RedelegationByValDstIndexKey, valDstAddr.Bytes()...) -} - -// GetREDsByDelToValDstIndexKey returns a key prefix for indexing a redelegation -// from an address to a source validator. -func GetREDsByDelToValDstIndexKey(delAddr sdk.AccAddress, valDstAddr sdk.ValAddress) []byte { - return append(GetREDsToValDstIndexKey(valDstAddr), delAddr.Bytes()...) -} - -// GetHistoricalInfoKey returns a key prefix for indexing HistoricalInfo objects. -func GetHistoricalInfoKey(height int64) []byte { - return append(HistoricalInfoKey, []byte(strconv.FormatInt(height, 10))...) -} diff --git a/x/staking/legacy/v040/migrate.go b/x/staking/legacy/v040/migrate.go deleted file mode 100644 index 007bb127..00000000 --- a/x/staking/legacy/v040/migrate.go +++ /dev/null @@ -1,140 +0,0 @@ -package v040 - -import ( - "fmt" - - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - v034staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v034" - v038staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v038" -) - -func migrateBondStatus(oldStatus v034staking.BondStatus) BondStatus { - switch oldStatus { - case v034staking.Unbonded: - return Unbonded - - case v034staking.Unbonding: - return Unbonding - - case v034staking.Bonded: - return Bonded - - default: - panic(fmt.Errorf("invalid bond status %d", oldStatus)) - } -} - -// Migrate accepts exported v0.38 x/staking genesis state and migrates it to -// v0.40 x/staking genesis state. The migration includes: -// -// - Convert addresses from bytes to bech32 strings. -// - Update BondStatus staking constants. -// - Re-encode in v0.40 GenesisState. -func Migrate(stakingState v038staking.GenesisState) *GenesisState { - newLastValidatorPowers := make([]LastValidatorPower, len(stakingState.LastValidatorPowers)) - for i, oldLastValidatorPower := range stakingState.LastValidatorPowers { - newLastValidatorPowers[i] = LastValidatorPower{ - Address: oldLastValidatorPower.Address.String(), - Power: oldLastValidatorPower.Power, - } - } - - newValidators := make([]Validator, len(stakingState.Validators)) - for i, oldValidator := range stakingState.Validators { - pkAny, err := codectypes.NewAnyWithValue(oldValidator.ConsPubKey) - if err != nil { - panic(fmt.Sprintf("Can't pack validator consensus PK as Any: %s", err)) - } - newValidators[i] = Validator{ - OperatorAddress: oldValidator.OperatorAddress.String(), - ConsensusPubkey: pkAny, - Jailed: oldValidator.Jailed, - Status: migrateBondStatus(oldValidator.Status), - Tokens: oldValidator.Tokens, - DelegatorShares: oldValidator.DelegatorShares, - Description: Description{ - Moniker: oldValidator.Description.Moniker, - Identity: oldValidator.Description.Identity, - Website: oldValidator.Description.Website, - SecurityContact: oldValidator.Description.SecurityContact, - Details: oldValidator.Description.Details, - }, - UnbondingHeight: oldValidator.UnbondingHeight, - UnbondingTime: oldValidator.UnbondingCompletionTime, - Commission: Commission{ - CommissionRates: CommissionRates{ - Rate: oldValidator.Commission.Rate, - MaxRate: oldValidator.Commission.MaxRate, - MaxChangeRate: oldValidator.Commission.MaxChangeRate, - }, - UpdateTime: oldValidator.Commission.UpdateTime, - }, - MinSelfDelegation: oldValidator.MinSelfDelegation, - } - } - - newDelegations := make([]Delegation, len(stakingState.Delegations)) - for i, oldDelegation := range stakingState.Delegations { - newDelegations[i] = Delegation{ - DelegatorAddress: oldDelegation.DelegatorAddress.String(), - ValidatorAddress: oldDelegation.ValidatorAddress.String(), - Shares: oldDelegation.Shares, - } - } - - newUnbondingDelegations := make([]UnbondingDelegation, len(stakingState.UnbondingDelegations)) - for i, oldUnbondingDelegation := range stakingState.UnbondingDelegations { - newEntries := make([]UnbondingDelegationEntry, len(oldUnbondingDelegation.Entries)) - for j, oldEntry := range oldUnbondingDelegation.Entries { - newEntries[j] = UnbondingDelegationEntry{ - CreationHeight: oldEntry.CreationHeight, - CompletionTime: oldEntry.CompletionTime, - InitialBalance: oldEntry.InitialBalance, - Balance: oldEntry.Balance, - } - } - - newUnbondingDelegations[i] = UnbondingDelegation{ - DelegatorAddress: oldUnbondingDelegation.DelegatorAddress.String(), - ValidatorAddress: oldUnbondingDelegation.ValidatorAddress.String(), - Entries: newEntries, - } - } - - newRedelegations := make([]Redelegation, len(stakingState.Redelegations)) - for i, oldRedelegation := range stakingState.Redelegations { - newEntries := make([]RedelegationEntry, len(oldRedelegation.Entries)) - for j, oldEntry := range oldRedelegation.Entries { - newEntries[j] = RedelegationEntry{ - CreationHeight: oldEntry.CreationHeight, - CompletionTime: oldEntry.CompletionTime, - InitialBalance: oldEntry.InitialBalance, - SharesDst: oldEntry.SharesDst, - } - } - - newRedelegations[i] = Redelegation{ - DelegatorAddress: oldRedelegation.DelegatorAddress.String(), - ValidatorSrcAddress: oldRedelegation.ValidatorSrcAddress.String(), - ValidatorDstAddress: oldRedelegation.ValidatorDstAddress.String(), - Entries: newEntries, - } - } - - return &GenesisState{ - Params: Params{ - UnbondingTime: stakingState.Params.UnbondingTime, - MaxValidators: uint32(stakingState.Params.MaxValidators), - MaxEntries: uint32(stakingState.Params.MaxEntries), - HistoricalEntries: uint32(stakingState.Params.HistoricalEntries), - BondDenom: stakingState.Params.BondDenom, - }, - LastTotalPower: stakingState.LastTotalPower, - LastValidatorPowers: newLastValidatorPowers, - Validators: newValidators, - Delegations: newDelegations, - UnbondingDelegations: newUnbondingDelegations, - Redelegations: newRedelegations, - Exported: stakingState.Exported, - } -} diff --git a/x/staking/legacy/v040/migrate_test.go b/x/staking/legacy/v040/migrate_test.go deleted file mode 100644 index 537f2310..00000000 --- a/x/staking/legacy/v040/migrate_test.go +++ /dev/null @@ -1,96 +0,0 @@ -package v040_test - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - simapp "github.com/iqlusioninc/liquidity-staking-module/app" - v034staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v034" - v038staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v038" - v040staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v040" -) - -func TestMigrate(t *testing.T) { - encodingConfig := simapp.MakeTestEncodingConfig() - clientCtx := client.Context{}. - WithInterfaceRegistry(encodingConfig.InterfaceRegistry). - WithTxConfig(encodingConfig.TxConfig). - WithLegacyAmino(encodingConfig.Amino). - WithJSONCodec(encodingConfig.Marshaler) - - consPubKey := ed25519.GenPrivKeyFromSecret([]byte("val0")).PubKey() - stakingGenState := v038staking.GenesisState{ - Validators: v038staking.Validators{v038staking.Validator{ - ConsPubKey: consPubKey, - Status: v034staking.Unbonded, - }}, - } - - migrated := v040staking.Migrate(stakingGenState) - - bz, err := clientCtx.Codec.MarshalJSON(migrated) - require.NoError(t, err) - - // Indent the JSON bz correctly. - var jsonObj map[string]interface{} - err = json.Unmarshal(bz, &jsonObj) - require.NoError(t, err) - indentedBz, err := json.MarshalIndent(jsonObj, "", " ") - require.NoError(t, err) - - // Make sure about: - // - consensus_pubkey: should be an any - // - validator's status should be 1 (new unbonded) - expected := `{ - "delegations": [], - "exported": false, - "last_total_power": "0", - "last_validator_powers": [], - "params": { - "bond_denom": "", - "historical_entries": 0, - "max_entries": 0, - "max_validators": 0, - "unbonding_time": "0s" - }, - "redelegations": [], - "unbonding_delegations": [], - "validators": [ - { - "commission": { - "commission_rates": { - "max_change_rate": "0", - "max_rate": "0", - "rate": "0" - }, - "update_time": "0001-01-01T00:00:00Z" - }, - "consensus_pubkey": { - "@type": "/cosmos.crypto.ed25519.PubKey", - "key": "KTeVrjP7NJIufvgMJsQRxZjfFyD+Exda6O7x+oxIvmA=" - }, - "delegator_shares": "0", - "description": { - "details": "", - "identity": "", - "moniker": "", - "security_contact": "", - "website": "" - }, - "jailed": false, - "min_self_delegation": "0", - "operator_address": "", - "status": "BOND_STATUS_UNBONDED", - "tokens": "0", - "unbonding_height": "0", - "unbonding_time": "0001-01-01T00:00:00Z" - } - ] -}` - - require.Equal(t, expected, string(indentedBz)) -} diff --git a/x/staking/legacy/v040/staking.pb.go b/x/staking/legacy/v040/staking.pb.go deleted file mode 100644 index 3200520a..00000000 --- a/x/staking/legacy/v040/staking.pb.go +++ /dev/null @@ -1,6525 +0,0 @@ -// Package v040 is taken from: -// https://github.com/cosmos/cosmos-sdk/blob/v0.40.1/x/staking/types/staking.pb.go -// nolint -package v040 - -import ( - bytes "bytes" - compress_gzip "compress/gzip" - fmt "fmt" - io "io" - io_ioutil "io/ioutil" - math "math" - math_bits "math/bits" - reflect "reflect" - strings "strings" - time "time" - - types1 "github.com/cosmos/cosmos-sdk/codec/types" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types2 "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_protoc_gen_gogo_descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/golang/protobuf/ptypes/duration" - _ "github.com/golang/protobuf/ptypes/timestamp" - _ "github.com/regen-network/cosmos-proto" - types "github.com/tendermint/tendermint/proto/tendermint/types" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf -var _ = time.Kitchen - -// 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 - -// BondStatus is the status of a validator. -type BondStatus int32 - -const ( - // UNSPECIFIED defines an invalid validator status. - Unspecified BondStatus = 0 - // UNBONDED defines a validator that is not bonded. - Unbonded BondStatus = 1 - // UNBONDING defines a validator that is unbonding. - Unbonding BondStatus = 2 - // BONDED defines a validator that is bonded. - Bonded BondStatus = 3 -) - -var BondStatus_name = map[int32]string{ - 0: "BOND_STATUS_UNSPECIFIED", - 1: "BOND_STATUS_UNBONDED", - 2: "BOND_STATUS_UNBONDING", - 3: "BOND_STATUS_BONDED", -} - -var BondStatus_value = map[string]int32{ - "BOND_STATUS_UNSPECIFIED": 0, - "BOND_STATUS_UNBONDED": 1, - "BOND_STATUS_UNBONDING": 2, - "BOND_STATUS_BONDED": 3, -} - -func (x BondStatus) String() string { - return proto.EnumName(BondStatus_name, int32(x)) -} - -func (BondStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{0} -} - -// HistoricalInfo contains header and validator information for a given block. -// It is stored as part of staking module's state, which persists the `n` most -// recent HistoricalInfo -// (`n` is set by the staking module's `historical_entries` parameter). -type HistoricalInfo struct { - Header types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header"` - Valset []Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset"` -} - -func (m *HistoricalInfo) Reset() { *m = HistoricalInfo{} } -func (m *HistoricalInfo) String() string { return proto.CompactTextString(m) } -func (*HistoricalInfo) ProtoMessage() {} -func (*HistoricalInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{0} -} -func (m *HistoricalInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *HistoricalInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_HistoricalInfo.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 *HistoricalInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_HistoricalInfo.Merge(m, src) -} -func (m *HistoricalInfo) XXX_Size() int { - return m.Size() -} -func (m *HistoricalInfo) XXX_DiscardUnknown() { - xxx_messageInfo_HistoricalInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_HistoricalInfo proto.InternalMessageInfo - -func (m *HistoricalInfo) GetHeader() types.Header { - if m != nil { - return m.Header - } - return types.Header{} -} - -func (m *HistoricalInfo) GetValset() []Validator { - if m != nil { - return m.Valset - } - return nil -} - -// CommissionRates defines the initial commission rates to be used for creating -// a validator. -type CommissionRates struct { - Rate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=rate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"rate"` - MaxRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=max_rate,json=maxRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_rate" yaml:"max_rate"` - MaxChangeRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=max_change_rate,json=maxChangeRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_change_rate" yaml:"max_change_rate"` -} - -func (m *CommissionRates) Reset() { *m = CommissionRates{} } -func (*CommissionRates) ProtoMessage() {} -func (*CommissionRates) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{1} -} -func (m *CommissionRates) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CommissionRates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CommissionRates.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 *CommissionRates) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommissionRates.Merge(m, src) -} -func (m *CommissionRates) XXX_Size() int { - return m.Size() -} -func (m *CommissionRates) XXX_DiscardUnknown() { - xxx_messageInfo_CommissionRates.DiscardUnknown(m) -} - -var xxx_messageInfo_CommissionRates proto.InternalMessageInfo - -// Commission defines commission parameters for a given validator. -type Commission struct { - CommissionRates `protobuf:"bytes,1,opt,name=commission_rates,json=commissionRates,proto3,embedded=commission_rates" json:"commission_rates"` - UpdateTime time.Time `protobuf:"bytes,2,opt,name=update_time,json=updateTime,proto3,stdtime" json:"update_time" yaml:"update_time"` -} - -func (m *Commission) Reset() { *m = Commission{} } -func (*Commission) ProtoMessage() {} -func (*Commission) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{2} -} -func (m *Commission) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Commission) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Commission.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 *Commission) XXX_Merge(src proto.Message) { - xxx_messageInfo_Commission.Merge(m, src) -} -func (m *Commission) XXX_Size() int { - return m.Size() -} -func (m *Commission) XXX_DiscardUnknown() { - xxx_messageInfo_Commission.DiscardUnknown(m) -} - -var xxx_messageInfo_Commission proto.InternalMessageInfo - -func (m *Commission) GetUpdateTime() time.Time { - if m != nil { - return m.UpdateTime - } - return time.Time{} -} - -// Description defines a validator description. -type Description struct { - Moniker string `protobuf:"bytes,1,opt,name=moniker,proto3" json:"moniker,omitempty"` - Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` - Website string `protobuf:"bytes,3,opt,name=website,proto3" json:"website,omitempty"` - SecurityContact string `protobuf:"bytes,4,opt,name=security_contact,json=securityContact,proto3" json:"security_contact,omitempty" yaml:"security_contact"` - Details string `protobuf:"bytes,5,opt,name=details,proto3" json:"details,omitempty"` -} - -func (m *Description) Reset() { *m = Description{} } -func (*Description) ProtoMessage() {} -func (*Description) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{3} -} -func (m *Description) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Description) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Description.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 *Description) XXX_Merge(src proto.Message) { - xxx_messageInfo_Description.Merge(m, src) -} -func (m *Description) XXX_Size() int { - return m.Size() -} -func (m *Description) XXX_DiscardUnknown() { - xxx_messageInfo_Description.DiscardUnknown(m) -} - -var xxx_messageInfo_Description proto.InternalMessageInfo - -func (m *Description) GetMoniker() string { - if m != nil { - return m.Moniker - } - return "" -} - -func (m *Description) GetIdentity() string { - if m != nil { - return m.Identity - } - return "" -} - -func (m *Description) GetWebsite() string { - if m != nil { - return m.Website - } - return "" -} - -func (m *Description) GetSecurityContact() string { - if m != nil { - return m.SecurityContact - } - return "" -} - -func (m *Description) GetDetails() string { - if m != nil { - return m.Details - } - return "" -} - -// Validator defines a validator, together with the total amount of the -// Validator's bond shares and their exchange rate to coins. Slashing results in -// a decrease in the exchange rate, allowing correct calculation of future -// undelegations without iterating over delegators. When coins are delegated to -// this validator, the validator is credited with a delegation whose number of -// bond shares is based on the amount of coins delegated divided by the current -// exchange rate. Voting power can be calculated as total bonded shares -// multiplied by exchange rate. -type Validator struct { - OperatorAddress string `protobuf:"bytes,1,opt,name=operator_address,json=operatorAddress,proto3" json:"operator_address,omitempty" yaml:"operator_address"` - ConsensusPubkey *types1.Any `protobuf:"bytes,2,opt,name=consensus_pubkey,json=consensusPubkey,proto3" json:"consensus_pubkey,omitempty" yaml:"consensus_pubkey"` - Jailed bool `protobuf:"varint,3,opt,name=jailed,proto3" json:"jailed,omitempty"` - Status BondStatus `protobuf:"varint,4,opt,name=status,proto3,enum=cosmos.staking.v1beta1.BondStatus" json:"status,omitempty"` - Tokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=tokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"tokens"` - DelegatorShares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=delegator_shares,json=delegatorShares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"delegator_shares" yaml:"delegator_shares"` - Description Description `protobuf:"bytes,7,opt,name=description,proto3" json:"description"` - UnbondingHeight int64 `protobuf:"varint,8,opt,name=unbonding_height,json=unbondingHeight,proto3" json:"unbonding_height,omitempty" yaml:"unbonding_height"` - UnbondingTime time.Time `protobuf:"bytes,9,opt,name=unbonding_time,json=unbondingTime,proto3,stdtime" json:"unbonding_time" yaml:"unbonding_time"` - Commission Commission `protobuf:"bytes,10,opt,name=commission,proto3" json:"commission"` - MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation" yaml:"min_self_delegation"` -} - -func (m *Validator) Reset() { *m = Validator{} } -func (*Validator) ProtoMessage() {} -func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{4} -} -func (m *Validator) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Validator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Validator.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 *Validator) XXX_Merge(src proto.Message) { - xxx_messageInfo_Validator.Merge(m, src) -} -func (m *Validator) XXX_Size() int { - return m.Size() -} -func (m *Validator) XXX_DiscardUnknown() { - xxx_messageInfo_Validator.DiscardUnknown(m) -} - -var xxx_messageInfo_Validator proto.InternalMessageInfo - -// ValAddresses defines a repeated set of validator addresses. -type ValAddresses struct { - Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` -} - -func (m *ValAddresses) Reset() { *m = ValAddresses{} } -func (*ValAddresses) ProtoMessage() {} -func (*ValAddresses) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{5} -} -func (m *ValAddresses) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ValAddresses) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ValAddresses.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 *ValAddresses) XXX_Merge(src proto.Message) { - xxx_messageInfo_ValAddresses.Merge(m, src) -} -func (m *ValAddresses) XXX_Size() int { - return m.Size() -} -func (m *ValAddresses) XXX_DiscardUnknown() { - xxx_messageInfo_ValAddresses.DiscardUnknown(m) -} - -var xxx_messageInfo_ValAddresses proto.InternalMessageInfo - -func (m *ValAddresses) GetAddresses() []string { - if m != nil { - return m.Addresses - } - return nil -} - -// DVPair is struct that just has a delegator-validator pair with no other data. -// It is intended to be used as a marshalable pointer. For example, a DVPair can -// be used to construct the key to getting an UnbondingDelegation from state. -type DVPair struct { - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` -} - -func (m *DVPair) Reset() { *m = DVPair{} } -func (*DVPair) ProtoMessage() {} -func (*DVPair) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{6} -} -func (m *DVPair) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DVPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DVPair.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 *DVPair) XXX_Merge(src proto.Message) { - xxx_messageInfo_DVPair.Merge(m, src) -} -func (m *DVPair) XXX_Size() int { - return m.Size() -} -func (m *DVPair) XXX_DiscardUnknown() { - xxx_messageInfo_DVPair.DiscardUnknown(m) -} - -var xxx_messageInfo_DVPair proto.InternalMessageInfo - -// DVPairs defines an array of DVPair objects. -type DVPairs struct { - Pairs []DVPair `protobuf:"bytes,1,rep,name=pairs,proto3" json:"pairs"` -} - -func (m *DVPairs) Reset() { *m = DVPairs{} } -func (m *DVPairs) String() string { return proto.CompactTextString(m) } -func (*DVPairs) ProtoMessage() {} -func (*DVPairs) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{7} -} -func (m *DVPairs) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DVPairs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DVPairs.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 *DVPairs) XXX_Merge(src proto.Message) { - xxx_messageInfo_DVPairs.Merge(m, src) -} -func (m *DVPairs) XXX_Size() int { - return m.Size() -} -func (m *DVPairs) XXX_DiscardUnknown() { - xxx_messageInfo_DVPairs.DiscardUnknown(m) -} - -var xxx_messageInfo_DVPairs proto.InternalMessageInfo - -func (m *DVPairs) GetPairs() []DVPair { - if m != nil { - return m.Pairs - } - return nil -} - -// DVVTriplet is struct that just has a delegator-validator-validator triplet -// with no other data. It is intended to be used as a marshalable pointer. For -// example, a DVVTriplet can be used to construct the key to getting a -// Redelegation from state. -type DVVTriplet struct { - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - ValidatorSrcAddress string `protobuf:"bytes,2,opt,name=validator_src_address,json=validatorSrcAddress,proto3" json:"validator_src_address,omitempty" yaml:"validator_src_address"` - ValidatorDstAddress string `protobuf:"bytes,3,opt,name=validator_dst_address,json=validatorDstAddress,proto3" json:"validator_dst_address,omitempty" yaml:"validator_dst_address"` -} - -func (m *DVVTriplet) Reset() { *m = DVVTriplet{} } -func (*DVVTriplet) ProtoMessage() {} -func (*DVVTriplet) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{8} -} -func (m *DVVTriplet) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DVVTriplet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DVVTriplet.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 *DVVTriplet) XXX_Merge(src proto.Message) { - xxx_messageInfo_DVVTriplet.Merge(m, src) -} -func (m *DVVTriplet) XXX_Size() int { - return m.Size() -} -func (m *DVVTriplet) XXX_DiscardUnknown() { - xxx_messageInfo_DVVTriplet.DiscardUnknown(m) -} - -var xxx_messageInfo_DVVTriplet proto.InternalMessageInfo - -// DVVTriplets defines an array of DVVTriplet objects. -type DVVTriplets struct { - Triplets []DVVTriplet `protobuf:"bytes,1,rep,name=triplets,proto3" json:"triplets"` -} - -func (m *DVVTriplets) Reset() { *m = DVVTriplets{} } -func (m *DVVTriplets) String() string { return proto.CompactTextString(m) } -func (*DVVTriplets) ProtoMessage() {} -func (*DVVTriplets) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{9} -} -func (m *DVVTriplets) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DVVTriplets) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DVVTriplets.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 *DVVTriplets) XXX_Merge(src proto.Message) { - xxx_messageInfo_DVVTriplets.Merge(m, src) -} -func (m *DVVTriplets) XXX_Size() int { - return m.Size() -} -func (m *DVVTriplets) XXX_DiscardUnknown() { - xxx_messageInfo_DVVTriplets.DiscardUnknown(m) -} - -var xxx_messageInfo_DVVTriplets proto.InternalMessageInfo - -func (m *DVVTriplets) GetTriplets() []DVVTriplet { - if m != nil { - return m.Triplets - } - return nil -} - -// Delegation represents the bond with tokens held by an account. It is -// owned by one delegator, and is associated with the voting power of one -// validator. -type Delegation struct { - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` - Shares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=shares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares"` -} - -func (m *Delegation) Reset() { *m = Delegation{} } -func (*Delegation) ProtoMessage() {} -func (*Delegation) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{10} -} -func (m *Delegation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Delegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Delegation.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 *Delegation) XXX_Merge(src proto.Message) { - xxx_messageInfo_Delegation.Merge(m, src) -} -func (m *Delegation) XXX_Size() int { - return m.Size() -} -func (m *Delegation) XXX_DiscardUnknown() { - xxx_messageInfo_Delegation.DiscardUnknown(m) -} - -var xxx_messageInfo_Delegation proto.InternalMessageInfo - -// UnbondingDelegation stores all of a single delegator's unbonding bonds -// for a single validator in an time-ordered list. -type UnbondingDelegation struct { - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` - Entries []UnbondingDelegationEntry `protobuf:"bytes,3,rep,name=entries,proto3" json:"entries"` -} - -func (m *UnbondingDelegation) Reset() { *m = UnbondingDelegation{} } -func (*UnbondingDelegation) ProtoMessage() {} -func (*UnbondingDelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{11} -} -func (m *UnbondingDelegation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *UnbondingDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_UnbondingDelegation.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 *UnbondingDelegation) XXX_Merge(src proto.Message) { - xxx_messageInfo_UnbondingDelegation.Merge(m, src) -} -func (m *UnbondingDelegation) XXX_Size() int { - return m.Size() -} -func (m *UnbondingDelegation) XXX_DiscardUnknown() { - xxx_messageInfo_UnbondingDelegation.DiscardUnknown(m) -} - -var xxx_messageInfo_UnbondingDelegation proto.InternalMessageInfo - -// UnbondingDelegationEntry defines an unbonding object with relevant metadata. -type UnbondingDelegationEntry struct { - CreationHeight int64 `protobuf:"varint,1,opt,name=creation_height,json=creationHeight,proto3" json:"creation_height,omitempty" yaml:"creation_height"` - CompletionTime time.Time `protobuf:"bytes,2,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time" yaml:"completion_time"` - InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` - Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` -} - -func (m *UnbondingDelegationEntry) Reset() { *m = UnbondingDelegationEntry{} } -func (*UnbondingDelegationEntry) ProtoMessage() {} -func (*UnbondingDelegationEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{12} -} -func (m *UnbondingDelegationEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *UnbondingDelegationEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_UnbondingDelegationEntry.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 *UnbondingDelegationEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_UnbondingDelegationEntry.Merge(m, src) -} -func (m *UnbondingDelegationEntry) XXX_Size() int { - return m.Size() -} -func (m *UnbondingDelegationEntry) XXX_DiscardUnknown() { - xxx_messageInfo_UnbondingDelegationEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_UnbondingDelegationEntry proto.InternalMessageInfo - -func (m *UnbondingDelegationEntry) GetCreationHeight() int64 { - if m != nil { - return m.CreationHeight - } - return 0 -} - -func (m *UnbondingDelegationEntry) GetCompletionTime() time.Time { - if m != nil { - return m.CompletionTime - } - return time.Time{} -} - -// RedelegationEntry defines a redelegation object with relevant metadata. -type RedelegationEntry struct { - CreationHeight int64 `protobuf:"varint,1,opt,name=creation_height,json=creationHeight,proto3" json:"creation_height,omitempty" yaml:"creation_height"` - CompletionTime time.Time `protobuf:"bytes,2,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time" yaml:"completion_time"` - InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` - SharesDst github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares_dst"` -} - -func (m *RedelegationEntry) Reset() { *m = RedelegationEntry{} } -func (*RedelegationEntry) ProtoMessage() {} -func (*RedelegationEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{13} -} -func (m *RedelegationEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RedelegationEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RedelegationEntry.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 *RedelegationEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_RedelegationEntry.Merge(m, src) -} -func (m *RedelegationEntry) XXX_Size() int { - return m.Size() -} -func (m *RedelegationEntry) XXX_DiscardUnknown() { - xxx_messageInfo_RedelegationEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_RedelegationEntry proto.InternalMessageInfo - -func (m *RedelegationEntry) GetCreationHeight() int64 { - if m != nil { - return m.CreationHeight - } - return 0 -} - -func (m *RedelegationEntry) GetCompletionTime() time.Time { - if m != nil { - return m.CompletionTime - } - return time.Time{} -} - -// Redelegation contains the list of a particular delegator's redelegating bonds -// from a particular source validator to a particular destination validator. -type Redelegation struct { - DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - ValidatorSrcAddress string `protobuf:"bytes,2,opt,name=validator_src_address,json=validatorSrcAddress,proto3" json:"validator_src_address,omitempty" yaml:"validator_src_address"` - ValidatorDstAddress string `protobuf:"bytes,3,opt,name=validator_dst_address,json=validatorDstAddress,proto3" json:"validator_dst_address,omitempty" yaml:"validator_dst_address"` - Entries []RedelegationEntry `protobuf:"bytes,4,rep,name=entries,proto3" json:"entries"` -} - -func (m *Redelegation) Reset() { *m = Redelegation{} } -func (*Redelegation) ProtoMessage() {} -func (*Redelegation) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{14} -} -func (m *Redelegation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Redelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Redelegation.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 *Redelegation) XXX_Merge(src proto.Message) { - xxx_messageInfo_Redelegation.Merge(m, src) -} -func (m *Redelegation) XXX_Size() int { - return m.Size() -} -func (m *Redelegation) XXX_DiscardUnknown() { - xxx_messageInfo_Redelegation.DiscardUnknown(m) -} - -var xxx_messageInfo_Redelegation proto.InternalMessageInfo - -// Params defines the parameters for the staking module. -type Params struct { - UnbondingTime time.Duration `protobuf:"bytes,1,opt,name=unbonding_time,json=unbondingTime,proto3,stdduration" json:"unbonding_time" yaml:"unbonding_time"` - MaxValidators uint32 `protobuf:"varint,2,opt,name=max_validators,json=maxValidators,proto3" json:"max_validators,omitempty" yaml:"max_validators"` - MaxEntries uint32 `protobuf:"varint,3,opt,name=max_entries,json=maxEntries,proto3" json:"max_entries,omitempty" yaml:"max_entries"` - HistoricalEntries uint32 `protobuf:"varint,4,opt,name=historical_entries,json=historicalEntries,proto3" json:"historical_entries,omitempty" yaml:"historical_entries"` - BondDenom string `protobuf:"bytes,5,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty" yaml:"bond_denom"` -} - -func (m *Params) Reset() { *m = Params{} } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{15} -} -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) GetUnbondingTime() time.Duration { - if m != nil { - return m.UnbondingTime - } - return 0 -} - -func (m *Params) GetMaxValidators() uint32 { - if m != nil { - return m.MaxValidators - } - return 0 -} - -func (m *Params) GetMaxEntries() uint32 { - if m != nil { - return m.MaxEntries - } - return 0 -} - -func (m *Params) GetHistoricalEntries() uint32 { - if m != nil { - return m.HistoricalEntries - } - return 0 -} - -func (m *Params) GetBondDenom() string { - if m != nil { - return m.BondDenom - } - return "" -} - -// DelegationResponse is equivalent to Delegation except that it contains a -// balance in addition to shares which is more suitable for client responses. -type DelegationResponse struct { - Delegation Delegation `protobuf:"bytes,1,opt,name=delegation,proto3" json:"delegation"` - Balance types2.Coin `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance"` -} - -func (m *DelegationResponse) Reset() { *m = DelegationResponse{} } -func (*DelegationResponse) ProtoMessage() {} -func (*DelegationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{16} -} -func (m *DelegationResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DelegationResponse.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 *DelegationResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DelegationResponse.Merge(m, src) -} -func (m *DelegationResponse) XXX_Size() int { - return m.Size() -} -func (m *DelegationResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DelegationResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_DelegationResponse proto.InternalMessageInfo - -func (m *DelegationResponse) GetDelegation() Delegation { - if m != nil { - return m.Delegation - } - return Delegation{} -} - -func (m *DelegationResponse) GetBalance() types2.Coin { - if m != nil { - return m.Balance - } - return types2.Coin{} -} - -// RedelegationEntryResponse is equivalent to a RedelegationEntry except that it -// contains a balance in addition to shares which is more suitable for client -// responses. -type RedelegationEntryResponse struct { - RedelegationEntry RedelegationEntry `protobuf:"bytes,1,opt,name=redelegation_entry,json=redelegationEntry,proto3" json:"redelegation_entry"` - Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` -} - -func (m *RedelegationEntryResponse) Reset() { *m = RedelegationEntryResponse{} } -func (m *RedelegationEntryResponse) String() string { return proto.CompactTextString(m) } -func (*RedelegationEntryResponse) ProtoMessage() {} -func (*RedelegationEntryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{17} -} -func (m *RedelegationEntryResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RedelegationEntryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RedelegationEntryResponse.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 *RedelegationEntryResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RedelegationEntryResponse.Merge(m, src) -} -func (m *RedelegationEntryResponse) XXX_Size() int { - return m.Size() -} -func (m *RedelegationEntryResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RedelegationEntryResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RedelegationEntryResponse proto.InternalMessageInfo - -func (m *RedelegationEntryResponse) GetRedelegationEntry() RedelegationEntry { - if m != nil { - return m.RedelegationEntry - } - return RedelegationEntry{} -} - -// RedelegationResponse is equivalent to a Redelegation except that its entries -// contain a balance in addition to shares which is more suitable for client -// responses. -type RedelegationResponse struct { - Redelegation Redelegation `protobuf:"bytes,1,opt,name=redelegation,proto3" json:"redelegation"` - Entries []RedelegationEntryResponse `protobuf:"bytes,2,rep,name=entries,proto3" json:"entries"` -} - -func (m *RedelegationResponse) Reset() { *m = RedelegationResponse{} } -func (m *RedelegationResponse) String() string { return proto.CompactTextString(m) } -func (*RedelegationResponse) ProtoMessage() {} -func (*RedelegationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{18} -} -func (m *RedelegationResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RedelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RedelegationResponse.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 *RedelegationResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_RedelegationResponse.Merge(m, src) -} -func (m *RedelegationResponse) XXX_Size() int { - return m.Size() -} -func (m *RedelegationResponse) XXX_DiscardUnknown() { - xxx_messageInfo_RedelegationResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_RedelegationResponse proto.InternalMessageInfo - -func (m *RedelegationResponse) GetRedelegation() Redelegation { - if m != nil { - return m.Redelegation - } - return Redelegation{} -} - -func (m *RedelegationResponse) GetEntries() []RedelegationEntryResponse { - if m != nil { - return m.Entries - } - return nil -} - -// Pool is used for tracking bonded and not-bonded token supply of the bond -// denomination. -type Pool struct { - NotBondedTokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=not_bonded_tokens,json=notBondedTokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"not_bonded_tokens"` - BondedTokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=bonded_tokens,json=bondedTokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"bonded_tokens" yaml:"bonded_tokens"` -} - -func (m *Pool) Reset() { *m = Pool{} } -func (m *Pool) String() string { return proto.CompactTextString(m) } -func (*Pool) ProtoMessage() {} -func (*Pool) Descriptor() ([]byte, []int) { - return fileDescriptor_64c30c6cf92913c9, []int{19} -} -func (m *Pool) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Pool.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 *Pool) XXX_Merge(src proto.Message) { - xxx_messageInfo_Pool.Merge(m, src) -} -func (m *Pool) XXX_Size() int { - return m.Size() -} -func (m *Pool) XXX_DiscardUnknown() { - xxx_messageInfo_Pool.DiscardUnknown(m) -} - -var xxx_messageInfo_Pool proto.InternalMessageInfo - -func init() { - // proto.RegisterEnum("cosmos.staking.v1beta1.BondStatus", BondStatus_name, BondStatus_value) - // proto.RegisterType((*HistoricalInfo)(nil), "cosmos.staking.v1beta1.HistoricalInfo") - // proto.RegisterType((*CommissionRates)(nil), "cosmos.staking.v1beta1.CommissionRates") - // proto.RegisterType((*Commission)(nil), "cosmos.staking.v1beta1.Commission") - // proto.RegisterType((*Description)(nil), "cosmos.staking.v1beta1.Description") - // proto.RegisterType((*Validator)(nil), "cosmos.staking.v1beta1.Validator") - // proto.RegisterType((*ValAddresses)(nil), "cosmos.staking.v1beta1.ValAddresses") - // proto.RegisterType((*DVPair)(nil), "cosmos.staking.v1beta1.DVPair") - // proto.RegisterType((*DVPairs)(nil), "cosmos.staking.v1beta1.DVPairs") - // proto.RegisterType((*DVVTriplet)(nil), "cosmos.staking.v1beta1.DVVTriplet") - // proto.RegisterType((*DVVTriplets)(nil), "cosmos.staking.v1beta1.DVVTriplets") - // proto.RegisterType((*Delegation)(nil), "cosmos.staking.v1beta1.Delegation") - // proto.RegisterType((*UnbondingDelegation)(nil), "cosmos.staking.v1beta1.UnbondingDelegation") - // proto.RegisterType((*UnbondingDelegationEntry)(nil), "cosmos.staking.v1beta1.UnbondingDelegationEntry") - // proto.RegisterType((*RedelegationEntry)(nil), "cosmos.staking.v1beta1.RedelegationEntry") - // proto.RegisterType((*Redelegation)(nil), "cosmos.staking.v1beta1.Redelegation") - // proto.RegisterType((*Params)(nil), "cosmos.staking.v1beta1.Params") - // proto.RegisterType((*DelegationResponse)(nil), "cosmos.staking.v1beta1.DelegationResponse") - // proto.RegisterType((*RedelegationEntryResponse)(nil), "cosmos.staking.v1beta1.RedelegationEntryResponse") - // proto.RegisterType((*RedelegationResponse)(nil), "cosmos.staking.v1beta1.RedelegationResponse") - // proto.RegisterType((*Pool)(nil), "cosmos.staking.v1beta1.Pool") -} - -func init() { - proto.RegisterFile("cosmos/staking/v1beta1/staking.proto", fileDescriptor_64c30c6cf92913c9) -} - -var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1796 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x76, 0x3b, 0x5e, 0xc7, 0x7e, 0x4e, 0xe2, 0xa4, 0x26, 0x33, 0xeb, 0x98, 0xc1, 0xed, 0x6d, - 0x56, 0x4b, 0x40, 0xbb, 0x0e, 0x93, 0x45, 0x8b, 0xc8, 0x05, 0xc6, 0x71, 0x86, 0x58, 0xbb, 0x0c, - 0xa1, 0x93, 0x09, 0x12, 0xac, 0xb0, 0xca, 0xdd, 0x15, 0xa7, 0x89, 0xbb, 0xdb, 0x74, 0x95, 0x87, - 0x58, 0xda, 0x03, 0xc7, 0x65, 0x10, 0x62, 0xb9, 0xed, 0x65, 0xa4, 0x91, 0xf6, 0xba, 0x12, 0x17, - 0xc4, 0x95, 0xeb, 0x02, 0x97, 0xe1, 0x86, 0x10, 0x32, 0x68, 0xe6, 0x82, 0x38, 0x21, 0x1f, 0x10, - 0x37, 0x50, 0xfd, 0xf4, 0x4f, 0xda, 0xf1, 0xcc, 0x78, 0xb4, 0x87, 0x91, 0xd8, 0x4b, 0xe2, 0x7a, - 0xf5, 0xde, 0xf7, 0xea, 0xfd, 0xd6, 0xab, 0x86, 0x57, 0x2d, 0x9f, 0xba, 0x3e, 0xdd, 0xa2, 0x0c, - 0x9f, 0x39, 0x5e, 0x6f, 0xeb, 0xee, 0x8d, 0x2e, 0x61, 0xf8, 0x46, 0xb8, 0x6e, 0x0c, 0x02, 0x9f, - 0xf9, 0xe8, 0x9a, 0xe4, 0x6a, 0x84, 0x54, 0xc5, 0x55, 0x5d, 0xef, 0xf9, 0x3d, 0x5f, 0xb0, 0x6c, - 0xf1, 0x5f, 0x92, 0xbb, 0xba, 0xd1, 0xf3, 0xfd, 0x5e, 0x9f, 0x6c, 0x89, 0x55, 0x77, 0x78, 0xb2, - 0x85, 0xbd, 0x91, 0xda, 0xaa, 0xa5, 0xb7, 0xec, 0x61, 0x80, 0x99, 0xe3, 0x7b, 0x6a, 0x5f, 0x4f, - 0xef, 0x33, 0xc7, 0x25, 0x94, 0x61, 0x77, 0x10, 0x62, 0xcb, 0x93, 0x74, 0xa4, 0x52, 0x75, 0x2c, - 0x85, 0xad, 0x4c, 0xe9, 0x62, 0x4a, 0x22, 0x3b, 0x2c, 0xdf, 0x09, 0xb1, 0xaf, 0x33, 0xe2, 0xd9, - 0x24, 0x70, 0x1d, 0x8f, 0x6d, 0xb1, 0xd1, 0x80, 0x50, 0xf9, 0x57, 0xee, 0x1a, 0x3f, 0xd3, 0x60, - 0x65, 0xdf, 0xa1, 0xcc, 0x0f, 0x1c, 0x0b, 0xf7, 0xdb, 0xde, 0x89, 0x8f, 0xde, 0x82, 0xfc, 0x29, - 0xc1, 0x36, 0x09, 0x2a, 0x5a, 0x5d, 0xdb, 0x2c, 0x6d, 0x57, 0x1a, 0x31, 0x42, 0x43, 0xca, 0xee, - 0x8b, 0xfd, 0x66, 0xee, 0x93, 0xb1, 0x9e, 0x31, 0x15, 0x37, 0xfa, 0x06, 0xe4, 0xef, 0xe2, 0x3e, - 0x25, 0xac, 0x92, 0xad, 0x2f, 0x6c, 0x96, 0xb6, 0x5f, 0x69, 0x5c, 0xee, 0xbe, 0xc6, 0x31, 0xee, - 0x3b, 0x36, 0x66, 0x7e, 0x04, 0x20, 0xc5, 0x8c, 0x5f, 0x67, 0xa1, 0xbc, 0xeb, 0xbb, 0xae, 0x43, - 0xa9, 0xe3, 0x7b, 0x26, 0x66, 0x84, 0xa2, 0x26, 0xe4, 0x02, 0xcc, 0x88, 0x38, 0x4a, 0xb1, 0xd9, - 0xe0, 0xfc, 0x7f, 0x19, 0xeb, 0xaf, 0xf5, 0x1c, 0x76, 0x3a, 0xec, 0x36, 0x2c, 0xdf, 0x55, 0xce, - 0x50, 0xff, 0xde, 0xa0, 0xf6, 0x99, 0xb2, 0xaf, 0x45, 0x2c, 0x53, 0xc8, 0xa2, 0x77, 0xa1, 0xe0, - 0xe2, 0xf3, 0x8e, 0xc0, 0xc9, 0x0a, 0x9c, 0x9b, 0xf3, 0xe1, 0x4c, 0xc6, 0x7a, 0x79, 0x84, 0xdd, - 0xfe, 0x8e, 0x11, 0xe2, 0x18, 0xe6, 0xa2, 0x8b, 0xcf, 0xf9, 0x11, 0xd1, 0x00, 0xca, 0x9c, 0x6a, - 0x9d, 0x62, 0xaf, 0x47, 0xa4, 0x92, 0x05, 0xa1, 0x64, 0x7f, 0x6e, 0x25, 0xd7, 0x62, 0x25, 0x09, - 0x38, 0xc3, 0x5c, 0x76, 0xf1, 0xf9, 0xae, 0x20, 0x70, 0x8d, 0x3b, 0x85, 0x0f, 0x1f, 0xe8, 0x99, - 0x7f, 0x3c, 0xd0, 0x35, 0xe3, 0x4f, 0x1a, 0x40, 0xec, 0x31, 0xf4, 0x2e, 0xac, 0x5a, 0xd1, 0x4a, - 0xc8, 0x52, 0x15, 0xc3, 0x2f, 0xce, 0x8a, 0x45, 0xca, 0xdf, 0xcd, 0x02, 0x3f, 0xf4, 0xc3, 0xb1, - 0xae, 0x99, 0x65, 0x2b, 0x15, 0x8a, 0x1f, 0x40, 0x69, 0x38, 0xb0, 0x31, 0x23, 0x1d, 0x9e, 0x9d, - 0xc2, 0x93, 0xa5, 0xed, 0x6a, 0x43, 0xa6, 0x6e, 0x23, 0x4c, 0xdd, 0xc6, 0x51, 0x98, 0xba, 0xcd, - 0x1a, 0xc7, 0x9a, 0x8c, 0x75, 0x24, 0xcd, 0x4a, 0x08, 0x1b, 0x1f, 0xfc, 0x4d, 0xd7, 0x4c, 0x90, - 0x14, 0x2e, 0x90, 0xb0, 0xe9, 0xf7, 0x1a, 0x94, 0x5a, 0x84, 0x5a, 0x81, 0x33, 0xe0, 0x15, 0x82, - 0x2a, 0xb0, 0xe8, 0xfa, 0x9e, 0x73, 0xa6, 0xf2, 0xb1, 0x68, 0x86, 0x4b, 0x54, 0x85, 0x82, 0x63, - 0x13, 0x8f, 0x39, 0x6c, 0x24, 0xe3, 0x6a, 0x46, 0x6b, 0x2e, 0xf5, 0x13, 0xd2, 0xa5, 0x4e, 0x18, - 0x0d, 0x33, 0x5c, 0xa2, 0x5b, 0xb0, 0x4a, 0x89, 0x35, 0x0c, 0x1c, 0x36, 0xea, 0x58, 0xbe, 0xc7, - 0xb0, 0xc5, 0x2a, 0x39, 0x11, 0xb0, 0xcf, 0x4d, 0xc6, 0xfa, 0xcb, 0xf2, 0xac, 0x69, 0x0e, 0xc3, - 0x2c, 0x87, 0xa4, 0x5d, 0x49, 0xe1, 0x1a, 0x6c, 0xc2, 0xb0, 0xd3, 0xa7, 0x95, 0x97, 0xa4, 0x06, - 0xb5, 0x4c, 0xd8, 0xf2, 0xf1, 0x22, 0x14, 0xa3, 0x6c, 0xe7, 0x9a, 0xfd, 0x01, 0x09, 0xf8, 0xef, - 0x0e, 0xb6, 0xed, 0x80, 0x50, 0xaa, 0xf2, 0x3a, 0xa1, 0x39, 0xcd, 0x61, 0x98, 0xe5, 0x90, 0x74, - 0x53, 0x52, 0x10, 0xe3, 0x61, 0xf6, 0x28, 0xf1, 0xe8, 0x90, 0x76, 0x06, 0xc3, 0xee, 0x19, 0x19, - 0xa9, 0x68, 0xac, 0x4f, 0x45, 0xe3, 0xa6, 0x37, 0x6a, 0xbe, 0x19, 0xa3, 0xa7, 0xe5, 0x8c, 0x3f, - 0xfc, 0xe6, 0x8d, 0x75, 0x95, 0x1a, 0x56, 0x30, 0x1a, 0x30, 0xbf, 0x71, 0x30, 0xec, 0xbe, 0x4d, - 0x46, 0x3c, 0xfc, 0x8a, 0xf5, 0x40, 0x70, 0xa2, 0x6b, 0x90, 0xff, 0x11, 0x76, 0xfa, 0xc4, 0x16, - 0x0e, 0x2d, 0x98, 0x6a, 0x85, 0x76, 0x20, 0x4f, 0x19, 0x66, 0x43, 0x2a, 0xbc, 0xb8, 0xb2, 0x6d, - 0xcc, 0x4a, 0xb5, 0xa6, 0xef, 0xd9, 0x87, 0x82, 0xd3, 0x54, 0x12, 0xe8, 0x16, 0xe4, 0x99, 0x7f, - 0x46, 0x3c, 0xe5, 0xc2, 0xb9, 0xea, 0xbb, 0xed, 0x31, 0x53, 0x49, 0x73, 0x8f, 0xd8, 0xa4, 0x4f, - 0x7a, 0xc2, 0x71, 0xf4, 0x14, 0x07, 0x84, 0x56, 0xf2, 0x02, 0xb1, 0x3d, 0x77, 0x11, 0x2a, 0x4f, - 0xa5, 0xf1, 0x0c, 0xb3, 0x1c, 0x91, 0x0e, 0x05, 0x05, 0xbd, 0x0d, 0x25, 0x3b, 0x4e, 0xd4, 0xca, - 0xa2, 0x08, 0xc1, 0x17, 0x66, 0x99, 0x9f, 0xc8, 0x69, 0xd5, 0xf7, 0x92, 0xd2, 0x3c, 0x39, 0x86, - 0x5e, 0xd7, 0xf7, 0x6c, 0xc7, 0xeb, 0x75, 0x4e, 0x89, 0xd3, 0x3b, 0x65, 0x95, 0x42, 0x5d, 0xdb, - 0x5c, 0x48, 0x26, 0x47, 0x9a, 0xc3, 0x30, 0xcb, 0x11, 0x69, 0x5f, 0x50, 0x90, 0x0d, 0x2b, 0x31, - 0x97, 0x28, 0xd4, 0xe2, 0x53, 0x0b, 0xf5, 0x15, 0x55, 0xa8, 0x57, 0xd3, 0x5a, 0xe2, 0x5a, 0x5d, - 0x8e, 0x88, 0x5c, 0x0c, 0xed, 0x03, 0xc4, 0xed, 0xa1, 0x02, 0x42, 0x83, 0xf1, 0xf4, 0x1e, 0xa3, - 0x0c, 0x4f, 0xc8, 0xa2, 0xf7, 0xe0, 0x8a, 0xeb, 0x78, 0x1d, 0x4a, 0xfa, 0x27, 0x1d, 0xe5, 0x60, - 0x0e, 0x59, 0x12, 0xd1, 0x7b, 0x67, 0xbe, 0x7c, 0x98, 0x8c, 0xf5, 0xaa, 0x6a, 0xa1, 0xd3, 0x90, - 0x86, 0xb9, 0xe6, 0x3a, 0xde, 0x21, 0xe9, 0x9f, 0xb4, 0x22, 0xda, 0xce, 0xd2, 0xfb, 0x0f, 0xf4, - 0x8c, 0x2a, 0xd7, 0x8c, 0xf1, 0x16, 0x2c, 0x1d, 0xe3, 0xbe, 0x2a, 0x33, 0x42, 0xd1, 0x75, 0x28, - 0xe2, 0x70, 0x51, 0xd1, 0xea, 0x0b, 0x9b, 0x45, 0x33, 0x26, 0xc8, 0x32, 0xff, 0xe9, 0x5f, 0xeb, - 0x9a, 0xf1, 0xb1, 0x06, 0xf9, 0xd6, 0xf1, 0x01, 0x76, 0x02, 0xd4, 0x86, 0xb5, 0x38, 0x73, 0x2e, - 0x16, 0xf9, 0xf5, 0xc9, 0x58, 0xaf, 0xa4, 0x93, 0x2b, 0xaa, 0xf2, 0x38, 0x81, 0xc3, 0x32, 0x6f, - 0xc3, 0xda, 0xdd, 0xb0, 0x77, 0x44, 0x50, 0xd9, 0x34, 0xd4, 0x14, 0x8b, 0x61, 0xae, 0x46, 0x34, - 0x05, 0x95, 0x32, 0x73, 0x0f, 0x16, 0xe5, 0x69, 0x29, 0xda, 0x81, 0x97, 0x06, 0xfc, 0x87, 0xb0, - 0xae, 0xb4, 0x5d, 0x9b, 0x99, 0xbc, 0x82, 0x5f, 0x85, 0x4f, 0x8a, 0x18, 0xbf, 0xca, 0x02, 0xb4, - 0x8e, 0x8f, 0x8f, 0x02, 0x67, 0xd0, 0x27, 0xec, 0xd3, 0xb4, 0xfc, 0x08, 0xae, 0xc6, 0x66, 0xd1, - 0xc0, 0x4a, 0x59, 0x5f, 0x9f, 0x8c, 0xf5, 0xeb, 0x69, 0xeb, 0x13, 0x6c, 0x86, 0x79, 0x25, 0xa2, - 0x1f, 0x06, 0xd6, 0xa5, 0xa8, 0x36, 0x65, 0x11, 0xea, 0xc2, 0x6c, 0xd4, 0x04, 0x5b, 0x12, 0xb5, - 0x45, 0xd9, 0xe5, 0xae, 0x3d, 0x84, 0x52, 0xec, 0x12, 0x8a, 0x5a, 0x50, 0x60, 0xea, 0xb7, 0xf2, - 0xb0, 0x31, 0xdb, 0xc3, 0xa1, 0x98, 0xf2, 0x72, 0x24, 0x69, 0xfc, 0x47, 0x03, 0x88, 0x73, 0xf6, - 0xc5, 0x4c, 0x31, 0xde, 0xca, 0x55, 0xe3, 0x5d, 0x78, 0xae, 0x51, 0x4d, 0x49, 0xa7, 0xfc, 0xf9, - 0xf3, 0x2c, 0x5c, 0xb9, 0x13, 0x76, 0x9e, 0x17, 0xde, 0x07, 0x07, 0xb0, 0x48, 0x3c, 0x16, 0x38, - 0xc2, 0x09, 0x3c, 0xda, 0x5f, 0x99, 0x15, 0xed, 0x4b, 0x6c, 0xda, 0xf3, 0x58, 0x30, 0x52, 0xb1, - 0x0f, 0x61, 0x52, 0xde, 0xf8, 0xe5, 0x02, 0x54, 0x66, 0x49, 0xa2, 0x5d, 0x28, 0x5b, 0x01, 0x11, - 0x84, 0xf0, 0xfe, 0xd0, 0xc4, 0xfd, 0x51, 0x8d, 0x27, 0xcb, 0x14, 0x83, 0x61, 0xae, 0x84, 0x14, - 0x75, 0x7b, 0xf4, 0x80, 0x8f, 0x7d, 0x3c, 0xed, 0x38, 0xd7, 0x33, 0xce, 0x79, 0x86, 0xba, 0x3e, - 0x42, 0x25, 0x17, 0x01, 0xe4, 0xfd, 0xb1, 0x12, 0x53, 0xc5, 0x05, 0xf2, 0x63, 0x28, 0x3b, 0x9e, - 0xc3, 0x1c, 0xdc, 0xef, 0x74, 0x71, 0x1f, 0x7b, 0xd6, 0xf3, 0x4c, 0xcd, 0xb2, 0xe5, 0x2b, 0xb5, - 0x29, 0x38, 0xc3, 0x5c, 0x51, 0x94, 0xa6, 0x24, 0xa0, 0x7d, 0x58, 0x0c, 0x55, 0xe5, 0x9e, 0x6b, - 0xda, 0x08, 0xc5, 0x13, 0x03, 0xde, 0x2f, 0x16, 0x60, 0xcd, 0x24, 0xf6, 0x67, 0xa1, 0x98, 0x2f, - 0x14, 0xdf, 0x06, 0x90, 0xe5, 0xce, 0x1b, 0xec, 0x73, 0x44, 0x83, 0x37, 0x8c, 0xa2, 0x44, 0x68, - 0x51, 0x96, 0x88, 0xc7, 0x38, 0x0b, 0x4b, 0xc9, 0x78, 0xfc, 0x9f, 0xde, 0x4a, 0xa8, 0x1d, 0x77, - 0xa2, 0x9c, 0xe8, 0x44, 0x5f, 0x9a, 0xd5, 0x89, 0xa6, 0xb2, 0xf7, 0xc9, 0x2d, 0xe8, 0xdf, 0x59, - 0xc8, 0x1f, 0xe0, 0x00, 0xbb, 0x14, 0x59, 0x53, 0x93, 0xa6, 0x7c, 0x6b, 0x6e, 0x4c, 0xe5, 0x67, - 0x4b, 0x7d, 0xed, 0x78, 0xca, 0xa0, 0xf9, 0xe1, 0x25, 0x83, 0xe6, 0x37, 0x61, 0x85, 0x3f, 0x87, - 0x23, 0x1b, 0xa5, 0xb7, 0x97, 0x9b, 0x1b, 0x31, 0xca, 0xc5, 0x7d, 0xf9, 0x5a, 0x8e, 0x1e, 0x5d, - 0x14, 0x7d, 0x0d, 0x4a, 0x9c, 0x23, 0x6e, 0xcc, 0x5c, 0xfc, 0x5a, 0xfc, 0x2c, 0x4d, 0x6c, 0x1a, - 0x26, 0xb8, 0xf8, 0x7c, 0x4f, 0x2e, 0xd0, 0x3b, 0x80, 0x4e, 0xa3, 0x2f, 0x23, 0x9d, 0xd8, 0x9d, - 0x5c, 0xfe, 0xf3, 0x93, 0xb1, 0xbe, 0x21, 0xe5, 0xa7, 0x79, 0x0c, 0x73, 0x2d, 0x26, 0x86, 0x68, - 0x5f, 0x05, 0xe0, 0x76, 0x75, 0x6c, 0xe2, 0xf9, 0xae, 0x7a, 0xee, 0x5c, 0x9d, 0x8c, 0xf5, 0x35, - 0x89, 0x12, 0xef, 0x19, 0x66, 0x91, 0x2f, 0x5a, 0xfc, 0x77, 0x22, 0xb3, 0x3f, 0xd2, 0x00, 0xc5, - 0x2d, 0xdf, 0x24, 0x74, 0xc0, 0xdf, 0x67, 0x7c, 0x10, 0x4f, 0x4c, 0xcd, 0xda, 0x93, 0x07, 0xf1, - 0x58, 0x3e, 0x1c, 0xc4, 0x13, 0x95, 0xf2, 0xf5, 0xb8, 0x3d, 0x66, 0x55, 0x1c, 0x15, 0x4c, 0x17, - 0x53, 0x92, 0x18, 0xe6, 0x9d, 0x50, 0x7a, 0xaa, 0x1f, 0x66, 0x8c, 0x3f, 0x6a, 0xb0, 0x31, 0x95, - 0x51, 0xd1, 0x61, 0x7f, 0x08, 0x28, 0x48, 0x6c, 0x0a, 0x7f, 0x8d, 0xd4, 0xa1, 0xe7, 0x4e, 0xd0, - 0xb5, 0x60, 0xaa, 0xef, 0x7e, 0x7a, 0x1d, 0x3e, 0x27, 0x7c, 0xfe, 0x3b, 0x0d, 0xd6, 0x93, 0xea, - 0x23, 0x43, 0x6e, 0xc3, 0x52, 0x52, 0xbb, 0x32, 0xe1, 0xd5, 0x67, 0x31, 0x41, 0x9d, 0xfe, 0x82, - 0x3c, 0xfa, 0x6e, 0x5c, 0xae, 0xf2, 0xdb, 0xd9, 0x8d, 0x67, 0xf6, 0x46, 0x78, 0xa6, 0x74, 0xd9, - 0xe6, 0x44, 0x3c, 0xfe, 0xab, 0x41, 0xee, 0xc0, 0xf7, 0xfb, 0xc8, 0x87, 0x35, 0xcf, 0x67, 0x1d, - 0x9e, 0x59, 0xc4, 0xee, 0xa8, 0x47, 0xb7, 0xec, 0x83, 0xbb, 0xf3, 0x39, 0xe9, 0x9f, 0x63, 0x7d, - 0x1a, 0xca, 0x2c, 0x7b, 0x3e, 0x6b, 0x0a, 0xca, 0x91, 0x7c, 0x92, 0xbf, 0x07, 0xcb, 0x17, 0x95, - 0xc9, 0x2e, 0xf9, 0xbd, 0xb9, 0x95, 0x5d, 0x84, 0x99, 0x8c, 0xf5, 0xf5, 0xb8, 0x62, 0x22, 0xb2, - 0x61, 0x2e, 0x75, 0x13, 0xda, 0x77, 0x0a, 0x3c, 0x7e, 0xff, 0x7a, 0xa0, 0x6b, 0x5f, 0xfe, 0xad, - 0x06, 0x10, 0x7f, 0x79, 0x40, 0xaf, 0xc3, 0xcb, 0xcd, 0xef, 0xdc, 0x6e, 0x75, 0x0e, 0x8f, 0x6e, - 0x1e, 0xdd, 0x39, 0xec, 0xdc, 0xb9, 0x7d, 0x78, 0xb0, 0xb7, 0xdb, 0xbe, 0xd5, 0xde, 0x6b, 0xad, - 0x66, 0xaa, 0xe5, 0x7b, 0xf7, 0xeb, 0xa5, 0x3b, 0x1e, 0x1d, 0x10, 0xcb, 0x39, 0x71, 0x88, 0x8d, - 0x5e, 0x83, 0xf5, 0x8b, 0xdc, 0x7c, 0xb5, 0xd7, 0x5a, 0xd5, 0xaa, 0x4b, 0xf7, 0xee, 0xd7, 0x0b, - 0x72, 0x16, 0x23, 0x36, 0xda, 0x84, 0xab, 0xd3, 0x7c, 0xed, 0xdb, 0xdf, 0x5a, 0xcd, 0x56, 0x97, - 0xef, 0xdd, 0xaf, 0x17, 0xa3, 0xa1, 0x0d, 0x19, 0x80, 0x92, 0x9c, 0x0a, 0x6f, 0xa1, 0x0a, 0xf7, - 0xee, 0xd7, 0xf3, 0xd2, 0x81, 0xd5, 0xdc, 0xfb, 0x1f, 0xd5, 0x32, 0xcd, 0x5b, 0x9f, 0x3c, 0xaa, - 0x69, 0x0f, 0x1f, 0xd5, 0xb4, 0xbf, 0x3f, 0xaa, 0x69, 0x1f, 0x3c, 0xae, 0x65, 0x1e, 0x3e, 0xae, - 0x65, 0xfe, 0xfc, 0xb8, 0x96, 0xf9, 0xfe, 0xeb, 0x4f, 0xf4, 0xdd, 0x79, 0xf4, 0x51, 0x5b, 0x78, - 0xb1, 0x9b, 0x17, 0x6d, 0xf8, 0xcd, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xc2, 0x48, 0x4c, 0x86, - 0xf3, 0x16, 0x00, 0x00, -} - -func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { - return StakingDescription() -} -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 - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xd7, - 0x71, 0xd8, 0xcd, 0xee, 0x02, 0xd8, 0x6d, 0x2c, 0x80, 0xc5, 0x03, 0xee, 0x6e, 0x6f, 0x79, 0x04, - 0xc0, 0xe1, 0xd7, 0xf1, 0x48, 0x02, 0xe4, 0x91, 0x77, 0x24, 0xf7, 0x24, 0xd2, 0x58, 0x60, 0x0f, - 0x07, 0x1e, 0xbe, 0x38, 0x00, 0x8e, 0xd4, 0x87, 0xb3, 0x35, 0x98, 0x7d, 0x58, 0x0c, 0xb1, 0x3b, - 0x33, 0x9c, 0x99, 0xbd, 0x3b, 0x50, 0x52, 0x15, 0x2d, 0x29, 0x8a, 0x44, 0xc7, 0x91, 0x14, 0xb9, - 0x1c, 0x89, 0xd6, 0x29, 0x92, 0xe5, 0x44, 0x8e, 0xac, 0xc4, 0x1f, 0x52, 0x94, 0x38, 0x49, 0x55, - 0xa4, 0x24, 0x8e, 0x25, 0xa5, 0xe2, 0x92, 0x2a, 0xae, 0xc4, 0x71, 0x25, 0x67, 0x87, 0x52, 0x39, - 0x8c, 0xa2, 0xc4, 0xf2, 0x59, 0x4e, 0x9c, 0x52, 0xa5, 0x92, 0x7a, 0x5f, 0xf3, 0xb5, 0x1f, 0xb3, - 0x0b, 0xdd, 0x49, 0x72, 0x9c, 0x5f, 0xd8, 0xd7, 0xaf, 0xbb, 0x5f, 0xbf, 0x7e, 0xfd, 0xba, 0xfb, - 0x7d, 0x0d, 0xe0, 0x9f, 0x9f, 0x87, 0x99, 0x9a, 0x69, 0xd6, 0xea, 0x78, 0xce, 0xb2, 0x4d, 0xd7, - 0xdc, 0x69, 0xee, 0xce, 0x55, 0xb1, 0xa3, 0xd9, 0xba, 0xe5, 0x9a, 0xf6, 0x2c, 0x85, 0xa1, 0x31, - 0x86, 0x31, 0x2b, 0x30, 0xe4, 0x55, 0x18, 0xbf, 0xa0, 0xd7, 0xf1, 0xa2, 0x87, 0xb8, 0x89, 0x5d, - 0xf4, 0x24, 0xa4, 0x76, 0xf5, 0x3a, 0xce, 0x4b, 0x33, 0xc9, 0x53, 0xc3, 0x67, 0xee, 0x99, 0x8d, - 0x10, 0xcd, 0x86, 0x29, 0x36, 0x08, 0x58, 0xa1, 0x14, 0xf2, 0xb7, 0x52, 0x30, 0xd1, 0xa6, 0x16, - 0x21, 0x48, 0x19, 0x6a, 0x83, 0x70, 0x94, 0x4e, 0x65, 0x14, 0xfa, 0x1b, 0xe5, 0x61, 0xc8, 0x52, - 0xb5, 0x7d, 0xb5, 0x86, 0xf3, 0x09, 0x0a, 0x16, 0x45, 0x34, 0x05, 0x50, 0xc5, 0x16, 0x36, 0xaa, - 0xd8, 0xd0, 0x0e, 0xf2, 0xc9, 0x99, 0xe4, 0xa9, 0x8c, 0x12, 0x80, 0xa0, 0x07, 0x61, 0xdc, 0x6a, - 0xee, 0xd4, 0x75, 0xad, 0x12, 0x40, 0x83, 0x99, 0xe4, 0xa9, 0x01, 0x25, 0xc7, 0x2a, 0x16, 0x7d, - 0xe4, 0xfb, 0x61, 0xec, 0x2a, 0x56, 0xf7, 0x83, 0xa8, 0xc3, 0x14, 0x75, 0x94, 0x80, 0x03, 0x88, - 0x0b, 0x90, 0x6d, 0x60, 0xc7, 0x51, 0x6b, 0xb8, 0xe2, 0x1e, 0x58, 0x38, 0x9f, 0xa2, 0xbd, 0x9f, - 0x69, 0xe9, 0x7d, 0xb4, 0xe7, 0xc3, 0x9c, 0x6a, 0xeb, 0xc0, 0xc2, 0x68, 0x1e, 0x32, 0xd8, 0x68, - 0x36, 0x18, 0x87, 0x81, 0x0e, 0xfa, 0x2b, 0x1b, 0xcd, 0x46, 0x94, 0x4b, 0x9a, 0x90, 0x71, 0x16, - 0x43, 0x0e, 0xb6, 0xaf, 0xe8, 0x1a, 0xce, 0x0f, 0x52, 0x06, 0xf7, 0xb7, 0x30, 0xd8, 0x64, 0xf5, - 0x51, 0x1e, 0x82, 0x0e, 0x2d, 0x40, 0x06, 0x5f, 0x73, 0xb1, 0xe1, 0xe8, 0xa6, 0x91, 0x1f, 0xa2, - 0x4c, 0xee, 0x6d, 0x33, 0x8a, 0xb8, 0x5e, 0x8d, 0xb2, 0xf0, 0xe9, 0xd0, 0x39, 0x18, 0x32, 0x2d, - 0x57, 0x37, 0x0d, 0x27, 0x9f, 0x9e, 0x91, 0x4e, 0x0d, 0x9f, 0x39, 0xd9, 0xd6, 0x10, 0xd6, 0x19, - 0x8e, 0x22, 0x90, 0xd1, 0x32, 0xe4, 0x1c, 0xb3, 0x69, 0x6b, 0xb8, 0xa2, 0x99, 0x55, 0x5c, 0xd1, - 0x8d, 0x5d, 0x33, 0x9f, 0xa1, 0x0c, 0xa6, 0x5b, 0x3b, 0x42, 0x11, 0x17, 0xcc, 0x2a, 0x5e, 0x36, - 0x76, 0x4d, 0x65, 0xd4, 0x09, 0x95, 0xd1, 0x31, 0x18, 0x74, 0x0e, 0x0c, 0x57, 0xbd, 0x96, 0xcf, - 0x52, 0x0b, 0xe1, 0x25, 0xf9, 0x37, 0x06, 0x61, 0xac, 0x17, 0x13, 0x3b, 0x0f, 0x03, 0xbb, 0xa4, - 0x97, 0xf9, 0x44, 0x3f, 0x3a, 0x60, 0x34, 0x61, 0x25, 0x0e, 0x1e, 0x52, 0x89, 0xf3, 0x30, 0x6c, - 0x60, 0xc7, 0xc5, 0x55, 0x66, 0x11, 0xc9, 0x1e, 0x6d, 0x0a, 0x18, 0x51, 0xab, 0x49, 0xa5, 0x0e, - 0x65, 0x52, 0x2f, 0xc0, 0x98, 0x27, 0x52, 0xc5, 0x56, 0x8d, 0x9a, 0xb0, 0xcd, 0xb9, 0x38, 0x49, - 0x66, 0xcb, 0x82, 0x4e, 0x21, 0x64, 0xca, 0x28, 0x0e, 0x95, 0xd1, 0x22, 0x80, 0x69, 0x60, 0x73, - 0xb7, 0x52, 0xc5, 0x5a, 0x3d, 0x9f, 0xee, 0xa0, 0xa5, 0x75, 0x82, 0xd2, 0xa2, 0x25, 0x93, 0x41, - 0xb5, 0x3a, 0x7a, 0xca, 0x37, 0xb5, 0xa1, 0x0e, 0x96, 0xb2, 0xca, 0x26, 0x59, 0x8b, 0xb5, 0x6d, - 0xc3, 0xa8, 0x8d, 0x89, 0xdd, 0xe3, 0x2a, 0xef, 0x59, 0x86, 0x0a, 0x31, 0x1b, 0xdb, 0x33, 0x85, - 0x93, 0xb1, 0x8e, 0x8d, 0xd8, 0xc1, 0x22, 0xba, 0x1b, 0x3c, 0x40, 0x85, 0x9a, 0x15, 0x50, 0x2f, - 0x94, 0x15, 0xc0, 0x35, 0xb5, 0x81, 0x0b, 0x2f, 0xc3, 0x68, 0x58, 0x3d, 0x68, 0x12, 0x06, 0x1c, - 0x57, 0xb5, 0x5d, 0x6a, 0x85, 0x03, 0x0a, 0x2b, 0xa0, 0x1c, 0x24, 0xb1, 0x51, 0xa5, 0x5e, 0x6e, - 0x40, 0x21, 0x3f, 0xd1, 0x4f, 0xf8, 0x1d, 0x4e, 0xd2, 0x0e, 0xdf, 0xd7, 0x3a, 0xa2, 0x21, 0xce, - 0xd1, 0x7e, 0x17, 0x9e, 0x80, 0x91, 0x50, 0x07, 0x7a, 0x6d, 0x5a, 0x7e, 0x27, 0x1c, 0x6d, 0xcb, - 0x1a, 0xbd, 0x00, 0x93, 0x4d, 0x43, 0x37, 0x5c, 0x6c, 0x5b, 0x36, 0x26, 0x16, 0xcb, 0x9a, 0xca, - 0xff, 0xe7, 0xa1, 0x0e, 0x36, 0xb7, 0x1d, 0xc4, 0x66, 0x5c, 0x94, 0x89, 0x66, 0x2b, 0xf0, 0x74, - 0x26, 0xfd, 0xc6, 0x50, 0xee, 0x95, 0x57, 0x5e, 0x79, 0x25, 0x21, 0x7f, 0x79, 0x10, 0x26, 0xdb, - 0xcd, 0x99, 0xb6, 0xd3, 0xf7, 0x18, 0x0c, 0x1a, 0xcd, 0xc6, 0x0e, 0xb6, 0xa9, 0x92, 0x06, 0x14, - 0x5e, 0x42, 0xf3, 0x30, 0x50, 0x57, 0x77, 0x70, 0x3d, 0x9f, 0x9a, 0x91, 0x4e, 0x8d, 0x9e, 0x79, - 0xb0, 0xa7, 0x59, 0x39, 0xbb, 0x42, 0x48, 0x14, 0x46, 0x89, 0x9e, 0x86, 0x14, 0x77, 0xd1, 0x84, - 0xc3, 0xe9, 0xde, 0x38, 0x90, 0xb9, 0xa4, 0x50, 0x3a, 0x74, 0x07, 0x64, 0xc8, 0x5f, 0x66, 0x1b, - 0x83, 0x54, 0xe6, 0x34, 0x01, 0x10, 0xbb, 0x40, 0x05, 0x48, 0xd3, 0x69, 0x52, 0xc5, 0x22, 0xb4, - 0x79, 0x65, 0x62, 0x58, 0x55, 0xbc, 0xab, 0x36, 0xeb, 0x6e, 0xe5, 0x8a, 0x5a, 0x6f, 0x62, 0x6a, - 0xf0, 0x19, 0x25, 0xcb, 0x81, 0x97, 0x09, 0x0c, 0x4d, 0xc3, 0x30, 0x9b, 0x55, 0xba, 0x51, 0xc5, - 0xd7, 0xa8, 0xf7, 0x1c, 0x50, 0xd8, 0x44, 0x5b, 0x26, 0x10, 0xd2, 0xfc, 0x8b, 0x8e, 0x69, 0x08, - 0xd3, 0xa4, 0x4d, 0x10, 0x00, 0x6d, 0xfe, 0x89, 0xa8, 0xe3, 0xbe, 0xb3, 0x7d, 0xf7, 0x5a, 0xe6, - 0xd2, 0xfd, 0x30, 0x46, 0x31, 0x1e, 0xe3, 0x43, 0xaf, 0xd6, 0xf3, 0xe3, 0x33, 0xd2, 0xa9, 0xb4, - 0x32, 0xca, 0xc0, 0xeb, 0x1c, 0x2a, 0x7f, 0x31, 0x01, 0x29, 0xea, 0x58, 0xc6, 0x60, 0x78, 0xeb, - 0x2d, 0x1b, 0xe5, 0xca, 0xe2, 0xfa, 0x76, 0x69, 0xa5, 0x9c, 0x93, 0xd0, 0x28, 0x00, 0x05, 0x5c, - 0x58, 0x59, 0x9f, 0xdf, 0xca, 0x25, 0xbc, 0xf2, 0xf2, 0xda, 0xd6, 0xb9, 0xc7, 0x73, 0x49, 0x8f, - 0x60, 0x9b, 0x01, 0x52, 0x41, 0x84, 0xc7, 0xce, 0xe4, 0x06, 0x50, 0x0e, 0xb2, 0x8c, 0xc1, 0xf2, - 0x0b, 0xe5, 0xc5, 0x73, 0x8f, 0xe7, 0x06, 0xc3, 0x90, 0xc7, 0xce, 0xe4, 0x86, 0xd0, 0x08, 0x64, - 0x28, 0xa4, 0xb4, 0xbe, 0xbe, 0x92, 0x4b, 0x7b, 0x3c, 0x37, 0xb7, 0x94, 0xe5, 0xb5, 0xa5, 0x5c, - 0xc6, 0xe3, 0xb9, 0xa4, 0xac, 0x6f, 0x6f, 0xe4, 0xc0, 0xe3, 0xb0, 0x5a, 0xde, 0xdc, 0x9c, 0x5f, - 0x2a, 0xe7, 0x86, 0x3d, 0x8c, 0xd2, 0x5b, 0xb6, 0xca, 0x9b, 0xb9, 0x6c, 0x48, 0xac, 0xc7, 0xce, - 0xe4, 0x46, 0xbc, 0x26, 0xca, 0x6b, 0xdb, 0xab, 0xb9, 0x51, 0x34, 0x0e, 0x23, 0xac, 0x09, 0x21, - 0xc4, 0x58, 0x04, 0x74, 0xee, 0xf1, 0x5c, 0xce, 0x17, 0x84, 0x71, 0x19, 0x0f, 0x01, 0xce, 0x3d, - 0x9e, 0x43, 0xf2, 0x02, 0x0c, 0x50, 0x33, 0x44, 0x08, 0x46, 0x57, 0xe6, 0x4b, 0xe5, 0x95, 0xca, - 0xfa, 0xc6, 0xd6, 0xf2, 0xfa, 0xda, 0xfc, 0x4a, 0x4e, 0xf2, 0x61, 0x4a, 0xf9, 0xb9, 0xed, 0x65, - 0xa5, 0xbc, 0x98, 0x4b, 0x04, 0x61, 0x1b, 0xe5, 0xf9, 0xad, 0xf2, 0x62, 0x2e, 0x29, 0x6b, 0x30, - 0xd9, 0xce, 0xa1, 0xb6, 0x9d, 0x42, 0x01, 0x5b, 0x48, 0x74, 0xb0, 0x05, 0xca, 0x2b, 0x6a, 0x0b, - 0xf2, 0x37, 0x13, 0x30, 0xd1, 0x26, 0xa8, 0xb4, 0x6d, 0xe4, 0x19, 0x18, 0x60, 0xb6, 0xcc, 0xc2, - 0xec, 0x03, 0x6d, 0xa3, 0x13, 0xb5, 0xec, 0x96, 0x50, 0x4b, 0xe9, 0x82, 0xa9, 0x46, 0xb2, 0x43, - 0xaa, 0x41, 0x58, 0xb4, 0x18, 0xec, 0x4f, 0xb6, 0x38, 0x7f, 0x16, 0x1f, 0xcf, 0xf5, 0x12, 0x1f, - 0x29, 0xac, 0xbf, 0x20, 0x30, 0xd0, 0x26, 0x08, 0x9c, 0x87, 0xf1, 0x16, 0x46, 0x3d, 0x3b, 0xe3, - 0xf7, 0x48, 0x90, 0xef, 0xa4, 0x9c, 0x18, 0x97, 0x98, 0x08, 0xb9, 0xc4, 0xf3, 0x51, 0x0d, 0xde, - 0xd5, 0x79, 0x10, 0x5a, 0xc6, 0xfa, 0x33, 0x12, 0x1c, 0x6b, 0x9f, 0x52, 0xb6, 0x95, 0xe1, 0x69, - 0x18, 0x6c, 0x60, 0x77, 0xcf, 0x14, 0x69, 0xd5, 0x7d, 0x6d, 0x82, 0x35, 0xa9, 0x8e, 0x0e, 0x36, - 0xa7, 0x0a, 0x46, 0xfb, 0x64, 0xa7, 0xbc, 0x90, 0x49, 0xd3, 0x22, 0xe9, 0x07, 0x12, 0x70, 0xb4, - 0x2d, 0xf3, 0xb6, 0x82, 0xde, 0x09, 0xa0, 0x1b, 0x56, 0xd3, 0x65, 0xa9, 0x13, 0xf3, 0xc4, 0x19, - 0x0a, 0xa1, 0xce, 0x8b, 0x78, 0xd9, 0xa6, 0xeb, 0xd5, 0x27, 0x69, 0x3d, 0x30, 0x10, 0x45, 0x78, - 0xd2, 0x17, 0x34, 0x45, 0x05, 0x9d, 0xea, 0xd0, 0xd3, 0x16, 0xc3, 0x7c, 0x04, 0x72, 0x5a, 0x5d, - 0xc7, 0x86, 0x5b, 0x71, 0x5c, 0x1b, 0xab, 0x0d, 0xdd, 0xa8, 0xd1, 0x50, 0x93, 0x2e, 0x0e, 0xec, - 0xaa, 0x75, 0x07, 0x2b, 0x63, 0xac, 0x7a, 0x53, 0xd4, 0x12, 0x0a, 0x6a, 0x40, 0x76, 0x80, 0x62, - 0x30, 0x44, 0xc1, 0xaa, 0x3d, 0x0a, 0xf9, 0xc3, 0x19, 0x18, 0x0e, 0x24, 0xe0, 0xe8, 0x2e, 0xc8, - 0xbe, 0xa8, 0x5e, 0x51, 0x2b, 0x62, 0x51, 0xc5, 0x34, 0x31, 0x4c, 0x60, 0x1b, 0x7c, 0x61, 0xf5, - 0x08, 0x4c, 0x52, 0x14, 0xb3, 0xe9, 0x62, 0xbb, 0xa2, 0xd5, 0x55, 0xc7, 0xa1, 0x4a, 0x4b, 0x53, - 0x54, 0x44, 0xea, 0xd6, 0x49, 0xd5, 0x82, 0xa8, 0x41, 0x67, 0x61, 0x82, 0x52, 0x34, 0x9a, 0x75, - 0x57, 0xb7, 0xea, 0xb8, 0x42, 0x96, 0x79, 0x0e, 0x0d, 0x39, 0x9e, 0x64, 0xe3, 0x04, 0x63, 0x95, - 0x23, 0x10, 0x89, 0x1c, 0xb4, 0x08, 0x77, 0x52, 0xb2, 0x1a, 0x36, 0xb0, 0xad, 0xba, 0xb8, 0x82, - 0x5f, 0x6a, 0xaa, 0x75, 0xa7, 0xa2, 0x1a, 0xd5, 0xca, 0x9e, 0xea, 0xec, 0xe5, 0x27, 0x09, 0x83, - 0x52, 0x22, 0x2f, 0x29, 0x27, 0x08, 0xe2, 0x12, 0xc7, 0x2b, 0x53, 0xb4, 0x79, 0xa3, 0x7a, 0x51, - 0x75, 0xf6, 0x50, 0x11, 0x8e, 0x51, 0x2e, 0x8e, 0x6b, 0xeb, 0x46, 0xad, 0xa2, 0xed, 0x61, 0x6d, - 0xbf, 0xd2, 0x74, 0x77, 0x9f, 0xcc, 0xdf, 0x11, 0x6c, 0x9f, 0x4a, 0xb8, 0x49, 0x71, 0x16, 0x08, - 0xca, 0xb6, 0xbb, 0xfb, 0x24, 0xda, 0x84, 0x2c, 0x19, 0x8c, 0x86, 0xfe, 0x32, 0xae, 0xec, 0x9a, - 0x36, 0x8d, 0xa1, 0xa3, 0x6d, 0x5c, 0x53, 0x40, 0x83, 0xb3, 0xeb, 0x9c, 0x60, 0xd5, 0xac, 0xe2, - 0xe2, 0xc0, 0xe6, 0x46, 0xb9, 0xbc, 0xa8, 0x0c, 0x0b, 0x2e, 0x17, 0x4c, 0x9b, 0x18, 0x54, 0xcd, - 0xf4, 0x14, 0x3c, 0xcc, 0x0c, 0xaa, 0x66, 0x0a, 0xf5, 0x9e, 0x85, 0x09, 0x4d, 0x63, 0x7d, 0xd6, - 0xb5, 0x0a, 0x5f, 0x8c, 0x39, 0xf9, 0x5c, 0x48, 0x59, 0x9a, 0xb6, 0xc4, 0x10, 0xb8, 0x8d, 0x3b, - 0xe8, 0x29, 0x38, 0xea, 0x2b, 0x2b, 0x48, 0x38, 0xde, 0xd2, 0xcb, 0x28, 0xe9, 0x59, 0x98, 0xb0, - 0x0e, 0x5a, 0x09, 0x51, 0xa8, 0x45, 0xeb, 0x20, 0x4a, 0xf6, 0x04, 0x4c, 0x5a, 0x7b, 0x56, 0x2b, - 0xdd, 0xe9, 0x20, 0x1d, 0xb2, 0xf6, 0xac, 0x28, 0xe1, 0xbd, 0x74, 0x65, 0x6e, 0x63, 0x4d, 0x75, - 0x71, 0x35, 0x7f, 0x3c, 0x88, 0x1e, 0xa8, 0x40, 0xb3, 0x90, 0xd3, 0xb4, 0x0a, 0x36, 0xd4, 0x9d, - 0x3a, 0xae, 0xa8, 0x36, 0x36, 0x54, 0x27, 0x3f, 0x4d, 0x91, 0x53, 0xae, 0xdd, 0xc4, 0xca, 0xa8, - 0xa6, 0x95, 0x69, 0xe5, 0x3c, 0xad, 0x43, 0xa7, 0x61, 0xdc, 0xdc, 0x79, 0x51, 0x63, 0x16, 0x59, - 0xb1, 0x6c, 0xbc, 0xab, 0x5f, 0xcb, 0xdf, 0x43, 0xd5, 0x3b, 0x46, 0x2a, 0xa8, 0x3d, 0x6e, 0x50, - 0x30, 0x7a, 0x00, 0x72, 0x9a, 0xb3, 0xa7, 0xda, 0x16, 0x75, 0xc9, 0x8e, 0xa5, 0x6a, 0x38, 0x7f, - 0x2f, 0x43, 0x65, 0xf0, 0x35, 0x01, 0x26, 0x33, 0xc2, 0xb9, 0xaa, 0xef, 0xba, 0x82, 0xe3, 0xfd, - 0x6c, 0x46, 0x50, 0x18, 0xe7, 0x76, 0x0a, 0x72, 0x44, 0x13, 0xa1, 0x86, 0x4f, 0x51, 0xb4, 0x51, - 0x6b, 0xcf, 0x0a, 0xb6, 0x7b, 0x37, 0x8c, 0x10, 0x4c, 0xbf, 0xd1, 0x07, 0x58, 0xe2, 0x66, 0xed, - 0x05, 0x5a, 0x7c, 0x1c, 0x8e, 0x11, 0xa4, 0x06, 0x76, 0xd5, 0xaa, 0xea, 0xaa, 0x01, 0xec, 0x87, - 0x28, 0x36, 0x51, 0xfb, 0x2a, 0xaf, 0x0c, 0xc9, 0x69, 0x37, 0x77, 0x0e, 0x3c, 0xc3, 0x7a, 0x98, - 0xc9, 0x49, 0x60, 0xc2, 0xb4, 0x6e, 0x5b, 0x72, 0x2e, 0x17, 0x21, 0x1b, 0xb4, 0x7b, 0x94, 0x01, - 0x66, 0xf9, 0x39, 0x89, 0x24, 0x41, 0x0b, 0xeb, 0x8b, 0x24, 0x7d, 0x79, 0x6b, 0x39, 0x97, 0x20, - 0x69, 0xd4, 0xca, 0xf2, 0x56, 0xb9, 0xa2, 0x6c, 0xaf, 0x6d, 0x2d, 0xaf, 0x96, 0x73, 0xc9, 0x40, - 0x62, 0xff, 0x6c, 0x2a, 0x7d, 0x5f, 0xee, 0x7e, 0xf9, 0x1b, 0x09, 0x18, 0x0d, 0xaf, 0xd4, 0xd0, - 0x9b, 0xe0, 0xb8, 0xd8, 0x56, 0x71, 0xb0, 0x5b, 0xb9, 0xaa, 0xdb, 0x74, 0x42, 0x36, 0x54, 0x16, - 0x1c, 0x3d, 0xfb, 0x99, 0xe4, 0x58, 0x9b, 0xd8, 0x7d, 0x5e, 0xb7, 0xc9, 0x74, 0x6b, 0xa8, 0x2e, - 0x5a, 0x81, 0x69, 0xc3, 0xac, 0x38, 0xae, 0x6a, 0x54, 0x55, 0xbb, 0x5a, 0xf1, 0x37, 0xb4, 0x2a, - 0xaa, 0xa6, 0x61, 0xc7, 0x31, 0x59, 0x20, 0xf4, 0xb8, 0x9c, 0x34, 0xcc, 0x4d, 0x8e, 0xec, 0x47, - 0x88, 0x79, 0x8e, 0x1a, 0x31, 0xdf, 0x64, 0x27, 0xf3, 0xbd, 0x03, 0x32, 0x0d, 0xd5, 0xaa, 0x60, - 0xc3, 0xb5, 0x0f, 0x68, 0x7e, 0x9e, 0x56, 0xd2, 0x0d, 0xd5, 0x2a, 0x93, 0xf2, 0x0f, 0x65, 0x99, - 0xf4, 0x6c, 0x2a, 0x9d, 0xce, 0x65, 0x9e, 0x4d, 0xa5, 0x33, 0x39, 0x90, 0x5f, 0x4f, 0x42, 0x36, - 0x98, 0xaf, 0x93, 0xe5, 0x8f, 0x46, 0x23, 0x96, 0x44, 0x7d, 0xda, 0xdd, 0x5d, 0xb3, 0xfb, 0xd9, - 0x05, 0x12, 0xca, 0x8a, 0x83, 0x2c, 0x39, 0x56, 0x18, 0x25, 0x49, 0x23, 0x88, 0xb1, 0x61, 0x96, - 0x8c, 0xa4, 0x15, 0x5e, 0x42, 0x4b, 0x30, 0xf8, 0xa2, 0x43, 0x79, 0x0f, 0x52, 0xde, 0xf7, 0x74, - 0xe7, 0xfd, 0xec, 0x26, 0x65, 0x9e, 0x79, 0x76, 0xb3, 0xb2, 0xb6, 0xae, 0xac, 0xce, 0xaf, 0x28, - 0x9c, 0x1c, 0x9d, 0x80, 0x54, 0x5d, 0x7d, 0xf9, 0x20, 0x1c, 0xf4, 0x28, 0xa8, 0xd7, 0x41, 0x38, - 0x01, 0xa9, 0xab, 0x58, 0xdd, 0x0f, 0x87, 0x1a, 0x0a, 0xba, 0x8d, 0x93, 0x61, 0x0e, 0x06, 0xa8, - 0xbe, 0x10, 0x00, 0xd7, 0x58, 0xee, 0x08, 0x4a, 0x43, 0x6a, 0x61, 0x5d, 0x21, 0x13, 0x22, 0x07, - 0x59, 0x06, 0xad, 0x6c, 0x2c, 0x97, 0x17, 0xca, 0xb9, 0x84, 0x7c, 0x16, 0x06, 0x99, 0x12, 0xc8, - 0x64, 0xf1, 0xd4, 0x90, 0x3b, 0xc2, 0x8b, 0x9c, 0x87, 0x24, 0x6a, 0xb7, 0x57, 0x4b, 0x65, 0x25, - 0x97, 0x08, 0x0f, 0x75, 0x2a, 0x37, 0x20, 0x3b, 0x90, 0x0d, 0xe6, 0xe1, 0x3f, 0x9c, 0xc5, 0xf8, - 0x97, 0x24, 0x18, 0x0e, 0xe4, 0xd5, 0x24, 0x21, 0x52, 0xeb, 0x75, 0xf3, 0x6a, 0x45, 0xad, 0xeb, - 0xaa, 0xc3, 0x4d, 0x03, 0x28, 0x68, 0x9e, 0x40, 0x7a, 0x1d, 0xba, 0x1f, 0xd2, 0x14, 0x19, 0xc8, - 0x0d, 0xca, 0x9f, 0x90, 0x20, 0x17, 0x4d, 0x6c, 0x23, 0x62, 0x4a, 0x3f, 0x4a, 0x31, 0xe5, 0x8f, - 0x4b, 0x30, 0x1a, 0xce, 0x66, 0x23, 0xe2, 0xdd, 0xf5, 0x23, 0x15, 0xef, 0x0f, 0x12, 0x30, 0x12, - 0xca, 0x61, 0x7b, 0x95, 0xee, 0x25, 0x18, 0xd7, 0xab, 0xb8, 0x61, 0x99, 0x2e, 0x36, 0xb4, 0x83, - 0x4a, 0x1d, 0x5f, 0xc1, 0xf5, 0xbc, 0x4c, 0x9d, 0xc6, 0x5c, 0xf7, 0x2c, 0x79, 0x76, 0xd9, 0xa7, - 0x5b, 0x21, 0x64, 0xc5, 0x89, 0xe5, 0xc5, 0xf2, 0xea, 0xc6, 0xfa, 0x56, 0x79, 0x6d, 0xe1, 0x2d, - 0x95, 0xed, 0xb5, 0x4b, 0x6b, 0xeb, 0xcf, 0xaf, 0x29, 0x39, 0x3d, 0x82, 0x76, 0x1b, 0xa7, 0xfd, - 0x06, 0xe4, 0xa2, 0x42, 0xa1, 0xe3, 0xd0, 0x4e, 0xac, 0xdc, 0x11, 0x34, 0x01, 0x63, 0x6b, 0xeb, - 0x95, 0xcd, 0xe5, 0xc5, 0x72, 0xa5, 0x7c, 0xe1, 0x42, 0x79, 0x61, 0x6b, 0x93, 0xed, 0x7b, 0x78, - 0xd8, 0x5b, 0xa1, 0x09, 0x2e, 0xbf, 0x96, 0x84, 0x89, 0x36, 0x92, 0xa0, 0x79, 0xbe, 0x62, 0x61, - 0x8b, 0xa8, 0x87, 0x7b, 0x91, 0x7e, 0x96, 0xe4, 0x0c, 0x1b, 0xaa, 0xed, 0xf2, 0x05, 0xce, 0x03, - 0x40, 0xb4, 0x64, 0xb8, 0xfa, 0xae, 0x8e, 0x6d, 0xbe, 0x9f, 0xc4, 0x96, 0x31, 0x63, 0x3e, 0x9c, - 0x6d, 0x29, 0x3d, 0x04, 0xc8, 0x32, 0x1d, 0xdd, 0xd5, 0xaf, 0xe0, 0x8a, 0x6e, 0x88, 0xcd, 0x27, - 0xb2, 0xac, 0x49, 0x29, 0x39, 0x51, 0xb3, 0x6c, 0xb8, 0x1e, 0xb6, 0x81, 0x6b, 0x6a, 0x04, 0x9b, - 0x38, 0xf3, 0xa4, 0x92, 0x13, 0x35, 0x1e, 0xf6, 0x5d, 0x90, 0xad, 0x9a, 0x4d, 0x92, 0xeb, 0x31, - 0x3c, 0x12, 0x3b, 0x24, 0x65, 0x98, 0xc1, 0x3c, 0x14, 0x9e, 0xc5, 0xfb, 0xbb, 0x5e, 0x59, 0x65, - 0x98, 0xc1, 0x18, 0xca, 0xfd, 0x30, 0xa6, 0xd6, 0x6a, 0x36, 0x61, 0x2e, 0x18, 0xb1, 0x75, 0xc9, - 0xa8, 0x07, 0xa6, 0x88, 0x85, 0x67, 0x21, 0x2d, 0xf4, 0x40, 0x42, 0x35, 0xd1, 0x44, 0xc5, 0x62, - 0x8b, 0xed, 0xc4, 0xa9, 0x8c, 0x92, 0x36, 0x44, 0xe5, 0x5d, 0x90, 0xd5, 0x9d, 0x8a, 0xbf, 0x89, - 0x9f, 0x98, 0x49, 0x9c, 0x4a, 0x2b, 0xc3, 0xba, 0xe3, 0x6d, 0x80, 0xca, 0x9f, 0x49, 0xc0, 0x68, - 0xf8, 0x10, 0x02, 0x2d, 0x42, 0xba, 0x6e, 0x6a, 0x2a, 0x35, 0x2d, 0x76, 0x02, 0x76, 0x2a, 0xe6, - 0xdc, 0x62, 0x76, 0x85, 0xe3, 0x2b, 0x1e, 0x65, 0xe1, 0xb7, 0x25, 0x48, 0x0b, 0x30, 0x3a, 0x06, - 0x29, 0x4b, 0x75, 0xf7, 0x28, 0xbb, 0x81, 0x52, 0x22, 0x27, 0x29, 0xb4, 0x4c, 0xe0, 0x8e, 0xa5, - 0x1a, 0xd4, 0x04, 0x38, 0x9c, 0x94, 0xc9, 0xb8, 0xd6, 0xb1, 0x5a, 0xa5, 0x8b, 0x1e, 0xb3, 0xd1, - 0xc0, 0x86, 0xeb, 0x88, 0x71, 0xe5, 0xf0, 0x05, 0x0e, 0x46, 0x0f, 0xc2, 0xb8, 0x6b, 0xab, 0x7a, - 0x3d, 0x84, 0x9b, 0xa2, 0xb8, 0x39, 0x51, 0xe1, 0x21, 0x17, 0xe1, 0x84, 0xe0, 0x5b, 0xc5, 0xae, - 0xaa, 0xed, 0xe1, 0xaa, 0x4f, 0x34, 0x48, 0x37, 0x37, 0x8e, 0x73, 0x84, 0x45, 0x5e, 0x2f, 0x68, - 0xe5, 0x6f, 0x48, 0x30, 0x2e, 0x96, 0x69, 0x55, 0x4f, 0x59, 0xab, 0x00, 0xaa, 0x61, 0x98, 0x6e, - 0x50, 0x5d, 0xad, 0xa6, 0xdc, 0x42, 0x37, 0x3b, 0xef, 0x11, 0x29, 0x01, 0x06, 0x85, 0x06, 0x80, - 0x5f, 0xd3, 0x51, 0x6d, 0xd3, 0x30, 0xcc, 0x4f, 0x98, 0xe8, 0x31, 0x25, 0x5b, 0xd8, 0x03, 0x03, - 0x91, 0xf5, 0x1c, 0x9a, 0x84, 0x81, 0x1d, 0x5c, 0xd3, 0x0d, 0xbe, 0x6f, 0xcc, 0x0a, 0x62, 0xfb, - 0x25, 0xe5, 0x6d, 0xbf, 0x94, 0x3e, 0x28, 0xc1, 0x84, 0x66, 0x36, 0xa2, 0xf2, 0x96, 0x72, 0x91, - 0xdd, 0x05, 0xe7, 0xa2, 0xf4, 0xd6, 0xa7, 0x6b, 0xba, 0xbb, 0xd7, 0xdc, 0x99, 0xd5, 0xcc, 0xc6, - 0x5c, 0xcd, 0xac, 0xab, 0x46, 0xcd, 0x3f, 0x67, 0xa5, 0x3f, 0xb4, 0x87, 0x6b, 0xd8, 0x78, 0xb8, - 0x66, 0x06, 0x4e, 0x5d, 0xcf, 0xfb, 0x3f, 0xff, 0x4c, 0x92, 0x7e, 0x21, 0x91, 0x5c, 0xda, 0x28, - 0x7d, 0x36, 0x51, 0x58, 0x62, 0xcd, 0x6d, 0x08, 0xf5, 0x28, 0x78, 0xb7, 0x8e, 0x35, 0xd2, 0x65, - 0xf8, 0xf6, 0x83, 0x30, 0x59, 0x33, 0x6b, 0x26, 0xe5, 0x38, 0x47, 0x7e, 0xf1, 0x93, 0xdb, 0x8c, - 0x07, 0x2d, 0xc4, 0x1e, 0xf3, 0x16, 0xd7, 0x60, 0x82, 0x23, 0x57, 0xe8, 0xd1, 0x11, 0x5b, 0xd8, - 0xa0, 0xae, 0xbb, 0x6a, 0xf9, 0x5f, 0xfb, 0x16, 0x0d, 0xe8, 0xca, 0x38, 0x27, 0x25, 0x75, 0x6c, - 0xed, 0x53, 0x54, 0xe0, 0x68, 0x88, 0x1f, 0x9b, 0xb6, 0xd8, 0x8e, 0xe1, 0xf8, 0x9b, 0x9c, 0xe3, - 0x44, 0x80, 0xe3, 0x26, 0x27, 0x2d, 0x2e, 0xc0, 0x48, 0x3f, 0xbc, 0xfe, 0x25, 0xe7, 0x95, 0xc5, - 0x41, 0x26, 0x4b, 0x30, 0x46, 0x99, 0x68, 0x4d, 0xc7, 0x35, 0x1b, 0xd4, 0x27, 0x76, 0x67, 0xf3, - 0x5b, 0xdf, 0x62, 0xf3, 0x68, 0x94, 0x90, 0x2d, 0x78, 0x54, 0xc5, 0x22, 0xd0, 0xd3, 0xb2, 0x2a, - 0xd6, 0xea, 0x31, 0x1c, 0xbe, 0xc2, 0x05, 0xf1, 0xf0, 0x8b, 0x97, 0x61, 0x92, 0xfc, 0xa6, 0x2e, - 0x2b, 0x28, 0x49, 0xfc, 0x16, 0x5c, 0xfe, 0x1b, 0xef, 0x61, 0x53, 0x75, 0xc2, 0x63, 0x10, 0x90, - 0x29, 0x30, 0x8a, 0x35, 0xec, 0xba, 0xd8, 0x76, 0x2a, 0x6a, 0xbd, 0x9d, 0x78, 0x81, 0x3d, 0x8c, - 0xfc, 0xc7, 0xbe, 0x13, 0x1e, 0xc5, 0x25, 0x46, 0x39, 0x5f, 0xaf, 0x17, 0xb7, 0xe1, 0x78, 0x1b, - 0xab, 0xe8, 0x81, 0xe7, 0x6b, 0x9c, 0xe7, 0x64, 0x8b, 0x65, 0x10, 0xb6, 0x1b, 0x20, 0xe0, 0xde, - 0x58, 0xf6, 0xc0, 0xf3, 0xe7, 0x39, 0x4f, 0xc4, 0x69, 0xc5, 0x90, 0x12, 0x8e, 0xcf, 0xc2, 0xf8, - 0x15, 0x6c, 0xef, 0x98, 0x0e, 0xdf, 0x37, 0xea, 0x81, 0xdd, 0xc7, 0x39, 0xbb, 0x31, 0x4e, 0x48, - 0x37, 0x92, 0x08, 0xaf, 0xa7, 0x20, 0xbd, 0xab, 0x6a, 0xb8, 0x07, 0x16, 0xd7, 0x39, 0x8b, 0x21, - 0x82, 0x4f, 0x48, 0xe7, 0x21, 0x5b, 0x33, 0x79, 0xd4, 0x8a, 0x27, 0xff, 0x04, 0x27, 0x1f, 0x16, - 0x34, 0x9c, 0x85, 0x65, 0x5a, 0xcd, 0x3a, 0x09, 0x69, 0xf1, 0x2c, 0xfe, 0xa6, 0x60, 0x21, 0x68, - 0x38, 0x8b, 0x3e, 0xd4, 0xfa, 0x49, 0xc1, 0xc2, 0x09, 0xe8, 0xf3, 0x19, 0x18, 0x36, 0x8d, 0xfa, - 0x81, 0x69, 0xf4, 0x22, 0xc4, 0xa7, 0x38, 0x07, 0xe0, 0x24, 0x84, 0xc1, 0x79, 0xc8, 0xf4, 0x3a, - 0x10, 0x7f, 0xeb, 0x3b, 0x62, 0x7a, 0x88, 0x11, 0x58, 0x82, 0x31, 0xe1, 0xa0, 0x74, 0xd3, 0xe8, - 0x81, 0xc5, 0xdf, 0xe6, 0x2c, 0x46, 0x03, 0x64, 0xbc, 0x1b, 0x2e, 0x76, 0xdc, 0x1a, 0xee, 0x85, - 0xc9, 0x67, 0x44, 0x37, 0x38, 0x09, 0x57, 0xe5, 0x0e, 0x36, 0xb4, 0xbd, 0xde, 0x38, 0xfc, 0x92, - 0x50, 0xa5, 0xa0, 0x21, 0x2c, 0x16, 0x60, 0xa4, 0xa1, 0xda, 0xce, 0x9e, 0x5a, 0xef, 0x69, 0x38, - 0xfe, 0x0e, 0xe7, 0x91, 0xf5, 0x88, 0xb8, 0x46, 0x9a, 0x46, 0x3f, 0x6c, 0x3e, 0x2b, 0x34, 0x12, - 0x20, 0xe3, 0x53, 0xcf, 0x71, 0xe9, 0x26, 0x5b, 0x3f, 0xdc, 0x7e, 0x59, 0x4c, 0x3d, 0x46, 0xbb, - 0x1a, 0xe4, 0x78, 0x1e, 0x32, 0x8e, 0xfe, 0x72, 0x4f, 0x6c, 0x3e, 0x27, 0x46, 0x9a, 0x12, 0x10, - 0xe2, 0xb7, 0xc0, 0x89, 0xb6, 0x61, 0xa2, 0x07, 0x66, 0x7f, 0x97, 0x33, 0x3b, 0xd6, 0x26, 0x54, - 0x70, 0x97, 0xd0, 0x2f, 0xcb, 0xbf, 0x27, 0x5c, 0x02, 0x8e, 0xf0, 0xda, 0x20, 0xeb, 0x08, 0x47, - 0xdd, 0xed, 0x4f, 0x6b, 0xbf, 0x22, 0xb4, 0xc6, 0x68, 0x43, 0x5a, 0xdb, 0x82, 0x63, 0x9c, 0x63, - 0x7f, 0xe3, 0xfa, 0xab, 0xc2, 0xb1, 0x32, 0xea, 0xed, 0xf0, 0xe8, 0xbe, 0x0d, 0x0a, 0x9e, 0x3a, - 0x45, 0xc2, 0xea, 0x54, 0x1a, 0xaa, 0xd5, 0x03, 0xe7, 0x5f, 0xe3, 0x9c, 0x85, 0xc7, 0xf7, 0x32, - 0x5e, 0x67, 0x55, 0xb5, 0x08, 0xf3, 0x17, 0x20, 0x2f, 0x98, 0x37, 0x0d, 0x1b, 0x6b, 0x66, 0xcd, - 0xd0, 0x5f, 0xc6, 0xd5, 0x1e, 0x58, 0xff, 0x7a, 0x64, 0xa8, 0xb6, 0x03, 0xe4, 0x84, 0xf3, 0x32, - 0xe4, 0xbc, 0x5c, 0xa5, 0xa2, 0x37, 0x2c, 0xd3, 0x76, 0x63, 0x38, 0x7e, 0x5e, 0x8c, 0x94, 0x47, - 0xb7, 0x4c, 0xc9, 0x8a, 0x65, 0x60, 0x27, 0xcf, 0xbd, 0x9a, 0xe4, 0x17, 0x38, 0xa3, 0x11, 0x9f, - 0x8a, 0x3b, 0x0e, 0xcd, 0x6c, 0x58, 0xaa, 0xdd, 0x8b, 0xff, 0xfb, 0xfb, 0xc2, 0x71, 0x70, 0x12, - 0xee, 0x38, 0xdc, 0x03, 0x0b, 0x93, 0x68, 0xdf, 0x03, 0x87, 0x2f, 0x0a, 0xc7, 0x21, 0x68, 0x38, - 0x0b, 0x91, 0x30, 0xf4, 0xc0, 0xe2, 0x1f, 0x08, 0x16, 0x82, 0x86, 0xb0, 0x78, 0xce, 0x0f, 0xb4, - 0x36, 0xae, 0xe9, 0x8e, 0x6b, 0xb3, 0x34, 0xb9, 0x3b, 0xab, 0x7f, 0xf8, 0x9d, 0x70, 0x12, 0xa6, - 0x04, 0x48, 0x89, 0x27, 0xe2, 0xdb, 0xae, 0x74, 0x15, 0x15, 0x2f, 0xd8, 0x6f, 0x08, 0x4f, 0x14, - 0x20, 0x23, 0xb2, 0x05, 0x32, 0x44, 0xa2, 0x76, 0x8d, 0xac, 0x1d, 0x7a, 0x60, 0xf7, 0x8f, 0x22, - 0xc2, 0x6d, 0x0a, 0x5a, 0xc2, 0x33, 0x90, 0xff, 0x34, 0x8d, 0x7d, 0x7c, 0xd0, 0x93, 0x75, 0xfe, - 0xe3, 0x48, 0xfe, 0xb3, 0xcd, 0x28, 0x99, 0x0f, 0x19, 0x8b, 0xe4, 0x53, 0x28, 0xee, 0x9e, 0x51, - 0xfe, 0xa7, 0xbe, 0xc7, 0xfb, 0x1b, 0x4e, 0xa7, 0x8a, 0x2b, 0xc4, 0xc8, 0xc3, 0x49, 0x4f, 0x3c, - 0xb3, 0xf7, 0x7c, 0xcf, 0xb3, 0xf3, 0x50, 0xce, 0x53, 0xbc, 0x00, 0x23, 0xa1, 0x84, 0x27, 0x9e, - 0xd5, 0x7b, 0x39, 0xab, 0x6c, 0x30, 0xdf, 0x29, 0x9e, 0x85, 0x14, 0x49, 0x5e, 0xe2, 0xc9, 0xff, - 0x32, 0x27, 0xa7, 0xe8, 0xc5, 0x37, 0x43, 0x5a, 0x24, 0x2d, 0xf1, 0xa4, 0xef, 0xe3, 0xa4, 0x1e, - 0x09, 0x21, 0x17, 0x09, 0x4b, 0x3c, 0xf9, 0x5f, 0x11, 0xe4, 0x82, 0x84, 0x90, 0xf7, 0xae, 0xc2, - 0x2f, 0xfd, 0x74, 0x8a, 0x07, 0x1d, 0xa1, 0xbb, 0xf3, 0x30, 0xc4, 0x33, 0x95, 0x78, 0xea, 0x0f, - 0xf0, 0xc6, 0x05, 0x45, 0xf1, 0x09, 0x18, 0xe8, 0x51, 0xe1, 0x3f, 0xc3, 0x49, 0x19, 0x7e, 0x71, - 0x01, 0x86, 0x03, 0xd9, 0x49, 0x3c, 0xf9, 0x5f, 0xe3, 0xe4, 0x41, 0x2a, 0x22, 0x3a, 0xcf, 0x4e, - 0xe2, 0x19, 0x7c, 0x50, 0x88, 0xce, 0x29, 0x88, 0xda, 0x44, 0x62, 0x12, 0x4f, 0xfd, 0x21, 0xa1, - 0x75, 0x41, 0x52, 0x7c, 0x06, 0x32, 0x5e, 0xb0, 0x89, 0xa7, 0xff, 0x30, 0xa7, 0xf7, 0x69, 0x88, - 0x06, 0x02, 0xc1, 0x2e, 0x9e, 0xc5, 0x5f, 0x17, 0x1a, 0x08, 0x50, 0x91, 0x69, 0x14, 0x4d, 0x60, - 0xe2, 0x39, 0x7d, 0x44, 0x4c, 0xa3, 0x48, 0xfe, 0x42, 0x46, 0x93, 0xfa, 0xfc, 0x78, 0x16, 0x3f, - 0x2b, 0x46, 0x93, 0xe2, 0x13, 0x31, 0xa2, 0x19, 0x41, 0x3c, 0x8f, 0xbf, 0x21, 0xc4, 0x88, 0x24, - 0x04, 0xc5, 0x0d, 0x40, 0xad, 0xd9, 0x40, 0x3c, 0xbf, 0x8f, 0x72, 0x7e, 0xe3, 0x2d, 0xc9, 0x40, - 0xf1, 0x79, 0x38, 0xd6, 0x3e, 0x13, 0x88, 0xe7, 0xfa, 0xb1, 0xef, 0x45, 0xd6, 0x6e, 0xc1, 0x44, - 0xa0, 0xb8, 0xe5, 0x87, 0x94, 0x60, 0x16, 0x10, 0xcf, 0xf6, 0xb5, 0xef, 0x85, 0x1d, 0x77, 0x30, - 0x09, 0x28, 0xce, 0x03, 0xf8, 0x01, 0x38, 0x9e, 0xd7, 0xc7, 0x39, 0xaf, 0x00, 0x11, 0x99, 0x1a, - 0x3c, 0xfe, 0xc6, 0xd3, 0x5f, 0x17, 0x53, 0x83, 0x53, 0x90, 0xa9, 0x21, 0x42, 0x6f, 0x3c, 0xf5, - 0x27, 0xc4, 0xd4, 0x10, 0x24, 0xc4, 0xb2, 0x03, 0xd1, 0x2d, 0x9e, 0xc3, 0xa7, 0x84, 0x65, 0x07, - 0xa8, 0x8a, 0x6b, 0x30, 0xde, 0x12, 0x10, 0xe3, 0x59, 0xfd, 0x02, 0x67, 0x95, 0x8b, 0xc6, 0xc3, - 0x60, 0xf0, 0xe2, 0xc1, 0x30, 0x9e, 0xdb, 0xa7, 0x23, 0xc1, 0x8b, 0xc7, 0xc2, 0xe2, 0x79, 0x48, - 0x1b, 0xcd, 0x7a, 0x9d, 0x4c, 0x1e, 0xd4, 0xfd, 0x6e, 0x60, 0xfe, 0xbf, 0x7c, 0x9f, 0x6b, 0x47, - 0x10, 0x14, 0xcf, 0xc2, 0x00, 0x6e, 0xec, 0xe0, 0x6a, 0x1c, 0xe5, 0xb7, 0xbf, 0x2f, 0x1c, 0x26, - 0xc1, 0x2e, 0x3e, 0x03, 0xc0, 0xb6, 0x46, 0xe8, 0xf1, 0x60, 0x0c, 0xed, 0x7f, 0xfd, 0x3e, 0xbf, - 0x8c, 0xe3, 0x93, 0xf8, 0x0c, 0xd8, 0xd5, 0x9e, 0xee, 0x0c, 0xbe, 0x13, 0x66, 0x40, 0x47, 0xe4, - 0x29, 0x18, 0x7a, 0xd1, 0x31, 0x0d, 0x57, 0xad, 0xc5, 0x51, 0xff, 0x37, 0x4e, 0x2d, 0xf0, 0x89, - 0xc2, 0x1a, 0xa6, 0x8d, 0x5d, 0xb5, 0xe6, 0xc4, 0xd1, 0xfe, 0x77, 0x4e, 0xeb, 0x11, 0x10, 0x62, - 0x4d, 0x75, 0xdc, 0x5e, 0xfa, 0xfd, 0x47, 0x82, 0x58, 0x10, 0x10, 0xa1, 0xc9, 0xef, 0x7d, 0x7c, - 0x10, 0x47, 0xfb, 0x5d, 0x21, 0x34, 0xc7, 0x2f, 0xbe, 0x19, 0x32, 0xe4, 0x27, 0xbb, 0x61, 0x17, - 0x43, 0xfc, 0xc7, 0x9c, 0xd8, 0xa7, 0x20, 0x2d, 0x3b, 0x6e, 0xd5, 0xd5, 0xe3, 0x95, 0x7d, 0x93, - 0x8f, 0xb4, 0xc0, 0x2f, 0xce, 0xc3, 0xb0, 0xe3, 0x56, 0xab, 0x4d, 0x9e, 0x9f, 0xc6, 0x90, 0xff, - 0xc9, 0xf7, 0xbd, 0x2d, 0x0b, 0x8f, 0x86, 0x8c, 0xf6, 0xd5, 0x7d, 0xd7, 0x32, 0xe9, 0x11, 0x48, - 0x1c, 0x87, 0xef, 0x71, 0x0e, 0x01, 0x92, 0xe2, 0x02, 0x64, 0x49, 0x5f, 0x6c, 0x6c, 0x61, 0x7a, - 0x5e, 0x15, 0xc3, 0xe2, 0x4f, 0xb9, 0x02, 0x42, 0x44, 0xa5, 0x9f, 0xfc, 0xca, 0xeb, 0x53, 0xd2, - 0xd7, 0x5f, 0x9f, 0x92, 0xfe, 0xe0, 0xf5, 0x29, 0xe9, 0x43, 0xdf, 0x9c, 0x3a, 0xf2, 0xf5, 0x6f, - 0x4e, 0x1d, 0xf9, 0xdd, 0x6f, 0x4e, 0x1d, 0x69, 0xbf, 0x6d, 0x0c, 0x4b, 0xe6, 0x92, 0xc9, 0x36, - 0x8c, 0xdf, 0x2a, 0x87, 0xb6, 0x8b, 0x6b, 0xa6, 0xbf, 0x5b, 0xeb, 0x2d, 0x72, 0xe0, 0x4f, 0x25, - 0xb2, 0x60, 0x0e, 0xef, 0xe5, 0xaa, 0xc6, 0x41, 0x87, 0xb7, 0x3a, 0x85, 0xb6, 0x1b, 0xc3, 0xf2, - 0x9b, 0x20, 0x39, 0x6f, 0x1c, 0xa0, 0x13, 0xcc, 0xe7, 0x55, 0x9a, 0x76, 0x9d, 0xdf, 0xfc, 0x1a, - 0x22, 0xe5, 0x6d, 0xbb, 0x8e, 0x26, 0xfd, 0xeb, 0x99, 0xd2, 0xa9, 0x2c, 0xbf, 0x73, 0x59, 0x4c, - 0x7d, 0xf7, 0x53, 0xd3, 0x47, 0x4a, 0xfb, 0xd1, 0x1e, 0x7e, 0x29, 0xb6, 0x97, 0xe9, 0x79, 0xe3, - 0x80, 0x76, 0x72, 0x43, 0x7a, 0xeb, 0x00, 0x69, 0xc3, 0x11, 0x1b, 0xdb, 0x53, 0xd1, 0x8d, 0xed, - 0xe7, 0x71, 0xbd, 0x7e, 0xc9, 0x30, 0xaf, 0x1a, 0x5b, 0x04, 0x6d, 0x67, 0x90, 0x5d, 0x23, 0x86, - 0xbf, 0x9a, 0x80, 0xa9, 0x96, 0x3d, 0x6c, 0x3e, 0xf2, 0x9d, 0x1e, 0x2a, 0x15, 0x21, 0xbd, 0x28, - 0x0c, 0x2a, 0x0f, 0x43, 0x0e, 0xd6, 0x4c, 0xa3, 0xea, 0xd0, 0xae, 0x26, 0x15, 0x51, 0x24, 0x5d, - 0x35, 0x54, 0xc3, 0x74, 0xf8, 0xed, 0x48, 0x56, 0x28, 0xfd, 0xac, 0xd4, 0xdf, 0x38, 0x8e, 0x88, - 0x96, 0x44, 0x37, 0x4f, 0x77, 0xdb, 0xfb, 0xa7, 0x2a, 0xf0, 0xe4, 0x0f, 0xec, 0xf3, 0xf7, 0xaa, - 0x8e, 0x0f, 0x25, 0x60, 0x3a, 0xaa, 0x0e, 0x32, 0x8f, 0x1c, 0x57, 0x6d, 0x58, 0x9d, 0xf4, 0x71, - 0x1e, 0x32, 0x5b, 0x02, 0xa7, 0x6f, 0x85, 0xfc, 0x5c, 0x9f, 0x0a, 0x19, 0xf5, 0x9a, 0x12, 0x1a, - 0x79, 0x30, 0x5e, 0x23, 0x5e, 0x17, 0x0e, 0xa1, 0x92, 0x77, 0x27, 0xe1, 0x84, 0x66, 0x3a, 0x0d, - 0xd3, 0xa9, 0x30, 0x83, 0x67, 0x05, 0xae, 0x8c, 0x6c, 0xb0, 0xaa, 0x87, 0xe3, 0x90, 0x8b, 0x30, - 0x4a, 0x9d, 0x02, 0xdd, 0x08, 0xa6, 0x7e, 0x38, 0x36, 0x74, 0x7e, 0xf5, 0xdf, 0x0e, 0xd0, 0x49, - 0x34, 0xe2, 0x11, 0xd2, 0x9b, 0x2e, 0x5b, 0x30, 0xa9, 0x37, 0xac, 0x3a, 0xa6, 0x47, 0x62, 0x15, - 0xaf, 0x2e, 0x9e, 0xdf, 0xd7, 0x38, 0xbf, 0x09, 0x9f, 0x7c, 0x59, 0x50, 0x17, 0x57, 0x60, 0x5c, - 0xd5, 0x34, 0x6c, 0x85, 0x58, 0xc6, 0x38, 0x2c, 0x21, 0x60, 0x8e, 0x53, 0x7a, 0xdc, 0x4a, 0xcf, - 0x74, 0x1a, 0xdb, 0xb7, 0xde, 0x1b, 0x18, 0x34, 0x1b, 0xd7, 0xb0, 0xf1, 0xb0, 0x81, 0xdd, 0xab, - 0xa6, 0xbd, 0xcf, 0xd5, 0xfb, 0x30, 0x6b, 0x4a, 0x0c, 0xc2, 0x7b, 0x93, 0x30, 0xc5, 0x2a, 0xe6, - 0x76, 0x54, 0x07, 0xcf, 0x5d, 0x79, 0x74, 0x07, 0xbb, 0xea, 0xa3, 0x73, 0x9a, 0xa9, 0x8b, 0x69, - 0x3a, 0xc1, 0xc7, 0x85, 0xd4, 0xcf, 0xf2, 0xfa, 0x0e, 0x7e, 0x6a, 0x09, 0x52, 0x0b, 0xa6, 0x6e, - 0x10, 0x8b, 0xac, 0x62, 0xc3, 0x6c, 0x70, 0x2f, 0xc5, 0x0a, 0xe8, 0x6e, 0x18, 0x54, 0x1b, 0x66, - 0xd3, 0x70, 0xd9, 0x69, 0x5e, 0x69, 0xf8, 0x2b, 0x37, 0xa6, 0x8f, 0xfc, 0xde, 0x8d, 0xe9, 0xe4, - 0xb2, 0xe1, 0x2a, 0xbc, 0xaa, 0x98, 0x7a, 0xe3, 0x93, 0xd3, 0x92, 0xfc, 0x2c, 0x0c, 0x2d, 0x62, - 0xed, 0x30, 0xbc, 0x16, 0xb1, 0x16, 0xe1, 0xf5, 0x00, 0xa4, 0x97, 0x0d, 0x97, 0xdd, 0x20, 0xbe, - 0x13, 0x92, 0xba, 0xc1, 0x2e, 0xa5, 0x45, 0xda, 0x27, 0x70, 0x82, 0xba, 0x88, 0x35, 0x0f, 0xb5, - 0x8a, 0xb5, 0x28, 0x2a, 0x61, 0x4f, 0xe0, 0xa5, 0xc5, 0xdf, 0xfd, 0x4f, 0x53, 0x47, 0x5e, 0x79, - 0x7d, 0xea, 0x48, 0xc7, 0x91, 0x08, 0x46, 0x07, 0xae, 0x62, 0x3e, 0x04, 0x4e, 0x75, 0x7f, 0xce, - 0x0d, 0xcd, 0x85, 0xcf, 0xa6, 0xe0, 0x4e, 0xfa, 0x78, 0xc4, 0x6e, 0xe8, 0x86, 0x3b, 0xa7, 0xd9, - 0x07, 0x96, 0x4b, 0xc3, 0x89, 0xb9, 0xcb, 0x47, 0x61, 0xdc, 0xaf, 0x9e, 0x65, 0xd5, 0x1d, 0xc6, - 0x60, 0x17, 0x06, 0x36, 0x08, 0x1d, 0x51, 0x9c, 0x6b, 0xba, 0x6a, 0x9d, 0xbb, 0x0b, 0x56, 0x20, - 0x50, 0xf6, 0xe0, 0x24, 0xc1, 0xa0, 0xba, 0x78, 0x6b, 0x52, 0xc7, 0xea, 0x2e, 0xbb, 0xb7, 0x9b, - 0xa4, 0x21, 0x24, 0x4d, 0x00, 0xf4, 0x8a, 0xee, 0x24, 0x0c, 0xa8, 0x4d, 0x76, 0xe4, 0x9c, 0x24, - 0xb1, 0x85, 0x16, 0xe4, 0x4b, 0x30, 0xc4, 0x8f, 0xb9, 0x50, 0x0e, 0x92, 0xfb, 0xf8, 0x80, 0xb6, - 0x93, 0x55, 0xc8, 0x4f, 0x34, 0x0b, 0x03, 0x54, 0x78, 0xfe, 0x20, 0x21, 0x3f, 0xdb, 0x22, 0xfd, - 0x2c, 0x15, 0x52, 0x61, 0x68, 0xf2, 0xb3, 0x90, 0x5e, 0x34, 0x1b, 0xba, 0x61, 0x86, 0xb9, 0x65, - 0x18, 0x37, 0x2a, 0xb3, 0xd5, 0xe4, 0x63, 0xad, 0xb0, 0x02, 0x3a, 0x06, 0x83, 0xec, 0x1e, 0x37, - 0x3f, 0x36, 0xe7, 0x25, 0x79, 0x01, 0x86, 0x28, 0xef, 0x75, 0x0b, 0x21, 0xfe, 0x02, 0x88, 0x5f, - 0x18, 0xa7, 0x6e, 0x81, 0xb3, 0x4f, 0xf8, 0xc2, 0x22, 0x48, 0x55, 0x55, 0x57, 0xe5, 0xfd, 0xa6, - 0xbf, 0xe5, 0xa7, 0x21, 0xcd, 0x99, 0x38, 0xe8, 0x0c, 0x24, 0x4d, 0xcb, 0xe1, 0x07, 0xdf, 0x85, - 0x4e, 0x5d, 0x59, 0xb7, 0x4a, 0x29, 0x62, 0x25, 0x0a, 0x41, 0x2e, 0x29, 0x1d, 0xcd, 0xe2, 0xc9, - 0x80, 0x59, 0x04, 0x86, 0x3c, 0xf0, 0x93, 0x0d, 0x69, 0x8b, 0x39, 0x78, 0xc6, 0xf2, 0xa9, 0x04, - 0x4c, 0x05, 0x6a, 0xaf, 0x60, 0x9b, 0xac, 0xf5, 0x98, 0x45, 0x71, 0x6b, 0x41, 0x01, 0x21, 0x79, - 0x7d, 0x07, 0x73, 0x79, 0x33, 0x24, 0xe7, 0x2d, 0x0b, 0x15, 0x20, 0xcd, 0x0e, 0xb8, 0x4d, 0x66, - 0x2f, 0x29, 0xc5, 0x2b, 0x93, 0x3a, 0xc7, 0xdc, 0x75, 0xaf, 0xaa, 0xb6, 0xf7, 0xd4, 0x49, 0x94, - 0xe5, 0xa7, 0x20, 0xb3, 0x60, 0x1a, 0x0e, 0x36, 0x9c, 0x26, 0x0d, 0x44, 0x3b, 0x75, 0x53, 0xdb, - 0xe7, 0x1c, 0x58, 0x81, 0x28, 0x5c, 0xb5, 0x2c, 0x4a, 0x99, 0x52, 0xc8, 0x4f, 0x36, 0x2f, 0x4b, - 0x9b, 0x1d, 0x55, 0xf4, 0x54, 0xff, 0x2a, 0xe2, 0x9d, 0xf4, 0x74, 0xf4, 0xbf, 0x25, 0x38, 0xd9, - 0x3a, 0xa1, 0xf6, 0xf1, 0x81, 0xd3, 0xef, 0x7c, 0x7a, 0x01, 0x32, 0x1b, 0xf4, 0xbd, 0xf1, 0x25, - 0x7c, 0x80, 0x0a, 0x30, 0x84, 0xab, 0x67, 0xce, 0x9e, 0x7d, 0xf4, 0x29, 0x66, 0xed, 0x17, 0x8f, - 0x28, 0x02, 0x80, 0xa6, 0x20, 0xe3, 0x60, 0xcd, 0x3a, 0x73, 0xf6, 0xdc, 0xfe, 0xa3, 0xcc, 0xbc, - 0x2e, 0x1e, 0x51, 0x7c, 0x50, 0x31, 0x4d, 0x7a, 0xfd, 0xc6, 0xa7, 0xa6, 0xa5, 0xd2, 0x00, 0x24, - 0x9d, 0x66, 0xe3, 0xb6, 0xda, 0xc8, 0x6b, 0x03, 0x30, 0x13, 0xa4, 0xa4, 0xd1, 0xfa, 0x8a, 0x5a, - 0xd7, 0xab, 0xaa, 0xff, 0x52, 0x3c, 0x17, 0xd0, 0x01, 0xc5, 0x68, 0xaf, 0x82, 0x42, 0x57, 0x4d, - 0xca, 0xbf, 0x2e, 0x41, 0xf6, 0xb2, 0xe0, 0xbc, 0x89, 0x5d, 0x74, 0x1e, 0xc0, 0x6b, 0x49, 0x4c, - 0x9b, 0x3b, 0x66, 0xa3, 0x6d, 0xcd, 0x7a, 0x34, 0x4a, 0x00, 0x1d, 0x3d, 0x41, 0x0d, 0xd1, 0x32, - 0x1d, 0xfe, 0xfc, 0x25, 0x86, 0xd4, 0x43, 0x46, 0x0f, 0x01, 0xa2, 0x1e, 0xae, 0x72, 0xc5, 0x74, - 0x75, 0xa3, 0x56, 0xb1, 0xcc, 0xab, 0xfc, 0x51, 0x61, 0x52, 0xc9, 0xd1, 0x9a, 0xcb, 0xb4, 0x62, - 0x83, 0xc0, 0x89, 0xd0, 0x19, 0x8f, 0x0b, 0xc9, 0xad, 0xd4, 0x6a, 0xd5, 0xc6, 0x8e, 0xc3, 0x9d, - 0x98, 0x28, 0xa2, 0xf3, 0x30, 0x64, 0x35, 0x77, 0x2a, 0xc2, 0x63, 0x0c, 0x9f, 0x39, 0xd9, 0x6e, - 0xfe, 0x0b, 0xfb, 0xe0, 0x1e, 0x60, 0xd0, 0x6a, 0xee, 0x10, 0x6b, 0xb9, 0x0b, 0xb2, 0x6d, 0x84, - 0x19, 0xbe, 0xe2, 0xcb, 0x41, 0x9f, 0xb9, 0xf3, 0x1e, 0x54, 0x2c, 0x5b, 0x37, 0x6d, 0xdd, 0x3d, - 0xa0, 0xb7, 0x57, 0x92, 0x4a, 0x4e, 0x54, 0x6c, 0x70, 0xb8, 0xbc, 0x0f, 0x63, 0x9b, 0x34, 0xb7, - 0xf0, 0x25, 0x3f, 0xeb, 0xcb, 0x27, 0xc5, 0xcb, 0xd7, 0x51, 0xb2, 0x44, 0x8b, 0x64, 0xa5, 0xe7, - 0x3a, 0x5a, 0xe7, 0x13, 0xfd, 0x5b, 0x67, 0x38, 0xda, 0xfd, 0xd1, 0x89, 0xd0, 0xe4, 0xe4, 0xa9, - 0x64, 0xc0, 0x7d, 0xf5, 0x6a, 0x98, 0x71, 0x29, 0x75, 0xa1, 0x7b, 0x50, 0x2d, 0xc4, 0xb8, 0xd1, - 0x42, 0xec, 0x14, 0x92, 0x9f, 0x82, 0x91, 0x0d, 0xd5, 0x76, 0x37, 0xb1, 0x7b, 0x11, 0xab, 0x55, - 0x6c, 0x87, 0xa3, 0xee, 0x88, 0x88, 0xba, 0x08, 0x52, 0x34, 0xb4, 0xb2, 0xa8, 0x43, 0x7f, 0xcb, - 0x7b, 0x90, 0xa2, 0x37, 0xd8, 0xbc, 0x88, 0xcc, 0x29, 0x58, 0x44, 0x26, 0xbe, 0xf4, 0xc0, 0xc5, - 0x8e, 0x58, 0xd0, 0xd1, 0x02, 0x7a, 0x5c, 0xc4, 0xd5, 0x64, 0xf7, 0xb8, 0xca, 0x0d, 0x91, 0x47, - 0xd7, 0x3a, 0x0c, 0x95, 0x88, 0x2b, 0x5e, 0x5e, 0xf4, 0x04, 0x91, 0x7c, 0x41, 0xd0, 0x2a, 0x8c, - 0x59, 0xaa, 0xed, 0xd2, 0xab, 0xfb, 0x7b, 0xb4, 0x17, 0xdc, 0xd6, 0xa7, 0x5b, 0x67, 0x5e, 0xa8, - 0xb3, 0xbc, 0x95, 0x11, 0x2b, 0x08, 0x94, 0xff, 0x30, 0x05, 0x83, 0x5c, 0x19, 0x6f, 0x86, 0x21, - 0xae, 0x56, 0x6e, 0x9d, 0x77, 0xce, 0xb6, 0x06, 0xa6, 0x59, 0x2f, 0x80, 0x70, 0x7e, 0x82, 0x06, - 0xdd, 0x07, 0x69, 0x6d, 0x4f, 0xd5, 0x8d, 0x8a, 0x5e, 0x15, 0x69, 0xde, 0xeb, 0x37, 0xa6, 0x87, - 0x16, 0x08, 0x6c, 0x79, 0x51, 0x19, 0xa2, 0x95, 0xcb, 0x55, 0x92, 0x09, 0xec, 0x61, 0xbd, 0xb6, - 0xe7, 0xf2, 0x19, 0xc6, 0x4b, 0xe8, 0x49, 0x48, 0x11, 0x83, 0xe0, 0x0f, 0xbb, 0x0a, 0x2d, 0xc9, - 0xb6, 0xb7, 0xe2, 0x29, 0xa5, 0x49, 0xc3, 0x1f, 0xfa, 0xfd, 0x69, 0x49, 0xa1, 0x14, 0x68, 0x01, - 0x46, 0xea, 0xaa, 0xe3, 0x56, 0x68, 0x04, 0x23, 0xcd, 0x0f, 0x50, 0x16, 0x27, 0x5a, 0x15, 0xc2, - 0x15, 0xcb, 0x45, 0x1f, 0x26, 0x54, 0x0c, 0x54, 0x45, 0xa7, 0x20, 0x47, 0x99, 0x68, 0x66, 0xa3, - 0xa1, 0xbb, 0x2c, 0xb7, 0x1a, 0xa4, 0x7a, 0x1f, 0x25, 0xf0, 0x05, 0x0a, 0xa6, 0x19, 0xd6, 0x1d, - 0x90, 0xa1, 0x4f, 0x49, 0x28, 0x0a, 0xbb, 0x36, 0x99, 0x26, 0x00, 0x5a, 0x79, 0x3f, 0x8c, 0xf9, - 0xfe, 0x91, 0xa1, 0xa4, 0x19, 0x17, 0x1f, 0x4c, 0x11, 0x1f, 0x81, 0x49, 0x03, 0x5f, 0xa3, 0x17, - 0x39, 0x43, 0xd8, 0x19, 0x8a, 0x8d, 0x48, 0xdd, 0xe5, 0x30, 0xc5, 0xbd, 0x30, 0xaa, 0x09, 0xe5, - 0x33, 0x5c, 0xa0, 0xb8, 0x23, 0x1e, 0x94, 0xa2, 0x9d, 0x80, 0xb4, 0x6a, 0x59, 0x0c, 0x61, 0x98, - 0xfb, 0x47, 0xcb, 0xa2, 0x55, 0xa7, 0x61, 0x9c, 0xf6, 0xd1, 0xc6, 0x4e, 0xb3, 0xee, 0x72, 0x26, - 0x59, 0x8a, 0x33, 0x46, 0x2a, 0x14, 0x06, 0xa7, 0xb8, 0x77, 0xc3, 0x08, 0xbe, 0xa2, 0x57, 0xb1, - 0xa1, 0x61, 0x86, 0x37, 0x42, 0xf1, 0xb2, 0x02, 0x48, 0x91, 0x1e, 0x00, 0xcf, 0xef, 0x55, 0x84, - 0x4f, 0x1e, 0x65, 0xfc, 0x04, 0x7c, 0x9e, 0x81, 0xe5, 0x3c, 0xa4, 0x16, 0x55, 0x57, 0x25, 0x09, - 0x86, 0x7b, 0x8d, 0x05, 0x9a, 0xac, 0x42, 0x7e, 0xca, 0x6f, 0x24, 0x20, 0x75, 0xd9, 0x74, 0x31, - 0x7a, 0x2c, 0x90, 0x00, 0x8e, 0xb6, 0xb3, 0xe7, 0x4d, 0xbd, 0x66, 0xe0, 0xea, 0xaa, 0x53, 0x0b, - 0xbc, 0xfb, 0xf6, 0xcd, 0x29, 0x11, 0x32, 0xa7, 0x49, 0x18, 0xb0, 0xcd, 0xa6, 0x51, 0x15, 0x37, - 0x0e, 0x69, 0x01, 0x95, 0x21, 0xed, 0x59, 0x49, 0x2a, 0xce, 0x4a, 0xc6, 0x88, 0x95, 0x10, 0x1b, - 0xe6, 0x00, 0x65, 0x68, 0x87, 0x1b, 0x4b, 0x09, 0x32, 0x9e, 0xf3, 0xe2, 0xd6, 0xd6, 0x9b, 0xc1, - 0xfa, 0x64, 0x24, 0x98, 0x78, 0x63, 0xef, 0x29, 0x8f, 0x59, 0x5c, 0xce, 0xab, 0xe0, 0xda, 0x0b, - 0x99, 0x15, 0x7f, 0x83, 0x3e, 0x44, 0xfb, 0xe5, 0x9b, 0x15, 0x7b, 0x87, 0x7e, 0x12, 0x32, 0x8e, - 0x5e, 0x33, 0x54, 0xb7, 0x69, 0x63, 0x6e, 0x79, 0x3e, 0x40, 0xfe, 0x92, 0x04, 0x83, 0xcc, 0x92, - 0x03, 0x7a, 0x93, 0xda, 0xeb, 0x2d, 0xd1, 0x49, 0x6f, 0xc9, 0xc3, 0xeb, 0x6d, 0x1e, 0xc0, 0x13, - 0xc6, 0xe1, 0x4f, 0x83, 0xdb, 0x64, 0x0c, 0x4c, 0xc4, 0x4d, 0xbd, 0xc6, 0x27, 0x6a, 0x80, 0x48, - 0xfe, 0x8f, 0x12, 0x49, 0x62, 0x79, 0x3d, 0x9a, 0x87, 0x11, 0x21, 0x57, 0x65, 0xb7, 0xae, 0xd6, - 0xb8, 0xed, 0xdc, 0xd9, 0x51, 0xb8, 0x0b, 0x75, 0xb5, 0xa6, 0x0c, 0x73, 0x79, 0x48, 0xa1, 0xfd, - 0x38, 0x24, 0x3a, 0x8c, 0x43, 0x68, 0xe0, 0x93, 0x87, 0x1b, 0xf8, 0xd0, 0x10, 0xa5, 0xa2, 0x43, - 0xf4, 0xf9, 0x04, 0x5d, 0xcc, 0x58, 0xa6, 0xa3, 0xd6, 0x7f, 0x18, 0x33, 0xe2, 0x0e, 0xc8, 0x58, - 0x66, 0xbd, 0xc2, 0x6a, 0xd8, 0x4d, 0xdc, 0xb4, 0x65, 0xd6, 0x95, 0x96, 0x61, 0x1f, 0xb8, 0x45, - 0xd3, 0x65, 0xf0, 0x16, 0x68, 0x6d, 0x28, 0xaa, 0x35, 0x1b, 0xb2, 0x4c, 0x15, 0x3c, 0x96, 0x3d, - 0x42, 0x74, 0x40, 0x83, 0xa3, 0xd4, 0x1a, 0x7b, 0x99, 0xd8, 0x0c, 0x53, 0xe1, 0x78, 0x84, 0x82, - 0xb9, 0xfe, 0x76, 0xab, 0xe0, 0xa0, 0x59, 0x2a, 0x1c, 0x4f, 0xfe, 0x39, 0x09, 0x60, 0x85, 0x68, - 0x96, 0xf6, 0x97, 0x44, 0x21, 0x87, 0x8a, 0x50, 0x09, 0xb5, 0x3c, 0xd5, 0x69, 0xd0, 0x78, 0xfb, - 0x59, 0x27, 0x28, 0xf7, 0x02, 0x8c, 0xf8, 0xc6, 0xe8, 0x60, 0x21, 0xcc, 0x54, 0x97, 0xac, 0x7a, - 0x13, 0xbb, 0x4a, 0xf6, 0x4a, 0xa0, 0x24, 0xff, 0x33, 0x09, 0x32, 0x54, 0xa6, 0x55, 0xec, 0xaa, - 0xa1, 0x31, 0x94, 0x0e, 0x3f, 0x86, 0x77, 0x02, 0x30, 0x36, 0x8e, 0xfe, 0x32, 0xe6, 0x96, 0x95, - 0xa1, 0x90, 0x4d, 0xfd, 0x65, 0x8c, 0xce, 0x79, 0x0a, 0x4f, 0x76, 0x57, 0xb8, 0xc8, 0xba, 0xb9, - 0xda, 0x8f, 0xc3, 0x10, 0xfd, 0x94, 0xce, 0x35, 0x87, 0x27, 0xd2, 0x83, 0x46, 0xb3, 0xb1, 0x75, - 0xcd, 0x91, 0x5f, 0x84, 0xa1, 0xad, 0x6b, 0x6c, 0x6f, 0xe4, 0x0e, 0xc8, 0xd8, 0xa6, 0xc9, 0x63, - 0x32, 0xcb, 0x85, 0xd2, 0x04, 0x40, 0x43, 0x90, 0xd8, 0x0f, 0x48, 0xf8, 0xfb, 0x01, 0xfe, 0x86, - 0x46, 0xb2, 0xa7, 0x0d, 0x8d, 0xd3, 0xff, 0x4e, 0x82, 0xe1, 0x80, 0x7f, 0x40, 0x8f, 0xc2, 0xd1, - 0xd2, 0xca, 0xfa, 0xc2, 0xa5, 0xca, 0xf2, 0x62, 0xe5, 0xc2, 0xca, 0xfc, 0x92, 0xff, 0xd6, 0xa4, - 0x70, 0xec, 0xd5, 0xeb, 0x33, 0x28, 0x80, 0xbb, 0x6d, 0xec, 0x1b, 0xe6, 0x55, 0x03, 0xcd, 0xc1, - 0x64, 0x98, 0x64, 0xbe, 0xb4, 0x59, 0x5e, 0xdb, 0xca, 0x49, 0x85, 0xa3, 0xaf, 0x5e, 0x9f, 0x19, - 0x0f, 0x50, 0xcc, 0xef, 0x38, 0xd8, 0x70, 0x5b, 0x09, 0x16, 0xd6, 0x57, 0x57, 0x97, 0xb7, 0x72, - 0x89, 0x16, 0x02, 0xee, 0xb0, 0x1f, 0x80, 0xf1, 0x30, 0xc1, 0xda, 0xf2, 0x4a, 0x2e, 0x59, 0x40, - 0xaf, 0x5e, 0x9f, 0x19, 0x0d, 0x60, 0xaf, 0xe9, 0xf5, 0x42, 0xfa, 0xfd, 0x9f, 0x9e, 0x3a, 0xf2, - 0x4b, 0xbf, 0x38, 0x25, 0x91, 0x9e, 0x8d, 0x84, 0x7c, 0x04, 0x7a, 0x08, 0x8e, 0x6f, 0x2e, 0x2f, - 0xad, 0x95, 0x17, 0x2b, 0xab, 0x9b, 0x4b, 0x15, 0xf6, 0x8d, 0x0d, 0xaf, 0x77, 0x63, 0xaf, 0x5e, - 0x9f, 0x19, 0xe6, 0x5d, 0xea, 0x84, 0xbd, 0xa1, 0x94, 0x2f, 0xaf, 0x6f, 0x95, 0x73, 0x12, 0xc3, - 0xde, 0xb0, 0xf1, 0x15, 0xd3, 0x65, 0xdf, 0xda, 0x7a, 0x04, 0x4e, 0xb4, 0xc1, 0xf6, 0x3a, 0x36, - 0xfe, 0xea, 0xf5, 0x99, 0x91, 0x0d, 0x1b, 0xb3, 0xf9, 0x43, 0x29, 0x66, 0x21, 0xdf, 0x4a, 0xb1, - 0xbe, 0xb1, 0xbe, 0x39, 0xbf, 0x92, 0x9b, 0x29, 0xe4, 0x5e, 0xbd, 0x3e, 0x93, 0x15, 0xce, 0x90, - 0xe0, 0xfb, 0x3d, 0xbb, 0x9d, 0x2b, 0x9e, 0x3f, 0x79, 0x18, 0xee, 0xe1, 0x7b, 0x80, 0x8e, 0xab, - 0xee, 0xeb, 0x46, 0xcd, 0xdb, 0x69, 0xe5, 0x65, 0xbe, 0xf2, 0x39, 0xc6, 0x37, 0x5b, 0x05, 0xb4, - 0xeb, 0x7e, 0x6b, 0xa1, 0xf3, 0xc9, 0x52, 0x21, 0xe6, 0xf0, 0x25, 0x7e, 0xe9, 0xd4, 0x79, 0x6f, - 0xbe, 0x10, 0xb3, 0x63, 0x5c, 0xe8, 0xba, 0xb8, 0x93, 0x3f, 0x20, 0xc1, 0xe8, 0x45, 0xdd, 0x71, - 0x4d, 0x5b, 0xd7, 0xd4, 0x3a, 0x7d, 0x61, 0x72, 0xae, 0x57, 0xdf, 0x1a, 0x99, 0xea, 0xcf, 0xc0, - 0xe0, 0x15, 0xb5, 0xce, 0x9c, 0x5a, 0x92, 0x7e, 0x10, 0xa3, 0xbd, 0xfa, 0x7c, 0xd7, 0x26, 0x18, - 0x30, 0x32, 0xf9, 0x57, 0x12, 0x30, 0x46, 0x27, 0x83, 0xc3, 0x3e, 0x95, 0x44, 0xd6, 0x58, 0x25, - 0x48, 0xd9, 0xaa, 0xcb, 0x37, 0x0d, 0x4b, 0xb3, 0x7c, 0xe7, 0xf7, 0xbe, 0xf8, 0xdd, 0xdc, 0xd9, - 0x45, 0xac, 0x29, 0x94, 0x16, 0xbd, 0x1d, 0xd2, 0x0d, 0xf5, 0x5a, 0x85, 0xf2, 0x61, 0x2b, 0x97, - 0xf9, 0xfe, 0xf8, 0xdc, 0xbc, 0x31, 0x3d, 0x76, 0xa0, 0x36, 0xea, 0x45, 0x59, 0xf0, 0x91, 0x95, - 0xa1, 0x86, 0x7a, 0x8d, 0x88, 0x88, 0x2c, 0x18, 0x23, 0x50, 0x6d, 0x4f, 0x35, 0x6a, 0x98, 0x35, - 0x42, 0xb7, 0x40, 0x4b, 0x17, 0xfb, 0x6e, 0xe4, 0x98, 0xdf, 0x48, 0x80, 0x9d, 0xac, 0x8c, 0x34, - 0xd4, 0x6b, 0x0b, 0x14, 0x40, 0x5a, 0x2c, 0xa6, 0x3f, 0xfa, 0xc9, 0xe9, 0x23, 0x74, 0x37, 0xfd, - 0x1b, 0x12, 0x80, 0xaf, 0x31, 0xf4, 0x76, 0xc8, 0x69, 0x5e, 0x89, 0xd2, 0x3a, 0x7c, 0x0c, 0xef, - 0xef, 0x34, 0x16, 0x11, 0x7d, 0xb3, 0xd8, 0xfc, 0xf5, 0x1b, 0xd3, 0x92, 0x32, 0xa6, 0x45, 0x86, - 0xe2, 0x6d, 0x30, 0xdc, 0xb4, 0xaa, 0xaa, 0x8b, 0x2b, 0x74, 0x1d, 0x97, 0x88, 0x8d, 0xf3, 0x53, - 0x84, 0xd7, 0xcd, 0x1b, 0xd3, 0x88, 0x75, 0x2b, 0x40, 0x2c, 0xd3, 0xe8, 0x0f, 0x0c, 0x42, 0x08, - 0x02, 0x7d, 0xfa, 0xaa, 0x04, 0xc3, 0x8b, 0x81, 0x9b, 0x5e, 0x79, 0x18, 0x6a, 0x98, 0x86, 0xbe, - 0xcf, 0xed, 0x31, 0xa3, 0x88, 0x22, 0x2a, 0x40, 0x9a, 0x3d, 0xba, 0x73, 0x0f, 0xc4, 0x56, 0xa8, - 0x28, 0x13, 0xaa, 0xab, 0x78, 0xc7, 0xd1, 0xc5, 0x68, 0x28, 0xa2, 0x88, 0x2e, 0x40, 0xce, 0xc1, - 0x5a, 0xd3, 0xd6, 0xdd, 0x83, 0x8a, 0x66, 0x1a, 0xae, 0xaa, 0xb9, 0xec, 0xf9, 0x56, 0xe9, 0x8e, - 0x9b, 0x37, 0xa6, 0x8f, 0x33, 0x59, 0xa3, 0x18, 0xb2, 0x32, 0x26, 0x40, 0x0b, 0x0c, 0x42, 0x5a, - 0xa8, 0x62, 0x57, 0xd5, 0xeb, 0x4e, 0x9e, 0x1d, 0x0c, 0x89, 0x62, 0xa0, 0x2f, 0x9f, 0x1b, 0x0a, - 0x6e, 0x6c, 0x5d, 0x80, 0x9c, 0x69, 0x61, 0x3b, 0x94, 0x88, 0x4a, 0xd1, 0x96, 0xa3, 0x18, 0xb2, - 0x32, 0x26, 0x40, 0x22, 0x49, 0x75, 0xc9, 0x30, 0x8b, 0x85, 0xa2, 0xd5, 0xdc, 0xf1, 0xf7, 0xc3, - 0x26, 0x5b, 0x46, 0x63, 0xde, 0x38, 0x28, 0x3d, 0xe6, 0x73, 0x8f, 0xd2, 0xc9, 0x5f, 0xfb, 0xc2, - 0xc3, 0x93, 0xdc, 0x34, 0xfc, 0xfd, 0xa9, 0x4b, 0xf8, 0x80, 0x0c, 0x3f, 0x47, 0xdd, 0xa0, 0x98, - 0x24, 0xed, 0x7c, 0x51, 0xd5, 0xeb, 0xe2, 0x19, 0xb2, 0xc2, 0x4b, 0xa8, 0x08, 0x83, 0x8e, 0xab, - 0xba, 0x4d, 0x87, 0x7f, 0x1c, 0x4c, 0xee, 0x64, 0x6a, 0x25, 0xd3, 0xa8, 0x6e, 0x52, 0x4c, 0x85, - 0x53, 0xa0, 0x0b, 0x30, 0xe8, 0x9a, 0xfb, 0xd8, 0xe0, 0x2a, 0xec, 0x6b, 0x7e, 0xd3, 0x73, 0x2a, - 0x46, 0x4d, 0x34, 0x52, 0xc5, 0x75, 0x5c, 0x63, 0x69, 0xd5, 0x9e, 0x4a, 0x56, 0x1f, 0xf4, 0x1b, - 0x61, 0xa5, 0xe5, 0xbe, 0x27, 0x21, 0xd7, 0x54, 0x94, 0x9f, 0xac, 0x8c, 0x79, 0xa0, 0x4d, 0x0a, - 0x41, 0x97, 0x42, 0x57, 0x12, 0xf9, 0x87, 0xf4, 0xee, 0xee, 0xd4, 0xfd, 0x80, 0x4d, 0x8b, 0xfd, - 0x89, 0xe0, 0x85, 0xc6, 0x0b, 0x90, 0x6b, 0x1a, 0x3b, 0xa6, 0x41, 0xdf, 0x0a, 0xf2, 0xfc, 0x9e, - 0xac, 0xef, 0x92, 0x41, 0xe3, 0x88, 0x62, 0xc8, 0xca, 0x98, 0x07, 0xba, 0xc8, 0x56, 0x01, 0x55, - 0x18, 0xf5, 0xb1, 0xe8, 0x44, 0xcd, 0xc4, 0x4e, 0xd4, 0xbb, 0xf8, 0x44, 0x3d, 0x1a, 0x6d, 0xc5, - 0x9f, 0xab, 0x23, 0x1e, 0x90, 0x90, 0xa1, 0x8b, 0x00, 0xbe, 0x7b, 0xa0, 0xfb, 0x14, 0xc3, 0x9d, - 0x07, 0xde, 0xf7, 0x31, 0x62, 0xbd, 0xe7, 0xd3, 0xa2, 0x77, 0xc2, 0x44, 0x43, 0x37, 0x2a, 0x0e, - 0xae, 0xef, 0x56, 0xb8, 0x82, 0x09, 0x4b, 0xfa, 0xa9, 0x97, 0xd2, 0x4a, 0x7f, 0xf6, 0x70, 0xf3, - 0xc6, 0x74, 0x81, 0xbb, 0xd0, 0x56, 0x96, 0xb2, 0x32, 0xde, 0xd0, 0x8d, 0x4d, 0x5c, 0xdf, 0x5d, - 0xf4, 0x60, 0xc5, 0xec, 0xfb, 0x3f, 0x39, 0x7d, 0x84, 0x4f, 0xd7, 0x23, 0xf2, 0x39, 0xba, 0x77, - 0xce, 0xa7, 0x19, 0x76, 0xc8, 0x9a, 0x44, 0x15, 0x05, 0xba, 0xa3, 0x91, 0x51, 0x7c, 0x00, 0x9b, - 0xe6, 0xaf, 0xfc, 0x87, 0x19, 0x49, 0xfe, 0x9c, 0x04, 0x83, 0x8b, 0x97, 0x37, 0x54, 0xdd, 0x46, - 0xcb, 0x30, 0xee, 0x5b, 0x4e, 0x78, 0x92, 0x9f, 0xbc, 0x79, 0x63, 0x3a, 0x1f, 0x35, 0x2e, 0x6f, - 0x96, 0xfb, 0x06, 0x2c, 0xa6, 0xf9, 0x72, 0xa7, 0x85, 0x6b, 0x88, 0x55, 0x0b, 0x8a, 0xdc, 0xba, - 0xac, 0x8d, 0x74, 0xb3, 0x0c, 0x43, 0x4c, 0x5a, 0x07, 0x15, 0x61, 0xc0, 0x22, 0x3f, 0xf8, 0xc1, - 0xc0, 0x54, 0x47, 0xe3, 0xa5, 0xf8, 0xde, 0x46, 0x26, 0x21, 0x91, 0x3f, 0x9c, 0x00, 0x58, 0xbc, - 0x7c, 0x79, 0xcb, 0xd6, 0xad, 0x3a, 0x76, 0x6f, 0x65, 0xcf, 0xb7, 0xe0, 0x68, 0x60, 0x95, 0x64, - 0x6b, 0x91, 0xde, 0xcf, 0xdc, 0xbc, 0x31, 0x7d, 0x32, 0xda, 0xfb, 0x00, 0x9a, 0xac, 0x4c, 0xf8, - 0xeb, 0x25, 0x5b, 0x6b, 0xcb, 0xb5, 0xea, 0xb8, 0x1e, 0xd7, 0x64, 0x67, 0xae, 0x01, 0xb4, 0x20, - 0xd7, 0x45, 0xc7, 0x6d, 0xaf, 0xda, 0x4d, 0x18, 0xf6, 0x55, 0xe2, 0xa0, 0x45, 0x48, 0xbb, 0xfc, - 0x37, 0xd7, 0xb0, 0xdc, 0x59, 0xc3, 0x82, 0x8c, 0x6b, 0xd9, 0xa3, 0x94, 0xff, 0x4c, 0x02, 0xf0, - 0x6d, 0xf6, 0xc7, 0xd3, 0xc4, 0x88, 0x2b, 0xe7, 0x8e, 0x37, 0x79, 0xa8, 0x54, 0x8d, 0x53, 0x47, - 0xf4, 0xf9, 0xd3, 0x09, 0x98, 0xd8, 0x16, 0x9e, 0xe7, 0xc7, 0x5e, 0x07, 0x1b, 0x30, 0x84, 0x0d, - 0xd7, 0xd6, 0xa9, 0x12, 0xc8, 0x68, 0x3f, 0xd2, 0x69, 0xb4, 0xdb, 0xf4, 0x89, 0x7e, 0xec, 0x46, - 0x6c, 0xba, 0x73, 0x36, 0x11, 0x6d, 0x7c, 0x30, 0x09, 0xf9, 0x4e, 0x94, 0x68, 0x01, 0xc6, 0x34, - 0x1b, 0x53, 0x40, 0x25, 0xb8, 0xf3, 0x57, 0x2a, 0xf8, 0x99, 0x65, 0x04, 0x41, 0x56, 0x46, 0x05, - 0x84, 0x47, 0x8f, 0x1a, 0x90, 0xb4, 0x8f, 0x98, 0x1d, 0xc1, 0xea, 0x31, 0xcf, 0x93, 0x79, 0xf8, - 0x10, 0x8d, 0x84, 0x19, 0xb0, 0xf8, 0x31, 0xea, 0x43, 0x69, 0x00, 0x79, 0x09, 0xc6, 0x74, 0x43, - 0x77, 0x75, 0xb5, 0x5e, 0xd9, 0x51, 0xeb, 0xaa, 0xa1, 0x1d, 0x26, 0x6b, 0x66, 0x2e, 0x9f, 0x37, - 0x1b, 0x61, 0x27, 0x2b, 0xa3, 0x1c, 0x52, 0x62, 0x00, 0x74, 0x11, 0x86, 0x44, 0x53, 0xa9, 0x43, - 0x65, 0x1b, 0x82, 0x3c, 0x90, 0xe0, 0xfd, 0x4c, 0x12, 0xc6, 0x15, 0x5c, 0xfd, 0xff, 0x43, 0xd1, - 0xdf, 0x50, 0xac, 0x02, 0xb0, 0xe9, 0x4e, 0x1c, 0xec, 0x21, 0x46, 0x83, 0x38, 0x8c, 0x0c, 0xe3, - 0xb0, 0xe8, 0xb8, 0x81, 0xf1, 0xb8, 0x91, 0x80, 0x6c, 0x70, 0x3c, 0xfe, 0x82, 0x46, 0x25, 0xb4, - 0xec, 0x7b, 0xa2, 0x14, 0xff, 0x44, 0x68, 0x07, 0x4f, 0xd4, 0x62, 0xbd, 0xdd, 0x5d, 0xd0, 0xff, - 0x48, 0xc0, 0xe0, 0x86, 0x6a, 0xab, 0x0d, 0x07, 0x69, 0x2d, 0x99, 0xa6, 0xd8, 0x7e, 0x6c, 0xf9, - 0x10, 0x34, 0xdf, 0xed, 0x88, 0x49, 0x34, 0x3f, 0xda, 0x26, 0xd1, 0xfc, 0x09, 0x18, 0x25, 0xcb, - 0xe1, 0xc0, 0x15, 0x06, 0xa2, 0xed, 0x91, 0xd2, 0x09, 0x9f, 0x4b, 0xb8, 0x9e, 0xad, 0x96, 0x2f, - 0x07, 0xef, 0x30, 0x0c, 0x13, 0x0c, 0xdf, 0x31, 0x13, 0xf2, 0x63, 0xfe, 0xb2, 0x34, 0x50, 0x29, - 0x2b, 0xd0, 0x50, 0xaf, 0x95, 0x59, 0x01, 0xad, 0x00, 0xda, 0xf3, 0x76, 0x46, 0x2a, 0xbe, 0x3a, - 0x09, 0xfd, 0x9d, 0x37, 0x6f, 0x4c, 0x9f, 0x60, 0xf4, 0xad, 0x38, 0xb2, 0x32, 0xee, 0x03, 0x05, - 0xb7, 0xc7, 0x01, 0x48, 0xbf, 0x2a, 0xec, 0xfa, 0x1c, 0x5b, 0xee, 0x1c, 0xbd, 0x79, 0x63, 0x7a, - 0x9c, 0x71, 0xf1, 0xeb, 0x64, 0x25, 0x43, 0x0a, 0x8b, 0xe4, 0x77, 0xc0, 0xb2, 0x3f, 0x2d, 0x01, - 0xf2, 0x5d, 0xbe, 0x82, 0x1d, 0x8b, 0xac, 0xcf, 0x48, 0x22, 0x1e, 0xc8, 0x9a, 0xa5, 0xee, 0x89, - 0xb8, 0x4f, 0x2f, 0x12, 0xf1, 0xc0, 0x4c, 0x79, 0xca, 0x77, 0x8f, 0x09, 0x3e, 0x8e, 0x6d, 0xee, - 0x1a, 0xce, 0x2e, 0x98, 0xba, 0xa0, 0x6e, 0xf1, 0x87, 0x47, 0xe4, 0x7f, 0x25, 0xc1, 0x89, 0x16, - 0x8b, 0xf2, 0x84, 0xfd, 0x4b, 0x80, 0xec, 0x40, 0x25, 0xff, 0xde, 0x1b, 0x13, 0xba, 0x6f, 0x03, - 0x1d, 0xb7, 0x5b, 0xfc, 0xee, 0xad, 0xf3, 0xf0, 0xec, 0xb2, 0xe2, 0x3f, 0x95, 0x60, 0x32, 0xd8, - 0xbc, 0xd7, 0x91, 0x35, 0xc8, 0x06, 0x5b, 0xe7, 0x5d, 0xb8, 0xa7, 0x97, 0x2e, 0x70, 0xe9, 0x43, - 0xf4, 0xe8, 0x39, 0x7f, 0xba, 0xb2, 0xbd, 0xb3, 0x47, 0x7b, 0xd6, 0x86, 0x90, 0x29, 0x3a, 0x6d, - 0x53, 0x74, 0x3c, 0xfe, 0x8f, 0x04, 0xa9, 0x0d, 0xd3, 0xac, 0x23, 0x13, 0xc6, 0x0d, 0xd3, 0xad, - 0x10, 0xcb, 0xc2, 0xd5, 0x0a, 0x5f, 0x74, 0x33, 0x3f, 0xb8, 0xd0, 0x9f, 0x92, 0xbe, 0x7d, 0x63, - 0xba, 0x95, 0x95, 0x32, 0x66, 0x98, 0x6e, 0x89, 0x42, 0xb6, 0xd8, 0x92, 0xfc, 0x9d, 0x30, 0x12, - 0x6e, 0x8c, 0x79, 0xc9, 0xe7, 0xfb, 0x6e, 0x2c, 0xcc, 0xe6, 0xe6, 0x8d, 0xe9, 0x49, 0x7f, 0xc6, - 0x78, 0x60, 0x59, 0xc9, 0xee, 0x04, 0x5a, 0x67, 0xd7, 0xbb, 0xbe, 0xfb, 0xc9, 0x69, 0xe9, 0xf4, - 0x17, 0x25, 0x00, 0x7f, 0xe7, 0x01, 0x3d, 0x04, 0xc7, 0x4b, 0xeb, 0x6b, 0x8b, 0x95, 0xcd, 0xad, - 0xf9, 0xad, 0xed, 0xcd, 0xca, 0xf6, 0xda, 0xe6, 0x46, 0x79, 0x61, 0xf9, 0xc2, 0x72, 0x79, 0xd1, - 0xdf, 0x1e, 0x77, 0x2c, 0xac, 0xe9, 0xbb, 0x3a, 0xae, 0xa2, 0xfb, 0x60, 0x32, 0x8c, 0x4d, 0x4a, - 0xe5, 0xc5, 0x9c, 0x54, 0xc8, 0xbe, 0x7a, 0x7d, 0x26, 0xcd, 0x72, 0x31, 0x5c, 0x45, 0xa7, 0xe0, - 0x68, 0x2b, 0xde, 0xf2, 0xda, 0x52, 0x2e, 0x51, 0x18, 0x79, 0xf5, 0xfa, 0x4c, 0xc6, 0x4b, 0xda, - 0x90, 0x0c, 0x28, 0x88, 0xc9, 0xf9, 0x25, 0x0b, 0xf0, 0xea, 0xf5, 0x99, 0x41, 0xa6, 0xc0, 0x42, - 0xea, 0xfd, 0x9f, 0x9e, 0x3a, 0x52, 0xba, 0xd0, 0x71, 0x03, 0xfc, 0xa1, 0xae, 0xba, 0xbb, 0xe6, - 0x6d, 0x6a, 0x87, 0x77, 0xbd, 0xff, 0x78, 0xa8, 0xe3, 0xae, 0x77, 0x0d, 0x1b, 0xd8, 0xd1, 0x9d, - 0x43, 0xed, 0x7a, 0xf7, 0xb4, 0x93, 0x2e, 0xff, 0xce, 0x00, 0x64, 0x97, 0x58, 0x2b, 0x64, 0x20, - 0x30, 0x7a, 0x13, 0x0c, 0x5a, 0x34, 0x8c, 0x78, 0xc7, 0x68, 0x1d, 0x0c, 0x9e, 0x05, 0x1b, 0xef, - 0x2e, 0x17, 0x0b, 0x3d, 0x0e, 0xbf, 0xcc, 0xc1, 0xee, 0x98, 0xf9, 0xb7, 0xa6, 0xb2, 0x7d, 0xed, - 0xf7, 0xb0, 0x9c, 0x85, 0x6f, 0xad, 0x44, 0xf9, 0xc9, 0xec, 0x5e, 0xc8, 0x16, 0x81, 0xb0, 0xdb, - 0x61, 0xef, 0x95, 0xe0, 0x28, 0xc5, 0xf2, 0x03, 0x31, 0xc5, 0x14, 0xc9, 0xfe, 0xe9, 0x4e, 0x5d, - 0x58, 0x51, 0x1d, 0xff, 0xae, 0x07, 0xbb, 0xcf, 0x75, 0x0f, 0x0f, 0x84, 0x27, 0x03, 0x8d, 0x47, - 0xd9, 0xca, 0xca, 0x44, 0xbd, 0x85, 0xd2, 0x41, 0x4b, 0xa1, 0x0b, 0x7d, 0xa9, 0xfe, 0xb6, 0xda, - 0x83, 0x97, 0xfb, 0x9e, 0x85, 0x61, 0xdf, 0x97, 0x38, 0xfc, 0xff, 0x53, 0xf4, 0x1e, 0x3b, 0x82, - 0xc4, 0xe8, 0x7d, 0x12, 0x1c, 0xf5, 0xa3, 0x79, 0x90, 0x2d, 0xfb, 0x3f, 0x1e, 0x0f, 0xf6, 0xb1, - 0x10, 0x8a, 0x2a, 0xa7, 0x2d, 0x5f, 0x59, 0x99, 0x6c, 0xb6, 0x92, 0x92, 0x25, 0xd8, 0x48, 0xd0, - 0xb3, 0x3a, 0x79, 0xf1, 0xa9, 0xba, 0xde, 0x5d, 0x73, 0x98, 0x01, 0xfb, 0xdf, 0x02, 0x96, 0x69, - 0xbb, 0xb8, 0x4a, 0x37, 0xe4, 0xd2, 0x8a, 0x57, 0x96, 0xd7, 0x00, 0xb5, 0x0e, 0x6e, 0xf4, 0x02, - 0x63, 0xc6, 0xbf, 0xc0, 0x38, 0x09, 0x03, 0xc1, 0x2b, 0x7e, 0xac, 0x50, 0x4c, 0xbf, 0x9f, 0x87, - 0xcf, 0x5b, 0x3e, 0xe7, 0xff, 0x45, 0x02, 0x4e, 0x07, 0x8f, 0x87, 0x5e, 0x6a, 0x62, 0xfb, 0xc0, - 0x9b, 0xa2, 0x96, 0x5a, 0xd3, 0x8d, 0xe0, 0x1b, 0xa0, 0x13, 0xc1, 0x80, 0x4f, 0x71, 0x85, 0x9e, - 0x64, 0x03, 0x86, 0x37, 0xd4, 0x1a, 0x56, 0xf0, 0x4b, 0x4d, 0xec, 0xb8, 0x6d, 0x2e, 0x99, 0x1f, - 0x83, 0x41, 0x73, 0x77, 0x57, 0x1c, 0x69, 0xa7, 0x14, 0x5e, 0x22, 0x5d, 0xae, 0xeb, 0x0d, 0x9d, - 0xdd, 0x06, 0x4b, 0x29, 0xac, 0x80, 0xa6, 0x61, 0x58, 0x33, 0x9b, 0x06, 0x9f, 0x71, 0xf9, 0x94, - 0xf8, 0x00, 0x44, 0xd3, 0x60, 0x33, 0x4e, 0x7e, 0x06, 0xb2, 0xac, 0x3d, 0x1e, 0x71, 0x4f, 0x40, - 0x9a, 0x5e, 0xa7, 0xf2, 0x5b, 0x1d, 0x22, 0xe5, 0x4b, 0xec, 0x42, 0x3a, 0xe3, 0xc2, 0x1a, 0x66, - 0x85, 0x52, 0xa9, 0xa3, 0x2a, 0x4f, 0xc5, 0xbb, 0x06, 0xa6, 0x28, 0x4f, 0x8d, 0xbf, 0x39, 0x00, - 0x47, 0xf9, 0x09, 0x9d, 0x6a, 0xe9, 0x73, 0x7b, 0xae, 0x2b, 0x5e, 0x09, 0x01, 0x4f, 0x75, 0x55, - 0x4b, 0x97, 0x0f, 0x20, 0x75, 0xd1, 0x75, 0x2d, 0x74, 0x1a, 0x06, 0xec, 0x66, 0x1d, 0x8b, 0x1d, - 0x1f, 0x6f, 0x4f, 0x5e, 0xb5, 0xf4, 0x59, 0x82, 0xa0, 0x34, 0xeb, 0x58, 0x61, 0x28, 0xa8, 0x0c, - 0xd3, 0xbb, 0xcd, 0x7a, 0xfd, 0xa0, 0x52, 0xc5, 0xf4, 0x7f, 0xf7, 0x78, 0x5f, 0xbf, 0xc7, 0xd7, - 0x2c, 0x55, 0x7c, 0x43, 0x8f, 0xe8, 0xe6, 0x24, 0x45, 0x5b, 0xa4, 0x58, 0xe2, 0xcb, 0xf7, 0x65, - 0x81, 0x23, 0xff, 0x5e, 0x02, 0xd2, 0x82, 0x35, 0xbd, 0x21, 0x8e, 0xeb, 0x58, 0x73, 0x4d, 0x71, - 0x62, 0xe2, 0x95, 0x11, 0x82, 0x64, 0x8d, 0x0f, 0x51, 0xe6, 0xe2, 0x11, 0x85, 0x14, 0x08, 0xcc, - 0xbb, 0xb7, 0x4f, 0x60, 0x56, 0x93, 0x8c, 0x5a, 0xca, 0x32, 0xc5, 0xd2, 0xec, 0xe2, 0x11, 0x85, - 0x96, 0x50, 0x1e, 0x06, 0xc9, 0xcc, 0x70, 0xd9, 0x87, 0x09, 0x09, 0x9c, 0x97, 0xd1, 0x31, 0x18, - 0xb0, 0x54, 0x57, 0x63, 0x57, 0xea, 0x48, 0x05, 0x2b, 0xa2, 0x27, 0x60, 0x90, 0x3d, 0x08, 0x8d, - 0xfe, 0x63, 0x0c, 0xa2, 0x0c, 0xf6, 0xe5, 0x2d, 0x22, 0xf7, 0x86, 0xea, 0xba, 0xd8, 0x36, 0x08, - 0x43, 0x86, 0x8e, 0x10, 0xa4, 0x76, 0xcc, 0xea, 0x01, 0xff, 0x67, 0x1d, 0xf4, 0x37, 0xff, 0xef, - 0x00, 0xd4, 0x1e, 0x2a, 0xb4, 0x92, 0xfd, 0x8f, 0xa2, 0xac, 0x00, 0x96, 0x08, 0x52, 0x19, 0x26, - 0xd4, 0x6a, 0x55, 0x67, 0xff, 0x37, 0xa3, 0xb2, 0xa3, 0x53, 0x0f, 0xe1, 0xd0, 0xff, 0x40, 0xd5, - 0x69, 0x2c, 0x90, 0x4f, 0x50, 0xe2, 0xf8, 0xa5, 0x0c, 0x0c, 0x59, 0x4c, 0x28, 0xf9, 0x3c, 0x8c, - 0xb7, 0x48, 0x4a, 0xe4, 0xdb, 0xd7, 0x8d, 0xaa, 0x78, 0xcc, 0x40, 0x7e, 0x13, 0x18, 0xfd, 0x7a, - 0x1e, 0x3b, 0x8b, 0xa2, 0xbf, 0x4b, 0xef, 0xee, 0xfc, 0xf0, 0x6b, 0x34, 0xf0, 0xf0, 0x4b, 0xb5, - 0xf4, 0x52, 0x86, 0xf2, 0xe7, 0xcf, 0xbd, 0xe6, 0x79, 0x05, 0x7b, 0xea, 0x35, 0x6b, 0xda, 0x35, - 0x12, 0xa5, 0x45, 0xf4, 0x25, 0x55, 0xaa, 0xa5, 0x3b, 0xd4, 0x1c, 0xfd, 0xaf, 0xf9, 0x39, 0xe7, - 0x03, 0xbf, 0xe9, 0x23, 0xb0, 0xd4, 0xd2, 0xfc, 0xc6, 0xb2, 0x67, 0xc7, 0x5f, 0x4e, 0xc0, 0xc9, - 0x80, 0x1d, 0x07, 0x90, 0x5b, 0xcd, 0xb9, 0xd0, 0xde, 0xe2, 0x7b, 0x78, 0xfc, 0x75, 0x09, 0x52, - 0x04, 0x1f, 0xc5, 0x7c, 0xbb, 0x3f, 0xff, 0xab, 0x5f, 0xfb, 0x27, 0x72, 0xf8, 0xd4, 0x2a, 0x34, - 0x2a, 0x94, 0x49, 0xe9, 0x7d, 0xbd, 0xeb, 0x2f, 0xe7, 0x7f, 0xc8, 0xd0, 0xb9, 0x75, 0x6a, 0x8c, - 0xea, 0xf0, 0x5b, 0x67, 0x41, 0xee, 0x90, 0xf2, 0x30, 0x8f, 0xd9, 0x3d, 0x89, 0xea, 0xc3, 0x1d, - 0x77, 0xba, 0xff, 0xdf, 0x6d, 0x04, 0x7b, 0x4c, 0xc7, 0xae, 0xc1, 0xb1, 0xe7, 0x48, 0xdb, 0xfe, - 0x32, 0x59, 0x38, 0xf6, 0x63, 0xde, 0x69, 0x9e, 0xc4, 0xff, 0x01, 0x98, 0x38, 0xa9, 0x03, 0x5f, - 0x3e, 0xbe, 0x40, 0xbc, 0x6f, 0xb6, 0x63, 0xbc, 0x98, 0x0d, 0x04, 0x0b, 0x25, 0x40, 0x29, 0xff, - 0xb2, 0x04, 0xc7, 0x5b, 0x9a, 0xe6, 0x3e, 0x7e, 0xa9, 0xcd, 0x53, 0x85, 0x43, 0x65, 0x36, 0x4b, - 0x6d, 0x84, 0xbd, 0x3f, 0x56, 0x58, 0x26, 0x45, 0x48, 0xda, 0xa7, 0xe1, 0x68, 0x58, 0x58, 0xa1, - 0xa6, 0x7b, 0x61, 0x34, 0xbc, 0x23, 0xcc, 0xd5, 0x35, 0x12, 0xda, 0x13, 0x96, 0x2b, 0x51, 0x3d, - 0x7b, 0x7d, 0x2d, 0x43, 0xc6, 0x43, 0xe5, 0x29, 0x70, 0xcf, 0x5d, 0xf5, 0x29, 0xe5, 0x0f, 0x4b, - 0x30, 0x13, 0x6e, 0x21, 0x90, 0x0c, 0xf5, 0x27, 0xec, 0x2d, 0x1b, 0xe2, 0x37, 0x24, 0xb8, 0xab, - 0x8b, 0x4c, 0x5c, 0x01, 0x2f, 0xc3, 0x64, 0x60, 0x27, 0x40, 0xb8, 0x70, 0x31, 0xec, 0xa7, 0xe3, - 0xd3, 0x50, 0x6f, 0xe1, 0x7b, 0x07, 0x51, 0xca, 0x67, 0x7f, 0x7f, 0x7a, 0xa2, 0xb5, 0xce, 0x51, - 0x26, 0x5a, 0x57, 0xef, 0xb7, 0xd0, 0x3e, 0x5e, 0x93, 0xe0, 0x81, 0x70, 0x57, 0xdb, 0xe4, 0xb3, - 0x3f, 0xaa, 0x71, 0xf8, 0xf7, 0x12, 0x9c, 0xee, 0x45, 0x38, 0x3e, 0x20, 0x3b, 0x30, 0xe1, 0x67, - 0xda, 0xd1, 0xf1, 0xe8, 0x2b, 0x7f, 0x67, 0x56, 0x8a, 0x3c, 0x6e, 0xb7, 0x41, 0xf1, 0x16, 0x9f, - 0x58, 0xc1, 0x21, 0xf7, 0x94, 0x1c, 0xde, 0xcd, 0x15, 0x4a, 0x0e, 0xed, 0xe7, 0xb6, 0x19, 0x8b, - 0x44, 0x9b, 0xb1, 0xf0, 0x53, 0x73, 0xf9, 0x0a, 0xf7, 0x5b, 0x6d, 0xf6, 0xe0, 0xde, 0x06, 0x13, - 0x6d, 0x4c, 0x99, 0xcf, 0xea, 0x3e, 0x2c, 0x59, 0x41, 0xad, 0xc6, 0x2a, 0x1f, 0xc0, 0x34, 0x6d, - 0xb7, 0x8d, 0xa2, 0x6f, 0x77, 0x97, 0x1b, 0xdc, 0xb7, 0xb4, 0x6d, 0x9a, 0xf7, 0x7d, 0x19, 0x06, - 0xd9, 0x38, 0xf3, 0xee, 0x1e, 0xc2, 0x50, 0x38, 0x03, 0xf9, 0xe7, 0x85, 0x2f, 0x5b, 0x14, 0x62, - 0xb7, 0x9f, 0x43, 0xbd, 0xf4, 0xf5, 0x16, 0xcd, 0xa1, 0x80, 0x32, 0xbe, 0x21, 0xbc, 0x5a, 0x7b, - 0xe9, 0xb8, 0x3a, 0xb4, 0x5b, 0xe6, 0xd5, 0x98, 0x6e, 0x6e, 0xaf, 0xfb, 0xfa, 0x45, 0xe1, 0xbe, - 0xbc, 0x3e, 0xc5, 0xb8, 0xaf, 0x1f, 0x8d, 0xea, 0x3d, 0x47, 0x16, 0x23, 0xe6, 0x9f, 0x47, 0x47, - 0xf6, 0x5d, 0x09, 0x4e, 0xd0, 0xbe, 0x05, 0x37, 0x22, 0xfa, 0x55, 0xf9, 0x43, 0x80, 0x1c, 0x5b, - 0xab, 0xb4, 0x9d, 0xdd, 0x39, 0xc7, 0xd6, 0x2e, 0x87, 0xe2, 0xcb, 0x43, 0x80, 0xaa, 0xa1, 0xed, - 0x26, 0x8a, 0xcd, 0x6e, 0xc9, 0xe5, 0xaa, 0x81, 0xdd, 0x8c, 0x36, 0xc3, 0x99, 0xba, 0x05, 0xc3, - 0xf9, 0x75, 0x09, 0x0a, 0xed, 0xba, 0xcc, 0x87, 0x4f, 0x87, 0x63, 0xa1, 0x43, 0x82, 0xe8, 0x08, - 0x3e, 0xd4, 0xcb, 0x56, 0x4e, 0x64, 0x1a, 0x1d, 0xb5, 0xf1, 0xed, 0xce, 0x03, 0xa6, 0xc3, 0x16, - 0xda, 0x9a, 0x59, 0xff, 0xc8, 0xa6, 0xcf, 0x17, 0x5a, 0xfc, 0xea, 0x9f, 0x8b, 0xdc, 0xfb, 0x1a, - 0x4c, 0x75, 0x90, 0xfa, 0x76, 0xc7, 0xbd, 0xbd, 0x8e, 0x83, 0x79, 0xab, 0xd3, 0xf7, 0xc7, 0xf9, - 0x4c, 0x08, 0xdf, 0xc0, 0x0e, 0xac, 0xc5, 0xda, 0x3d, 0xe1, 0x92, 0xdf, 0x02, 0x77, 0xb4, 0xa5, - 0xe2, 0xb2, 0x15, 0x21, 0xb5, 0xa7, 0x3b, 0x2e, 0x17, 0xeb, 0xbe, 0x4e, 0x62, 0x45, 0xa8, 0x29, - 0x8d, 0x8c, 0x20, 0x47, 0x59, 0x6f, 0x98, 0x66, 0x9d, 0x8b, 0x21, 0x5f, 0x82, 0xf1, 0x00, 0x8c, - 0x37, 0x72, 0x0e, 0x52, 0x96, 0xc9, 0x3f, 0x4f, 0x30, 0x7c, 0xe6, 0x64, 0xc7, 0xdd, 0x7b, 0xd3, - 0xac, 0xf3, 0x6e, 0x53, 0x7c, 0x79, 0x12, 0x10, 0x63, 0x46, 0x37, 0xf2, 0x45, 0x13, 0x9b, 0x30, - 0x11, 0x82, 0xf2, 0x46, 0x7e, 0xa0, 0x43, 0x82, 0x33, 0xdf, 0x3e, 0x0a, 0x03, 0x94, 0x2b, 0xfa, - 0x98, 0x04, 0x10, 0x38, 0x11, 0x9e, 0xed, 0xc4, 0xa6, 0xfd, 0x9a, 0xb8, 0x30, 0xd7, 0x33, 0x3e, - 0xcf, 0xd9, 0x4e, 0xbf, 0xfb, 0xdf, 0x7c, 0xeb, 0x23, 0x89, 0x7b, 0x90, 0x3c, 0xd7, 0x61, 0x35, - 0x1e, 0x98, 0x2f, 0x9f, 0x09, 0xbd, 0x7d, 0x7f, 0xb8, 0xb7, 0xa6, 0x84, 0x64, 0xb3, 0xbd, 0xa2, - 0x73, 0xc1, 0xce, 0x53, 0xc1, 0xce, 0xa2, 0xc7, 0xe2, 0x05, 0x9b, 0x7b, 0x47, 0x78, 0xd2, 0xbc, - 0x0b, 0xfd, 0x8e, 0x04, 0x93, 0xed, 0x96, 0x74, 0xe8, 0xc9, 0xde, 0xa4, 0x68, 0x4d, 0x29, 0x0a, - 0x4f, 0x1d, 0x82, 0x92, 0x77, 0x65, 0x89, 0x76, 0x65, 0x1e, 0x3d, 0x73, 0x88, 0xae, 0xcc, 0x05, - 0xf7, 0xf7, 0xff, 0x97, 0x04, 0x77, 0x76, 0x5d, 0x21, 0xa1, 0xf9, 0xde, 0xa4, 0xec, 0x92, 0x3b, - 0x15, 0x4a, 0x3f, 0x08, 0x0b, 0xde, 0xe3, 0xe7, 0x68, 0x8f, 0x2f, 0xa1, 0xe5, 0xc3, 0xf4, 0xb8, - 0xed, 0x21, 0x0a, 0xfa, 0xad, 0xf0, 0xcd, 0xc2, 0xee, 0xe6, 0xd4, 0xb2, 0xf0, 0x88, 0x99, 0x18, - 0xad, 0x49, 0xad, 0xfc, 0x02, 0xed, 0x82, 0x82, 0x36, 0x7e, 0xc0, 0x41, 0x9b, 0x7b, 0x47, 0xd8, - 0xf1, 0xbf, 0x0b, 0xfd, 0x4f, 0xa9, 0xfd, 0x45, 0xc1, 0x27, 0xba, 0x8a, 0xd8, 0x79, 0x51, 0x55, - 0x78, 0xb2, 0x7f, 0x42, 0xde, 0xc9, 0x06, 0xed, 0x64, 0x0d, 0xe1, 0x5b, 0xdd, 0xc9, 0xb6, 0x83, - 0x88, 0xbe, 0x2a, 0xc1, 0x64, 0xbb, 0x35, 0x49, 0xcc, 0xb4, 0xec, 0xb2, 0xc8, 0x8a, 0x99, 0x96, - 0xdd, 0x16, 0x40, 0xf2, 0x9b, 0x68, 0xe7, 0xcf, 0xa1, 0xc7, 0x3b, 0x75, 0xbe, 0xeb, 0x28, 0x92, - 0xb9, 0xd8, 0x35, 0xc9, 0x8f, 0x99, 0x8b, 0xbd, 0xac, 0x63, 0x62, 0xe6, 0x62, 0x4f, 0x6b, 0x8c, - 0xf8, 0xb9, 0xe8, 0xf5, 0xac, 0xc7, 0x61, 0x74, 0xd0, 0x97, 0x25, 0x18, 0x09, 0x65, 0xc4, 0xe8, - 0xd1, 0xae, 0x82, 0xb6, 0x5b, 0x30, 0x14, 0xce, 0xf4, 0x43, 0xc2, 0xfb, 0xb2, 0x4c, 0xfb, 0xb2, - 0x80, 0xe6, 0x0f, 0xd3, 0x97, 0xf0, 0x59, 0xe9, 0xd7, 0x25, 0x98, 0x68, 0x93, 0x65, 0xc6, 0xcc, - 0xc2, 0xce, 0x49, 0x73, 0xe1, 0xc9, 0xfe, 0x09, 0x79, 0xaf, 0x2e, 0xd0, 0x5e, 0xfd, 0x04, 0x7a, - 0xfa, 0x30, 0xbd, 0x0a, 0xc4, 0xe7, 0x1b, 0xfe, 0xbd, 0xab, 0x40, 0x3b, 0xe8, 0x5c, 0x9f, 0x82, - 0x89, 0x0e, 0x3d, 0xd1, 0x37, 0x1d, 0xef, 0xcf, 0xf3, 0xb4, 0x3f, 0xcf, 0xa1, 0xf5, 0x1f, 0xac, - 0x3f, 0xad, 0x61, 0xfd, 0xf3, 0xad, 0x2f, 0x00, 0xbb, 0x5b, 0x51, 0xdb, 0x64, 0xb5, 0xf0, 0x58, - 0x5f, 0x34, 0xbc, 0x53, 0x4f, 0xd2, 0x4e, 0x9d, 0x41, 0x8f, 0x74, 0xea, 0x54, 0xe0, 0x72, 0x9d, - 0x6e, 0xec, 0x9a, 0x73, 0xef, 0x60, 0x29, 0xf0, 0xbb, 0xd0, 0x4f, 0x89, 0x8b, 0x4d, 0xa7, 0xba, - 0xb6, 0x1b, 0xc8, 0x63, 0x0b, 0x0f, 0xf4, 0x80, 0xc9, 0xe5, 0xba, 0x87, 0xca, 0x35, 0x85, 0x4e, - 0x76, 0x92, 0x8b, 0xe4, 0xb2, 0xe8, 0x03, 0x92, 0x77, 0x17, 0xf2, 0x74, 0x77, 0xde, 0xc1, 0x64, - 0xb7, 0xf0, 0x60, 0x4f, 0xb8, 0x5c, 0x92, 0xfb, 0xa8, 0x24, 0x33, 0x68, 0xaa, 0xa3, 0x24, 0x2c, - 0xf5, 0xbd, 0xd5, 0x37, 0x07, 0x5e, 0x3d, 0x0e, 0xd3, 0x1d, 0x5a, 0x74, 0xaf, 0xc5, 0x9c, 0x71, - 0x75, 0x79, 0x08, 0x1b, 0xfb, 0xd0, 0xb5, 0xc3, 0xd3, 0xda, 0xc3, 0x3f, 0x7f, 0xed, 0xed, 0x40, - 0xec, 0x5f, 0xa7, 0x00, 0xad, 0x3a, 0xb5, 0x05, 0x1b, 0xb3, 0x7f, 0x7a, 0xc7, 0x67, 0x79, 0xe4, - 0x85, 0x97, 0xf4, 0x03, 0xbd, 0xf0, 0x5a, 0x0d, 0xbd, 0x99, 0x4a, 0xf4, 0xf7, 0x2e, 0xb3, 0xe7, - 0x87, 0x53, 0xc9, 0x1f, 0xca, 0xc3, 0xa9, 0xf6, 0xf7, 0xaa, 0x53, 0xb7, 0xee, 0x01, 0xc6, 0xc0, - 0x61, 0x1f, 0xa1, 0xf0, 0xf7, 0x90, 0x83, 0x5d, 0xde, 0x43, 0xe6, 0x3b, 0x3e, 0x7a, 0xe4, 0xd4, - 0xe8, 0xac, 0xf8, 0x80, 0xef, 0x50, 0x6f, 0x37, 0x61, 0xf9, 0x17, 0x7e, 0xfd, 0x2d, 0x84, 0x93, - 0x50, 0x68, 0x35, 0x27, 0x6f, 0x52, 0x7f, 0x24, 0x09, 0xb9, 0x55, 0xa7, 0x56, 0xae, 0xea, 0xee, - 0x6d, 0xb2, 0xb5, 0x67, 0x3a, 0x3f, 0x6a, 0x41, 0x37, 0x6f, 0x4c, 0x8f, 0x32, 0x9d, 0x76, 0xd1, - 0x64, 0x03, 0xc6, 0x22, 0x4f, 0x89, 0xb9, 0x65, 0x2d, 0x1e, 0xe6, 0x45, 0x73, 0x84, 0x95, 0x4c, - 0xdf, 0x20, 0x04, 0xec, 0x1b, 0x5d, 0x6b, 0x6f, 0xcc, 0xcc, 0xa0, 0x2e, 0xde, 0xce, 0x17, 0x80, - 0xfe, 0x98, 0x15, 0x20, 0x1f, 0x1d, 0x14, 0x6f, 0xc4, 0xfe, 0x50, 0x82, 0xe1, 0x55, 0x47, 0xa4, - 0x82, 0xf8, 0xc7, 0xf4, 0xfd, 0xd1, 0x13, 0xde, 0x77, 0x58, 0x93, 0xbd, 0xd9, 0xad, 0xf8, 0x36, - 0xab, 0xaf, 0x84, 0xa3, 0x30, 0x11, 0xe8, 0xa7, 0xd7, 0xff, 0xdf, 0x4e, 0x50, 0xff, 0x58, 0xc2, - 0x35, 0xdd, 0xf0, 0xb2, 0x48, 0xfc, 0x17, 0xf5, 0x75, 0x85, 0xaf, 0xe7, 0xd4, 0x61, 0xf5, 0xbc, - 0x4f, 0x1d, 0x44, 0x44, 0x9f, 0xde, 0xc6, 0xd7, 0x6a, 0xeb, 0xdb, 0x1f, 0xa9, 0x8f, 0xcf, 0xea, - 0x44, 0x5e, 0xf8, 0xc8, 0x6f, 0x48, 0x30, 0xb2, 0xea, 0xd4, 0xb6, 0x8d, 0xea, 0xff, 0xf3, 0xf6, - 0xbb, 0x0b, 0x47, 0x43, 0x3d, 0xbd, 0x4d, 0x2a, 0x3d, 0xf3, 0x5a, 0x0a, 0x92, 0xab, 0x4e, 0x0d, - 0xbd, 0x04, 0x63, 0xd1, 0xa4, 0xa1, 0x63, 0x2e, 0xd8, 0x1a, 0x11, 0x3a, 0xaf, 0xd7, 0x3a, 0x47, - 0x0f, 0xb4, 0x0f, 0x23, 0xe1, 0xc8, 0x71, 0xaa, 0x0b, 0x93, 0x10, 0x66, 0xe1, 0x91, 0x5e, 0x31, - 0xbd, 0xc6, 0xde, 0x0e, 0x69, 0xcf, 0xe9, 0xdd, 0xdd, 0x85, 0x5a, 0x20, 0x75, 0xce, 0x6e, 0xdb, - 0xb8, 0x15, 0xa2, 0xbd, 0xa8, 0x4b, 0xe9, 0xa6, 0xbd, 0x08, 0x6e, 0x57, 0xed, 0x75, 0x9a, 0x5a, - 0x3b, 0x00, 0x81, 0x79, 0x70, 0x6f, 0x17, 0x0e, 0x3e, 0x5a, 0xe1, 0xe1, 0x9e, 0xd0, 0xbc, 0x43, - 0xa7, 0x5b, 0x9c, 0x8c, 0xff, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd5, 0xca, 0x34, 0x9e, 0x6a, - 0x94, 0x00, 0x00, - } - r := bytes.NewReader(gzipped) - gzipr, err := compress_gzip.NewReader(r) - if err != nil { - panic(err) - } - ungzipped, err := io_ioutil.ReadAll(gzipr) - if err != nil { - panic(err) - } - if err := github_com_gogo_protobuf_proto.Unmarshal(ungzipped, d); err != nil { - panic(err) - } - return d -} -func (this *CommissionRates) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*CommissionRates) - if !ok { - that2, ok := that.(CommissionRates) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.Rate.Equal(that1.Rate) { - return false - } - if !this.MaxRate.Equal(that1.MaxRate) { - return false - } - if !this.MaxChangeRate.Equal(that1.MaxChangeRate) { - return false - } - return true -} -func (this *Commission) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Commission) - if !ok { - that2, ok := that.(Commission) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.CommissionRates.Equal(&that1.CommissionRates) { - return false - } - if !this.UpdateTime.Equal(that1.UpdateTime) { - return false - } - return true -} -func (this *Description) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Description) - if !ok { - that2, ok := that.(Description) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Moniker != that1.Moniker { - return false - } - if this.Identity != that1.Identity { - return false - } - if this.Website != that1.Website { - return false - } - if this.SecurityContact != that1.SecurityContact { - return false - } - if this.Details != that1.Details { - return false - } - return true -} -func (this *UnbondingDelegationEntry) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*UnbondingDelegationEntry) - if !ok { - that2, ok := that.(UnbondingDelegationEntry) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.CreationHeight != that1.CreationHeight { - return false - } - if !this.CompletionTime.Equal(that1.CompletionTime) { - return false - } - if !this.InitialBalance.Equal(that1.InitialBalance) { - return false - } - if !this.Balance.Equal(that1.Balance) { - return false - } - return true -} -func (this *RedelegationEntry) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*RedelegationEntry) - if !ok { - that2, ok := that.(RedelegationEntry) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.CreationHeight != that1.CreationHeight { - return false - } - if !this.CompletionTime.Equal(that1.CompletionTime) { - return false - } - if !this.InitialBalance.Equal(that1.InitialBalance) { - return false - } - if !this.SharesDst.Equal(that1.SharesDst) { - return false - } - return true -} -func (this *Params) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Params) - if !ok { - that2, ok := that.(Params) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.UnbondingTime != that1.UnbondingTime { - return false - } - if this.MaxValidators != that1.MaxValidators { - return false - } - if this.MaxEntries != that1.MaxEntries { - return false - } - if this.HistoricalEntries != that1.HistoricalEntries { - return false - } - if this.BondDenom != that1.BondDenom { - return false - } - return true -} -func (this *RedelegationEntryResponse) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*RedelegationEntryResponse) - if !ok { - that2, ok := that.(RedelegationEntryResponse) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.RedelegationEntry.Equal(&that1.RedelegationEntry) { - return false - } - if !this.Balance.Equal(that1.Balance) { - return false - } - return true -} -func (this *Pool) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*Pool) - if !ok { - that2, ok := that.(Pool) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !this.NotBondedTokens.Equal(that1.NotBondedTokens) { - return false - } - if !this.BondedTokens.Equal(that1.BondedTokens) { - return false - } - return true -} -func (m *HistoricalInfo) 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 *HistoricalInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *HistoricalInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Valset) > 0 { - for iNdEx := len(m.Valset) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Valset[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *CommissionRates) 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 *CommissionRates) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommissionRates) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.MaxChangeRate.Size() - i -= size - if _, err := m.MaxChangeRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.MaxRate.Size() - i -= size - if _, err := m.MaxRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.Rate.Size() - i -= size - if _, err := m.Rate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Commission) 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 *Commission) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Commission) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UpdateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UpdateTime):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintStaking(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x12 - { - size, err := m.CommissionRates.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Description) 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 *Description) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Description) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Details) > 0 { - i -= len(m.Details) - copy(dAtA[i:], m.Details) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Details))) - i-- - dAtA[i] = 0x2a - } - if len(m.SecurityContact) > 0 { - i -= len(m.SecurityContact) - copy(dAtA[i:], m.SecurityContact) - i = encodeVarintStaking(dAtA, i, uint64(len(m.SecurityContact))) - i-- - dAtA[i] = 0x22 - } - if len(m.Website) > 0 { - i -= len(m.Website) - copy(dAtA[i:], m.Website) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Website))) - i-- - dAtA[i] = 0x1a - } - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Identity))) - i-- - dAtA[i] = 0x12 - } - if len(m.Moniker) > 0 { - i -= len(m.Moniker) - copy(dAtA[i:], m.Moniker) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Moniker))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Validator) 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 *Validator) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.MinSelfDelegation.Size() - i -= size - if _, err := m.MinSelfDelegation.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a - { - size, err := m.Commission.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - n5, err5 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime):]) - if err5 != nil { - return 0, err5 - } - i -= n5 - i = encodeVarintStaking(dAtA, i, uint64(n5)) - i-- - dAtA[i] = 0x4a - if m.UnbondingHeight != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingHeight)) - i-- - dAtA[i] = 0x40 - } - { - size, err := m.Description.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - { - size := m.DelegatorShares.Size() - i -= size - if _, err := m.DelegatorShares.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.Tokens.Size() - i -= size - if _, err := m.Tokens.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - if m.Status != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.Status)) - i-- - dAtA[i] = 0x20 - } - if m.Jailed { - i-- - if m.Jailed { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.ConsensusPubkey != nil { - { - size, err := m.ConsensusPubkey.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.OperatorAddress) > 0 { - i -= len(m.OperatorAddress) - copy(dAtA[i:], m.OperatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.OperatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ValAddresses) 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 *ValAddresses) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValAddresses) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Addresses) > 0 { - for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Addresses[iNdEx]) - copy(dAtA[i:], m.Addresses[iNdEx]) - i = encodeVarintStaking(dAtA, i, uint64(len(m.Addresses[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *DVPair) 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 *DVPair) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DVPair) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *DVPairs) 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 *DVPairs) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DVPairs) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Pairs) > 0 { - for iNdEx := len(m.Pairs) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Pairs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *DVVTriplet) 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 *DVVTriplet) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DVVTriplet) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ValidatorDstAddress) > 0 { - i -= len(m.ValidatorDstAddress) - copy(dAtA[i:], m.ValidatorDstAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorDstAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.ValidatorSrcAddress) > 0 { - i -= len(m.ValidatorSrcAddress) - copy(dAtA[i:], m.ValidatorSrcAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorSrcAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *DVVTriplets) 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 *DVVTriplets) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DVVTriplets) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Triplets) > 0 { - for iNdEx := len(m.Triplets) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Triplets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *Delegation) 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 *Delegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Delegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Shares.Size() - i -= size - if _, err := m.Shares.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *UnbondingDelegation) 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 *UnbondingDelegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *UnbondingDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Entries) > 0 { - for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.ValidatorAddress) > 0 { - i -= len(m.ValidatorAddress) - copy(dAtA[i:], m.ValidatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *UnbondingDelegationEntry) 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 *UnbondingDelegationEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Balance.Size() - i -= size - if _, err := m.Balance.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.InitialBalance.Size() - i -= size - if _, err := m.InitialBalance.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err8 != nil { - return 0, err8 - } - i -= n8 - i = encodeVarintStaking(dAtA, i, uint64(n8)) - i-- - dAtA[i] = 0x12 - if m.CreationHeight != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.CreationHeight)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *RedelegationEntry) 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 *RedelegationEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.SharesDst.Size() - i -= size - if _, err := m.SharesDst.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.InitialBalance.Size() - i -= size - if _, err := m.InitialBalance.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err9 != nil { - return 0, err9 - } - i -= n9 - i = encodeVarintStaking(dAtA, i, uint64(n9)) - i-- - dAtA[i] = 0x12 - if m.CreationHeight != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.CreationHeight)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Redelegation) 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 *Redelegation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Redelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Entries) > 0 { - for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.ValidatorDstAddress) > 0 { - i -= len(m.ValidatorDstAddress) - copy(dAtA[i:], m.ValidatorDstAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorDstAddress))) - i-- - dAtA[i] = 0x1a - } - if len(m.ValidatorSrcAddress) > 0 { - i -= len(m.ValidatorSrcAddress) - copy(dAtA[i:], m.ValidatorSrcAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorSrcAddress))) - i-- - dAtA[i] = 0x12 - } - if len(m.DelegatorAddress) > 0 { - i -= len(m.DelegatorAddress) - copy(dAtA[i:], m.DelegatorAddress) - i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) - i-- - dAtA[i] = 0xa - } - 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.BondDenom) > 0 { - i -= len(m.BondDenom) - copy(dAtA[i:], m.BondDenom) - i = encodeVarintStaking(dAtA, i, uint64(len(m.BondDenom))) - i-- - dAtA[i] = 0x2a - } - if m.HistoricalEntries != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.HistoricalEntries)) - i-- - dAtA[i] = 0x20 - } - if m.MaxEntries != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.MaxEntries)) - i-- - dAtA[i] = 0x18 - } - if m.MaxValidators != 0 { - i = encodeVarintStaking(dAtA, i, uint64(m.MaxValidators)) - i-- - dAtA[i] = 0x10 - } - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) - if err10 != nil { - return 0, err10 - } - i -= n10 - i = encodeVarintStaking(dAtA, i, uint64(n10)) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *DelegationResponse) 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 *DelegationResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DelegationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Balance.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Delegation.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *RedelegationEntryResponse) 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 *RedelegationEntryResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RedelegationEntryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Balance.Size() - i -= size - if _, err := m.Balance.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.RedelegationEntry.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *RedelegationResponse) 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 *RedelegationResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RedelegationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Entries) > 0 { - for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Redelegation.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Pool) 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 *Pool) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.BondedTokens.Size() - i -= size - if _, err := m.BondedTokens.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.NotBondedTokens.Size() - i -= size - if _, err := m.NotBondedTokens.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintStaking(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintStaking(dAtA []byte, offset int, v uint64) int { - offset -= sovStaking(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *HistoricalInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Header.Size() - n += 1 + l + sovStaking(uint64(l)) - if len(m.Valset) > 0 { - for _, e := range m.Valset { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *CommissionRates) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Rate.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.MaxRate.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.MaxChangeRate.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *Commission) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.CommissionRates.Size() - n += 1 + l + sovStaking(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.UpdateTime) - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *Description) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Moniker) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.Website) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.SecurityContact) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.Details) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - return n -} - -func (m *Validator) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.OperatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - if m.ConsensusPubkey != nil { - l = m.ConsensusPubkey.Size() - n += 1 + l + sovStaking(uint64(l)) - } - if m.Jailed { - n += 2 - } - if m.Status != 0 { - n += 1 + sovStaking(uint64(m.Status)) - } - l = m.Tokens.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.DelegatorShares.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.Description.Size() - n += 1 + l + sovStaking(uint64(l)) - if m.UnbondingHeight != 0 { - n += 1 + sovStaking(uint64(m.UnbondingHeight)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime) - n += 1 + l + sovStaking(uint64(l)) - l = m.Commission.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.MinSelfDelegation.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *ValAddresses) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Addresses) > 0 { - for _, s := range m.Addresses { - l = len(s) - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *DVPair) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - return n -} - -func (m *DVPairs) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Pairs) > 0 { - for _, e := range m.Pairs { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *DVVTriplet) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorSrcAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorDstAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - return n -} - -func (m *DVVTriplets) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Triplets) > 0 { - for _, e := range m.Triplets { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *Delegation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = m.Shares.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *UnbondingDelegation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - if len(m.Entries) > 0 { - for _, e := range m.Entries { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *UnbondingDelegationEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CreationHeight != 0 { - n += 1 + sovStaking(uint64(m.CreationHeight)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) - n += 1 + l + sovStaking(uint64(l)) - l = m.InitialBalance.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.Balance.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *RedelegationEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CreationHeight != 0 { - n += 1 + sovStaking(uint64(m.CreationHeight)) - } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) - n += 1 + l + sovStaking(uint64(l)) - l = m.InitialBalance.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.SharesDst.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *Redelegation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorSrcAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - l = len(m.ValidatorDstAddress) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - if len(m.Entries) > 0 { - for _, e := range m.Entries { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime) - n += 1 + l + sovStaking(uint64(l)) - if m.MaxValidators != 0 { - n += 1 + sovStaking(uint64(m.MaxValidators)) - } - if m.MaxEntries != 0 { - n += 1 + sovStaking(uint64(m.MaxEntries)) - } - if m.HistoricalEntries != 0 { - n += 1 + sovStaking(uint64(m.HistoricalEntries)) - } - l = len(m.BondDenom) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } - return n -} - -func (m *DelegationResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Delegation.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.Balance.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *RedelegationEntryResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.RedelegationEntry.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.Balance.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func (m *RedelegationResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Redelegation.Size() - n += 1 + l + sovStaking(uint64(l)) - if len(m.Entries) > 0 { - for _, e := range m.Entries { - l = e.Size() - n += 1 + l + sovStaking(uint64(l)) - } - } - return n -} - -func (m *Pool) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.NotBondedTokens.Size() - n += 1 + l + sovStaking(uint64(l)) - l = m.BondedTokens.Size() - n += 1 + l + sovStaking(uint64(l)) - return n -} - -func sovStaking(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozStaking(x uint64) (n int) { - return sovStaking(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *ValAddresses) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ValAddresses{`, - `Addresses:` + fmt.Sprintf("%v", this.Addresses) + `,`, - `}`, - }, "") - return s -} -func valueToStringStaking(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *HistoricalInfo) 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 ErrIntOverflowStaking - } - 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: HistoricalInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: HistoricalInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - 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 ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Valset", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Valset = append(m.Valset, Validator{}) - if err := m.Valset[len(m.Valset)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CommissionRates) 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 ErrIntOverflowStaking - } - 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: CommissionRates: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CommissionRates: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Rate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MaxRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxChangeRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MaxChangeRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Commission) 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 ErrIntOverflowStaking - } - 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: Commission: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Commission: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CommissionRates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.CommissionRates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdateTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.UpdateTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Description) 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 ErrIntOverflowStaking - } - 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: Description: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Description: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Moniker", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Moniker = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Website", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Website = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecurityContact", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SecurityContact = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Details = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Validator) 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 ErrIntOverflowStaking - } - 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: Validator: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Validator: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OperatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OperatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusPubkey", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ConsensusPubkey == nil { - m.ConsensusPubkey = &types1.Any{} - } - if err := m.ConsensusPubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Jailed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Jailed = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - m.Status = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Status |= BondStatus(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tokens", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Tokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorShares", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.DelegatorShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Description.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UnbondingHeight", wireType) - } - m.UnbondingHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.UnbondingHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UnbondingTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Commission", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Commission.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ValAddresses) 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 ErrIntOverflowStaking - } - 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: ValAddresses: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ValAddresses: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DVPair) 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 ErrIntOverflowStaking - } - 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: DVPair: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DVPair: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DVPairs) 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 ErrIntOverflowStaking - } - 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: DVPairs: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DVPairs: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pairs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pairs = append(m.Pairs, DVPair{}) - if err := m.Pairs[len(m.Pairs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DVVTriplet) 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 ErrIntOverflowStaking - } - 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: DVVTriplet: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DVVTriplet: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSrcAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorSrcAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorDstAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorDstAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DVVTriplets) 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 ErrIntOverflowStaking - } - 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: DVVTriplets: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DVVTriplets: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Triplets", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Triplets = append(m.Triplets, DVVTriplet{}) - if err := m.Triplets[len(m.Triplets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Delegation) 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 ErrIntOverflowStaking - } - 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: Delegation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Delegation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Shares", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Shares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UnbondingDelegation) 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 ErrIntOverflowStaking - } - 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: UnbondingDelegation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UnbondingDelegation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Entries = append(m.Entries, UnbondingDelegationEntry{}) - if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UnbondingDelegationEntry) 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 ErrIntOverflowStaking - } - 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: UnbondingDelegationEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UnbondingDelegationEntry: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CreationHeight", wireType) - } - m.CreationHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CreationHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InitialBalance", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.InitialBalance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RedelegationEntry) 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 ErrIntOverflowStaking - } - 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: RedelegationEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RedelegationEntry: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CreationHeight", wireType) - } - m.CreationHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CreationHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InitialBalance", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.InitialBalance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SharesDst", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SharesDst.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Redelegation) 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 ErrIntOverflowStaking - } - 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: Redelegation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Redelegation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSrcAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorSrcAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorDstAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorDstAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Entries = append(m.Entries, RedelegationEntry{}) - if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - 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 ErrIntOverflowStaking - } - 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 UnbondingTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxValidators", wireType) - } - m.MaxValidators = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxValidators |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxEntries", wireType) - } - m.MaxEntries = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxEntries |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HistoricalEntries", wireType) - } - m.HistoricalEntries = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HistoricalEntries |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BondDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.BondDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DelegationResponse) 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 ErrIntOverflowStaking - } - 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: DelegationResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DelegationResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Delegation", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Delegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RedelegationEntryResponse) 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 ErrIntOverflowStaking - } - 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: RedelegationEntryResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RedelegationEntryResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RedelegationEntry", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RedelegationEntry.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RedelegationResponse) 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 ErrIntOverflowStaking - } - 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: RedelegationResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RedelegationResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Redelegation", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Redelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthStaking - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Entries = append(m.Entries, RedelegationEntryResponse{}) - if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Pool) 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 ErrIntOverflowStaking - } - 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: Pool: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Pool: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NotBondedTokens", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.NotBondedTokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BondedTokens", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BondedTokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipStaking(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipStaking(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, ErrIntOverflowStaking - } - 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, ErrIntOverflowStaking - } - 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, ErrIntOverflowStaking - } - 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, ErrInvalidLengthStaking - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupStaking - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthStaking - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthStaking = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowStaking = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupStaking = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/staking/legacy/v040/types.go b/x/staking/legacy/v040/types.go deleted file mode 100644 index 8964296f..00000000 --- a/x/staking/legacy/v040/types.go +++ /dev/null @@ -1,201 +0,0 @@ -package v040 - -import ( - "fmt" - "strings" - "time" - - yaml "gopkg.in/yaml.v2" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// Staking params default values -const ( - // DefaultUnbondingTime reflects three weeks in seconds as the default - // unbonding time. - // TODO: Justify our choice of default here. - DefaultUnbondingTime time.Duration = time.Hour * 24 * 7 * 3 - - // Default maximum number of bonded validators - DefaultMaxValidators uint32 = 100 - - // Default maximum entries in a UBD/RED pair - DefaultMaxEntries uint32 = 7 - - // DefaultHistorical entries is 10000. Apps that don't use IBC can ignore this - // value by not adding the staking module to the application module manager's - // SetOrderBeginBlockers. - DefaultHistoricalEntries uint32 = 10000 -) - -// NewParams creates a new Params instance -func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historicalEntries uint32, bondDenom string) Params { - return Params{ - UnbondingTime: unbondingTime, - MaxValidators: maxValidators, - MaxEntries: maxEntries, - HistoricalEntries: historicalEntries, - BondDenom: bondDenom, - } -} - -// String returns a human readable string representation of the parameters. -func (p Params) String() string { - out, _ := yaml.Marshal(p) - return string(out) -} - -func DefaultParams() Params { - return NewParams( - DefaultUnbondingTime, - DefaultMaxValidators, - DefaultMaxEntries, - DefaultHistoricalEntries, - sdk.DefaultBondDenom, - ) -} - -// String implements the Stringer interface for a Commission object. -func (c Commission) String() string { - out, _ := yaml.Marshal(c) - return string(out) -} - -// String implements the Stringer interface for a CommissionRates object. -func (cr CommissionRates) String() string { - out, _ := yaml.Marshal(cr) - return string(out) -} - -// String implements the Stringer interface for a DVPair object. -func (dv DVPair) String() string { - out, _ := yaml.Marshal(dv) - return string(out) -} - -// String implements the Stringer interface for a DVVTriplet object. -func (dvv DVVTriplet) String() string { - out, _ := yaml.Marshal(dvv) - return string(out) -} - -// String returns a human readable string representation of a Delegation. -func (d Delegation) String() string { - out, _ := yaml.Marshal(d) - return string(out) -} - -// Delegations is a collection of delegations -type Delegations []Delegation - -func (d Delegations) String() (out string) { - for _, del := range d { - out += del.String() + "\n" - } - - return strings.TrimSpace(out) -} - -// String implements the stringer interface for a UnbondingDelegationEntry. -func (e UnbondingDelegationEntry) String() string { - out, _ := yaml.Marshal(e) - return string(out) -} - -// String returns a human readable string representation of an UnbondingDelegation. -func (ubd UnbondingDelegation) String() string { - out := fmt.Sprintf(`Unbonding Delegations between: - Delegator: %s - Validator: %s - Entries:`, ubd.DelegatorAddress, ubd.ValidatorAddress) - for i, entry := range ubd.Entries { - out += fmt.Sprintf(` Unbonding Delegation %d: - Creation Height: %v - Min time to unbond (unix): %v - Expected balance: %s`, i, entry.CreationHeight, - entry.CompletionTime, entry.Balance) - } - - return out -} - -// UnbondingDelegations is a collection of UnbondingDelegation -type UnbondingDelegations []UnbondingDelegation - -func (ubds UnbondingDelegations) String() (out string) { - for _, u := range ubds { - out += u.String() + "\n" - } - - return strings.TrimSpace(out) -} - -// String implements the Stringer interface for a RedelegationEntry object. -func (e RedelegationEntry) String() string { - out, _ := yaml.Marshal(e) - return string(out) -} - -// String returns a human readable string representation of a Redelegation. -func (red Redelegation) String() string { - out := fmt.Sprintf(`Redelegations between: - Delegator: %s - Source Validator: %s - Destination Validator: %s - Entries: -`, - red.DelegatorAddress, red.ValidatorSrcAddress, red.ValidatorDstAddress, - ) - - for i, entry := range red.Entries { - out += fmt.Sprintf(` Redelegation Entry #%d: - Creation height: %v - Min time to unbond (unix): %v - Dest Shares: %s -`, - i, entry.CreationHeight, entry.CompletionTime, entry.SharesDst, - ) - } - - return strings.TrimRight(out, "\n") -} - -// Redelegations are a collection of Redelegation -type Redelegations []Redelegation - -func (d Redelegations) String() (out string) { - for _, red := range d { - out += red.String() + "\n" - } - - return strings.TrimSpace(out) -} - -// String implements the Stringer interface for DelegationResponse. -func (d DelegationResponse) String() string { - return fmt.Sprintf("%s\n Balance: %s", d.Delegation.String(), d.Balance) -} - -// String implements the Stringer interface for a Validator object. -func (v Validator) String() string { - out, _ := yaml.Marshal(v) - return string(out) -} - -// Validators is a collection of Validator -type Validators []Validator - -func (v Validators) String() (out string) { - for _, val := range v { - out += val.String() + "\n" - } - - return strings.TrimSpace(out) -} - -// String implements the Stringer interface for a Description object. -func (d Description) String() string { - out, _ := yaml.Marshal(d) - return string(out) -} diff --git a/x/staking/legacy/v043/store.go b/x/staking/legacy/v043/store.go deleted file mode 100644 index a8c1c68a..00000000 --- a/x/staking/legacy/v043/store.go +++ /dev/null @@ -1,78 +0,0 @@ -package v043 - -import ( - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/address" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/legacy/v040" - v043distribution "github.com/iqlusioninc/liquidity-staking-module/x/distribution/legacy/v043" - v040staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v040" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -// migratePrefixAddressAddressAddress is a helper function that migrates all keys of format: -// prefix_bytes | address_1_bytes | address_2_bytes | address_3_bytes -// into format: -// prefix_bytes | address_1_len (1 byte) | address_1_bytes | address_2_len (1 byte) | address_2_bytes | address_3_len (1 byte) | address_3_bytes -func migratePrefixAddressAddressAddress(store sdk.KVStore, prefixBz []byte) { - oldStore := prefix.NewStore(store, prefixBz) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - addr1 := oldStoreIter.Key()[:v040auth.AddrLen] - addr2 := oldStoreIter.Key()[v040auth.AddrLen : 2*v040auth.AddrLen] - addr3 := oldStoreIter.Key()[2*v040auth.AddrLen:] - newStoreKey := append(append(append( - prefixBz, - address.MustLengthPrefix(addr1)...), address.MustLengthPrefix(addr2)...), address.MustLengthPrefix(addr3)..., - ) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} - -const powerBytesLen = 8 - -func migrateValidatorsByPowerIndexKey(store sdk.KVStore) { - oldStore := prefix.NewStore(store, v040staking.ValidatorsByPowerIndexKey) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - powerBytes := oldStoreIter.Key()[:powerBytesLen] - valAddr := oldStoreIter.Key()[powerBytesLen:] - newStoreKey := append(append(types.ValidatorsByPowerIndexKey, powerBytes...), address.MustLengthPrefix(valAddr)...) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} - -// MigrateStore performs in-place store migrations from v0.40 to v0.43. The -// migration includes: -// -// - Setting the Power Reduction param in the paramstore -func MigrateStore(ctx sdk.Context, storeKey sdk.StoreKey) error { - store := ctx.KVStore(storeKey) - - v043distribution.MigratePrefixAddress(store, v040staking.LastValidatorPowerKey) - - v043distribution.MigratePrefixAddress(store, v040staking.ValidatorsKey) - v043distribution.MigratePrefixAddress(store, v040staking.ValidatorsByConsAddrKey) - migrateValidatorsByPowerIndexKey(store) - - v043distribution.MigratePrefixAddressAddress(store, v040staking.DelegationKey) - v043distribution.MigratePrefixAddressAddress(store, v040staking.UnbondingDelegationKey) - v043distribution.MigratePrefixAddressAddress(store, v040staking.UnbondingDelegationByValIndexKey) - migratePrefixAddressAddressAddress(store, v040staking.RedelegationKey) - migratePrefixAddressAddressAddress(store, v040staking.RedelegationByValSrcIndexKey) - migratePrefixAddressAddressAddress(store, v040staking.RedelegationByValDstIndexKey) - - return nil -} diff --git a/x/staking/legacy/v043/store_test.go b/x/staking/legacy/v043/store_test.go deleted file mode 100644 index 0c202a40..00000000 --- a/x/staking/legacy/v043/store_test.go +++ /dev/null @@ -1,138 +0,0 @@ -package v043_test - -import ( - "bytes" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - v040staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v040" - v043staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/legacy/v043" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -func TestStoreMigration(t *testing.T) { - stakingKey := sdk.NewKVStoreKey("staking") - tStakingKey := sdk.NewTransientStoreKey("transient_test") - ctx := testutil.DefaultContext(stakingKey, tStakingKey) - store := ctx.KVStore(stakingKey) - - _, pk1, addr1 := testdata.KeyTestPubAddr() - valAddr1 := sdk.ValAddress(addr1) - val := teststaking.NewValidator(t, valAddr1, pk1) - _, pk1, addr2 := testdata.KeyTestPubAddr() - valAddr2 := sdk.ValAddress(addr2) - _, _, addr3 := testdata.KeyTestPubAddr() - consAddr := sdk.ConsAddress(addr3.String()) - _, _, addr4 := testdata.KeyTestPubAddr() - now := time.Now() - // Use dummy value for all keys. - value := []byte("foo") - - testCases := []struct { - name string - oldKey []byte - newKey []byte - }{ - { - "LastValidatorPowerKey", - v040staking.GetLastValidatorPowerKey(valAddr1), - types.GetLastValidatorPowerKey(valAddr1), - }, - { - "LastTotalPowerKey", - v040staking.LastTotalPowerKey, - types.LastTotalPowerKey, - }, - { - "ValidatorsKey", - v040staking.GetValidatorKey(valAddr1), - types.GetValidatorKey(valAddr1), - }, - { - "ValidatorsByConsAddrKey", - v040staking.GetValidatorByConsAddrKey(consAddr), - types.GetValidatorByConsAddrKey(consAddr), - }, - { - "ValidatorsByPowerIndexKey", - v040staking.GetValidatorsByPowerIndexKey(val), - types.GetValidatorsByPowerIndexKey(val, sdk.DefaultPowerReduction), - }, - { - "DelegationKey", - v040staking.GetDelegationKey(addr4, valAddr1), - types.GetDelegationKey(addr4, valAddr1), - }, - { - "UnbondingDelegationKey", - v040staking.GetUBDKey(addr4, valAddr1), - types.GetUBDKey(addr4, valAddr1), - }, - { - "UnbondingDelegationByValIndexKey", - v040staking.GetUBDByValIndexKey(addr4, valAddr1), - types.GetUBDByValIndexKey(addr4, valAddr1), - }, - { - "RedelegationKey", - v040staking.GetREDKey(addr4, valAddr1, valAddr2), - types.GetREDKey(addr4, valAddr1, valAddr2), - }, - { - "RedelegationByValSrcIndexKey", - v040staking.GetREDByValSrcIndexKey(addr4, valAddr1, valAddr2), - types.GetREDByValSrcIndexKey(addr4, valAddr1, valAddr2), - }, - { - "RedelegationByValDstIndexKey", - v040staking.GetREDByValDstIndexKey(addr4, valAddr1, valAddr2), - types.GetREDByValDstIndexKey(addr4, valAddr1, valAddr2), - }, - { - "UnbondingQueueKey", - v040staking.GetUnbondingDelegationTimeKey(now), - types.GetUnbondingDelegationTimeKey(now), - }, - { - "RedelegationQueueKey", - v040staking.GetRedelegationTimeKey(now), - types.GetRedelegationTimeKey(now), - }, - { - "ValidatorQueueKey", - v040staking.GetValidatorQueueKey(now, 4), - types.GetValidatorQueueKey(now, 4), - }, - { - "HistoricalInfoKey", - v040staking.GetHistoricalInfoKey(4), - types.GetHistoricalInfoKey(4), - }, - } - - // Set all the old keys to the store - for _, tc := range testCases { - store.Set(tc.oldKey, value) - } - - // Run migrations. - err := v043staking.MigrateStore(ctx, stakingKey) - require.NoError(t, err) - - // Make sure the new keys are set and old keys are deleted. - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - if !bytes.Equal(tc.oldKey, tc.newKey) { - require.Nil(t, store.Get(tc.oldKey)) - } - require.Equal(t, value, store.Get(tc.newKey)) - }) - } -} diff --git a/x/staking/module.go b/x/staking/module.go index 057596d2..55984b3b 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -19,7 +19,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/rest" "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/staking/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" @@ -71,7 +70,6 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncod // RegisterRESTRoutes registers the REST routes for the staking module. func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { - rest.RegisterHandlers(clientCtx, rtr) } // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the staking module. From 72160b586735e85929a3c3be76dca55d5d7353b5 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 17 Mar 2022 10:58:35 +1000 Subject: [PATCH 02/57] resolve build errors for tests --- app/app.go | 14 +++++++- app/app_test.go | 37 +++++++++------------- app/sim_test.go | 5 +-- cmd/liquidstakingd/cmd/cmd_test.go | 2 +- cmd/liquidstakingd/cmd/genaccounts_test.go | 4 +-- x/distribution/client/cli/tx_test.go | 2 +- x/distribution/client/testutil/suite.go | 3 +- x/distribution/simulation/decoder_test.go | 2 +- x/slashing/client/testutil/suite.go | 6 ++-- x/slashing/simulation/decoder_test.go | 2 +- x/staking/client/testutil/suite.go | 29 +++++++++++------ x/staking/handler_test.go | 7 ++-- x/staking/keeper/grpc_query_test.go | 2 +- x/staking/simulation/decoder_test.go | 2 +- 14 files changed, 68 insertions(+), 49 deletions(-) diff --git a/app/app.go b/app/app.go index 3dcbb493..a1db3f31 100644 --- a/app/app.go +++ b/app/app.go @@ -44,6 +44,7 @@ import ( capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" "github.com/cosmos/cosmos-sdk/x/authz" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" @@ -342,8 +343,18 @@ func NewSimApp( app.mm.SetOrderBeginBlockers( upgradetypes.ModuleName, capabilitytypes.ModuleName, minttypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, evidencetypes.ModuleName, stakingtypes.ModuleName, + authtypes.ModuleName, banktypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, + authz.ModuleName, feegrant.ModuleName, + paramstypes.ModuleName, vestingtypes.ModuleName, + ) + app.mm.SetOrderEndBlockers( + crisistypes.ModuleName, govtypes.ModuleName, stakingtypes.ModuleName, + capabilitytypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, + slashingtypes.ModuleName, minttypes.ModuleName, + genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, + feegrant.ModuleName, + paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, ) - app.mm.SetOrderEndBlockers(crisistypes.ModuleName, govtypes.ModuleName, stakingtypes.ModuleName) // NOTE: The genutils module must occur after staking so that pools are // properly initialized with tokens from genesis accounts. @@ -355,6 +366,7 @@ func NewSimApp( slashingtypes.ModuleName, govtypes.ModuleName, minttypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, feegrant.ModuleName, + paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, ) app.mm.RegisterInvariants(&app.CrisisKeeper) diff --git a/app/app_test.go b/app/app_test.go index 5edcfc5d..e73991ed 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -2,7 +2,6 @@ package simapp import ( "encoding/json" - "os" "testing" "github.com/golang/mock/gomock" @@ -17,6 +16,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" + authmiddleware "github.com/cosmos/cosmos-sdk/x/auth/middleware" "github.com/cosmos/cosmos-sdk/x/auth/vesting" authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/bank" @@ -38,7 +38,9 @@ import ( func TestSimAppExportAndBlockedAddrs(t *testing.T) { encCfg := MakeTestEncodingConfig() db := dbm.NewMemDB() - app := NewSimApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + logger, _ := log.NewDefaultLogger("plain", "info", false) + + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) for acc := range maccPerms { require.True( @@ -48,22 +50,12 @@ func TestSimAppExportAndBlockedAddrs(t *testing.T) { ) } - genesisState := NewDefaultGenesisState(encCfg.Marshaler) - stateBytes, err := json.MarshalIndent(genesisState, "", " ") - require.NoError(t, err) - - // Initialize the chain - app.InitChain( - abci.RequestInitChain{ - Validators: []abci.ValidatorUpdate{}, - AppStateBytes: stateBytes, - }, - ) app.Commit() + logger2, _ := log.NewDefaultLogger("plain", "info", false) // Making a new app object with the db, so that initchain hasn't been called - app2 := NewSimApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) - _, err = app2.ExportAppStateAndValidators(false, []string{}) + app2 := NewSimApp(logger2, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + _, err := app2.ExportAppStateAndValidators(false, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") } @@ -75,16 +67,16 @@ func TestGetMaccPerms(t *testing.T) { func TestRunMigrations(t *testing.T) { db := dbm.NewMemDB() encCfg := MakeTestEncodingConfig() - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) + logger, _ := log.NewDefaultLogger("plain", "info", false) app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) // Create a new baseapp and configurator for the purpose of this test. - bApp := baseapp.NewBaseApp(appName, logger, db, encCfg.TxConfig.TxDecoder()) + bApp := baseapp.NewBaseApp(appName, logger, db) bApp.SetCommitMultiStoreTracer(nil) bApp.SetInterfaceRegistry(encCfg.InterfaceRegistry) + msr := authmiddleware.NewMsgServiceRouter(encCfg.InterfaceRegistry) app.BaseApp = bApp - app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) - + app.configurator = module.NewConfigurator(app.appCodec, msr, app.GRPCQueryRouter()) // We register all modules on the Configurator, except x/bank. x/bank will // serve as the test subject on which we run the migration tests. // @@ -198,7 +190,7 @@ func TestRunMigrations(t *testing.T) { func TestInitGenesisOnMigration(t *testing.T) { db := dbm.NewMemDB() encCfg := MakeTestEncodingConfig() - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) + logger, _ := log.NewDefaultLogger("plain", "info", false) app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) @@ -242,8 +234,9 @@ func TestInitGenesisOnMigration(t *testing.T) { func TestUpgradeStateOnGenesis(t *testing.T) { encCfg := MakeTestEncodingConfig() db := dbm.NewMemDB() - app := NewSimApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) - genesisState := NewDefaultGenesisState(encCfg.Marshaler) + logger, _ := log.NewDefaultLogger("plain", "info", false) + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + genesisState := NewDefaultGenesisState(encCfg.Codec) stateBytes, err := json.MarshalIndent(genesisState, "", " ") require.NoError(t, err) diff --git a/app/sim_test.go b/app/sim_test.go index 138659a8..7efa2f1e 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -7,6 +7,7 @@ import ( "os" "testing" + storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" @@ -38,8 +39,8 @@ func init() { } type StoreKeysPrefixes struct { - A sdk.StoreKey - B sdk.StoreKey + A storetypes.StoreKey + B storetypes.StoreKey Prefixes [][]byte } diff --git a/cmd/liquidstakingd/cmd/cmd_test.go b/cmd/liquidstakingd/cmd/cmd_test.go index 4d3e527a..3ad57712 100644 --- a/cmd/liquidstakingd/cmd/cmd_test.go +++ b/cmd/liquidstakingd/cmd/cmd_test.go @@ -20,5 +20,5 @@ func TestInitCmd(t *testing.T) { fmt.Sprintf("--%s=%s", cli.FlagOverwrite, "true"), // Overwrite genesis.json, in case it already exists }) - require.NoError(t, svrcmd.Execute(rootCmd, simapp.DefaultNodeHome)) + require.NoError(t, svrcmd.Execute(rootCmd, "", simapp.DefaultNodeHome)) } diff --git a/cmd/liquidstakingd/cmd/genaccounts_test.go b/cmd/liquidstakingd/cmd/genaccounts_test.go index ebfb7519..00bb4f64 100644 --- a/cmd/liquidstakingd/cmd/genaccounts_test.go +++ b/cmd/liquidstakingd/cmd/genaccounts_test.go @@ -73,7 +73,7 @@ func TestAddGenesisAccountCmd(t *testing.T) { cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) - appCodec := simapp.MakeTestEncodingConfig().Marshaler + appCodec := simapp.MakeTestEncodingConfig().Codec err = genutiltest.ExecInitCmd(testMbm, home, appCodec) require.NoError(t, err) @@ -82,7 +82,7 @@ func TestAddGenesisAccountCmd(t *testing.T) { if tc.withKeyring { path := hd.CreateHDPath(118, 0, 0).String() - kr, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendMemory, home, nil) + kr, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendMemory, home, nil, appCodec) require.NoError(t, err) _, _, err = kr.NewMnemonic(tc.addr, keyring.English, path, keyring.DefaultBIP39Passphrase, hd.Secp256k1) require.NoError(t, err) diff --git a/x/distribution/client/cli/tx_test.go b/x/distribution/client/cli/tx_test.go index 36a946e7..7176c6bf 100644 --- a/x/distribution/client/cli/tx_test.go +++ b/x/distribution/client/cli/tx_test.go @@ -77,7 +77,7 @@ func TestParseProposal(t *testing.T) { } `) - proposal, err := ParseCommunityPoolSpendProposalWithDeposit(encodingConfig.Marshaler, okJSON.Name()) + proposal, err := ParseCommunityPoolSpendProposalWithDeposit(encodingConfig.Codec, okJSON.Name()) require.NoError(t, err) require.Equal(t, "Community Pool Spend", proposal.Title) diff --git a/x/distribution/client/testutil/suite.go b/x/distribution/client/testutil/suite.go index 3f5b2f23..6f64f305 100644 --- a/x/distribution/client/testutil/suite.go +++ b/x/distribution/client/testutil/suite.go @@ -50,7 +50,8 @@ func (s *IntegrationTestSuite) SetupTest() { genesisState[minttypes.ModuleName] = mintDataBz s.cfg.GenesisState = genesisState - s.network = network.New(s.T(), s.cfg) + s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg) + s.Require().NoError(err) _, err = s.network.WaitForHeight(1) s.Require().NoError(err) diff --git a/x/distribution/simulation/decoder_test.go b/x/distribution/simulation/decoder_test.go index c7797b5c..62f80cbf 100644 --- a/x/distribution/simulation/decoder_test.go +++ b/x/distribution/simulation/decoder_test.go @@ -22,7 +22,7 @@ var ( ) func TestDecodeDistributionStore(t *testing.T) { - cdc := simapp.MakeTestEncodingConfig().Marshaler + cdc := simapp.MakeTestEncodingConfig().Codec dec := simulation.NewDecodeStore(cdc) decCoins := sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.OneDec())} diff --git a/x/slashing/client/testutil/suite.go b/x/slashing/client/testutil/suite.go index c7503b58..13a9bee4 100644 --- a/x/slashing/client/testutil/suite.go +++ b/x/slashing/client/testutil/suite.go @@ -31,9 +31,11 @@ func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite { func (s *IntegrationTestSuite) SetupSuite() { s.T().Log("setting up integration test suite") - s.network = network.New(s.T(), s.cfg) + var err error + s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg) + s.Require().NoError(err) - _, err := s.network.WaitForHeight(1) + _, err = s.network.WaitForHeight(1) s.Require().NoError(err) } diff --git a/x/slashing/simulation/decoder_test.go b/x/slashing/simulation/decoder_test.go index 7e884309..9063e7d2 100644 --- a/x/slashing/simulation/decoder_test.go +++ b/x/slashing/simulation/decoder_test.go @@ -25,7 +25,7 @@ var ( ) func TestDecodeStore(t *testing.T) { - cdc := simapp.MakeTestEncodingConfig().Marshaler + cdc := simapp.MakeTestEncodingConfig().Codec dec := simulation.NewDecodeStore(cdc) info := types.NewValidatorSigningInfo(consAddr1, 0, 1, time.Now().UTC(), false, 0) diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index d4dfd79e..b859e075 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -43,9 +43,11 @@ func (s *IntegrationTestSuite) SetupSuite() { s.T().Skip("skipping test in unit-tests mode.") } - s.network = network.New(s.T(), s.cfg) + var err error + s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg) + s.Require().NoError(err) - _, err := s.network.WaitForHeight(1) + _, err = s.network.WaitForHeight(1) s.Require().NoError(err) unbond, err := sdk.ParseCoinNormalized("10stake") @@ -87,10 +89,13 @@ func (s *IntegrationTestSuite) TestNewCreateValidatorCmd() { require.NoError(err) require.NotNil(consPubKeyBz) - info, _, err := val.ClientCtx.Keyring.NewMnemonic("NewValidator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewValidator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + require.NoError(err) + + pub, err := k.GetPubKey() require.NoError(err) - newAddr := sdk.AccAddress(info.GetPubKey().Address()) + newAddr := sdk.AccAddress(pub.Address()) _, err = banktestutil.MsgSendExec( val.ClientCtx, val.Address, @@ -1052,10 +1057,13 @@ func (s *IntegrationTestSuite) TestNewEditValidatorCmd() { func (s *IntegrationTestSuite) TestNewDelegateCmd() { val := s.network.Validators[0] - info, _, err := val.ClientCtx.Keyring.NewMnemonic("NewAccount", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewAccount", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) s.Require().NoError(err) - newAddr := sdk.AccAddress(info.GetPubKey().Address()) + pub, err := k.GetPubKey() + s.Require().NoError(err) + + newAddr := sdk.AccAddress(pub.Address()) _, err = banktestutil.MsgSendExec( val.ClientCtx, @@ -1537,9 +1545,12 @@ func (s *IntegrationTestSuite) TestBlockResults() { val := s.network.Validators[0] // Create new account in the keyring. - info, _, err := val.ClientCtx.Keyring.NewMnemonic("NewDelegator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + // Create new account in the keyring. + k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewDelegator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + require.NoError(err) + pub, err := k.GetPubKey() require.NoError(err) - newAddr := sdk.AccAddress(info.GetPubKey().Address()) + newAddr := sdk.AccAddress(pub.Address()) // Send some funds to the new account. _, err = banktestutil.MsgSendExec( @@ -1567,7 +1578,7 @@ func (s *IntegrationTestSuite) TestBlockResults() { require.NoError(err) // Create a HTTP rpc client. - rpcClient, err := http.New(val.RPCAddress, "/websocket") + rpcClient, err := http.New(val.RPCAddress) require.NoError(err) // Loop until we find a block result with the correct validator updates. diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index 2f457a44..1c09b1e7 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -7,8 +7,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" "github.com/golang/protobuf/proto" @@ -25,6 +23,7 @@ import ( "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) func bootstrapHandlerGenesisTest(t *testing.T, power int64, numAddrs int, accAmount sdk.Int) (*simapp.SimApp, sdk.Context, []sdk.AccAddress, []sdk.ValAddress) { @@ -171,7 +170,7 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { func TestInvalidPubKeyTypeMsgCreateValidator(t *testing.T) { initPower := int64(1000) app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 1, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - ctx = ctx.WithConsensusParams(&abci.ConsensusParams{ + ctx = ctx.WithConsensusParams(&tmproto.ConsensusParams{ Validator: &tmproto.ValidatorParams{PubKeyTypes: []string{tmtypes.ABCIPubKeyTypeEd25519}}, }) @@ -185,7 +184,7 @@ func TestInvalidPubKeyTypeMsgCreateValidator(t *testing.T) { func TestBothPubKeyTypesMsgCreateValidator(t *testing.T) { app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, 1000, 2, sdk.NewInt(1000)) - ctx = ctx.WithConsensusParams(&abci.ConsensusParams{ + ctx = ctx.WithConsensusParams(&tmproto.ConsensusParams{ Validator: &tmproto.ValidatorParams{PubKeyTypes: []string{tmtypes.ABCIPubKeyTypeEd25519, tmtypes.ABCIPubKeyTypeSecp256k1}}, }) diff --git a/x/staking/keeper/grpc_query_test.go b/x/staking/keeper/grpc_query_test.go index d4998cfa..30759552 100644 --- a/x/staking/keeper/grpc_query_test.go +++ b/x/staking/keeper/grpc_query_test.go @@ -774,7 +774,7 @@ func createValidators(t *testing.T, ctx sdk.Context, app *simapp.SimApp, powers addrs := simapp.AddTestAddrsIncremental(app, ctx, 5, app.StakingKeeper.TokensFromConsensusPower(ctx, 300)) valAddrs := simapp.ConvertAddrsToValAddrs(addrs) pks := simapp.CreateTestPubKeys(5) - cdc := simapp.MakeTestEncodingConfig().Marshaler + cdc := simapp.MakeTestEncodingConfig().Codec app.StakingKeeper = keeper.NewKeeper( cdc, app.GetKey(types.StoreKey), diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index b1606020..d06de8d9 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -32,7 +32,7 @@ func makeTestCodec() (cdc *codec.LegacyAmino) { } func TestDecodeStore(t *testing.T) { - cdc := simapp.MakeTestEncodingConfig().Marshaler + cdc := simapp.MakeTestEncodingConfig().Codec dec := simulation.NewDecodeStore(cdc) bondTime := time.Now().UTC() From f5bb69811240cf4ea3ae074296864209f48c59c0 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 17 Mar 2022 11:42:16 +1000 Subject: [PATCH 03/57] fix memory issue for router --- app/app.go | 2 + app/test_helpers.go | 199 ++++++++++++------- x/distribution/handler_test.go | 2 +- x/distribution/keeper/allocation_test.go | 11 +- x/distribution/keeper/delegation_test.go | 23 ++- x/distribution/keeper/grpc_query_test.go | 5 +- x/distribution/keeper/keeper_test.go | 13 +- x/distribution/keeper/querier_test.go | 2 +- x/distribution/module_test.go | 2 +- x/distribution/proposal_handler_test.go | 7 +- x/distribution/simulation/operations_test.go | 7 +- x/distribution/simulation/proposals_test.go | 2 +- x/slashing/abci_test.go | 2 +- x/slashing/app_test.go | 2 +- x/slashing/genesis_test.go | 2 +- x/slashing/handler_test.go | 8 +- x/slashing/keeper/grpc_query_test.go | 2 +- x/slashing/keeper/keeper_test.go | 8 +- x/slashing/keeper/querier_test.go | 4 +- x/slashing/keeper/signing_info_test.go | 8 +- x/slashing/simulation/operations_test.go | 11 +- x/staking/app_test.go | 2 +- x/staking/common_test.go | 5 +- x/staking/genesis_test.go | 15 +- x/staking/handler_test.go | 5 +- x/staking/keeper/common_test.go | 4 +- x/staking/keeper/delegation_test.go | 67 ++++--- x/staking/keeper/historical_info_test.go | 6 +- x/staking/keeper/keeper_test.go | 4 +- x/staking/keeper/msg_server_test.go | 6 +- x/staking/keeper/querier_test.go | 16 +- x/staking/keeper/slash_test.go | 15 +- x/staking/keeper/validator_test.go | 29 +-- x/staking/module_test.go | 2 +- x/staking/simulation/operations_test.go | 19 +- x/staking/types/authz_test.go | 2 +- 36 files changed, 296 insertions(+), 223 deletions(-) diff --git a/app/app.go b/app/app.go index a1db3f31..93724d5e 100644 --- a/app/app.go +++ b/app/app.go @@ -224,6 +224,8 @@ func NewSimApp( legacyAmino: legacyAmino, appCodec: appCodec, interfaceRegistry: interfaceRegistry, + legacyRouter: authmiddleware.NewLegacyRouter(), + msgSvcRouter: authmiddleware.NewMsgServiceRouter(interfaceRegistry), invCheckPeriod: invCheckPeriod, keys: keys, tkeys: tkeys, diff --git a/app/test_helpers.go b/app/test_helpers.go index 8f94f4b6..364891a5 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -2,6 +2,7 @@ package simapp import ( "bytes" + "context" "encoding/hex" "encoding/json" "fmt" @@ -11,6 +12,7 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" + tmjson "github.com/tendermint/tendermint/libs/json" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" @@ -21,16 +23,18 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/simapp/helpers" + "github.com/cosmos/cosmos-sdk/simapp/params" + "github.com/cosmos/cosmos-sdk/testutil/mock" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" - stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // DefaultConsensusParams defines the default Tendermint consensus params used in @@ -52,6 +56,17 @@ var DefaultConsensusParams = &tmproto.ConsensusParams{ }, } +// SetupOptions defines arguments that are passed into `Simapp` constructor. +type SetupOptions struct { + Logger log.Logger + DB *dbm.MemDB + InvCheckPeriod uint + HomePath string + SkipUpgradeHeights map[int64]bool + EncConfig params.EncodingConfig + AppOpts types.AppOptions +} + func setup(withGenesis bool, invCheckPeriod uint) (*SimApp, GenesisState) { db := dbm.NewMemDB() encCdc := MakeTestEncodingConfig() @@ -62,15 +77,33 @@ func setup(withGenesis bool, invCheckPeriod uint) (*SimApp, GenesisState) { return app, GenesisState{} } -// Setup initializes a new SimApp. A Nop logger is set in SimApp. -func Setup(isCheckTx bool) *SimApp { - app, genesisState := setup(!isCheckTx, 5) +// NewSimappWithCustomOptions initializes a new SimApp with custom options. +func NewSimappWithCustomOptions(t *testing.T, isCheckTx bool, options SetupOptions) *SimApp { + t.Helper() + + privVal := mock.NewPV() + pubKey, err := privVal.GetPubKey(context.TODO()) + require.NoError(t, err) + // create validator set with single validator + validator := tmtypes.NewValidator(pubKey, 1) + valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) + + // generate genesis account + senderPrivKey := secp256k1.GenPrivKey() + acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) + balance := banktypes.Balance{ + Address: acc.GetAddress().String(), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100000000000000))), + } + + app := NewSimApp(options.Logger, options.DB, nil, true, options.SkipUpgradeHeights, options.HomePath, options.InvCheckPeriod, options.EncConfig, options.AppOpts) + genesisState := NewDefaultGenesisState(app.appCodec) + genesisState = genesisStateWithValSet(t, app, genesisState, valSet, []authtypes.GenesisAccount{acc}, balance) + if !isCheckTx { // init chain must be called to stop deliverState from being nil - stateBytes, err := json.MarshalIndent(genesisState, "", " ") - if err != nil { - panic(err) - } + stateBytes, err := tmjson.MarshalIndent(genesisState, "", " ") + require.NoError(t, err) // Initialize the chain app.InitChain( @@ -85,12 +118,35 @@ func Setup(isCheckTx bool) *SimApp { return app } -// SetupWithGenesisValSet initializes a new SimApp with a validator set and genesis accounts -// that also act as delegators. For simplicity, each validator is bonded with a delegation -// of one consensus engine unit (10^6) in the default token of the simapp from first genesis -// account. A Nop logger is set in SimApp. -func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance) *SimApp { - app, genesisState := setup(true, 5) +// Setup initializes a new SimApp. A Nop logger is set in SimApp. +func Setup(t *testing.T, isCheckTx bool) *SimApp { + t.Helper() + + privVal := mock.NewPV() + pubKey, err := privVal.GetPubKey(context.TODO()) + require.NoError(t, err) + + // create validator set with single validator + validator := tmtypes.NewValidator(pubKey, 1) + valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) + + // generate genesis account + senderPrivKey := secp256k1.GenPrivKey() + acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) + balance := banktypes.Balance{ + Address: acc.GetAddress().String(), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100000000000000))), + } + + app := SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, balance) + + return app +} + +func genesisStateWithValSet(t *testing.T, + app *SimApp, genesisState GenesisState, + valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, + balances ...banktypes.Balance) GenesisState { // set genesis accounts authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis) @@ -98,7 +154,7 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs validators := make([]stakingtypes.Validator, 0, len(valSet.Validators)) delegations := make([]stakingtypes.Delegation, 0, len(valSet.Validators)) - bondAmt := sdk.NewInt(1000000) + bondAmt := sdk.DefaultPowerReduction for _, val := range valSet.Validators { pk, err := cryptocodec.FromTmPubKeyInterface(val.PubKey) @@ -109,7 +165,7 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs OperatorAddress: sdk.ValAddress(val.Address).String(), ConsensusPubkey: pkAny, Jailed: false, - Status: sdkstaking.Bonded, + Status: stakingtypes.Bonded, Tokens: bondAmt, DelegatorShares: sdk.OneDec(), Description: stakingtypes.Description{}, @@ -128,8 +184,13 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs totalSupply := sdk.NewCoins() for _, b := range balances { - // add genesis acc tokens and delegated tokens to total supply - totalSupply = totalSupply.Add(b.Coins.Add(sdk.NewCoin(sdk.DefaultBondDenom, bondAmt))...) + // add genesis acc tokens to total supply + totalSupply = totalSupply.Add(b.Coins...) + } + + for range delegations { + // add delegated tokens to total supply + totalSupply = totalSupply.Add(sdk.NewCoin(sdk.DefaultBondDenom, bondAmt)) } // add bonded amount to bonded pool module account @@ -142,6 +203,19 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}) genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) + return genesisState +} + +// SetupWithGenesisValSet initializes a new SimApp with a validator set and genesis accounts +// that also act as delegators. For simplicity, each validator is bonded with a delegation +// of one consensus engine unit in the default token of the simapp from first genesis +// account. A Nop logger is set in SimApp. +func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance) *SimApp { + t.Helper() + + app, genesisState := setup(true, 5) + genesisState = genesisStateWithValSet(t, app, genesisState, valSet, genAccs, balances...) + stateBytes, err := json.MarshalIndent(genesisState, "", " ") require.NoError(t, err) @@ -168,36 +242,47 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs // SetupWithGenesisAccounts initializes a new SimApp with the provided genesis // accounts and possible balances. -func SetupWithGenesisAccounts(genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance) *SimApp { - app, genesisState := setup(true, 0) - authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) - genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis) +func SetupWithGenesisAccounts(t *testing.T, genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance) *SimApp { + t.Helper() - totalSupply := sdk.NewCoins() - for _, b := range balances { - totalSupply = totalSupply.Add(b.Coins...) - } + privVal := mock.NewPV() + pubKey, err := privVal.GetPubKey(context.TODO()) + require.NoError(t, err) - bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}) - genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) + // create validator set with single validator + validator := tmtypes.NewValidator(pubKey, 1) + valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) - stateBytes, err := json.MarshalIndent(genesisState, "", " ") - if err != nil { - panic(err) - } + return SetupWithGenesisValSet(t, valSet, genAccs, balances...) +} - app.InitChain( - abci.RequestInitChain{ - Validators: []abci.ValidatorUpdate{}, - ConsensusParams: DefaultConsensusParams, - AppStateBytes: stateBytes, +// SetupWithGenesisValSet initializes GenesisState with a single validator and genesis accounts +// that also act as delegators. +func GenesisStateWithSingleValidator(t *testing.T, app *SimApp) GenesisState { + t.Helper() + + privVal := mock.NewPV() + pubKey, err := privVal.GetPubKey(context.TODO()) + require.NoError(t, err) + + // create validator set with single validator + validator := tmtypes.NewValidator(pubKey, 1) + valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) + + // generate genesis account + senderPrivKey := secp256k1.GenPrivKey() + acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) + balances := []banktypes.Balance{ + { + Address: acc.GetAddress().String(), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100000000000000))), }, - ) + } - app.Commit() - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1}}) + genesisState := NewDefaultGenesisState(app.appCodec) + genesisState = genesisStateWithValSet(t, app, genesisState, valSet, []authtypes.GenesisAccount{acc}, balances...) - return app + return genesisState } type GenerateAccountStrategy func(int) []sdk.AccAddress @@ -438,31 +523,3 @@ type EmptyAppOptions struct{} func (ao EmptyAppOptions) Get(o string) interface{} { return nil } - -// FundAccount is a utility function that funds an account by minting and -// sending the coins to the address. This should be used for testing purposes -// only! -// -// TODO: Instead of using the mint module account, which has the -// permission of minting, create a "faucet" account. (@fdymylja) -func FundAccount(bankKeeper bankkeeper.Keeper, ctx sdk.Context, addr sdk.AccAddress, amounts sdk.Coins) error { - if err := bankKeeper.MintCoins(ctx, minttypes.ModuleName, amounts); err != nil { - return err - } - - return bankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, amounts) -} - -// FundModuleAccount is a utility function that funds a module account by -// minting and sending the coins to the address. This should be used for testing -// purposes only! -// -// TODO: Instead of using the mint module account, which has the -// permission of minting, create a "faucet" account. (@fdymylja) -func FundModuleAccount(bankKeeper bankkeeper.Keeper, ctx sdk.Context, recipientMod string, amounts sdk.Coins) error { - if err := bankKeeper.MintCoins(ctx, minttypes.ModuleName, amounts); err != nil { - return err - } - - return bankKeeper.SendCoinsFromModuleToModule(ctx, minttypes.ModuleName, recipientMod, amounts) -} diff --git a/x/distribution/handler_test.go b/x/distribution/handler_test.go index 93c25f5e..aa5bf863 100644 --- a/x/distribution/handler_test.go +++ b/x/distribution/handler_test.go @@ -13,7 +13,7 @@ import ( // test msg registration func TestWithdrawTokenizeShareRecordReward(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) h := distribution.NewHandler(app.DistrKeeper) diff --git a/x/distribution/keeper/allocation_test.go b/x/distribution/keeper/allocation_test.go index 6f620c07..73fe27dd 100644 --- a/x/distribution/keeper/allocation_test.go +++ b/x/distribution/keeper/allocation_test.go @@ -9,13 +9,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) func TestAllocateTokensToValidatorWithCommission(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrs := simapp.AddTestAddrs(app, ctx, 3, sdk.NewInt(1234)) @@ -44,7 +45,7 @@ func TestAllocateTokensToValidatorWithCommission(t *testing.T) { } func TestAllocateTokensToManyValidators(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrs := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1234)) @@ -83,7 +84,7 @@ func TestAllocateTokensToManyValidators(t *testing.T) { require.NotNil(t, feeCollector) // fund fee collector - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, feeCollector.GetName(), fees)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, feeCollector.GetName(), fees)) app.AccountKeeper.SetAccount(ctx, feeCollector) @@ -115,7 +116,7 @@ func TestAllocateTokensToManyValidators(t *testing.T) { } func TestAllocateTokensTruncation(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrs := simapp.AddTestAddrs(app, ctx, 3, sdk.NewInt(1234)) @@ -163,7 +164,7 @@ func TestAllocateTokensTruncation(t *testing.T) { feeCollector := app.AccountKeeper.GetModuleAccount(ctx, types.FeeCollectorName) require.NotNil(t, feeCollector) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, feeCollector.GetName(), fees)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, feeCollector.GetName(), fees)) app.AccountKeeper.SetAccount(ctx, feeCollector) diff --git a/x/distribution/keeper/delegation_test.go b/x/distribution/keeper/delegation_test.go index 0c629fd7..089f8c98 100644 --- a/x/distribution/keeper/delegation_test.go +++ b/x/distribution/keeper/delegation_test.go @@ -7,6 +7,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -17,7 +18,7 @@ import ( ) func TestCalculateRewardsBasic(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) @@ -71,7 +72,7 @@ func TestCalculateRewardsBasic(t *testing.T) { } func TestWithdrawTokenizeShareRecordReward(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(100000000)) @@ -187,7 +188,7 @@ func TestWithdrawTokenizeShareRecordReward(t *testing.T) { } func TestCalculateRewardsAfterSlash(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(100000000)) @@ -250,7 +251,7 @@ func TestCalculateRewardsAfterSlash(t *testing.T) { } func TestCalculateRewardsAfterManySlashes(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) @@ -325,7 +326,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { } func TestCalculateRewardsMultiDelegator(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) @@ -388,7 +389,7 @@ func TestCalculateRewardsMultiDelegator(t *testing.T) { } func TestWithdrawDelegationRewardsBasic(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) balancePower := int64(1000) @@ -399,7 +400,7 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) { // set module account coins distrAcc := app.DistrKeeper.GetDistributionAccount(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, distrAcc.GetName(), sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, balanceTokens)))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, distrAcc.GetName(), sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, balanceTokens)))) app.AccountKeeper.SetModuleAccount(ctx, distrAcc) // create validator with 50% commission @@ -459,7 +460,7 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) { } func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addr := simapp.AddTestAddrs(app, ctx, 1, sdk.NewInt(1000000000)) @@ -527,7 +528,7 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) { } func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) @@ -601,7 +602,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { } func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) @@ -611,7 +612,7 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) { // set module account coins distrAcc := app.DistrKeeper.GetDistributionAccount(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, distrAcc.GetName(), sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000))))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, distrAcc.GetName(), sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000))))) app.AccountKeeper.SetModuleAccount(ctx, distrAcc) tokens := sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(initial))} diff --git a/x/distribution/keeper/grpc_query_test.go b/x/distribution/keeper/grpc_query_test.go index 2690ae42..318055f2 100644 --- a/x/distribution/keeper/grpc_query_test.go +++ b/x/distribution/keeper/grpc_query_test.go @@ -11,6 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -31,7 +32,7 @@ type KeeperTestSuite struct { } func (suite *KeeperTestSuite) SetupTest() { - app := simapp.Setup(false) + app := simapp.Setup(suite.T(), false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) queryHelper := baseapp.NewQueryServerTestHelper(ctx, app.InterfaceRegistry()) @@ -625,7 +626,7 @@ func (suite *KeeperTestSuite) TestGRPCCommunityPool() { "valid request", func() { amount := sdk.NewCoins(sdk.NewInt64Coin("stake", 100)) - suite.Require().NoError(simapp.FundAccount(app.BankKeeper, ctx, addrs[0], amount)) + suite.Require().NoError(testutil.FundAccount(app.BankKeeper, ctx, addrs[0], amount)) err := app.DistrKeeper.FundCommunityPool(ctx, amount, addrs[0]) suite.Require().Nil(err) diff --git a/x/distribution/keeper/keeper_test.go b/x/distribution/keeper/keeper_test.go index f0fcf5c9..7e7039d7 100644 --- a/x/distribution/keeper/keeper_test.go +++ b/x/distribution/keeper/keeper_test.go @@ -8,12 +8,13 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) func TestSetWithdrawAddr(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1000000000)) @@ -35,7 +36,7 @@ func TestSetWithdrawAddr(t *testing.T) { } func TestWithdrawValidatorCommission(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) valCommission := sdk.DecCoins{ @@ -49,7 +50,7 @@ func TestWithdrawValidatorCommission(t *testing.T) { // set module account coins distrAcc := app.DistrKeeper.GetDistributionAccount(ctx) coins := sdk.NewCoins(sdk.NewCoin("mytoken", sdk.NewInt(2)), sdk.NewCoin("stake", sdk.NewInt(2))) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, distrAcc.GetName(), coins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, distrAcc.GetName(), coins)) app.AccountKeeper.SetModuleAccount(ctx, distrAcc) @@ -87,7 +88,7 @@ func TestWithdrawValidatorCommission(t *testing.T) { } func TestGetTotalRewards(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) valCommission := sdk.DecCoins{ @@ -108,13 +109,13 @@ func TestGetTotalRewards(t *testing.T) { } func TestFundCommunityPool(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addr := simapp.AddTestAddrs(app, ctx, 2, sdk.ZeroInt()) amount := sdk.NewCoins(sdk.NewInt64Coin("stake", 100)) - require.NoError(t, simapp.FundAccount(app.BankKeeper, ctx, addr[0], amount)) + require.NoError(t, testutil.FundAccount(app.BankKeeper, ctx, addr[0], amount)) initPool := app.DistrKeeper.GetFeePool(ctx) assert.Empty(t, initPool.CommunityPool) diff --git a/x/distribution/keeper/querier_test.go b/x/distribution/keeper/querier_test.go index 20b49807..df1bbc7a 100644 --- a/x/distribution/keeper/querier_test.go +++ b/x/distribution/keeper/querier_test.go @@ -116,7 +116,7 @@ func TestQueries(t *testing.T) { types.RegisterLegacyAminoCodec(cdc) banktypes.RegisterLegacyAminoCodec(cdc) - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addr := simapp.AddTestAddrs(app, ctx, 1, sdk.NewInt(1000000000)) diff --git a/x/distribution/module_test.go b/x/distribution/module_test.go index 2c8fd8ba..e31a3ffb 100644 --- a/x/distribution/module_test.go +++ b/x/distribution/module_test.go @@ -13,7 +13,7 @@ import ( ) func TestItCreatesModuleAccountOnInitBlock(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) app.InitChain( diff --git a/x/distribution/proposal_handler_test.go b/x/distribution/proposal_handler_test.go index 676d8d4b..b594588a 100644 --- a/x/distribution/proposal_handler_test.go +++ b/x/distribution/proposal_handler_test.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/distribution" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -25,7 +26,7 @@ func testProposal(recipient sdk.AccAddress, amount sdk.Coins) *types.CommunityPo } func TestProposalHandlerPassed(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) recipient := delAddr1 @@ -33,7 +34,7 @@ func TestProposalHandlerPassed(t *testing.T) { // add coins to the module account macc := app.DistrKeeper.GetDistributionAccount(ctx) balances := app.BankKeeper.GetAllBalances(ctx, macc.GetAddress()) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, macc.GetName(), amount)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, macc.GetName(), amount)) app.AccountKeeper.SetModuleAccount(ctx, macc) @@ -54,7 +55,7 @@ func TestProposalHandlerPassed(t *testing.T) { } func TestProposalHandlerFailed(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) recipient := delAddr1 diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index ccb26b0e..16b7036c 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -11,6 +11,7 @@ import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -144,7 +145,7 @@ func (suite *SimTestSuite) testSimulateMsgWithdrawValidatorCommission(tokenName // set module account coins distrAcc := suite.app.DistrKeeper.GetDistributionAccount(suite.ctx) - suite.Require().NoError(simapp.FundModuleAccount(suite.app.BankKeeper, suite.ctx, distrAcc.GetName(), sdk.NewCoins( + suite.Require().NoError(testutil.FundModuleAccount(suite.app.BankKeeper, suite.ctx, distrAcc.GetName(), sdk.NewCoins( sdk.NewCoin(tokenName, sdk.NewInt(10)), sdk.NewCoin("stake", sdk.NewInt(5)), ))) @@ -215,7 +216,7 @@ type SimTestSuite struct { func (suite *SimTestSuite) SetupTest() { checkTx := false - app := simapp.Setup(checkTx) + app := simapp.Setup(suite.T(), checkTx) suite.app = app suite.ctx = app.BaseApp.NewContext(checkTx, tmproto.Header{}) } @@ -230,7 +231,7 @@ func (suite *SimTestSuite) getTestingAccounts(r *rand.Rand, n int) []simtypes.Ac for _, account := range accounts { acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, account.Address) suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - suite.Require().NoError(simapp.FundAccount(suite.app.BankKeeper, suite.ctx, account.Address, initCoins)) + suite.Require().NoError(testutil.FundAccount(suite.app.BankKeeper, suite.ctx, account.Address, initCoins)) } return accounts diff --git a/x/distribution/simulation/proposals_test.go b/x/distribution/simulation/proposals_test.go index cb7a5882..14acf3cd 100644 --- a/x/distribution/simulation/proposals_test.go +++ b/x/distribution/simulation/proposals_test.go @@ -15,7 +15,7 @@ import ( ) func TestProposalContents(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) // initialize parameters diff --git a/x/slashing/abci_test.go b/x/slashing/abci_test.go index 23b39d89..c6676474 100644 --- a/x/slashing/abci_test.go +++ b/x/slashing/abci_test.go @@ -17,7 +17,7 @@ import ( ) func TestBeginBlocker(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) pks := simapp.CreateTestPubKeys(1) diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index f75a6b62..5f215e1e 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -58,7 +58,7 @@ func TestSlashingMsgs(t *testing.T) { }, } - app := simapp.SetupWithGenesisAccounts(accs, balances...) + app := simapp.SetupWithGenesisAccounts(t, accs, balances...) simapp.CheckBalance(t, app, addr1, sdk.Coins{genCoin}) description := stakingtypes.NewDescription("foo_moniker", "", "", "", "") diff --git a/x/slashing/genesis_test.go b/x/slashing/genesis_test.go index 2be6ca2a..efae2535 100644 --- a/x/slashing/genesis_test.go +++ b/x/slashing/genesis_test.go @@ -15,7 +15,7 @@ import ( ) func TestExportAndInitGenesis(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) app.SlashingKeeper.SetParams(ctx, testslashing.TestParams()) diff --git a/x/slashing/handler_test.go b/x/slashing/handler_test.go index 6882605e..b88bc8bd 100644 --- a/x/slashing/handler_test.go +++ b/x/slashing/handler_test.go @@ -23,7 +23,7 @@ import ( func TestCannotUnjailUnlessJailed(t *testing.T) { // initial setup - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) pks := simapp.CreateTestPubKeys(1) simapp.AddTestAddrsFromPubKeys(app, ctx, pks, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) @@ -49,7 +49,7 @@ func TestCannotUnjailUnlessJailed(t *testing.T) { func TestCannotUnjailUnlessMeetMinSelfDelegation(t *testing.T) { // initial setup - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) pks := simapp.CreateTestPubKeys(1) simapp.AddTestAddrsFromPubKeys(app, ctx, pks, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) @@ -80,7 +80,7 @@ func TestCannotUnjailUnlessMeetMinSelfDelegation(t *testing.T) { func TestJailedValidatorDelegations(t *testing.T) { // initial setup - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{Time: time.Unix(0, 0)}) pks := simapp.CreateTestPubKeys(3) @@ -142,7 +142,7 @@ func TestInvalidMsg(t *testing.T) { // unrevocation, starting height reset, and revocation again func TestHandleAbsentValidator(t *testing.T) { // initial setup - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{Time: time.Unix(0, 0)}) pks := simapp.CreateTestPubKeys(1) simapp.AddTestAddrsFromPubKeys(app, ctx, pks, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) diff --git a/x/slashing/keeper/grpc_query_test.go b/x/slashing/keeper/grpc_query_test.go index d0cb2f81..722a92ba 100644 --- a/x/slashing/keeper/grpc_query_test.go +++ b/x/slashing/keeper/grpc_query_test.go @@ -28,7 +28,7 @@ type SlashingTestSuite struct { } func (suite *SlashingTestSuite) SetupTest() { - app := simapp.Setup(false) + app := simapp.Setup(suite.T(), false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) app.AccountKeeper.SetParams(ctx, authtypes.DefaultParams()) diff --git a/x/slashing/keeper/keeper_test.go b/x/slashing/keeper/keeper_test.go index 7e387766..f5b54be8 100644 --- a/x/slashing/keeper/keeper_test.go +++ b/x/slashing/keeper/keeper_test.go @@ -16,7 +16,7 @@ import ( ) func TestUnJailNotBonded(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) p := app.StakingKeeper.GetParams(ctx) @@ -80,7 +80,7 @@ func TestUnJailNotBonded(t *testing.T) { // Ensure that SigningInfo.StartHeight is set correctly // and that they are not immediately jailed func TestHandleNewValidator(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) @@ -124,7 +124,7 @@ func TestHandleNewValidator(t *testing.T) { // Ensure that they're only slashed once func TestHandleAlreadyJailed(t *testing.T) { // initial setup - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) @@ -178,7 +178,7 @@ func TestValidatorDippingInAndOut(t *testing.T) { // initial setup // TestParams set the SignedBlocksWindow to 1000 and MaxMissedBlocksPerWindow to 500 - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) app.SlashingKeeper.SetParams(ctx, testslashing.TestParams()) diff --git a/x/slashing/keeper/querier_test.go b/x/slashing/keeper/querier_test.go index 9674e4d2..19302e9d 100644 --- a/x/slashing/keeper/querier_test.go +++ b/x/slashing/keeper/querier_test.go @@ -16,7 +16,7 @@ import ( ) func TestNewQuerier(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) app.SlashingKeeper.SetParams(ctx, testslashing.TestParams()) legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) @@ -34,7 +34,7 @@ func TestNewQuerier(t *testing.T) { func TestQueryParams(t *testing.T) { cdc := codec.NewLegacyAmino() legacyQuerierCdc := codec.NewAminoCodec(cdc) - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) app.SlashingKeeper.SetParams(ctx, testslashing.TestParams()) diff --git a/x/slashing/keeper/signing_info_test.go b/x/slashing/keeper/signing_info_test.go index 3ec61818..56ba117f 100644 --- a/x/slashing/keeper/signing_info_test.go +++ b/x/slashing/keeper/signing_info_test.go @@ -13,7 +13,7 @@ import ( ) func TestGetSetValidatorSigningInfo(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) @@ -37,7 +37,7 @@ func TestGetSetValidatorSigningInfo(t *testing.T) { } func TestGetSetValidatorMissedBlockBitArray(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) @@ -49,7 +49,7 @@ func TestGetSetValidatorMissedBlockBitArray(t *testing.T) { } func TestTombstoned(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) @@ -73,7 +73,7 @@ func TestTombstoned(t *testing.T) { } func TestJailUntil(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) diff --git a/x/slashing/simulation/operations_test.go b/x/slashing/simulation/operations_test.go index dd00fc4d..83f13aca 100644 --- a/x/slashing/simulation/operations_test.go +++ b/x/slashing/simulation/operations_test.go @@ -12,6 +12,7 @@ import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" distrtypes "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -22,7 +23,7 @@ import ( // TestWeightedOperations tests the weights of the operations. func TestWeightedOperations(t *testing.T) { - app, ctx := createTestApp(false) + app, ctx := createTestApp(t, false) ctx.WithChainID("test-chain") cdc := app.AppCodec() @@ -53,7 +54,7 @@ func TestWeightedOperations(t *testing.T) { // TestSimulateMsgUnjail tests the normal scenario of a valid message of type types.MsgUnjail. // Abonormal scenarios, where the message is created by an errors, are not tested here. func TestSimulateMsgUnjail(t *testing.T) { - app, ctx := createTestApp(false) + app, ctx := createTestApp(t, false) blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) @@ -103,8 +104,8 @@ func TestSimulateMsgUnjail(t *testing.T) { } // returns context and an app with updated mint keeper -func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) { - app := simapp.Setup(isCheckTx) +func createTestApp(t *testing.T, isCheckTx bool) (*simapp.SimApp, sdk.Context) { + app := simapp.Setup(t, isCheckTx) ctx := app.BaseApp.NewContext(isCheckTx, tmproto.Header{}) app.MintKeeper.SetParams(ctx, minttypes.DefaultParams()) @@ -123,7 +124,7 @@ func getTestingAccounts(t *testing.T, r *rand.Rand, app *simapp.SimApp, ctx sdk. for _, account := range accounts { acc := app.AccountKeeper.NewAccountWithAddress(ctx, account.Address) app.AccountKeeper.SetAccount(ctx, acc) - require.NoError(t, simapp.FundAccount(app.BankKeeper, ctx, account.Address, initCoins)) + require.NoError(t, testutil.FundAccount(app.BankKeeper, ctx, account.Address, initCoins)) } return accounts diff --git a/x/staking/app_test.go b/x/staking/app_test.go index 64e84c28..e6fb011f 100644 --- a/x/staking/app_test.go +++ b/x/staking/app_test.go @@ -60,7 +60,7 @@ func TestStakingMsgs(t *testing.T) { }, } - app := simapp.SetupWithGenesisAccounts(accs, balances...) + app := simapp.SetupWithGenesisAccounts(t, accs, balances...) simapp.CheckBalance(t, app, addr1, sdk.Coins{genCoin}) simapp.CheckBalance(t, app, addr2, sdk.Coins{genCoin}) diff --git a/x/staking/common_test.go b/x/staking/common_test.go index 9544dd85..209c5fda 100644 --- a/x/staking/common_test.go +++ b/x/staking/common_test.go @@ -2,6 +2,7 @@ package staking_test import ( "math/big" + "testing" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" @@ -35,8 +36,8 @@ var ( // getBaseSimappWithCustomKeeper Returns a simapp with custom StakingKeeper // to avoid messing with the hooks. -func getBaseSimappWithCustomKeeper() (*codec.LegacyAmino, *simapp.SimApp, sdk.Context) { - app := simapp.Setup(false) +func getBaseSimappWithCustomKeeper(t *testing.T) (*codec.LegacyAmino, *simapp.SimApp, sdk.Context) { + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) appCodec := app.AppCodec() diff --git a/x/staking/genesis_test.go b/x/staking/genesis_test.go index af7e1b9b..5042f0f4 100644 --- a/x/staking/genesis_test.go +++ b/x/staking/genesis_test.go @@ -13,6 +13,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/staking" @@ -20,15 +21,15 @@ import ( "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) -func bootstrapGenesisTest(numAddrs int) (*simapp.SimApp, sdk.Context, []sdk.AccAddress) { - _, app, ctx := getBaseSimappWithCustomKeeper() +func bootstrapGenesisTest(t *testing.T, numAddrs int) (*simapp.SimApp, sdk.Context, []sdk.AccAddress) { + _, app, ctx := getBaseSimappWithCustomKeeper(t) addrDels, _ := generateAddresses(app, ctx, numAddrs, sdk.NewInt(10000)) return app, ctx, addrDels } func TestInitGenesis(t *testing.T) { - app, ctx, addrs := bootstrapGenesisTest(10) + app, ctx, addrs := bootstrapGenesisTest(t, 10) valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) @@ -65,7 +66,7 @@ func TestInitGenesis(t *testing.T) { log.Printf("%#v", len(validators)) // mint coins in the bonded pool representing the validators coins require.NoError(t, - simapp.FundModuleAccount( + testutil.FundModuleAccount( app.BankKeeper, ctx, types.BondedPoolName, @@ -107,7 +108,7 @@ func TestInitGenesis(t *testing.T) { } func TestInitGenesis_PoolsBalanceMismatch(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.NewContext(false, tmproto.Header{}) consPub, err := codectypes.NewAnyWithValue(PKs[0]) @@ -155,7 +156,7 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { size := 200 require.True(t, size > 100) - app, ctx, addrs := bootstrapGenesisTest(200) + app, ctx, addrs := bootstrapGenesisTest(t, 200) params := app.StakingKeeper.GetParams(ctx) delegations := []types.Delegation{} @@ -183,7 +184,7 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { // mint coins in the bonded pool representing the validators coins require.NoError(t, - simapp.FundModuleAccount( + testutil.FundModuleAccount( app.BankKeeper, ctx, types.BondedPoolName, diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index 1c09b1e7..835ebe80 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -17,6 +17,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/staking" @@ -27,7 +28,7 @@ import ( ) func bootstrapHandlerGenesisTest(t *testing.T, power int64, numAddrs int, accAmount sdk.Int) (*simapp.SimApp, sdk.Context, []sdk.AccAddress, []sdk.ValAddress) { - _, app, ctx := getBaseSimappWithCustomKeeper() + _, app, ctx := getBaseSimappWithCustomKeeper(t) addrDels, addrVals := generateAddresses(app, ctx, numAddrs, accAmount) @@ -38,7 +39,7 @@ func bootstrapHandlerGenesisTest(t *testing.T, power int64, numAddrs int, accAmo // set non bonded pool balance app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), totalSupply)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), totalSupply)) return app, ctx, addrDels, addrVals } diff --git a/x/staking/keeper/common_test.go b/x/staking/keeper/common_test.go index b227c335..c583de6d 100644 --- a/x/staking/keeper/common_test.go +++ b/x/staking/keeper/common_test.go @@ -24,8 +24,8 @@ func init() { // createTestInput Returns a simapp with custom StakingKeeper // to avoid messing with the hooks. -func createTestInput() (*codec.LegacyAmino, *simapp.SimApp, sdk.Context) { - app := simapp.Setup(false) +func createTestInput(t *testing.T) (*codec.LegacyAmino, *simapp.SimApp, sdk.Context) { + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) app.StakingKeeper = keeper.NewKeeper( diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index e07fe5a3..746febff 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" @@ -17,7 +18,7 @@ import ( // tests GetDelegation, GetDelegatorDelegations, SetDelegation, RemoveDelegation, GetDelegatorDelegations func TestDelegation(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 3, sdk.NewInt(10000)) valAddrs := simapp.ConvertAddrsToValAddrs(addrDels) @@ -133,7 +134,7 @@ func TestDelegation(t *testing.T) { // tests Get/Set/Remove UnbondingDelegation func TestUnbondingDelegation(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) delAddrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(10000)) valAddrs := simapp.ConvertAddrsToValAddrs(delAddrs) @@ -179,7 +180,7 @@ func TestUnbondingDelegation(t *testing.T) { } func TestUnbondDelegation(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) delAddrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.NewInt(10000)) valAddrs := simapp.ConvertAddrsToValAddrs(delAddrs) @@ -187,7 +188,7 @@ func TestUnbondDelegation(t *testing.T) { startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)))) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator and a delegator to that validator @@ -218,7 +219,7 @@ func TestUnbondDelegation(t *testing.T) { } func TestUnbondingDelegationsMaxEntries(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.NewInt(10000)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -228,7 +229,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { bondDenom := app.StakingKeeper.BondDenom(ctx) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator and a delegator to that validator @@ -300,7 +301,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { //// test undelegating self delegation from a validator pushing it below MinSelfDelegation //// shift it from the bonded to unbonding state and jailed func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.NewInt(10000)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -316,7 +317,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) @@ -328,7 +329,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { // add bonded tokens to pool for delegations bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) // create a second delegation to this validator @@ -338,7 +339,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { require.Equal(t, delTokens, issuedShares.RoundInt()) // add bonded tokens to pool for delegations - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) @@ -360,7 +361,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { } func TestUndelegateFromUnbondingValidator(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) @@ -376,7 +377,7 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) @@ -387,7 +388,7 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { // add bonded tokens to pool for delegations bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) // create a second delegation to this validator @@ -396,14 +397,14 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { validator, issuedShares = validator.AddTokensFromDel(delTokens) require.Equal(t, delTokens, issuedShares.RoundInt()) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) delegation := types.NewDelegation(addrDels[1], addrVals[0], issuedShares) app.StakingKeeper.SetDelegation(ctx, delegation) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) header := ctx.BlockHeader() @@ -446,7 +447,7 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { } func TestUndelegateFromUnbondedValidator(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) @@ -455,7 +456,7 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator with a self-delegation @@ -474,7 +475,7 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { // add bonded tokens to pool for delegations bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) // create a second delegation to this validator @@ -527,7 +528,7 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { } func TestUnbondingAllDelegationFromValidator(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) @@ -536,7 +537,7 @@ func TestUnbondingAllDelegationFromValidator(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) //create a validator with a self-delegation @@ -561,7 +562,7 @@ func TestUnbondingAllDelegationFromValidator(t *testing.T) { // add bonded tokens to pool for delegations bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) @@ -600,7 +601,7 @@ func TestUnbondingAllDelegationFromValidator(t *testing.T) { // Make sure that that the retrieving the delegations doesn't affect the state func TestGetRedelegationsFromSrcValidator(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -627,7 +628,7 @@ func TestGetRedelegationsFromSrcValidator(t *testing.T) { // tests Get/Set/Remove/Has UnbondingDelegation func TestRedelegation(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -690,7 +691,7 @@ func TestRedelegation(t *testing.T) { } func TestRedelegateToSameValidator(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -700,7 +701,7 @@ func TestRedelegateToSameValidator(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator with a self-delegation @@ -719,7 +720,7 @@ func TestRedelegateToSameValidator(t *testing.T) { } func TestRedelegationMaxEntries(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -729,7 +730,7 @@ func TestRedelegationMaxEntries(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator with a self-delegation @@ -775,7 +776,7 @@ func TestRedelegationMaxEntries(t *testing.T) { } func TestRedelegateSelfDelegation(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -785,7 +786,7 @@ func TestRedelegateSelfDelegation(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) //create a validator with a self-delegation @@ -831,7 +832,7 @@ func TestRedelegateSelfDelegation(t *testing.T) { } func TestRedelegateFromUnbondingValidator(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -841,7 +842,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) //create a validator with a self-delegation @@ -913,7 +914,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { } func TestRedelegateFromUnbondedValidator(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -923,7 +924,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) //create a validator with a self-delegation diff --git a/x/staking/keeper/historical_info_test.go b/x/staking/keeper/historical_info_test.go index e67927b8..43c7b01d 100644 --- a/x/staking/keeper/historical_info_test.go +++ b/x/staking/keeper/historical_info_test.go @@ -25,7 +25,7 @@ func IsValSetSorted(data []types.Validator, powerReduction sdk.Int) bool { } func TestHistoricalInfo(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 50, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -52,7 +52,7 @@ func TestHistoricalInfo(t *testing.T) { } func TestTrackHistoricalInfo(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 50, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -130,7 +130,7 @@ func TestTrackHistoricalInfo(t *testing.T) { } func TestGetAllHistoricalInfo(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 50, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) diff --git a/x/staking/keeper/keeper_test.go b/x/staking/keeper/keeper_test.go index d13770f1..53d37145 100644 --- a/x/staking/keeper/keeper_test.go +++ b/x/staking/keeper/keeper_test.go @@ -26,7 +26,7 @@ type KeeperTestSuite struct { } func (suite *KeeperTestSuite) SetupTest() { - app := simapp.Setup(false) + app := simapp.Setup(suite.T(), false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) querier := keeper.Querier{Keeper: app.StakingKeeper} @@ -51,7 +51,7 @@ func (suite *KeeperTestSuite) SetupTest() { suite.app, suite.ctx, suite.queryClient, suite.addrs, suite.vals = app, ctx, queryClient, addrs, validators } func TestParams(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) expParams := types.DefaultParams() diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 7d435ecb..efdb598c 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -17,7 +17,7 @@ import ( ) func TestTokenizeSharesAndRedeemTokens(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) testCases := []struct { name string @@ -117,7 +117,7 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - _, app, ctx = createTestInput() + _, app, ctx = createTestInput(t) addrs := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000)) addrAcc1, addrAcc2 := addrs[0], addrs[1] addrVal1, addrVal2 := sdk.ValAddress(addrAcc1), sdk.ValAddress(addrAcc2) @@ -294,7 +294,7 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { } func TestTransferTokenizeShareRecord(t *testing.T) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrs := simapp.AddTestAddrs(app, ctx, 3, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000)) addrAcc1, addrAcc2, valAcc := addrs[0], addrs[1], addrs[2] diff --git a/x/staking/keeper/querier_test.go b/x/staking/keeper/querier_test.go index 944a0d97..a66a6978 100644 --- a/x/staking/keeper/querier_test.go +++ b/x/staking/keeper/querier_test.go @@ -18,7 +18,7 @@ import ( ) func TestNewQuerier(t *testing.T) { - cdc, app, ctx := createTestInput() + cdc, app, ctx := createTestInput(t) addrs := simapp.AddTestAddrs(app, ctx, 500, sdk.NewInt(10000)) _, addrAcc2 := addrs[0], addrs[1] @@ -110,7 +110,7 @@ func TestNewQuerier(t *testing.T) { } func TestQueryParametersPool(t *testing.T) { - cdc, app, ctx := createTestInput() + cdc, app, ctx := createTestInput(t) legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino) @@ -136,7 +136,7 @@ func TestQueryParametersPool(t *testing.T) { } func TestQueryValidators(t *testing.T) { - cdc, app, ctx := createTestInput() + cdc, app, ctx := createTestInput(t) params := app.StakingKeeper.GetParams(ctx) legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino) @@ -204,7 +204,7 @@ func TestQueryValidators(t *testing.T) { } func TestQueryDelegation(t *testing.T) { - cdc, app, ctx := createTestInput() + cdc, app, ctx := createTestInput(t) params := app.StakingKeeper.GetParams(ctx) legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino) @@ -453,7 +453,7 @@ func TestQueryValidatorDelegations_Pagination(t *testing.T) { }, } - cdc, app, ctx := createTestInput() + cdc, app, ctx := createTestInput(t) legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino) @@ -538,7 +538,7 @@ func TestQueryValidatorDelegations_Pagination(t *testing.T) { } func TestQueryRedelegations(t *testing.T) { - cdc, app, ctx := createTestInput() + cdc, app, ctx := createTestInput(t) legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino) @@ -610,7 +610,7 @@ func TestQueryRedelegations(t *testing.T) { } func TestQueryUnbondingDelegation(t *testing.T) { - cdc, app, ctx := createTestInput() + cdc, app, ctx := createTestInput(t) legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino) @@ -706,7 +706,7 @@ func TestQueryUnbondingDelegation(t *testing.T) { } func TestQueryHistoricalInfo(t *testing.T) { - cdc, app, ctx := createTestInput() + cdc, app, ctx := createTestInput(t) legacyQuerierCdc := codec.NewAminoCodec(cdc) querier := keeper.NewQuerier(app.StakingKeeper, legacyQuerierCdc.LegacyAmino) diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index 0709b875..80fa6227 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -9,6 +9,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" @@ -18,7 +19,7 @@ import ( // bootstrapSlashTest creates 3 validators and bootstrap the app. func bootstrapSlashTest(t *testing.T, power int64) (*simapp.SimApp, sdk.Context, []sdk.AccAddress, []sdk.ValAddress) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(t) addrDels, addrVals := generateAddresses(app, ctx, 100) @@ -26,7 +27,7 @@ func bootstrapSlashTest(t *testing.T, power int64) (*simapp.SimApp, sdk.Context, totalSupply := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), amt.MulRaw(int64(len(addrDels))))) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), totalSupply)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), totalSupply)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) @@ -36,7 +37,7 @@ func bootstrapSlashTest(t *testing.T, power int64) (*simapp.SimApp, sdk.Context, // set bonded pool balance app.AccountKeeper.SetModuleAccount(ctx, bondedPool) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), bondedCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), bondedCoins)) for i := int64(0); i < numVals; i++ { validator := teststaking.NewValidator(t, addrVals[i], PKs[i]) @@ -126,7 +127,7 @@ func TestSlashRedelegation(t *testing.T) { bondedPool := app.StakingKeeper.GetBondedPool(ctx) balances := app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), startCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), startCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) // set a redelegation with an expiration timestamp beyond which the @@ -403,7 +404,7 @@ func TestSlashWithRedelegation(t *testing.T) { notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) rdCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, rdTokens.MulRaw(2))) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), rdCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), rdCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) @@ -566,8 +567,8 @@ func TestSlashBoth(t *testing.T) { bondedPool := app.StakingKeeper.GetBondedPool(ctx) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), bondedCoins)) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), notBondedCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), bondedCoins)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), notBondedCoins)) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) diff --git a/x/staking/keeper/validator_test.go b/x/staking/keeper/validator_test.go index e53700ed..482b4115 100644 --- a/x/staking/keeper/validator_test.go +++ b/x/staking/keeper/validator_test.go @@ -12,6 +12,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" @@ -26,7 +27,7 @@ func newMonikerValidator(t testing.TB, operator sdk.ValAddress, pubKey cryptotyp } func bootstrapValidatorTest(t testing.TB, power int64, numAddrs int) (*simapp.SimApp, sdk.Context, []sdk.AccAddress, []sdk.ValAddress) { - _, app, ctx := createTestInput() + _, app, ctx := createTestInput(&testing.T{}) addrDels, addrVals := generateAddresses(app, ctx, numAddrs) @@ -37,7 +38,7 @@ func bootstrapValidatorTest(t testing.TB, power int64, numAddrs int) (*simapp.Si // set bonded pool supply app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), totalSupply)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), totalSupply)) return app, ctx, addrDels, addrVals } @@ -114,8 +115,8 @@ func TestUpdateValidatorByPowerIndex(t *testing.T) { bondedPool := app.StakingKeeper.GetBondedPool(ctx) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 1234))))) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 1234))))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))))) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) @@ -163,8 +164,8 @@ func TestUpdateBondedValidatorsDecreaseCliff(t *testing.T) { app.StakingKeeper.SetParams(ctx, params) // create a random pool - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 1234))))) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 1234))))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 10000))))) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) @@ -218,7 +219,7 @@ func TestSlashToZeroPowerRemoved(t *testing.T) { bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), valTokens)))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), valTokens)))) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) @@ -423,8 +424,8 @@ func TestGetValidatorSortingMixed(t *testing.T) { bondedPool := app.StakingKeeper.GetBondedPool(ctx) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 501))))) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 0))))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 501))))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), app.StakingKeeper.TokensFromConsensusPower(ctx, 0))))) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) @@ -498,7 +499,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) { validators[i], _ = validators[i].AddTokensFromDel(tokens) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(params.BondDenom, tokens)))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(params.BondDenom, tokens)))) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) validators[i] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[i], true) } @@ -517,7 +518,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) { newTokens := sdk.NewCoins() - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), newTokens)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), newTokens)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // test that the two largest validators are @@ -549,7 +550,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) { notBondedPool = app.StakingKeeper.GetNotBondedPool(ctx) newTokens = sdk.NewCoins(sdk.NewCoin(params.BondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 1))) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), newTokens)) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), newTokens)) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) validators[3] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[3], true) @@ -564,7 +565,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) { validators[3], _ = validators[3].RemoveDelShares(sdk.NewDec(201)) bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(params.BondDenom, rmTokens)))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(params.BondDenom, rmTokens)))) app.AccountKeeper.SetModuleAccount(ctx, bondedPool) validators[3] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[3], true) @@ -578,7 +579,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) { validators[3], _ = validators[3].AddTokensFromDel(sdk.NewInt(200)) notBondedPool = app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(params.BondDenom, sdk.NewInt(200))))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(params.BondDenom, sdk.NewInt(200))))) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) validators[3] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[3], true) diff --git a/x/staking/module_test.go b/x/staking/module_test.go index 73f9f230..0ab9628a 100644 --- a/x/staking/module_test.go +++ b/x/staking/module_test.go @@ -13,7 +13,7 @@ import ( ) func TestItCreatesModuleAccountOnInitBlock(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) app.InitChain( diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index 897a0f87..e8958f82 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -12,6 +12,7 @@ import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" distrtypes "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -23,7 +24,7 @@ import ( // TestWeightedOperations tests the weights of the operations. func TestWeightedOperations(t *testing.T) { - app, ctx := createTestApp(false) + app, ctx := createTestApp(t, false) ctx.WithChainID("test-chain") @@ -66,7 +67,7 @@ func TestWeightedOperations(t *testing.T) { // TestSimulateMsgCreateValidator tests the normal scenario of a valid message of type TypeMsgCreateValidator. // Abonormal scenarios, where the message are created by an errors are not tested here. func TestSimulateMsgCreateValidator(t *testing.T) { - app, ctx := createTestApp(false) + app, ctx := createTestApp(t, false) // setup 3 accounts s := rand.NewSource(1) @@ -98,7 +99,7 @@ func TestSimulateMsgCreateValidator(t *testing.T) { // TestSimulateMsgEditValidator tests the normal scenario of a valid message of type TypeMsgEditValidator. // Abonormal scenarios, where the message is created by an errors are not tested here. func TestSimulateMsgEditValidator(t *testing.T) { - app, ctx := createTestApp(false) + app, ctx := createTestApp(t, false) blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) @@ -135,7 +136,7 @@ func TestSimulateMsgEditValidator(t *testing.T) { // TestSimulateMsgDelegate tests the normal scenario of a valid message of type TypeMsgDelegate. // Abonormal scenarios, where the message is created by an errors are not tested here. func TestSimulateMsgDelegate(t *testing.T) { - app, ctx := createTestApp(false) + app, ctx := createTestApp(t, false) blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) @@ -171,7 +172,7 @@ func TestSimulateMsgDelegate(t *testing.T) { // TestSimulateMsgUndelegate tests the normal scenario of a valid message of type TypeMsgUndelegate. // Abonormal scenarios, where the message is created by an errors are not tested here. func TestSimulateMsgUndelegate(t *testing.T) { - app, ctx := createTestApp(false) + app, ctx := createTestApp(t, false) blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) @@ -217,7 +218,7 @@ func TestSimulateMsgUndelegate(t *testing.T) { // TestSimulateMsgBeginRedelegate tests the normal scenario of a valid message of type TypeMsgBeginRedelegate. // Abonormal scenarios, where the message is created by an errors, are not tested here. func TestSimulateMsgBeginRedelegate(t *testing.T) { - app, ctx := createTestApp(false) + app, ctx := createTestApp(t, false) blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) @@ -265,9 +266,9 @@ func TestSimulateMsgBeginRedelegate(t *testing.T) { } // returns context and an app with updated mint keeper -func createTestApp(isCheckTx bool) (*simapp.SimApp, sdk.Context) { +func createTestApp(t *testing.T, isCheckTx bool) (*simapp.SimApp, sdk.Context) { // sdk.PowerReduction = sdk.NewIntFromBigInt(new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil)) - app := simapp.Setup(isCheckTx) + app := simapp.Setup(t, isCheckTx) ctx := app.BaseApp.NewContext(isCheckTx, tmproto.Header{}) app.MintKeeper.SetParams(ctx, minttypes.DefaultParams()) @@ -286,7 +287,7 @@ func getTestingAccounts(t *testing.T, r *rand.Rand, app *simapp.SimApp, ctx sdk. for _, account := range accounts { acc := app.AccountKeeper.NewAccountWithAddress(ctx, account.Address) app.AccountKeeper.SetAccount(ctx, acc) - require.NoError(t, simapp.FundAccount(app.BankKeeper, ctx, account.Address, initCoins)) + require.NoError(t, testutil.FundAccount(app.BankKeeper, ctx, account.Address, initCoins)) } return accounts diff --git a/x/staking/types/authz_test.go b/x/staking/types/authz_test.go index ddaaa66a..b7ecff84 100644 --- a/x/staking/types/authz_test.go +++ b/x/staking/types/authz_test.go @@ -21,7 +21,7 @@ var ( ) func TestAuthzAuthorizations(t *testing.T) { - app := simapp.Setup(false) + app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) // verify ValidateBasic returns error for the AUTHORIZATION_TYPE_UNSPECIFIED authorization type From 30b9d6b06aebe5058a9de753a097419670ee9a1b Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 17 Mar 2022 12:11:06 +1000 Subject: [PATCH 04/57] min commission rate addition --- app/test_helpers.go | 5 +- cmd/liquidstakingd/cmd/testnet.go | 2 +- go.mod | 1 + proto/staking/v1beta1/staking.proto | 17 +- x/staking/keeper/params.go | 9 +- x/staking/simulation/genesis.go | 9 +- x/staking/types/params.go | 34 +- x/staking/types/staking.pb.go | 1589 ++++++++++++++------------- 8 files changed, 889 insertions(+), 777 deletions(-) diff --git a/app/test_helpers.go b/app/test_helpers.go index 364891a5..ee80f474 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -34,7 +34,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + stdstaking "github.com/cosmos/cosmos-sdk/x/staking/types" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) // DefaultConsensusParams defines the default Tendermint consensus params used in @@ -165,7 +166,7 @@ func genesisStateWithValSet(t *testing.T, OperatorAddress: sdk.ValAddress(val.Address).String(), ConsensusPubkey: pkAny, Jailed: false, - Status: stakingtypes.Bonded, + Status: stdstaking.Bonded, Tokens: bondAmt, DelegatorShares: sdk.OneDec(), Description: stakingtypes.Description{}, diff --git a/cmd/liquidstakingd/cmd/testnet.go b/cmd/liquidstakingd/cmd/testnet.go index d8c61fe1..1ce39073 100644 --- a/cmd/liquidstakingd/cmd/testnet.go +++ b/cmd/liquidstakingd/cmd/testnet.go @@ -34,7 +34,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) var ( diff --git a/go.mod b/go.mod index 6c549e2a..a012db89 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( google.golang.org/grpc v1.44.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 + sigs.k8s.io/yaml v1.3.0 // indirect ) replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/proto/staking/v1beta1/staking.proto b/proto/staking/v1beta1/staking.proto index d6751f77..38ca4a5a 100644 --- a/proto/staking/v1beta1/staking.proto +++ b/proto/staking/v1beta1/staking.proto @@ -272,16 +272,21 @@ message Params { option (gogoproto.goproto_stringer) = false; // unbonding_time is the time duration of unbonding. - google.protobuf.Duration unbonding_time = 1 - [(gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"unbonding_time\""]; + google.protobuf.Duration unbonding_time = 1 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true]; // max_validators is the maximum number of validators. - uint32 max_validators = 2 [(gogoproto.moretags) = "yaml:\"max_validators\""]; + uint32 max_validators = 2; // max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio). - uint32 max_entries = 3 [(gogoproto.moretags) = "yaml:\"max_entries\""]; + uint32 max_entries = 3; // historical_entries is the number of historical entries to persist. - uint32 historical_entries = 4 [(gogoproto.moretags) = "yaml:\"historical_entries\""]; + uint32 historical_entries = 4; // bond_denom defines the bondable coin denomination. - string bond_denom = 5 [(gogoproto.moretags) = "yaml:\"bond_denom\""]; + string bond_denom = 5; + // min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators + string min_commission_rate = 6 [ + (gogoproto.moretags) = "yaml:\"min_commission_rate\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false + ]; } // DelegationResponse is equivalent to Delegation except that it contains a diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index e3a787bc..fb9898e8 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -47,7 +47,13 @@ func (k Keeper) PowerReduction(ctx sdk.Context) sdk.Int { return sdk.DefaultPowerReduction } -// Get all parameteras as types.Params +// MinCommissionRate - Minimum validator commission rate +func (k Keeper) MinCommissionRate(ctx sdk.Context) (res sdk.Dec) { + k.paramstore.Get(ctx, types.KeyMinCommissionRate, &res) + return +} + +// Get all parameters as types.Params func (k Keeper) GetParams(ctx sdk.Context) types.Params { return types.NewParams( k.UnbondingTime(ctx), @@ -55,6 +61,7 @@ func (k Keeper) GetParams(ctx sdk.Context) types.Params { k.MaxEntries(ctx), k.HistoricalEntries(ctx), k.BondDenom(ctx), + k.MinCommissionRate(ctx), ) } diff --git a/x/staking/simulation/genesis.go b/x/staking/simulation/genesis.go index 3b79e57e..82bc5117 100644 --- a/x/staking/simulation/genesis.go +++ b/x/staking/simulation/genesis.go @@ -40,9 +40,10 @@ func getHistEntries(r *rand.Rand) uint32 { func RandomizedGenState(simState *module.SimulationState) { // params var ( - unbondTime time.Duration - maxVals uint32 - histEntries uint32 + unbondTime time.Duration + maxVals uint32 + histEntries uint32 + minCommissionRate sdk.Dec ) simState.AppParams.GetOrGenerate( @@ -63,7 +64,7 @@ func RandomizedGenState(simState *module.SimulationState) { // NOTE: the slashing module need to be defined after the staking module on the // NewSimulationManager constructor for this to work simState.UnbondTime = unbondTime - params := types.NewParams(simState.UnbondTime, maxVals, 7, histEntries, sdk.DefaultBondDenom) + params := types.NewParams(simState.UnbondTime, maxVals, 7, histEntries, sdk.DefaultBondDenom, minCommissionRate) // validators & delegations var ( diff --git a/x/staking/types/params.go b/x/staking/types/params.go index 8ccae6b5..cb9def63 100644 --- a/x/staking/types/params.go +++ b/x/staking/types/params.go @@ -6,7 +6,7 @@ import ( "strings" "time" - yaml "gopkg.in/yaml.v2" + "sigs.k8s.io/yaml" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" @@ -32,13 +32,18 @@ const ( DefaultHistoricalEntries uint32 = 10000 ) +var ( + // DefaultMinCommissionRate is set to 0% + DefaultMinCommissionRate = sdk.ZeroDec() +) + var ( KeyUnbondingTime = []byte("UnbondingTime") KeyMaxValidators = []byte("MaxValidators") KeyMaxEntries = []byte("MaxEntries") KeyBondDenom = []byte("BondDenom") KeyHistoricalEntries = []byte("HistoricalEntries") - KeyPowerReduction = []byte("PowerReduction") + KeyMinCommissionRate = []byte("MinCommissionRate") ) var _ paramtypes.ParamSet = (*Params)(nil) @@ -49,13 +54,14 @@ func ParamKeyTable() paramtypes.KeyTable { } // NewParams creates a new Params instance -func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historicalEntries uint32, bondDenom string) Params { +func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historicalEntries uint32, bondDenom string, minCommissionRate sdk.Dec) Params { return Params{ UnbondingTime: unbondingTime, MaxValidators: maxValidators, MaxEntries: maxEntries, HistoricalEntries: historicalEntries, BondDenom: bondDenom, + MinCommissionRate: minCommissionRate, } } @@ -67,6 +73,7 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(KeyMaxEntries, &p.MaxEntries, validateMaxEntries), paramtypes.NewParamSetPair(KeyHistoricalEntries, &p.HistoricalEntries, validateHistoricalEntries), paramtypes.NewParamSetPair(KeyBondDenom, &p.BondDenom, validateBondDenom), + paramtypes.NewParamSetPair(KeyMinCommissionRate, &p.MinCommissionRate, validateMinCommissionRate), } } @@ -78,6 +85,7 @@ func DefaultParams() Params { DefaultMaxEntries, DefaultHistoricalEntries, sdk.DefaultBondDenom, + DefaultMinCommissionRate, ) } @@ -125,6 +133,10 @@ func (p Params) Validate() error { return err } + if err := validateMinCommissionRate(p.MinCommissionRate); err != nil { + return err + } + return nil } @@ -205,3 +217,19 @@ func ValidatePowerReduction(i interface{}) error { return nil } + +func validateMinCommissionRate(i interface{}) error { + v, ok := i.(sdk.Dec) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + if v.IsNegative() { + return fmt.Errorf("minimum commission rate cannot be negative: %s", v) + } + if v.GT(sdk.OneDec()) { + return fmt.Errorf("minimum commission rate cannot be greater than 100%%: %s", v) + } + + return nil +} diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 86758b07..3af9cec2 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -836,15 +836,17 @@ var xxx_messageInfo_Redelegation proto.InternalMessageInfo // Params defines the parameters for the staking module. type Params struct { // unbonding_time is the time duration of unbonding. - UnbondingTime time.Duration `protobuf:"bytes,1,opt,name=unbonding_time,json=unbondingTime,proto3,stdduration" json:"unbonding_time" yaml:"unbonding_time"` + UnbondingTime time.Duration `protobuf:"bytes,1,opt,name=unbonding_time,json=unbondingTime,proto3,stdduration" json:"unbonding_time"` // max_validators is the maximum number of validators. - MaxValidators uint32 `protobuf:"varint,2,opt,name=max_validators,json=maxValidators,proto3" json:"max_validators,omitempty" yaml:"max_validators"` + MaxValidators uint32 `protobuf:"varint,2,opt,name=max_validators,json=maxValidators,proto3" json:"max_validators,omitempty"` // max_entries is the max entries for either unbonding delegation or redelegation (per pair/trio). - MaxEntries uint32 `protobuf:"varint,3,opt,name=max_entries,json=maxEntries,proto3" json:"max_entries,omitempty" yaml:"max_entries"` + MaxEntries uint32 `protobuf:"varint,3,opt,name=max_entries,json=maxEntries,proto3" json:"max_entries,omitempty"` // historical_entries is the number of historical entries to persist. - HistoricalEntries uint32 `protobuf:"varint,4,opt,name=historical_entries,json=historicalEntries,proto3" json:"historical_entries,omitempty" yaml:"historical_entries"` + HistoricalEntries uint32 `protobuf:"varint,4,opt,name=historical_entries,json=historicalEntries,proto3" json:"historical_entries,omitempty"` // bond_denom defines the bondable coin denomination. - BondDenom string `protobuf:"bytes,5,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty" yaml:"bond_denom"` + BondDenom string `protobuf:"bytes,5,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty"` + // min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators + MinCommissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=min_commission_rate,json=minCommissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"min_commission_rate" yaml:"min_commission_rate"` } func (m *Params) Reset() { *m = Params{} } @@ -1214,127 +1216,126 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/staking.proto", fileDescriptor_76a7656dabf68054) } var fileDescriptor_76a7656dabf68054 = []byte{ - // 1913 bytes of a gzipped FileDescriptorProto + // 1898 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x5b, 0x59, - 0x15, 0xf6, 0x73, 0xdc, 0xfc, 0x1c, 0x27, 0x71, 0x72, 0x9b, 0x76, 0x5c, 0xd3, 0xc6, 0xe6, 0x49, - 0x33, 0x4a, 0x0b, 0x75, 0x98, 0x0c, 0x9a, 0x81, 0x6e, 0x20, 0x8e, 0x53, 0x12, 0x4d, 0xe9, 0x44, - 0x2f, 0x3f, 0x03, 0x03, 0x92, 0x75, 0xfd, 0xde, 0x8d, 0x73, 0xc9, 0xfb, 0x71, 0xdf, 0xbd, 0xee, - 0xc4, 0x68, 0x16, 0x2c, 0x47, 0x95, 0x10, 0x85, 0xd5, 0x6c, 0x2a, 0x55, 0x62, 0x87, 0x90, 0x90, - 0x10, 0x62, 0xcf, 0x6e, 0x40, 0x42, 0xaa, 0x58, 0x8d, 0x10, 0x32, 0xa8, 0x15, 0x12, 0x62, 0x85, - 0xb2, 0x40, 0xec, 0x40, 0xf7, 0xe7, 0xfd, 0xe4, 0xb9, 0x33, 0xae, 0xa3, 0x59, 0x8c, 0xc4, 0x6c, - 0x12, 0xdf, 0x73, 0xcf, 0xf9, 0xce, 0x3b, 0xbf, 0xf7, 0xdc, 0x0b, 0xd7, 0x18, 0xc7, 0xc7, 0xd4, - 0xef, 0xac, 0xde, 0x7f, 0xb5, 0x4d, 0x38, 0x7e, 0x75, 0x55, 0xaf, 0xeb, 0xdd, 0x30, 0xe0, 0x01, - 0xba, 0xe6, 0xd2, 0x7b, 0x3d, 0xea, 0x44, 0xc4, 0xe8, 0xbf, 0x66, 0xae, 0x2c, 0x75, 0x82, 0x4e, - 0x20, 0x39, 0x57, 0xc5, 0x2f, 0x25, 0x54, 0xb9, 0xd2, 0x09, 0x82, 0x8e, 0x4b, 0x56, 0xe5, 0xaa, - 0xdd, 0x3b, 0x5c, 0xc5, 0x7e, 0x5f, 0x6f, 0x2d, 0x67, 0xb7, 0x9c, 0x5e, 0x88, 0x39, 0x0d, 0x7c, - 0xbd, 0x5f, 0xcd, 0xee, 0x73, 0xea, 0x11, 0xc6, 0xb1, 0xd7, 0x8d, 0xb0, 0xed, 0x80, 0x79, 0x01, - 0x6b, 0x29, 0xa5, 0x6a, 0x11, 0x61, 0xab, 0xd5, 0x6a, 0x1b, 0x33, 0x12, 0x9b, 0x63, 0x07, 0x34, - 0xc2, 0xbe, 0xca, 0x89, 0xef, 0x90, 0xd0, 0xa3, 0x3e, 0x5f, 0xe5, 0xfd, 0x2e, 0x61, 0xea, 0xaf, - 0xda, 0x35, 0x1f, 0x1a, 0x30, 0xbf, 0x45, 0x19, 0x0f, 0x42, 0x6a, 0x63, 0x77, 0xdb, 0x3f, 0x0c, - 0xd0, 0xeb, 0x30, 0x79, 0x44, 0xb0, 0x43, 0xc2, 0xb2, 0x51, 0x33, 0x56, 0x8a, 0x6b, 0xe5, 0x7a, - 0x82, 0x50, 0x57, 0xb2, 0x5b, 0x72, 0xbf, 0x51, 0xf8, 0x70, 0x50, 0xcd, 0x59, 0x9a, 0x1b, 0xdd, - 0x86, 0xc9, 0xfb, 0xd8, 0x65, 0x84, 0x97, 0xf3, 0xb5, 0x89, 0x95, 0xe2, 0xda, 0x4a, 0xfd, 0x13, - 0xbd, 0x58, 0x3f, 0xc0, 0x2e, 0x75, 0x30, 0x0f, 0x62, 0x1c, 0x25, 0x6d, 0xfe, 0x2a, 0x0f, 0xa5, - 0x8d, 0xc0, 0xf3, 0x28, 0x63, 0x34, 0xf0, 0x2d, 0xcc, 0x09, 0x43, 0x0d, 0x28, 0x84, 0x98, 0x13, - 0xf9, 0x45, 0x33, 0x8d, 0xba, 0xe0, 0xff, 0xf3, 0xa0, 0xfa, 0x4a, 0x87, 0xf2, 0xa3, 0x5e, 0xbb, - 0x6e, 0x07, 0x9e, 0xf6, 0x89, 0xfe, 0x77, 0x93, 0x39, 0xc7, 0xda, 0xcc, 0x26, 0xb1, 0x2d, 0x29, - 0x8b, 0xbe, 0x0f, 0xd3, 0x1e, 0x3e, 0x69, 0x49, 0x9c, 0xbc, 0xc4, 0x59, 0x1f, 0x0f, 0xe7, 0x74, - 0x50, 0x2d, 0xf5, 0xb1, 0xe7, 0xde, 0x32, 0x23, 0x1c, 0xd3, 0x9a, 0xf2, 0xf0, 0x89, 0xf8, 0x44, - 0xd4, 0x85, 0x92, 0xa0, 0xda, 0x47, 0xd8, 0xef, 0x10, 0xa5, 0x64, 0x42, 0x2a, 0xd9, 0x1a, 0x5b, - 0xc9, 0xe5, 0x44, 0x49, 0x0a, 0xce, 0xb4, 0xe6, 0x3c, 0x7c, 0xb2, 0x21, 0x09, 0x42, 0xe3, 0xad, - 0xe9, 0x0f, 0x1e, 0x57, 0x73, 0xff, 0x78, 0x5c, 0x35, 0xcc, 0x8f, 0x0c, 0x80, 0xc4, 0x63, 0xc8, - 0x86, 0x05, 0x3b, 0x5e, 0x49, 0x59, 0xa6, 0x43, 0x59, 0x1f, 0x11, 0x92, 0x8c, 0xdb, 0x1b, 0xd3, - 0xe2, 0xdb, 0x9f, 0x0c, 0xaa, 0x86, 0x55, 0xb2, 0x33, 0x11, 0xf9, 0x1e, 0x14, 0x7b, 0x5d, 0x07, - 0x73, 0xd2, 0x12, 0xb9, 0x2a, 0x1d, 0x5a, 0x5c, 0xab, 0xd4, 0x55, 0x22, 0xd7, 0xa3, 0x44, 0xae, - 0xef, 0x45, 0x89, 0xdc, 0x58, 0x16, 0x58, 0xa7, 0x83, 0x2a, 0x52, 0xd6, 0xa5, 0x84, 0xcd, 0x87, - 0x7f, 0xad, 0x1a, 0x16, 0x28, 0x8a, 0x10, 0x48, 0x99, 0xf6, 0x7b, 0x03, 0x8a, 0x4d, 0xc2, 0xec, - 0x90, 0x76, 0x45, 0xbd, 0xa0, 0x32, 0x4c, 0x79, 0x81, 0x4f, 0x8f, 0x75, 0x76, 0xce, 0x58, 0xd1, - 0x12, 0x55, 0x60, 0x9a, 0x3a, 0xc4, 0xe7, 0x94, 0xf7, 0x55, 0x78, 0xad, 0x78, 0x2d, 0xa4, 0xde, - 0x25, 0x6d, 0x46, 0xa3, 0xa0, 0x58, 0xd1, 0x12, 0xdd, 0x86, 0x05, 0x46, 0xec, 0x5e, 0x48, 0x79, - 0xbf, 0x65, 0x07, 0x3e, 0xc7, 0x36, 0x2f, 0x17, 0x64, 0xdc, 0xbe, 0x70, 0x3a, 0xa8, 0xbe, 0xa4, - 0xbe, 0x35, 0xcb, 0x61, 0x5a, 0xa5, 0x88, 0xb4, 0xa1, 0x28, 0x42, 0x83, 0x43, 0x38, 0xa6, 0x2e, - 0x2b, 0x5f, 0x50, 0x1a, 0xf4, 0x32, 0x65, 0xcb, 0xef, 0xa6, 0x60, 0x26, 0x4e, 0x7a, 0xa1, 0x39, - 0xe8, 0x92, 0x50, 0xfc, 0x6e, 0x61, 0xc7, 0x09, 0x09, 0x63, 0x3a, 0xbd, 0x53, 0x9a, 0xb3, 0x1c, - 0xa6, 0x55, 0x8a, 0x48, 0xeb, 0x8a, 0x82, 0xb8, 0x88, 0xb6, 0xcf, 0x88, 0xcf, 0x7a, 0xac, 0xd5, - 0xed, 0xb5, 0x8f, 0x49, 0x5f, 0x47, 0x63, 0x69, 0x28, 0x1a, 0xeb, 0x7e, 0xbf, 0xf1, 0x5a, 0x82, - 0x9e, 0x95, 0x33, 0xff, 0xf0, 0x9b, 0x9b, 0x4b, 0xba, 0xb9, 0xd8, 0x61, 0xbf, 0xcb, 0x83, 0xfa, - 0x4e, 0xaf, 0xfd, 0x26, 0xe9, 0x8b, 0xf0, 0x6b, 0xd6, 0x1d, 0xc9, 0x89, 0x2e, 0xc3, 0xe4, 0x0f, - 0x30, 0x75, 0x89, 0x23, 0x1d, 0x3a, 0x6d, 0xe9, 0x15, 0x5a, 0x87, 0x49, 0xc6, 0x31, 0xef, 0x31, - 0xe9, 0xc5, 0xf9, 0xb5, 0xeb, 0x23, 0x32, 0xae, 0x11, 0xf8, 0xce, 0xae, 0x14, 0xb0, 0xb4, 0xa0, - 0xe8, 0x23, 0x3c, 0x38, 0x26, 0xbe, 0xf6, 0xe4, 0x58, 0xd5, 0xbe, 0xed, 0x73, 0x4b, 0x4b, 0x0b, - 0xc7, 0x38, 0xc4, 0x25, 0x1d, 0xe9, 0x3f, 0x76, 0x84, 0x43, 0xc2, 0xca, 0x93, 0x12, 0x71, 0x7b, - 0xec, 0x92, 0xd4, 0x0e, 0xcb, 0xe2, 0x99, 0x56, 0x29, 0x26, 0xed, 0x4a, 0x0a, 0xb2, 0xa0, 0xe8, - 0x24, 0xf9, 0x5a, 0x9e, 0x92, 0x91, 0xb8, 0x31, 0xc2, 0x0b, 0xa9, 0x0c, 0xd7, 0xcd, 0x30, 0x0d, - 0x22, 0x52, 0xa5, 0xe7, 0xb7, 0x03, 0xdf, 0xa1, 0x7e, 0xa7, 0x75, 0x44, 0x68, 0xe7, 0x88, 0x97, - 0xa7, 0x6b, 0xc6, 0xca, 0x44, 0x3a, 0x55, 0xb2, 0x1c, 0xa6, 0x55, 0x8a, 0x49, 0x5b, 0x92, 0x82, - 0x1c, 0x98, 0x4f, 0xb8, 0x64, 0xd9, 0xce, 0x8c, 0x2c, 0xdb, 0x2f, 0xea, 0xb2, 0xbd, 0x94, 0xd5, - 0x92, 0x54, 0xee, 0x5c, 0x4c, 0x14, 0x62, 0xe8, 0x2d, 0x80, 0xa4, 0x59, 0x94, 0x41, 0x6a, 0xb8, - 0xfe, 0xc2, 0x8d, 0x47, 0xdb, 0x9f, 0x82, 0x40, 0xef, 0xc1, 0x45, 0x8f, 0xfa, 0x2d, 0x46, 0xdc, - 0xc3, 0x96, 0x76, 0xb7, 0x40, 0x2e, 0xca, 0x58, 0xde, 0x19, 0x2f, 0x3b, 0x4e, 0x07, 0xd5, 0x8a, - 0x6e, 0xaf, 0xc3, 0x90, 0xa6, 0xb5, 0xe8, 0x51, 0x7f, 0x97, 0xb8, 0x87, 0xcd, 0x98, 0x76, 0x6b, - 0xf6, 0xfd, 0xc7, 0xd5, 0x9c, 0xae, 0xe1, 0x9c, 0xf9, 0x3a, 0xcc, 0x1e, 0x60, 0x57, 0xd7, 0x1e, - 0x61, 0xe8, 0x2a, 0xcc, 0xe0, 0x68, 0x51, 0x36, 0x6a, 0x13, 0x2b, 0x33, 0x56, 0x42, 0x50, 0xb5, - 0xff, 0xa3, 0xbf, 0xd4, 0x0c, 0xf3, 0x97, 0x06, 0x4c, 0x36, 0x0f, 0x76, 0x30, 0x0d, 0xd1, 0x36, - 0x2c, 0x26, 0x79, 0x74, 0xb6, 0xf2, 0xaf, 0x9e, 0x0e, 0xaa, 0xe5, 0x6c, 0xaa, 0xc5, 0xa5, 0x9f, - 0xa4, 0x73, 0x54, 0xfb, 0xdb, 0xb0, 0x78, 0x3f, 0x6a, 0x28, 0x31, 0x54, 0x3e, 0x0b, 0x35, 0xc4, - 0x62, 0x5a, 0x0b, 0x31, 0x4d, 0x43, 0x65, 0xcc, 0xbc, 0x03, 0x53, 0xea, 0x6b, 0x19, 0x5a, 0x87, - 0x0b, 0x5d, 0xf1, 0x43, 0x5a, 0x57, 0x5c, 0x7b, 0x79, 0x54, 0x2a, 0x4b, 0x31, 0x1d, 0x45, 0x25, - 0x69, 0xfe, 0x34, 0x0f, 0xd0, 0x3c, 0x38, 0xd8, 0x0b, 0x69, 0xd7, 0x25, 0xfc, 0xd3, 0x74, 0xc0, - 0x1e, 0x5c, 0x4a, 0xac, 0x63, 0xa1, 0x9d, 0x71, 0x42, 0xed, 0x74, 0x50, 0xbd, 0x9a, 0x75, 0x42, - 0x8a, 0xcd, 0xb4, 0x2e, 0xc6, 0xf4, 0xdd, 0xd0, 0x7e, 0x2e, 0xaa, 0xc3, 0x78, 0x8c, 0x3a, 0xf1, - 0xf1, 0xa8, 0x29, 0xb6, 0x34, 0x6a, 0x93, 0xf1, 0xe7, 0x7b, 0xf8, 0x1d, 0x28, 0x26, 0x2e, 0x61, - 0xe8, 0x4d, 0x98, 0xe6, 0xfa, 0xb7, 0x76, 0xf4, 0xf5, 0x91, 0x8e, 0x8e, 0xa4, 0xb5, 0xb3, 0x63, - 0x00, 0xf3, 0x3f, 0x06, 0x40, 0x92, 0xc1, 0x9f, 0xcd, 0x84, 0x13, 0x6d, 0x5e, 0x37, 0xe5, 0x89, - 0x73, 0x0d, 0x75, 0x5a, 0x3a, 0xe3, 0xd6, 0x9f, 0xe5, 0xe1, 0xe2, 0x7e, 0xd4, 0x8e, 0x3e, 0xf3, - 0x3e, 0x78, 0x1b, 0xa6, 0x88, 0xcf, 0x43, 0x2a, 0x9d, 0x20, 0x82, 0xfe, 0xc6, 0x88, 0xa0, 0x3f, - 0xc7, 0xb4, 0x4d, 0x9f, 0x87, 0x7d, 0x9d, 0x02, 0x11, 0x5a, 0xc6, 0x29, 0x3f, 0x99, 0x80, 0xf2, - 0xc7, 0x49, 0xa2, 0x0d, 0x28, 0xd9, 0x21, 0x91, 0x84, 0xe8, 0x6c, 0x31, 0xe4, 0xd9, 0x52, 0x49, - 0x46, 0xd1, 0x0c, 0x83, 0x69, 0xcd, 0x47, 0x14, 0x7d, 0xb2, 0x74, 0x40, 0x0c, 0x88, 0x22, 0xfb, - 0x04, 0xd7, 0x0b, 0x4e, 0x84, 0xa6, 0x3e, 0x5a, 0x22, 0x25, 0x67, 0x01, 0xd4, 0xd9, 0x32, 0x9f, - 0x50, 0xe5, 0xe1, 0x72, 0x0f, 0x4a, 0xd4, 0xa7, 0x9c, 0x62, 0xb7, 0xd5, 0xc6, 0x2e, 0xf6, 0xed, - 0xf3, 0x8c, 0xd9, 0xea, 0x1c, 0xd0, 0x6a, 0x33, 0x70, 0xa6, 0x35, 0xaf, 0x29, 0x0d, 0x45, 0x40, - 0x5b, 0x30, 0x15, 0xa9, 0x2a, 0x9c, 0x6b, 0x20, 0x89, 0xc4, 0x53, 0xa3, 0xe0, 0x8f, 0x27, 0x60, - 0xd1, 0x22, 0xce, 0xe7, 0xa1, 0x18, 0x2f, 0x14, 0xdf, 0x06, 0x50, 0x55, 0x2f, 0xda, 0xed, 0x39, - 0xa2, 0x21, 0xfa, 0xc6, 0x8c, 0x42, 0x68, 0x32, 0x9e, 0x8a, 0xc7, 0xdf, 0xf3, 0x30, 0x9b, 0x8e, - 0xc7, 0xff, 0xe9, 0x19, 0x85, 0x76, 0x92, 0x86, 0x54, 0x90, 0x0d, 0xe9, 0x2b, 0x23, 0x1a, 0xd2, - 0x50, 0x12, 0x7f, 0x72, 0x27, 0xfa, 0x77, 0x1e, 0x26, 0x77, 0x70, 0x88, 0x3d, 0x86, 0xec, 0xa1, - 0x61, 0x54, 0xdd, 0x51, 0xaf, 0x0c, 0xa5, 0x69, 0x53, 0x3f, 0x96, 0x8c, 0x98, 0x45, 0x3f, 0x78, - 0xce, 0x2c, 0xfa, 0x4d, 0x98, 0x17, 0xd7, 0xe8, 0xd8, 0x54, 0xe5, 0xf4, 0xb9, 0xc6, 0x95, 0x04, - 0xe5, 0xec, 0xbe, 0xba, 0x65, 0xc7, 0xb7, 0x34, 0x86, 0xde, 0x80, 0xa2, 0xe0, 0x48, 0xda, 0xb4, - 0x10, 0xbf, 0x9c, 0xdc, 0x63, 0x53, 0x9b, 0xa6, 0x05, 0x1e, 0x3e, 0xd9, 0x54, 0x0b, 0x74, 0x07, - 0xd0, 0x51, 0xfc, 0xb0, 0xd2, 0x4a, 0xbc, 0x2a, 0xe4, 0xaf, 0x9d, 0x0e, 0xaa, 0x57, 0x94, 0xfc, - 0x30, 0x8f, 0x69, 0x2d, 0x26, 0xc4, 0x08, 0xed, 0xab, 0x00, 0xc2, 0xae, 0x96, 0x43, 0xfc, 0xc0, - 0xd3, 0x17, 0xa3, 0x4b, 0xa7, 0x83, 0xea, 0xa2, 0x42, 0x49, 0xf6, 0x4c, 0x6b, 0x46, 0x2c, 0x9a, - 0xe2, 0x77, 0x2a, 0xc1, 0x7f, 0x61, 0x00, 0x4a, 0x3a, 0xbf, 0x45, 0x58, 0x57, 0x5c, 0xe8, 0xc4, - 0xac, 0x9e, 0x9a, 0xa8, 0x8d, 0x17, 0x9a, 0xd5, 0x13, 0x98, 0x68, 0x56, 0x4f, 0xd5, 0xcd, 0xd7, - 0x93, 0x66, 0x99, 0xd7, 0xe1, 0xd4, 0x17, 0xca, 0x36, 0x66, 0x24, 0x35, 0xef, 0xd3, 0x48, 0x7a, - 0xa8, 0x3b, 0xe6, 0xcc, 0x3f, 0x19, 0x70, 0x65, 0x28, 0xb1, 0xe2, 0x6f, 0x26, 0x80, 0xc2, 0xd4, - 0xa6, 0x74, 0x5b, 0x5f, 0x7f, 0xfb, 0x79, 0xd3, 0x75, 0x31, 0x1c, 0x6a, 0xc6, 0x9f, 0x5e, 0xdb, - 0x2f, 0xc8, 0x08, 0xfc, 0xd1, 0x80, 0xa5, 0xb4, 0xfa, 0xd8, 0x9e, 0x7d, 0x98, 0x4d, 0x6b, 0xd7, - 0x96, 0x7c, 0x69, 0x0c, 0x4b, 0xb4, 0x11, 0x67, 0x60, 0xd0, 0x77, 0x92, 0x52, 0x56, 0xef, 0x71, - 0x5f, 0x1b, 0xd7, 0x37, 0xd1, 0x17, 0x66, 0x4b, 0xba, 0x20, 0x83, 0xf4, 0x5f, 0x03, 0x0a, 0x3b, - 0x41, 0xe0, 0xa2, 0x00, 0x16, 0xfd, 0x80, 0xb7, 0x44, 0xd6, 0x11, 0xa7, 0xa5, 0xaf, 0xee, 0xaa, - 0x55, 0x6e, 0x8c, 0xe7, 0xb2, 0x7f, 0x0e, 0xaa, 0xc3, 0x50, 0x56, 0xc9, 0x0f, 0x78, 0x43, 0x52, - 0xf6, 0xd4, 0xc5, 0xfe, 0x3d, 0x98, 0x3b, 0xab, 0x4c, 0x35, 0xd2, 0xb7, 0xc7, 0x56, 0x76, 0x16, - 0xe6, 0x74, 0x50, 0x5d, 0x4a, 0xaa, 0x29, 0x26, 0x9b, 0xd6, 0x6c, 0x3b, 0xa5, 0xfd, 0xd6, 0xb4, - 0x88, 0xe6, 0xbf, 0x44, 0x44, 0x7f, 0x6d, 0xc0, 0x45, 0x49, 0xa4, 0x3f, 0x24, 0xf2, 0xf6, 0x6f, - 0x11, 0x3b, 0x08, 0x1d, 0x34, 0x0f, 0x79, 0xea, 0x48, 0x0f, 0x14, 0xac, 0x3c, 0x75, 0xd0, 0x12, - 0x5c, 0x08, 0xde, 0xf5, 0x49, 0xa8, 0x9f, 0xa5, 0xd4, 0x02, 0xdd, 0x80, 0x45, 0x79, 0x12, 0x29, - 0x35, 0xba, 0xb0, 0xd5, 0xeb, 0x54, 0x49, 0x6e, 0x48, 0x68, 0x59, 0xc7, 0xe8, 0x65, 0x98, 0xf7, - 0x02, 0xa7, 0xe7, 0x92, 0x16, 0xb6, 0xed, 0xa0, 0xe7, 0xeb, 0xb3, 0xcf, 0x9a, 0x53, 0xd4, 0x75, - 0x45, 0x14, 0x97, 0xd1, 0xb8, 0x93, 0xe9, 0x67, 0xa8, 0x84, 0xa0, 0xd2, 0xf0, 0xc6, 0x6f, 0x0d, - 0x80, 0xe4, 0xd1, 0x05, 0x7d, 0x19, 0x5e, 0x6a, 0xbc, 0x75, 0xb7, 0xd9, 0xda, 0xdd, 0x5b, 0xdf, - 0xdb, 0xdf, 0x6d, 0xed, 0xdf, 0xdd, 0xdd, 0xd9, 0xdc, 0xd8, 0xbe, 0xbd, 0xbd, 0xd9, 0x5c, 0xc8, - 0x55, 0x4a, 0x0f, 0x1e, 0xd5, 0x8a, 0xfb, 0x3e, 0xeb, 0x12, 0x9b, 0x1e, 0x52, 0xe2, 0xa0, 0x57, - 0x60, 0xe9, 0x2c, 0xb7, 0x58, 0x6d, 0x36, 0x17, 0x8c, 0xca, 0xec, 0x83, 0x47, 0xb5, 0x69, 0x35, - 0x63, 0x12, 0x07, 0xad, 0xc0, 0xa5, 0x61, 0xbe, 0xed, 0xbb, 0xdf, 0x5a, 0xc8, 0x57, 0xe6, 0x1e, - 0x3c, 0xaa, 0xcd, 0xc4, 0xc3, 0x28, 0x32, 0x01, 0xa5, 0x39, 0x35, 0xde, 0x44, 0x05, 0x1e, 0x3c, - 0xaa, 0x4d, 0xaa, 0xa8, 0x57, 0x0a, 0xef, 0xff, 0x7c, 0x39, 0xd7, 0xf8, 0xee, 0x87, 0x4f, 0x97, - 0x8d, 0x27, 0x4f, 0x97, 0x8d, 0xbf, 0x3d, 0x5d, 0x36, 0x1e, 0x3e, 0x5b, 0xce, 0x3d, 0x79, 0xb6, - 0x9c, 0xfb, 0xe8, 0xd9, 0x72, 0xee, 0x9d, 0x6f, 0xa4, 0x02, 0x4e, 0xef, 0xb9, 0x3d, 0x46, 0x03, - 0x9f, 0xfa, 0xf6, 0xaa, 0x4a, 0x77, 0xca, 0xfb, 0x37, 0x75, 0xaa, 0xdf, 0x54, 0xee, 0x5a, 0x3d, - 0x89, 0x9e, 0xfb, 0x55, 0x36, 0xb4, 0x27, 0xe5, 0x51, 0xf3, 0xda, 0xff, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x7e, 0x94, 0xa0, 0x1f, 0x16, 0x18, 0x00, 0x00, + 0x15, 0xf6, 0x73, 0xdc, 0x24, 0x3e, 0x4e, 0xe2, 0xe4, 0x36, 0x9d, 0x71, 0x4d, 0x6b, 0x9b, 0x27, + 0xcd, 0x28, 0x2d, 0xc4, 0x66, 0x32, 0xd2, 0x00, 0xdd, 0xa0, 0x38, 0x4e, 0x49, 0x98, 0xd2, 0x89, + 0x5e, 0x7e, 0x06, 0x06, 0x24, 0xeb, 0xfa, 0xbd, 0x1b, 0xe7, 0x92, 0xe7, 0xf7, 0xdc, 0x77, 0xaf, + 0x3b, 0x31, 0x9a, 0x05, 0xcb, 0x51, 0x25, 0x44, 0x61, 0x35, 0x9b, 0x4a, 0x95, 0xd8, 0x21, 0x24, + 0x24, 0x84, 0xd8, 0xb3, 0x1b, 0x90, 0x90, 0x2a, 0x56, 0x23, 0x84, 0x0c, 0x6a, 0x85, 0x84, 0x58, + 0xa1, 0xac, 0xd8, 0x81, 0xee, 0xcf, 0xfb, 0xc9, 0x73, 0x67, 0x52, 0x47, 0xb3, 0xa8, 0x04, 0x9b, + 0xc4, 0xf7, 0xdc, 0x73, 0xbe, 0x73, 0xef, 0xf9, 0xbb, 0xe7, 0x3c, 0xb8, 0xce, 0x38, 0x3e, 0xa6, + 0x5e, 0xb7, 0x71, 0xff, 0x8d, 0x0e, 0xe1, 0xf8, 0x8d, 0x86, 0x5e, 0xd7, 0xfb, 0x81, 0xcf, 0x7d, + 0x74, 0xdd, 0xa5, 0xf7, 0x06, 0xd4, 0x09, 0x89, 0xe1, 0x7f, 0xcd, 0x5c, 0x5e, 0xee, 0xfa, 0x5d, + 0x5f, 0x72, 0x36, 0xc4, 0x2f, 0x25, 0x54, 0xbe, 0xda, 0xf5, 0xfd, 0xae, 0x4b, 0x1a, 0x72, 0xd5, + 0x19, 0x1c, 0x36, 0xb0, 0x37, 0xd4, 0x5b, 0x95, 0xf4, 0x96, 0x33, 0x08, 0x30, 0xa7, 0xbe, 0xa7, + 0xf7, 0xab, 0xe9, 0x7d, 0x4e, 0x7b, 0x84, 0x71, 0xdc, 0xeb, 0x87, 0xd8, 0xb6, 0xcf, 0x7a, 0x3e, + 0x6b, 0x2b, 0xa5, 0x6a, 0x11, 0x62, 0xab, 0x55, 0xa3, 0x83, 0x19, 0x89, 0xae, 0x63, 0xfb, 0x34, + 0xc4, 0xbe, 0xc6, 0x89, 0xe7, 0x90, 0xa0, 0x47, 0x3d, 0xde, 0xe0, 0xc3, 0x3e, 0x61, 0xea, 0xaf, + 0xda, 0x35, 0x1f, 0x1a, 0xb0, 0xb0, 0x45, 0x19, 0xf7, 0x03, 0x6a, 0x63, 0x77, 0xdb, 0x3b, 0xf4, + 0xd1, 0x5b, 0x30, 0x7d, 0x44, 0xb0, 0x43, 0x82, 0x92, 0x51, 0x33, 0x56, 0x0a, 0x6b, 0xa5, 0x7a, + 0x8c, 0x50, 0x57, 0xb2, 0x5b, 0x72, 0xbf, 0x99, 0xfb, 0x78, 0x54, 0xcd, 0x58, 0x9a, 0x1b, 0xdd, + 0x86, 0xe9, 0xfb, 0xd8, 0x65, 0x84, 0x97, 0xb2, 0xb5, 0xa9, 0x95, 0xc2, 0xda, 0x4a, 0xfd, 0x33, + 0xad, 0x58, 0x3f, 0xc0, 0x2e, 0x75, 0x30, 0xf7, 0x23, 0x1c, 0x25, 0x6d, 0xfe, 0x2a, 0x0b, 0xc5, + 0x0d, 0xbf, 0xd7, 0xa3, 0x8c, 0x51, 0xdf, 0xb3, 0x30, 0x27, 0x0c, 0x35, 0x21, 0x17, 0x60, 0x4e, + 0xe4, 0x89, 0xf2, 0xcd, 0xba, 0xe0, 0xff, 0xf3, 0xa8, 0xfa, 0x7a, 0x97, 0xf2, 0xa3, 0x41, 0xa7, + 0x6e, 0xfb, 0x3d, 0x6d, 0x13, 0xfd, 0x6f, 0x95, 0x39, 0xc7, 0xfa, 0x9a, 0x2d, 0x62, 0x5b, 0x52, + 0x16, 0x7d, 0x1f, 0x66, 0x7b, 0xf8, 0xa4, 0x2d, 0x71, 0xb2, 0x12, 0x67, 0x7d, 0x32, 0x9c, 0xd3, + 0x51, 0xb5, 0x38, 0xc4, 0x3d, 0xf7, 0x96, 0x19, 0xe2, 0x98, 0xd6, 0x4c, 0x0f, 0x9f, 0x88, 0x23, + 0xa2, 0x3e, 0x14, 0x05, 0xd5, 0x3e, 0xc2, 0x5e, 0x97, 0x28, 0x25, 0x53, 0x52, 0xc9, 0xd6, 0xc4, + 0x4a, 0x5e, 0x89, 0x95, 0x24, 0xe0, 0x4c, 0x6b, 0xbe, 0x87, 0x4f, 0x36, 0x24, 0x41, 0x68, 0xbc, + 0x35, 0xfb, 0xd1, 0xe3, 0x6a, 0xe6, 0x1f, 0x8f, 0xab, 0x86, 0xf9, 0x89, 0x01, 0x10, 0x5b, 0x0c, + 0xd9, 0xb0, 0x68, 0x47, 0x2b, 0x29, 0xcb, 0xb4, 0x2b, 0xeb, 0xe7, 0xb8, 0x24, 0x65, 0xf6, 0xe6, + 0xac, 0x38, 0xfb, 0x93, 0x51, 0xd5, 0xb0, 0x8a, 0x76, 0xca, 0x23, 0xdf, 0x83, 0xc2, 0xa0, 0xef, + 0x60, 0x4e, 0xda, 0x22, 0x56, 0xa5, 0x41, 0x0b, 0x6b, 0xe5, 0xba, 0x0a, 0xe4, 0x7a, 0x18, 0xc8, + 0xf5, 0xbd, 0x30, 0x90, 0x9b, 0x15, 0x81, 0x75, 0x3a, 0xaa, 0x22, 0x75, 0xbb, 0x84, 0xb0, 0xf9, + 0xf0, 0xaf, 0x55, 0xc3, 0x02, 0x45, 0x11, 0x02, 0x89, 0xab, 0xfd, 0xde, 0x80, 0x42, 0x8b, 0x30, + 0x3b, 0xa0, 0x7d, 0x91, 0x2f, 0xa8, 0x04, 0x33, 0x3d, 0xdf, 0xa3, 0xc7, 0x3a, 0x3a, 0xf3, 0x56, + 0xb8, 0x44, 0x65, 0x98, 0xa5, 0x0e, 0xf1, 0x38, 0xe5, 0x43, 0xe5, 0x5e, 0x2b, 0x5a, 0x0b, 0xa9, + 0xf7, 0x49, 0x87, 0xd1, 0xd0, 0x29, 0x56, 0xb8, 0x44, 0xb7, 0x61, 0x91, 0x11, 0x7b, 0x10, 0x50, + 0x3e, 0x6c, 0xdb, 0xbe, 0xc7, 0xb1, 0xcd, 0x4b, 0x39, 0xe9, 0xb7, 0x2f, 0x9c, 0x8e, 0xaa, 0xaf, + 0xaa, 0xb3, 0xa6, 0x39, 0x4c, 0xab, 0x18, 0x92, 0x36, 0x14, 0x45, 0x68, 0x70, 0x08, 0xc7, 0xd4, + 0x65, 0xa5, 0x4b, 0x4a, 0x83, 0x5e, 0x26, 0xee, 0xf2, 0xbb, 0x19, 0xc8, 0x47, 0x41, 0x2f, 0x34, + 0xfb, 0x7d, 0x12, 0x88, 0xdf, 0x6d, 0xec, 0x38, 0x01, 0x61, 0x4c, 0x87, 0x77, 0x42, 0x73, 0x9a, + 0xc3, 0xb4, 0x8a, 0x21, 0x69, 0x5d, 0x51, 0x10, 0x17, 0xde, 0xf6, 0x18, 0xf1, 0xd8, 0x80, 0xb5, + 0xfb, 0x83, 0xce, 0x31, 0x19, 0x6a, 0x6f, 0x2c, 0x8f, 0x79, 0x63, 0xdd, 0x1b, 0x36, 0xdf, 0x8c, + 0xd1, 0xd3, 0x72, 0xe6, 0x1f, 0x7e, 0xb3, 0xba, 0xac, 0x8b, 0x8b, 0x1d, 0x0c, 0xfb, 0xdc, 0xaf, + 0xef, 0x0c, 0x3a, 0x6f, 0x93, 0xa1, 0x70, 0xbf, 0x66, 0xdd, 0x91, 0x9c, 0xe8, 0x15, 0x98, 0xfe, + 0x01, 0xa6, 0x2e, 0x71, 0xa4, 0x41, 0x67, 0x2d, 0xbd, 0x42, 0xeb, 0x30, 0xcd, 0x38, 0xe6, 0x03, + 0x26, 0xad, 0xb8, 0xb0, 0x76, 0xe3, 0x9c, 0x88, 0x6b, 0xfa, 0x9e, 0xb3, 0x2b, 0x05, 0x2c, 0x2d, + 0x28, 0xea, 0x08, 0xf7, 0x8f, 0x89, 0xa7, 0x2d, 0x39, 0x51, 0xb6, 0x6f, 0x7b, 0xdc, 0xd2, 0xd2, + 0xc2, 0x30, 0x0e, 0x71, 0x49, 0x57, 0xda, 0x8f, 0x1d, 0xe1, 0x80, 0xb0, 0xd2, 0xb4, 0x44, 0xdc, + 0x9e, 0x38, 0x25, 0xb5, 0xc1, 0xd2, 0x78, 0xa6, 0x55, 0x8c, 0x48, 0xbb, 0x92, 0x82, 0x2c, 0x28, + 0x38, 0x71, 0xbc, 0x96, 0x66, 0xa4, 0x27, 0x6e, 0x9e, 0x63, 0x85, 0x44, 0x84, 0xeb, 0x62, 0x98, + 0x04, 0x11, 0xa1, 0x32, 0xf0, 0x3a, 0xbe, 0xe7, 0x50, 0xaf, 0xdb, 0x3e, 0x22, 0xb4, 0x7b, 0xc4, + 0x4b, 0xb3, 0x35, 0x63, 0x65, 0x2a, 0x19, 0x2a, 0x69, 0x0e, 0xd3, 0x2a, 0x46, 0xa4, 0x2d, 0x49, + 0x41, 0x0e, 0x2c, 0xc4, 0x5c, 0x32, 0x6d, 0xf3, 0xe7, 0xa6, 0xed, 0x17, 0x75, 0xda, 0x5e, 0x49, + 0x6b, 0x89, 0x33, 0x77, 0x3e, 0x22, 0x0a, 0x31, 0xf4, 0x0e, 0x40, 0x5c, 0x2c, 0x4a, 0x20, 0x35, + 0xdc, 0x78, 0xe1, 0xc2, 0xa3, 0xef, 0x9f, 0x80, 0x40, 0x1f, 0xc0, 0xe5, 0x1e, 0xf5, 0xda, 0x8c, + 0xb8, 0x87, 0x6d, 0x6d, 0x6e, 0x81, 0x5c, 0x90, 0xbe, 0xbc, 0x33, 0x59, 0x74, 0x9c, 0x8e, 0xaa, + 0x65, 0x5d, 0x5e, 0xc7, 0x21, 0x4d, 0x6b, 0xa9, 0x47, 0xbd, 0x5d, 0xe2, 0x1e, 0xb6, 0x22, 0xda, + 0xad, 0xb9, 0x0f, 0x1f, 0x57, 0x33, 0x3a, 0x87, 0x33, 0xe6, 0x5b, 0x30, 0x77, 0x80, 0x5d, 0x9d, + 0x7b, 0x84, 0xa1, 0x6b, 0x90, 0xc7, 0xe1, 0xa2, 0x64, 0xd4, 0xa6, 0x56, 0xf2, 0x56, 0x4c, 0x50, + 0xb9, 0xff, 0xa3, 0xbf, 0xd4, 0x0c, 0xf3, 0x97, 0x06, 0x4c, 0xb7, 0x0e, 0x76, 0x30, 0x0d, 0xd0, + 0x36, 0x2c, 0xc5, 0x71, 0x74, 0x36, 0xf3, 0xaf, 0x9d, 0x8e, 0xaa, 0xa5, 0x74, 0xa8, 0x45, 0xa9, + 0x1f, 0x87, 0x73, 0x98, 0xfb, 0xdb, 0xb0, 0x74, 0x3f, 0x2c, 0x28, 0x11, 0x54, 0x36, 0x0d, 0x35, + 0xc6, 0x62, 0x5a, 0x8b, 0x11, 0x4d, 0x43, 0xa5, 0xae, 0x79, 0x07, 0x66, 0xd4, 0x69, 0x19, 0x5a, + 0x87, 0x4b, 0x7d, 0xf1, 0x43, 0xde, 0xae, 0xb0, 0xf6, 0xda, 0x79, 0xa1, 0x2c, 0xc5, 0xb4, 0x17, + 0x95, 0xa4, 0xf9, 0xd3, 0x2c, 0x40, 0xeb, 0xe0, 0x60, 0x2f, 0xa0, 0x7d, 0x97, 0xf0, 0xcf, 0xd3, + 0x00, 0x7b, 0x70, 0x25, 0xbe, 0x1d, 0x0b, 0xec, 0x94, 0x11, 0x6a, 0xa7, 0xa3, 0xea, 0xb5, 0xb4, + 0x11, 0x12, 0x6c, 0xa6, 0x75, 0x39, 0xa2, 0xef, 0x06, 0xf6, 0x73, 0x51, 0x1d, 0xc6, 0x23, 0xd4, + 0xa9, 0x4f, 0x47, 0x4d, 0xb0, 0x25, 0x51, 0x5b, 0x8c, 0x3f, 0xdf, 0xc2, 0xef, 0x41, 0x21, 0x36, + 0x09, 0x43, 0x6f, 0xc3, 0x2c, 0xd7, 0xbf, 0xb5, 0xa1, 0x6f, 0x9c, 0x6b, 0xe8, 0x50, 0x5a, 0x1b, + 0x3b, 0x02, 0x30, 0xff, 0x6d, 0x00, 0xc4, 0x11, 0xfc, 0x72, 0x06, 0x9c, 0x28, 0xf3, 0xba, 0x28, + 0x4f, 0x5d, 0xa8, 0xa9, 0xd3, 0xd2, 0x29, 0xb3, 0xfe, 0x2c, 0x0b, 0x97, 0xf7, 0xc3, 0x72, 0xf4, + 0xd2, 0xdb, 0xe0, 0x5d, 0x98, 0x21, 0x1e, 0x0f, 0xa8, 0x34, 0x82, 0x70, 0xfa, 0x57, 0xcf, 0x71, + 0xfa, 0x73, 0xae, 0xb6, 0xe9, 0xf1, 0x60, 0xa8, 0x43, 0x20, 0x44, 0x4b, 0x19, 0xe5, 0x27, 0x53, + 0x50, 0xfa, 0x34, 0x49, 0xb4, 0x01, 0x45, 0x3b, 0x20, 0x92, 0x10, 0xbe, 0x2d, 0x86, 0x7c, 0x5b, + 0xca, 0x71, 0x2b, 0x9a, 0x62, 0x30, 0xad, 0x85, 0x90, 0xa2, 0x5f, 0x96, 0x2e, 0x88, 0x06, 0x51, + 0x44, 0x9f, 0xe0, 0x7a, 0xc1, 0x8e, 0xd0, 0xd4, 0x4f, 0x4b, 0xa8, 0xe4, 0x2c, 0x80, 0x7a, 0x5b, + 0x16, 0x62, 0xaa, 0x7c, 0x5c, 0xee, 0x41, 0x91, 0x7a, 0x94, 0x53, 0xec, 0xb6, 0x3b, 0xd8, 0xc5, + 0x9e, 0x7d, 0x91, 0x36, 0x5b, 0xbd, 0x03, 0x5a, 0x6d, 0x0a, 0xce, 0xb4, 0x16, 0x34, 0xa5, 0xa9, + 0x08, 0x68, 0x0b, 0x66, 0x42, 0x55, 0xb9, 0x0b, 0x35, 0x24, 0xa1, 0x78, 0xa2, 0x15, 0xfc, 0xf1, + 0x14, 0x2c, 0x59, 0xc4, 0xf9, 0xbf, 0x2b, 0x26, 0x73, 0xc5, 0xb7, 0x01, 0x54, 0xd6, 0x8b, 0x72, + 0x7b, 0x01, 0x6f, 0x88, 0xba, 0x91, 0x57, 0x08, 0x2d, 0xc6, 0x13, 0xfe, 0xf8, 0x7b, 0x16, 0xe6, + 0x92, 0xfe, 0xf8, 0x1f, 0x7d, 0xa3, 0xd0, 0x4e, 0x5c, 0x90, 0x72, 0xb2, 0x20, 0x7d, 0xe5, 0x9c, + 0x82, 0x34, 0x16, 0xc4, 0x9f, 0x5d, 0x89, 0x4e, 0xb3, 0x30, 0xbd, 0x83, 0x03, 0xdc, 0x63, 0xe8, + 0x5b, 0x63, 0xcd, 0xa8, 0x9a, 0x51, 0xaf, 0x8e, 0x85, 0x69, 0x4b, 0x7f, 0x2c, 0x51, 0xe3, 0xe8, + 0x47, 0xcf, 0x69, 0x39, 0x5f, 0x83, 0x05, 0x31, 0x2d, 0x47, 0x37, 0x52, 0xb6, 0x9d, 0x97, 0x13, + 0x73, 0x34, 0x71, 0x31, 0x54, 0x85, 0x82, 0x60, 0x8b, 0x4b, 0xae, 0xe0, 0x81, 0x1e, 0x3e, 0xd9, + 0x54, 0x14, 0xb4, 0x0a, 0xe8, 0x28, 0xfa, 0x18, 0xd2, 0x8e, 0x2d, 0x21, 0xf8, 0x96, 0xe2, 0x9d, + 0x90, 0xfd, 0x3a, 0x80, 0x38, 0x45, 0xdb, 0x21, 0x9e, 0xdf, 0xd3, 0x73, 0x5f, 0x5e, 0x50, 0x5a, + 0x82, 0x10, 0xf6, 0xad, 0xa9, 0x59, 0x5c, 0xcf, 0x20, 0x77, 0x26, 0x9e, 0x41, 0x12, 0x7d, 0x6b, + 0x0a, 0x52, 0xf5, 0xad, 0x67, 0x87, 0xf7, 0x44, 0x70, 0xff, 0xc2, 0x00, 0x14, 0x57, 0x7d, 0x8b, + 0xb0, 0xbe, 0x18, 0xe6, 0x44, 0x9f, 0x9e, 0xe8, 0xa6, 0x8d, 0x17, 0xea, 0xd3, 0x63, 0x98, 0xb0, + 0x4f, 0x4f, 0xe4, 0xcc, 0xd7, 0xe3, 0x42, 0x99, 0xd5, 0xae, 0xd4, 0xc3, 0x64, 0x07, 0x33, 0x92, + 0xe8, 0xf5, 0x69, 0x28, 0x3d, 0x56, 0x19, 0x33, 0xe6, 0x9f, 0x0c, 0xb8, 0x3a, 0x16, 0x54, 0xd1, + 0x99, 0x09, 0xa0, 0x20, 0xb1, 0x29, 0x5d, 0x34, 0xd4, 0x67, 0xbf, 0x68, 0xa8, 0x2e, 0x05, 0x63, + 0x85, 0xf8, 0xf3, 0x2b, 0xf9, 0x39, 0xe9, 0x81, 0x3f, 0x1a, 0xb0, 0x9c, 0x54, 0x1f, 0xdd, 0x67, + 0x1f, 0xe6, 0x92, 0xda, 0xf5, 0x4d, 0xbe, 0x34, 0xc1, 0x4d, 0xf4, 0x25, 0xce, 0xc0, 0xa0, 0xef, + 0xc4, 0x69, 0xac, 0xbe, 0xc5, 0x7d, 0x6d, 0x52, 0xdb, 0x84, 0x27, 0x4c, 0xa7, 0x73, 0x4e, 0x3a, + 0xe9, 0x3f, 0x06, 0xe4, 0x76, 0x7c, 0xdf, 0x45, 0x3e, 0x2c, 0x79, 0x3e, 0x6f, 0x8b, 0x98, 0x27, + 0x4e, 0x5b, 0x8f, 0xed, 0xaa, 0x4c, 0x6e, 0x4c, 0x66, 0xb2, 0x7f, 0x8e, 0xaa, 0xe3, 0x50, 0x56, + 0xd1, 0xf3, 0x79, 0x53, 0x52, 0xf6, 0xd4, 0x50, 0xff, 0x01, 0xcc, 0x9f, 0x55, 0xa6, 0x8a, 0xe8, + 0xbb, 0x13, 0x2b, 0x3b, 0x0b, 0x73, 0x3a, 0xaa, 0x2e, 0xab, 0xf4, 0x3a, 0x43, 0x36, 0xad, 0xb9, + 0x4e, 0x42, 0xfb, 0xad, 0x59, 0xe1, 0xcd, 0x7f, 0x09, 0x8f, 0xfe, 0xda, 0x80, 0xcb, 0x92, 0x48, + 0x7f, 0x48, 0xe4, 0xe4, 0x6f, 0x11, 0xdb, 0x0f, 0x1c, 0xb4, 0x00, 0x59, 0xea, 0x48, 0x0b, 0xe4, + 0xac, 0x2c, 0x75, 0xd0, 0x32, 0x5c, 0xf2, 0xdf, 0xf7, 0x48, 0xa0, 0x3f, 0x49, 0xa9, 0x05, 0xba, + 0x09, 0x4b, 0xf2, 0x15, 0x52, 0x6a, 0x74, 0xfd, 0x50, 0x5f, 0xa6, 0x8a, 0x72, 0x43, 0x42, 0xab, + 0x2a, 0x22, 0x6a, 0x9b, 0xef, 0x0c, 0x5c, 0xd2, 0xc6, 0xb6, 0xed, 0x0f, 0x3c, 0xfd, 0xee, 0x59, + 0xf3, 0x8a, 0xba, 0xae, 0x88, 0x62, 0x10, 0x8d, 0xca, 0x5f, 0x58, 0x8a, 0x22, 0x82, 0x0a, 0xc3, + 0x9b, 0xbf, 0x35, 0x00, 0xe2, 0x0f, 0x2e, 0xe8, 0xcb, 0xf0, 0x6a, 0xf3, 0x9d, 0xbb, 0xad, 0xf6, + 0xee, 0xde, 0xfa, 0xde, 0xfe, 0x6e, 0x7b, 0xff, 0xee, 0xee, 0xce, 0xe6, 0xc6, 0xf6, 0xed, 0xed, + 0xcd, 0xd6, 0x62, 0xa6, 0x5c, 0x7c, 0xf0, 0xa8, 0x56, 0xd8, 0xf7, 0x58, 0x9f, 0xd8, 0xf4, 0x90, + 0x12, 0x07, 0xbd, 0x0e, 0xcb, 0x67, 0xb9, 0xc5, 0x6a, 0xb3, 0xb5, 0x68, 0x94, 0xe7, 0x1e, 0x3c, + 0xaa, 0xcd, 0xaa, 0xfe, 0x92, 0x38, 0x68, 0x05, 0xae, 0x8c, 0xf3, 0x6d, 0xdf, 0xfd, 0xe6, 0x62, + 0xb6, 0x3c, 0xff, 0xe0, 0x51, 0x2d, 0x1f, 0x35, 0xa2, 0xc8, 0x04, 0x94, 0xe4, 0xd4, 0x78, 0x53, + 0x65, 0x78, 0xf0, 0xa8, 0x36, 0xad, 0xbc, 0x5e, 0xce, 0x7d, 0xf8, 0xf3, 0x4a, 0xa6, 0xf9, 0xdd, + 0x8f, 0x9f, 0x56, 0x8c, 0x27, 0x4f, 0x2b, 0xc6, 0xdf, 0x9e, 0x56, 0x8c, 0x87, 0xcf, 0x2a, 0x99, + 0x27, 0xcf, 0x2a, 0x99, 0x4f, 0x9e, 0x55, 0x32, 0xef, 0x7d, 0x23, 0xe1, 0x70, 0x7a, 0xcf, 0x1d, + 0x88, 0xf2, 0x47, 0x3d, 0xbb, 0xa1, 0xc2, 0x9d, 0xf2, 0xe1, 0xaa, 0x0e, 0xf5, 0x55, 0x65, 0xae, + 0xc6, 0x49, 0xf8, 0xa9, 0x5f, 0x45, 0x43, 0x67, 0x5a, 0x3e, 0x33, 0x6f, 0xfe, 0x37, 0x00, 0x00, + 0xff, 0xff, 0xa9, 0x65, 0x92, 0xb7, 0x12, 0x18, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1343,641 +1344,660 @@ 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{ - // 10140 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, - 0x75, 0x18, 0x7e, 0xb3, 0xbb, 0x00, 0x76, 0x1f, 0xbe, 0x16, 0x0d, 0xdc, 0xdd, 0xde, 0xde, 0x1d, - 0x00, 0x0e, 0xbf, 0x8e, 0x47, 0x1e, 0x40, 0x1e, 0xef, 0x8b, 0x7b, 0x22, 0x4f, 0xbb, 0xc0, 0x1e, - 0x0e, 0x24, 0xbe, 0x38, 0x00, 0x8e, 0x14, 0xfd, 0x73, 0xed, 0x6f, 0xb0, 0xdb, 0x58, 0x0c, 0xb1, - 0x3b, 0x33, 0x9c, 0x99, 0xbd, 0x03, 0x28, 0xa9, 0x4c, 0x4b, 0xfe, 0xa0, 0xe9, 0x28, 0xfa, 0xb0, - 0x4b, 0x92, 0x29, 0x9d, 0x22, 0x59, 0x4e, 0xa4, 0x30, 0x8e, 0x3f, 0x64, 0x59, 0x89, 0xe3, 0xfc, - 0x21, 0xb9, 0xca, 0x89, 0xac, 0xaa, 0xd8, 0x92, 0x53, 0x89, 0x54, 0x4e, 0x72, 0x92, 0x29, 0xc5, - 0x51, 0x14, 0x25, 0x56, 0x2e, 0x52, 0xca, 0x55, 0xaa, 0x7c, 0x54, 0x7f, 0xcd, 0xd7, 0xee, 0x62, - 0x76, 0xc1, 0x3b, 0x4a, 0xb6, 0xf3, 0x17, 0xb6, 0x5f, 0xbf, 0xf7, 0xfa, 0xf5, 0xeb, 0xd7, 0xaf, - 0x5f, 0xbf, 0xe9, 0x6e, 0xc0, 0x47, 0x2e, 0xc2, 0x64, 0xd5, 0x30, 0xaa, 0x35, 0x3c, 0x6d, 0x5a, - 0x86, 0x63, 0x6c, 0x34, 0x36, 0xa7, 0x2b, 0xd8, 0x2e, 0x5b, 0x9a, 0xe9, 0x18, 0xd6, 0x14, 0x85, - 0xa1, 0x61, 0x86, 0x31, 0x25, 0x30, 0xe4, 0x45, 0x18, 0xb9, 0xac, 0xd5, 0xf0, 0xac, 0x8b, 0xb8, - 0x8a, 0x1d, 0x74, 0x01, 0x12, 0x9b, 0x5a, 0x0d, 0x67, 0xa4, 0xc9, 0xf8, 0x89, 0xfe, 0xd3, 0xf7, - 0x4c, 0x85, 0x88, 0xa6, 0x82, 0x14, 0x2b, 0x04, 0xac, 0x50, 0x0a, 0xf9, 0x5b, 0x09, 0x18, 0x6d, - 0x51, 0x8b, 0x10, 0x24, 0x74, 0xb5, 0x4e, 0x38, 0x4a, 0x27, 0x52, 0x0a, 0xfd, 0x8d, 0x32, 0xd0, - 0x67, 0xaa, 0xe5, 0x6d, 0xb5, 0x8a, 0x33, 0x31, 0x0a, 0x16, 0x45, 0x34, 0x0e, 0x50, 0xc1, 0x26, - 0xd6, 0x2b, 0x58, 0x2f, 0xef, 0x66, 0xe2, 0x93, 0xf1, 0x13, 0x29, 0xc5, 0x07, 0x41, 0x0f, 0xc2, - 0x88, 0xd9, 0xd8, 0xa8, 0x69, 0xe5, 0x92, 0x0f, 0x0d, 0x26, 0xe3, 0x27, 0x7a, 0x94, 0x34, 0xab, - 0x98, 0xf5, 0x90, 0xef, 0x87, 0xe1, 0xeb, 0x58, 0xdd, 0xf6, 0xa3, 0xf6, 0x53, 0xd4, 0x21, 0x02, - 0xf6, 0x21, 0xce, 0xc0, 0x40, 0x1d, 0xdb, 0xb6, 0x5a, 0xc5, 0x25, 0x67, 0xd7, 0xc4, 0x99, 0x04, - 0xed, 0xfd, 0x64, 0x53, 0xef, 0xc3, 0x3d, 0xef, 0xe7, 0x54, 0x6b, 0xbb, 0x26, 0x46, 0x79, 0x48, - 0x61, 0xbd, 0x51, 0x67, 0x1c, 0x7a, 0xda, 0xe8, 0xaf, 0xa8, 0x37, 0xea, 0x61, 0x2e, 0x49, 0x42, - 0xc6, 0x59, 0xf4, 0xd9, 0xd8, 0xba, 0xa6, 0x95, 0x71, 0xa6, 0x97, 0x32, 0xb8, 0xbf, 0x89, 0xc1, - 0x2a, 0xab, 0x0f, 0xf3, 0x10, 0x74, 0x68, 0x06, 0x52, 0x78, 0xc7, 0xc1, 0xba, 0xad, 0x19, 0x7a, - 0xa6, 0x8f, 0x32, 0xb9, 0xb7, 0xc5, 0x28, 0xe2, 0x5a, 0x25, 0xcc, 0xc2, 0xa3, 0x43, 0xe7, 0xa0, - 0xcf, 0x30, 0x1d, 0xcd, 0xd0, 0xed, 0x4c, 0x72, 0x52, 0x3a, 0xd1, 0x7f, 0xfa, 0x58, 0x4b, 0x43, - 0x58, 0x66, 0x38, 0x8a, 0x40, 0x46, 0xf3, 0x90, 0xb6, 0x8d, 0x86, 0x55, 0xc6, 0xa5, 0xb2, 0x51, - 0xc1, 0x25, 0x4d, 0xdf, 0x34, 0x32, 0x29, 0xca, 0x60, 0xa2, 0xb9, 0x23, 0x14, 0x71, 0xc6, 0xa8, - 0xe0, 0x79, 0x7d, 0xd3, 0x50, 0x86, 0xec, 0x40, 0x19, 0x1d, 0x82, 0x5e, 0x7b, 0x57, 0x77, 0xd4, - 0x9d, 0xcc, 0x00, 0xb5, 0x10, 0x5e, 0x92, 0x7f, 0xaf, 0x17, 0x86, 0x3b, 0x31, 0xb1, 0x8b, 0xd0, - 0xb3, 0x49, 0x7a, 0x99, 0x89, 0x75, 0xa3, 0x03, 0x46, 0x13, 0x54, 0x62, 0xef, 0x3e, 0x95, 0x98, - 0x87, 0x7e, 0x1d, 0xdb, 0x0e, 0xae, 0x30, 0x8b, 0x88, 0x77, 0x68, 0x53, 0xc0, 0x88, 0x9a, 0x4d, - 0x2a, 0xb1, 0x2f, 0x93, 0x7a, 0x16, 0x86, 0x5d, 0x91, 0x4a, 0x96, 0xaa, 0x57, 0x85, 0x6d, 0x4e, - 0x47, 0x49, 0x32, 0x55, 0x14, 0x74, 0x0a, 0x21, 0x53, 0x86, 0x70, 0xa0, 0x8c, 0x66, 0x01, 0x0c, - 0x1d, 0x1b, 0x9b, 0xa5, 0x0a, 0x2e, 0xd7, 0x32, 0xc9, 0x36, 0x5a, 0x5a, 0x26, 0x28, 0x4d, 0x5a, - 0x32, 0x18, 0xb4, 0x5c, 0x43, 0x8f, 0x79, 0xa6, 0xd6, 0xd7, 0xc6, 0x52, 0x16, 0xd9, 0x24, 0x6b, - 0xb2, 0xb6, 0x75, 0x18, 0xb2, 0x30, 0xb1, 0x7b, 0x5c, 0xe1, 0x3d, 0x4b, 0x51, 0x21, 0xa6, 0x22, - 0x7b, 0xa6, 0x70, 0x32, 0xd6, 0xb1, 0x41, 0xcb, 0x5f, 0x44, 0x77, 0x83, 0x0b, 0x28, 0x51, 0xb3, - 0x02, 0xea, 0x85, 0x06, 0x04, 0x70, 0x49, 0xad, 0xe3, 0xec, 0x8b, 0x30, 0x14, 0x54, 0x0f, 0x1a, - 0x83, 0x1e, 0xdb, 0x51, 0x2d, 0x87, 0x5a, 0x61, 0x8f, 0xc2, 0x0a, 0x28, 0x0d, 0x71, 0xac, 0x57, - 0xa8, 0x97, 0xeb, 0x51, 0xc8, 0x4f, 0xf4, 0x56, 0xaf, 0xc3, 0x71, 0xda, 0xe1, 0xfb, 0x9a, 0x47, - 0x34, 0xc0, 0x39, 0xdc, 0xef, 0xec, 0x79, 0x18, 0x0c, 0x74, 0xa0, 0xd3, 0xa6, 0xe5, 0x77, 0xc0, - 0xc1, 0x96, 0xac, 0xd1, 0xb3, 0x30, 0xd6, 0xd0, 0x35, 0xdd, 0xc1, 0x96, 0x69, 0x61, 0x62, 0xb1, - 0xac, 0xa9, 0xcc, 0x7f, 0xea, 0x6b, 0x63, 0x73, 0xeb, 0x7e, 0x6c, 0xc6, 0x45, 0x19, 0x6d, 0x34, - 0x03, 0x4f, 0xa6, 0x92, 0xdf, 0xee, 0x4b, 0xbf, 0xf4, 0xd2, 0x4b, 0x2f, 0xc5, 0xe4, 0x0f, 0xf7, - 0xc2, 0x58, 0xab, 0x39, 0xd3, 0x72, 0xfa, 0x1e, 0x82, 0x5e, 0xbd, 0x51, 0xdf, 0xc0, 0x16, 0x55, - 0x52, 0x8f, 0xc2, 0x4b, 0x28, 0x0f, 0x3d, 0x35, 0x75, 0x03, 0xd7, 0x32, 0x89, 0x49, 0xe9, 0xc4, - 0xd0, 0xe9, 0x07, 0x3b, 0x9a, 0x95, 0x53, 0x0b, 0x84, 0x44, 0x61, 0x94, 0xe8, 0x09, 0x48, 0x70, - 0x17, 0x4d, 0x38, 0x9c, 0xec, 0x8c, 0x03, 0x99, 0x4b, 0x0a, 0xa5, 0x43, 0x47, 0x21, 0x45, 0xfe, - 0x32, 0xdb, 0xe8, 0xa5, 0x32, 0x27, 0x09, 0x80, 0xd8, 0x05, 0xca, 0x42, 0x92, 0x4e, 0x93, 0x0a, - 0x16, 0x4b, 0x9b, 0x5b, 0x26, 0x86, 0x55, 0xc1, 0x9b, 0x6a, 0xa3, 0xe6, 0x94, 0xae, 0xa9, 0xb5, - 0x06, 0xa6, 0x06, 0x9f, 0x52, 0x06, 0x38, 0xf0, 0x2a, 0x81, 0xa1, 0x09, 0xe8, 0x67, 0xb3, 0x4a, - 0xd3, 0x2b, 0x78, 0x87, 0x7a, 0xcf, 0x1e, 0x85, 0x4d, 0xb4, 0x79, 0x02, 0x21, 0xcd, 0x3f, 0x6f, - 0x1b, 0xba, 0x30, 0x4d, 0xda, 0x04, 0x01, 0xd0, 0xe6, 0xcf, 0x87, 0x1d, 0xf7, 0xf1, 0xd6, 0xdd, - 0x0b, 0xdb, 0x94, 0xfc, 0xb9, 0x18, 0x24, 0xa8, 0xbf, 0x18, 0x86, 0xfe, 0xb5, 0xb7, 0xad, 0x14, - 0x4b, 0xb3, 0xcb, 0xeb, 0x85, 0x85, 0x62, 0x5a, 0x42, 0x43, 0x00, 0x14, 0x70, 0x79, 0x61, 0x39, - 0xbf, 0x96, 0x8e, 0xb9, 0xe5, 0xf9, 0xa5, 0xb5, 0x73, 0x67, 0xd2, 0x71, 0x97, 0x60, 0x9d, 0x01, - 0x12, 0x7e, 0x84, 0x47, 0x4f, 0xa7, 0x7b, 0x50, 0x1a, 0x06, 0x18, 0x83, 0xf9, 0x67, 0x8b, 0xb3, - 0xe7, 0xce, 0xa4, 0x7b, 0x83, 0x90, 0x47, 0x4f, 0xa7, 0xfb, 0xd0, 0x20, 0xa4, 0x28, 0xa4, 0xb0, - 0xbc, 0xbc, 0x90, 0x4e, 0xba, 0x3c, 0x57, 0xd7, 0x94, 0xf9, 0xa5, 0xb9, 0x74, 0xca, 0xe5, 0x39, - 0xa7, 0x2c, 0xaf, 0xaf, 0xa4, 0xc1, 0xe5, 0xb0, 0x58, 0x5c, 0x5d, 0xcd, 0xcf, 0x15, 0xd3, 0xfd, - 0x2e, 0x46, 0xe1, 0x6d, 0x6b, 0xc5, 0xd5, 0xf4, 0x40, 0x40, 0xac, 0x47, 0x4f, 0xa7, 0x07, 0xdd, - 0x26, 0x8a, 0x4b, 0xeb, 0x8b, 0xe9, 0x21, 0x34, 0x02, 0x83, 0xac, 0x09, 0x21, 0xc4, 0x70, 0x08, - 0x74, 0xee, 0x4c, 0x3a, 0xed, 0x09, 0xc2, 0xb8, 0x8c, 0x04, 0x00, 0xe7, 0xce, 0xa4, 0x91, 0x3c, - 0x03, 0x3d, 0xd4, 0xba, 0x10, 0x82, 0xa1, 0x85, 0x7c, 0xa1, 0xb8, 0x50, 0x5a, 0x5e, 0x59, 0x9b, - 0x5f, 0x5e, 0xca, 0x2f, 0xa4, 0x25, 0x0f, 0xa6, 0x14, 0x9f, 0x5e, 0x9f, 0x57, 0x8a, 0xb3, 0xe9, - 0x98, 0x1f, 0xb6, 0x52, 0xcc, 0xaf, 0x15, 0x67, 0xd3, 0x71, 0xb9, 0x0c, 0x63, 0xad, 0xfc, 0x64, - 0xcb, 0x99, 0xe1, 0x1b, 0xe2, 0x58, 0x9b, 0x21, 0xa6, 0xbc, 0x9a, 0x86, 0xf8, 0x9b, 0x31, 0x18, - 0x6d, 0xb1, 0x56, 0xb4, 0x6c, 0xe4, 0x12, 0xf4, 0x30, 0x13, 0x65, 0xab, 0xe7, 0x03, 0x2d, 0x17, - 0x1d, 0x6a, 0xb0, 0x4d, 0x2b, 0x28, 0xa5, 0xf3, 0x47, 0x10, 0xf1, 0x36, 0x11, 0x04, 0x61, 0xd1, - 0xe4, 0xd3, 0x7f, 0xb2, 0xc9, 0xa7, 0xb3, 0x65, 0xef, 0x5c, 0x27, 0xcb, 0x1e, 0x85, 0x75, 0xe7, - 0xdb, 0x7b, 0x5a, 0xf8, 0xf6, 0x8b, 0x30, 0xd2, 0xc4, 0xa8, 0x63, 0x1f, 0xfb, 0x6e, 0x09, 0x32, - 0xed, 0x94, 0x13, 0xe1, 0xe9, 0x62, 0x01, 0x4f, 0x77, 0x31, 0xac, 0xc1, 0xbb, 0xda, 0x0f, 0x42, - 0xd3, 0x58, 0x7f, 0x4a, 0x82, 0x43, 0xad, 0x23, 0xc5, 0x96, 0x32, 0x3c, 0x01, 0xbd, 0x75, 0xec, - 0x6c, 0x19, 0x22, 0x5a, 0xba, 0xaf, 0xc5, 0x1a, 0x4c, 0xaa, 0xc3, 0x83, 0xcd, 0xa9, 0xfc, 0x8b, - 0x78, 0xbc, 0x5d, 0xb8, 0xc7, 0xa4, 0x69, 0x92, 0xf4, 0x17, 0x62, 0x70, 0xb0, 0x25, 0xf3, 0x96, - 0x82, 0x1e, 0x07, 0xd0, 0x74, 0xb3, 0xe1, 0xb0, 0x88, 0x88, 0x39, 0xd8, 0x14, 0x85, 0x50, 0xe7, - 0x45, 0x9c, 0x67, 0xc3, 0x71, 0xeb, 0xe3, 0xb4, 0x1e, 0x18, 0x88, 0x22, 0x5c, 0xf0, 0x04, 0x4d, - 0x50, 0x41, 0xc7, 0xdb, 0xf4, 0xb4, 0xc9, 0x30, 0x1f, 0x86, 0x74, 0xb9, 0xa6, 0x61, 0xdd, 0x29, - 0xd9, 0x8e, 0x85, 0xd5, 0xba, 0xa6, 0x57, 0xe9, 0x0a, 0x92, 0xcc, 0xf5, 0x6c, 0xaa, 0x35, 0x1b, - 0x2b, 0xc3, 0xac, 0x7a, 0x55, 0xd4, 0x12, 0x0a, 0x6a, 0x40, 0x96, 0x8f, 0xa2, 0x37, 0x40, 0xc1, - 0xaa, 0x5d, 0x0a, 0xf9, 0x03, 0x29, 0xe8, 0xf7, 0xc5, 0xd5, 0xe8, 0x2e, 0x18, 0x78, 0x5e, 0xbd, - 0xa6, 0x96, 0xc4, 0x5e, 0x89, 0x69, 0xa2, 0x9f, 0xc0, 0x56, 0xf8, 0x7e, 0xe9, 0x61, 0x18, 0xa3, - 0x28, 0x46, 0xc3, 0xc1, 0x56, 0xa9, 0x5c, 0x53, 0x6d, 0x9b, 0x2a, 0x2d, 0x49, 0x51, 0x11, 0xa9, - 0x5b, 0x26, 0x55, 0x33, 0xa2, 0x06, 0x9d, 0x85, 0x51, 0x4a, 0x51, 0x6f, 0xd4, 0x1c, 0xcd, 0xac, - 0xe1, 0x12, 0xd9, 0xbd, 0xd9, 0x74, 0x25, 0x71, 0x25, 0x1b, 0x21, 0x18, 0x8b, 0x1c, 0x81, 0x48, - 0x64, 0xa3, 0x59, 0x38, 0x4e, 0xc9, 0xaa, 0x58, 0xc7, 0x96, 0xea, 0xe0, 0x12, 0x7e, 0xa1, 0xa1, - 0xd6, 0xec, 0x92, 0xaa, 0x57, 0x4a, 0x5b, 0xaa, 0xbd, 0x95, 0x19, 0x23, 0x0c, 0x0a, 0xb1, 0x8c, - 0xa4, 0x1c, 0x21, 0x88, 0x73, 0x1c, 0xaf, 0x48, 0xd1, 0xf2, 0x7a, 0xe5, 0x8a, 0x6a, 0x6f, 0xa1, - 0x1c, 0x1c, 0xa2, 0x5c, 0x6c, 0xc7, 0xd2, 0xf4, 0x6a, 0xa9, 0xbc, 0x85, 0xcb, 0xdb, 0xa5, 0x86, - 0xb3, 0x79, 0x21, 0x73, 0xd4, 0xdf, 0x3e, 0x95, 0x70, 0x95, 0xe2, 0xcc, 0x10, 0x94, 0x75, 0x67, - 0xf3, 0x02, 0x5a, 0x85, 0x01, 0x32, 0x18, 0x75, 0xed, 0x45, 0x5c, 0xda, 0x34, 0x2c, 0xba, 0x34, - 0x0e, 0xb5, 0x70, 0x4d, 0x3e, 0x0d, 0x4e, 0x2d, 0x73, 0x82, 0x45, 0xa3, 0x82, 0x73, 0x3d, 0xab, - 0x2b, 0xc5, 0xe2, 0xac, 0xd2, 0x2f, 0xb8, 0x5c, 0x36, 0x2c, 0x62, 0x50, 0x55, 0xc3, 0x55, 0x70, - 0x3f, 0x33, 0xa8, 0xaa, 0x21, 0xd4, 0x7b, 0x16, 0x46, 0xcb, 0x65, 0xd6, 0x67, 0xad, 0x5c, 0xe2, - 0x7b, 0x2c, 0x3b, 0x93, 0x0e, 0x28, 0xab, 0x5c, 0x9e, 0x63, 0x08, 0xdc, 0xc6, 0x6d, 0xf4, 0x18, - 0x1c, 0xf4, 0x94, 0xe5, 0x27, 0x1c, 0x69, 0xea, 0x65, 0x98, 0xf4, 0x2c, 0x8c, 0x9a, 0xbb, 0xcd, - 0x84, 0x28, 0xd0, 0xa2, 0xb9, 0x1b, 0x26, 0x3b, 0x0f, 0x63, 0xe6, 0x96, 0xd9, 0x4c, 0x77, 0xd2, - 0x4f, 0x87, 0xcc, 0x2d, 0x33, 0x4c, 0x78, 0x2f, 0xdd, 0x70, 0x5b, 0xb8, 0xac, 0x3a, 0xb8, 0x92, - 0x39, 0xec, 0x47, 0xf7, 0x55, 0xa0, 0x69, 0x48, 0x97, 0xcb, 0x25, 0xac, 0xab, 0x1b, 0x35, 0x5c, - 0x52, 0x2d, 0xac, 0xab, 0x76, 0x66, 0xc2, 0x8f, 0x3c, 0x54, 0x2e, 0x17, 0x69, 0x6d, 0x9e, 0x56, - 0xa2, 0x93, 0x30, 0x62, 0x6c, 0x3c, 0x5f, 0x66, 0x26, 0x59, 0x32, 0x2d, 0xbc, 0xa9, 0xed, 0x64, - 0xee, 0xa1, 0xfa, 0x1d, 0x26, 0x15, 0xd4, 0x20, 0x57, 0x28, 0x18, 0x3d, 0x00, 0xe9, 0xb2, 0xbd, - 0xa5, 0x5a, 0x26, 0xf5, 0xc9, 0xb6, 0xa9, 0x96, 0x71, 0xe6, 0x5e, 0x86, 0xca, 0xe0, 0x4b, 0x02, - 0x4c, 0xa6, 0x84, 0x7d, 0x5d, 0xdb, 0x74, 0x04, 0xc7, 0xfb, 0xd9, 0x94, 0xa0, 0x30, 0xce, 0xed, - 0x04, 0xa4, 0x89, 0x2a, 0x02, 0x0d, 0x9f, 0xa0, 0x68, 0x43, 0xe6, 0x96, 0xe9, 0x6f, 0xf7, 0x6e, - 0x18, 0x24, 0x98, 0x5e, 0xa3, 0x0f, 0xb0, 0x80, 0xcc, 0xdc, 0xf2, 0xb5, 0x78, 0x06, 0x0e, 0x11, - 0xa4, 0x3a, 0x76, 0xd4, 0x8a, 0xea, 0xa8, 0x3e, 0xec, 0x87, 0x28, 0x36, 0xd1, 0xfb, 0x22, 0xaf, - 0x0c, 0xc8, 0x69, 0x35, 0x36, 0x76, 0x5d, 0xcb, 0x3a, 0xc5, 0xe4, 0x24, 0x30, 0x61, 0x5b, 0x77, - 0x2c, 0xe8, 0x96, 0x73, 0x30, 0xe0, 0x37, 0x7c, 0x94, 0x02, 0x66, 0xfa, 0x69, 0x89, 0x44, 0x41, - 0x33, 0xcb, 0xb3, 0x24, 0x7e, 0x79, 0xae, 0x98, 0x8e, 0x91, 0x38, 0x6a, 0x61, 0x7e, 0xad, 0x58, - 0x52, 0xd6, 0x97, 0xd6, 0xe6, 0x17, 0x8b, 0xe9, 0xb8, 0x2f, 0x60, 0x7f, 0x32, 0x91, 0xbc, 0x2f, - 0x7d, 0xbf, 0xfc, 0x95, 0x18, 0x0c, 0x05, 0x77, 0x60, 0xe8, 0x2d, 0x70, 0x58, 0xa4, 0x4b, 0x6c, - 0xec, 0x94, 0xae, 0x6b, 0x16, 0x9d, 0x91, 0x75, 0x95, 0xad, 0x8e, 0xae, 0x4d, 0x8c, 0x71, 0xac, - 0x55, 0xec, 0x3c, 0xa3, 0x59, 0x64, 0xbe, 0xd5, 0x55, 0x07, 0x2d, 0xc0, 0x84, 0x6e, 0x94, 0x6c, - 0x47, 0xd5, 0x2b, 0xaa, 0x55, 0x29, 0x79, 0x89, 0xaa, 0x92, 0x5a, 0x2e, 0x63, 0xdb, 0x36, 0xd8, - 0x4a, 0xe8, 0x72, 0x39, 0xa6, 0x1b, 0xab, 0x1c, 0xd9, 0x5b, 0x22, 0xf2, 0x1c, 0x35, 0x64, 0xbf, - 0xf1, 0x76, 0xf6, 0x7b, 0x14, 0x52, 0x75, 0xd5, 0x2c, 0x61, 0xdd, 0xb1, 0x76, 0x69, 0xdc, 0x9d, - 0x54, 0x92, 0x75, 0xd5, 0x2c, 0x92, 0xf2, 0x9b, 0xb2, 0xfd, 0x79, 0x32, 0x91, 0x4c, 0xa6, 0x53, - 0x4f, 0x26, 0x92, 0xa9, 0x34, 0xc8, 0xaf, 0xc7, 0x61, 0xc0, 0x1f, 0x87, 0x93, 0x6d, 0x4d, 0x99, - 0x2e, 0x59, 0x12, 0x75, 0x6a, 0x77, 0xef, 0x19, 0xb5, 0x4f, 0xcd, 0x90, 0xb5, 0x2c, 0xd7, 0xcb, - 0xa2, 0x63, 0x85, 0x51, 0x92, 0x38, 0x82, 0x18, 0x1b, 0x66, 0xd1, 0x48, 0x52, 0xe1, 0x25, 0x34, - 0x07, 0xbd, 0xcf, 0xdb, 0x94, 0x77, 0x2f, 0xe5, 0x7d, 0xcf, 0xde, 0xbc, 0x9f, 0x5c, 0xa5, 0xcc, - 0x53, 0x4f, 0xae, 0x96, 0x96, 0x96, 0x95, 0xc5, 0xfc, 0x82, 0xc2, 0xc9, 0xd1, 0x11, 0x48, 0xd4, - 0xd4, 0x17, 0x77, 0x83, 0xab, 0x1e, 0x05, 0x75, 0x3a, 0x08, 0x47, 0x20, 0x71, 0x1d, 0xab, 0xdb, - 0xc1, 0xb5, 0x86, 0x82, 0xee, 0xe0, 0x64, 0x98, 0x86, 0x1e, 0xaa, 0x2f, 0x04, 0xc0, 0x35, 0x96, - 0x3e, 0x80, 0x92, 0x90, 0x98, 0x59, 0x56, 0xc8, 0x84, 0x48, 0xc3, 0x00, 0x83, 0x96, 0x56, 0xe6, - 0x8b, 0x33, 0xc5, 0x74, 0x4c, 0x3e, 0x0b, 0xbd, 0x4c, 0x09, 0x64, 0xb2, 0xb8, 0x6a, 0x48, 0x1f, - 0xe0, 0x45, 0xce, 0x43, 0x12, 0xb5, 0xeb, 0x8b, 0x85, 0xa2, 0x92, 0x8e, 0x05, 0x87, 0x3a, 0x91, - 0xee, 0x91, 0x6d, 0x18, 0xf0, 0x07, 0xe2, 0x6f, 0xce, 0x26, 0xfb, 0xf3, 0x12, 0xf4, 0xfb, 0x02, - 0x6b, 0x12, 0x11, 0xa9, 0xb5, 0x9a, 0x71, 0xbd, 0xa4, 0xd6, 0x34, 0xd5, 0xe6, 0xa6, 0x01, 0x14, - 0x94, 0x27, 0x90, 0x4e, 0x87, 0xee, 0x4d, 0x9a, 0x22, 0x3d, 0xe9, 0x5e, 0xf9, 0x63, 0x12, 0xa4, - 0xc3, 0x91, 0x6d, 0x48, 0x4c, 0xe9, 0x47, 0x29, 0xa6, 0xfc, 0x51, 0x09, 0x86, 0x82, 0xe1, 0x6c, - 0x48, 0xbc, 0xbb, 0x7e, 0xa4, 0xe2, 0x7d, 0x23, 0x06, 0x83, 0x81, 0x20, 0xb6, 0x53, 0xe9, 0x5e, - 0x80, 0x11, 0xad, 0x82, 0xeb, 0xa6, 0xe1, 0x60, 0xbd, 0xbc, 0x5b, 0xaa, 0xe1, 0x6b, 0xb8, 0x96, - 0x91, 0xa9, 0xd3, 0x98, 0xde, 0x3b, 0x4c, 0x9e, 0x9a, 0xf7, 0xe8, 0x16, 0x08, 0x59, 0x6e, 0x74, - 0x7e, 0xb6, 0xb8, 0xb8, 0xb2, 0xbc, 0x56, 0x5c, 0x9a, 0x79, 0x5b, 0x69, 0x7d, 0xe9, 0xa9, 0xa5, - 0xe5, 0x67, 0x96, 0x94, 0xb4, 0x16, 0x42, 0xbb, 0x83, 0xd3, 0x7e, 0x05, 0xd2, 0x61, 0xa1, 0xd0, - 0x61, 0x68, 0x25, 0x56, 0xfa, 0x00, 0x1a, 0x85, 0xe1, 0xa5, 0xe5, 0xd2, 0xea, 0xfc, 0x6c, 0xb1, - 0x54, 0xbc, 0x7c, 0xb9, 0x38, 0xb3, 0xb6, 0xca, 0x12, 0x1f, 0x2e, 0xf6, 0x5a, 0x60, 0x82, 0xcb, - 0xaf, 0xc6, 0x61, 0xb4, 0x85, 0x24, 0x28, 0xcf, 0xb7, 0x2c, 0x6c, 0x17, 0x75, 0xaa, 0x13, 0xe9, - 0xa7, 0x48, 0xcc, 0xb0, 0xa2, 0x5a, 0x0e, 0xdf, 0xe1, 0x3c, 0x00, 0x44, 0x4b, 0xba, 0xa3, 0x6d, - 0x6a, 0xd8, 0xe2, 0x79, 0x22, 0xb6, 0x8f, 0x19, 0xf6, 0xe0, 0x2c, 0x55, 0xf4, 0x10, 0x20, 0xd3, - 0xb0, 0x35, 0x47, 0xbb, 0x86, 0x4b, 0x9a, 0x2e, 0x92, 0x4a, 0x64, 0x5f, 0x93, 0x50, 0xd2, 0xa2, - 0x66, 0x5e, 0x77, 0x5c, 0x6c, 0x1d, 0x57, 0xd5, 0x10, 0x36, 0x71, 0xe6, 0x71, 0x25, 0x2d, 0x6a, - 0x5c, 0xec, 0xbb, 0x60, 0xa0, 0x62, 0x34, 0x48, 0xb0, 0xc7, 0xf0, 0xc8, 0xda, 0x21, 0x29, 0xfd, - 0x0c, 0xe6, 0xa2, 0xf0, 0x30, 0xde, 0xcb, 0x66, 0x0d, 0x28, 0xfd, 0x0c, 0xc6, 0x50, 0xee, 0x87, - 0x61, 0xb5, 0x5a, 0xb5, 0x08, 0x73, 0xc1, 0x88, 0x6d, 0x4c, 0x86, 0x5c, 0x30, 0x45, 0xcc, 0x3e, - 0x09, 0x49, 0xa1, 0x07, 0xb2, 0x54, 0x13, 0x4d, 0x94, 0x4c, 0xb6, 0xdb, 0x8e, 0x9d, 0x48, 0x29, - 0x49, 0x5d, 0x54, 0xde, 0x05, 0x03, 0x9a, 0x5d, 0xf2, 0x92, 0xf3, 0xb1, 0xc9, 0xd8, 0x89, 0xa4, - 0xd2, 0xaf, 0xd9, 0x6e, 0x62, 0x53, 0xfe, 0x54, 0x0c, 0x86, 0x82, 0x1f, 0x17, 0xd0, 0x2c, 0x24, - 0x6b, 0x46, 0x59, 0xa5, 0xa6, 0xc5, 0xbe, 0x6c, 0x9d, 0x88, 0xf8, 0x1e, 0x31, 0xb5, 0xc0, 0xf1, - 0x15, 0x97, 0x32, 0xfb, 0xc7, 0x12, 0x24, 0x05, 0x18, 0x1d, 0x82, 0x84, 0xa9, 0x3a, 0x5b, 0x94, - 0x5d, 0x4f, 0x21, 0x96, 0x96, 0x14, 0x5a, 0x26, 0x70, 0xdb, 0x54, 0x75, 0x6a, 0x02, 0x1c, 0x4e, - 0xca, 0x64, 0x5c, 0x6b, 0x58, 0xad, 0xd0, 0x5d, 0x8f, 0x51, 0xaf, 0x63, 0xdd, 0xb1, 0xc5, 0xb8, - 0x72, 0xf8, 0x0c, 0x07, 0xa3, 0x07, 0x61, 0xc4, 0xb1, 0x54, 0xad, 0x16, 0xc0, 0x4d, 0x50, 0xdc, - 0xb4, 0xa8, 0x70, 0x91, 0x73, 0x70, 0x44, 0xf0, 0xad, 0x60, 0x47, 0x2d, 0x6f, 0xe1, 0x8a, 0x47, - 0xd4, 0x4b, 0xb3, 0x1b, 0x87, 0x39, 0xc2, 0x2c, 0xaf, 0x17, 0xb4, 0xf2, 0x57, 0x24, 0x18, 0x11, - 0xfb, 0xb4, 0x8a, 0xab, 0xac, 0x45, 0x00, 0x55, 0xd7, 0x0d, 0xc7, 0xaf, 0xae, 0x66, 0x53, 0x6e, - 0xa2, 0x9b, 0xca, 0xbb, 0x44, 0x8a, 0x8f, 0x41, 0xb6, 0x0e, 0xe0, 0xd5, 0xb4, 0x55, 0xdb, 0x04, - 0xf4, 0xf3, 0x2f, 0x47, 0xf4, 0xf3, 0x23, 0xdb, 0xd9, 0x03, 0x03, 0x91, 0x0d, 0x1d, 0x1a, 0x83, - 0x9e, 0x0d, 0x5c, 0xd5, 0x74, 0x9e, 0x0f, 0x66, 0x05, 0x91, 0x7f, 0x49, 0xb8, 0xf9, 0x97, 0xc2, - 0x7b, 0x25, 0x18, 0x2d, 0x1b, 0xf5, 0xb0, 0xbc, 0x85, 0x74, 0x28, 0xbd, 0x60, 0x5f, 0x91, 0x9e, - 0x7b, 0xa2, 0xaa, 0x39, 0x5b, 0x8d, 0x8d, 0xa9, 0xb2, 0x51, 0x9f, 0xae, 0x1a, 0x35, 0x55, 0xaf, - 0x7a, 0xdf, 0x4f, 0xe9, 0x8f, 0xf2, 0xa9, 0x2a, 0xd6, 0x4f, 0x55, 0x0d, 0xdf, 0xd7, 0xd4, 0x8b, - 0xde, 0xcf, 0xbf, 0x92, 0xa4, 0x5f, 0x8d, 0xc5, 0xe7, 0x56, 0x0a, 0xaf, 0xc5, 0xb2, 0x73, 0xac, - 0xb9, 0x15, 0xa1, 0x1e, 0x05, 0x6f, 0xd6, 0x70, 0x99, 0x74, 0x19, 0xbe, 0xf3, 0x20, 0x8c, 0x55, - 0x8d, 0xaa, 0x41, 0x39, 0x4e, 0x93, 0x5f, 0xfc, 0x8b, 0x6c, 0xca, 0x85, 0x66, 0x23, 0x3f, 0xdf, - 0xe6, 0x96, 0x60, 0x94, 0x23, 0x97, 0xe8, 0x27, 0x21, 0xb6, 0xb1, 0x41, 0x7b, 0xa6, 0xd5, 0x32, - 0xbf, 0xfd, 0x2d, 0xba, 0xa0, 0x2b, 0x23, 0x9c, 0x94, 0xd4, 0xb1, 0xbd, 0x4f, 0x4e, 0x81, 0x83, - 0x01, 0x7e, 0x6c, 0xda, 0x62, 0x2b, 0x82, 0xe3, 0x1f, 0x72, 0x8e, 0xa3, 0x3e, 0x8e, 0xab, 0x9c, - 0x34, 0x37, 0x03, 0x83, 0xdd, 0xf0, 0xfa, 0x17, 0x9c, 0xd7, 0x00, 0xf6, 0x33, 0x99, 0x83, 0x61, - 0xca, 0xa4, 0xdc, 0xb0, 0x1d, 0xa3, 0x4e, 0x7d, 0xe2, 0xde, 0x6c, 0xfe, 0xe5, 0xb7, 0xd8, 0x3c, - 0x1a, 0x22, 0x64, 0x33, 0x2e, 0x55, 0x2e, 0x07, 0xf4, 0x2b, 0x58, 0x05, 0x97, 0x6b, 0x11, 0x1c, - 0xbe, 0xc8, 0x05, 0x71, 0xf1, 0x73, 0x57, 0x61, 0x8c, 0xfc, 0xa6, 0x2e, 0xcb, 0x2f, 0x49, 0x74, - 0x0e, 0x2e, 0xf3, 0x95, 0x77, 0xb3, 0xa9, 0x3a, 0xea, 0x32, 0xf0, 0xc9, 0xe4, 0x1b, 0xc5, 0x2a, - 0x76, 0x1c, 0x6c, 0xd9, 0x25, 0xb5, 0xd6, 0x4a, 0x3c, 0x5f, 0x12, 0x23, 0xf3, 0x2b, 0xdf, 0x0d, - 0x8e, 0xe2, 0x1c, 0xa3, 0xcc, 0xd7, 0x6a, 0xb9, 0x75, 0x38, 0xdc, 0xc2, 0x2a, 0x3a, 0xe0, 0xf9, - 0x2a, 0xe7, 0x39, 0xd6, 0x64, 0x19, 0x84, 0xed, 0x0a, 0x08, 0xb8, 0x3b, 0x96, 0x1d, 0xf0, 0xfc, - 0x08, 0xe7, 0x89, 0x38, 0xad, 0x18, 0x52, 0xc2, 0xf1, 0x49, 0x18, 0xb9, 0x86, 0xad, 0x0d, 0xc3, - 0xe6, 0x89, 0xa3, 0x0e, 0xd8, 0x7d, 0x94, 0xb3, 0x1b, 0xe6, 0x84, 0x34, 0x93, 0x44, 0x78, 0x3d, - 0x06, 0xc9, 0x4d, 0xb5, 0x8c, 0x3b, 0x60, 0x71, 0x83, 0xb3, 0xe8, 0x23, 0xf8, 0x84, 0x34, 0x0f, - 0x03, 0x55, 0x83, 0xaf, 0x5a, 0xd1, 0xe4, 0x1f, 0xe3, 0xe4, 0xfd, 0x82, 0x86, 0xb3, 0x30, 0x0d, - 0xb3, 0x51, 0x23, 0x4b, 0x5a, 0x34, 0x8b, 0xbf, 0x27, 0x58, 0x08, 0x1a, 0xce, 0xa2, 0x0b, 0xb5, - 0x7e, 0x5c, 0xb0, 0xb0, 0x7d, 0xfa, 0xbc, 0x04, 0xfd, 0x86, 0x5e, 0xdb, 0x35, 0xf4, 0x4e, 0x84, - 0xf8, 0x04, 0xe7, 0x00, 0x9c, 0x84, 0x30, 0xb8, 0x08, 0xa9, 0x4e, 0x07, 0xe2, 0xef, 0x7f, 0x57, - 0x4c, 0x0f, 0x31, 0x02, 0x73, 0x30, 0x2c, 0x1c, 0x94, 0x66, 0xe8, 0x1d, 0xb0, 0xf8, 0x07, 0x9c, - 0xc5, 0x90, 0x8f, 0x8c, 0x77, 0xc3, 0xc1, 0xb6, 0x53, 0xc5, 0x9d, 0x30, 0xf9, 0x94, 0xe8, 0x06, - 0x27, 0xe1, 0xaa, 0xdc, 0xc0, 0x7a, 0x79, 0xab, 0x33, 0x0e, 0x9f, 0x16, 0xaa, 0x14, 0x34, 0x84, - 0xc5, 0x0c, 0x0c, 0xd6, 0x55, 0xcb, 0xde, 0x52, 0x6b, 0x1d, 0x0d, 0xc7, 0x3f, 0xe4, 0x3c, 0x06, - 0x5c, 0x22, 0xae, 0x91, 0x86, 0xde, 0x0d, 0x9b, 0xd7, 0x84, 0x46, 0x7c, 0x64, 0x7c, 0xea, 0xd9, - 0x0e, 0xcd, 0xb2, 0x75, 0xc3, 0xed, 0x1f, 0x89, 0xa9, 0xc7, 0x68, 0x17, 0xfd, 0x1c, 0x2f, 0x42, - 0xca, 0xd6, 0x5e, 0xec, 0x88, 0xcd, 0xaf, 0x8b, 0x91, 0xa6, 0x04, 0x84, 0xf8, 0x6d, 0x70, 0xa4, - 0xe5, 0x32, 0xd1, 0x01, 0xb3, 0x7f, 0xcc, 0x99, 0x1d, 0x6a, 0xb1, 0x54, 0x70, 0x97, 0xd0, 0x2d, - 0xcb, 0xdf, 0x10, 0x2e, 0x01, 0x87, 0x78, 0xad, 0x90, 0x7d, 0x84, 0xad, 0x6e, 0x76, 0xa7, 0xb5, - 0xdf, 0x14, 0x5a, 0x63, 0xb4, 0x01, 0xad, 0xad, 0xc1, 0x21, 0xce, 0xb1, 0xbb, 0x71, 0xfd, 0x2d, - 0xe1, 0x58, 0x19, 0xf5, 0x7a, 0x70, 0x74, 0x7f, 0x02, 0xb2, 0xae, 0x3a, 0x45, 0xc0, 0x6a, 0x97, - 0xea, 0xaa, 0xd9, 0x01, 0xe7, 0xdf, 0xe6, 0x9c, 0x85, 0xc7, 0x77, 0x23, 0x5e, 0x7b, 0x51, 0x35, - 0x09, 0xf3, 0x67, 0x21, 0x23, 0x98, 0x37, 0x74, 0x0b, 0x97, 0x8d, 0xaa, 0xae, 0xbd, 0x88, 0x2b, - 0x1d, 0xb0, 0xfe, 0x4c, 0x68, 0xa8, 0xd6, 0x7d, 0xe4, 0x84, 0xf3, 0x3c, 0xa4, 0xdd, 0x58, 0xa5, - 0xa4, 0xd5, 0x4d, 0xc3, 0x72, 0x22, 0x38, 0xfe, 0x8e, 0x18, 0x29, 0x97, 0x6e, 0x9e, 0x92, 0xe5, - 0x8a, 0x30, 0x44, 0x8b, 0x9d, 0x9a, 0xe4, 0x67, 0x39, 0xa3, 0x41, 0x8f, 0x8a, 0x3b, 0x8e, 0xb2, - 0x51, 0x37, 0x55, 0xab, 0x13, 0xff, 0xf7, 0xbb, 0xc2, 0x71, 0x70, 0x12, 0xee, 0x38, 0x9c, 0x5d, - 0x13, 0x93, 0xd5, 0xbe, 0x03, 0x0e, 0x9f, 0x13, 0x8e, 0x43, 0xd0, 0x70, 0x16, 0x22, 0x60, 0xe8, - 0x80, 0xc5, 0x3f, 0x11, 0x2c, 0x04, 0x0d, 0x61, 0xf1, 0xb4, 0xb7, 0xd0, 0x5a, 0xb8, 0xaa, 0xd9, - 0x8e, 0xc5, 0xc2, 0xe4, 0xbd, 0x59, 0xfd, 0xd3, 0xef, 0x06, 0x83, 0x30, 0xc5, 0x47, 0x4a, 0x3c, - 0x11, 0x4f, 0xbb, 0xd2, 0x5d, 0x54, 0xb4, 0x60, 0xbf, 0x27, 0x3c, 0x91, 0x8f, 0x8c, 0xc8, 0xe6, - 0x8b, 0x10, 0x89, 0xda, 0xcb, 0x64, 0xef, 0xd0, 0x01, 0xbb, 0x7f, 0x16, 0x12, 0x6e, 0x55, 0xd0, - 0x12, 0x9e, 0xbe, 0xf8, 0xa7, 0xa1, 0x6f, 0xe3, 0xdd, 0x8e, 0xac, 0xf3, 0xf7, 0x43, 0xf1, 0xcf, - 0x3a, 0xa3, 0x64, 0x3e, 0x64, 0x38, 0x14, 0x4f, 0xa1, 0xa8, 0xf3, 0x43, 0x99, 0x9f, 0xfe, 0x3e, - 0xef, 0x6f, 0x30, 0x9c, 0xca, 0x2d, 0x10, 0x23, 0x0f, 0x06, 0x3d, 0xd1, 0xcc, 0xde, 0xfd, 0x7d, - 0xd7, 0xce, 0x03, 0x31, 0x4f, 0xee, 0x32, 0x0c, 0x06, 0x02, 0x9e, 0x68, 0x56, 0x3f, 0xc3, 0x59, - 0x0d, 0xf8, 0xe3, 0x9d, 0xdc, 0x59, 0x48, 0x90, 0xe0, 0x25, 0x9a, 0xfc, 0x67, 0x39, 0x39, 0x45, - 0xcf, 0x3d, 0x0e, 0x49, 0x11, 0xb4, 0x44, 0x93, 0xfe, 0x1c, 0x27, 0x75, 0x49, 0x08, 0xb9, 0x08, - 0x58, 0xa2, 0xc9, 0x7f, 0x5e, 0x90, 0x0b, 0x12, 0x42, 0xde, 0xb9, 0x0a, 0x3f, 0xff, 0x8b, 0x09, - 0xbe, 0xe8, 0x08, 0xdd, 0x5d, 0x84, 0x3e, 0x1e, 0xa9, 0x44, 0x53, 0xff, 0x02, 0x6f, 0x5c, 0x50, - 0xe4, 0xce, 0x43, 0x4f, 0x87, 0x0a, 0x7f, 0x0f, 0x27, 0x65, 0xf8, 0xb9, 0x19, 0xe8, 0xf7, 0x45, - 0x27, 0xd1, 0xe4, 0x7f, 0x97, 0x93, 0xfb, 0xa9, 0x88, 0xe8, 0x3c, 0x3a, 0x89, 0x66, 0xf0, 0x5e, - 0x21, 0x3a, 0xa7, 0x20, 0x6a, 0x13, 0x81, 0x49, 0x34, 0xf5, 0xfb, 0x84, 0xd6, 0x05, 0x49, 0xee, - 0x12, 0xa4, 0xdc, 0xc5, 0x26, 0x9a, 0xfe, 0xfd, 0x9c, 0xde, 0xa3, 0x21, 0x1a, 0xf0, 0x2d, 0x76, - 0xd1, 0x2c, 0x3e, 0x20, 0x34, 0xe0, 0xa3, 0x22, 0xd3, 0x28, 0x1c, 0xc0, 0x44, 0x73, 0xfa, 0x25, - 0x31, 0x8d, 0x42, 0xf1, 0x0b, 0x19, 0x4d, 0xea, 0xf3, 0xa3, 0x59, 0xfc, 0xb2, 0x18, 0x4d, 0x8a, - 0x4f, 0xc4, 0x08, 0x47, 0x04, 0xd1, 0x3c, 0x3e, 0x24, 0xc4, 0x08, 0x05, 0x04, 0xb9, 0x15, 0x40, - 0xcd, 0xd1, 0x40, 0x34, 0xbf, 0x0f, 0x73, 0x7e, 0x23, 0x4d, 0xc1, 0x40, 0xee, 0x19, 0x38, 0xd4, - 0x3a, 0x12, 0x88, 0xe6, 0xfa, 0x2b, 0xdf, 0x0f, 0xed, 0xdd, 0xfc, 0x81, 0x40, 0x6e, 0xcd, 0x5b, - 0x52, 0xfc, 0x51, 0x40, 0x34, 0xdb, 0x57, 0xbf, 0x1f, 0x74, 0xdc, 0xfe, 0x20, 0x20, 0x97, 0x07, - 0xf0, 0x16, 0xe0, 0x68, 0x5e, 0x1f, 0xe5, 0xbc, 0x7c, 0x44, 0x64, 0x6a, 0xf0, 0xf5, 0x37, 0x9a, - 0xfe, 0x86, 0x98, 0x1a, 0x9c, 0x82, 0x4c, 0x0d, 0xb1, 0xf4, 0x46, 0x53, 0x7f, 0x4c, 0x4c, 0x0d, - 0x41, 0x42, 0x2c, 0xdb, 0xb7, 0xba, 0x45, 0x73, 0xf8, 0x84, 0xb0, 0x6c, 0x1f, 0x55, 0x6e, 0x09, - 0x46, 0x9a, 0x16, 0xc4, 0x68, 0x56, 0xbf, 0xca, 0x59, 0xa5, 0xc3, 0xeb, 0xa1, 0x7f, 0xf1, 0xe2, - 0x8b, 0x61, 0x34, 0xb7, 0x4f, 0x86, 0x16, 0x2f, 0xbe, 0x16, 0xe6, 0x2e, 0x42, 0x52, 0x6f, 0xd4, - 0x6a, 0x64, 0xf2, 0xa0, 0xbd, 0xcf, 0xfc, 0x65, 0xfe, 0xf3, 0x0f, 0xb9, 0x76, 0x04, 0x41, 0xee, - 0x2c, 0xf4, 0xe0, 0xfa, 0x06, 0xae, 0x44, 0x51, 0x7e, 0xe7, 0x87, 0xc2, 0x61, 0x12, 0xec, 0xdc, - 0x25, 0x00, 0x96, 0x1a, 0xa1, 0x9f, 0x07, 0x23, 0x68, 0xff, 0xcb, 0x0f, 0xf9, 0x69, 0x1c, 0x8f, - 0xc4, 0x63, 0xc0, 0xce, 0xf6, 0xec, 0xcd, 0xe0, 0xbb, 0x41, 0x06, 0x74, 0x44, 0x1e, 0x83, 0xbe, - 0xe7, 0x6d, 0x43, 0x77, 0xd4, 0x6a, 0x14, 0xf5, 0x7f, 0xe5, 0xd4, 0x02, 0x9f, 0x28, 0xac, 0x6e, - 0x58, 0xd8, 0x51, 0xab, 0x76, 0x14, 0xed, 0x7f, 0xe3, 0xb4, 0x2e, 0x01, 0x21, 0x2e, 0xab, 0xb6, - 0xd3, 0x49, 0xbf, 0xff, 0x52, 0x10, 0x0b, 0x02, 0x22, 0x34, 0xf9, 0xbd, 0x8d, 0x77, 0xa3, 0x68, - 0xbf, 0x27, 0x84, 0xe6, 0xf8, 0xb9, 0xc7, 0x21, 0x45, 0x7e, 0xb2, 0x23, 0x76, 0x11, 0xc4, 0xff, - 0x9d, 0x13, 0x7b, 0x14, 0xa4, 0x65, 0xdb, 0xa9, 0x38, 0x5a, 0xb4, 0xb2, 0x6f, 0xf1, 0x91, 0x16, - 0xf8, 0xb9, 0x3c, 0xf4, 0xdb, 0x4e, 0xa5, 0xd2, 0xe0, 0xf1, 0x69, 0x04, 0xf9, 0xff, 0xf8, 0xa1, - 0x9b, 0xb2, 0x70, 0x69, 0xc8, 0x68, 0x5f, 0xdf, 0x76, 0x4c, 0x83, 0x7e, 0x02, 0x89, 0xe2, 0xf0, - 0x7d, 0xce, 0xc1, 0x47, 0x92, 0x9b, 0x81, 0x01, 0xd2, 0x17, 0x0b, 0x9b, 0x98, 0x7e, 0xaf, 0x8a, - 0x60, 0xf1, 0x03, 0xae, 0x80, 0x00, 0x51, 0xe1, 0x27, 0xbf, 0xf8, 0xfa, 0xb8, 0xf4, 0xe5, 0xd7, - 0xc7, 0xa5, 0x6f, 0xbc, 0x3e, 0x2e, 0xbd, 0xef, 0x9b, 0xe3, 0x07, 0xbe, 0xfc, 0xcd, 0xf1, 0x03, - 0x5f, 0xfb, 0xe6, 0xf8, 0x81, 0xd6, 0x69, 0x63, 0x98, 0x33, 0xe6, 0x0c, 0x96, 0x30, 0x7e, 0x4e, - 0x0e, 0xa4, 0x8b, 0xab, 0x86, 0x97, 0xad, 0x75, 0x37, 0x39, 0xf0, 0x03, 0x89, 0x6c, 0x98, 0x83, - 0xb9, 0x5c, 0x55, 0xdf, 0x6d, 0x73, 0x07, 0x27, 0xdb, 0x32, 0x31, 0x2c, 0xbf, 0x05, 0xe2, 0x79, - 0x7d, 0x17, 0x1d, 0x61, 0x3e, 0xaf, 0xd4, 0xb0, 0x6a, 0xfc, 0xe8, 0x57, 0x1f, 0x29, 0xaf, 0x5b, - 0x35, 0x34, 0xe6, 0x9d, 0xcf, 0x94, 0x4e, 0x0c, 0xf0, 0x43, 0x97, 0xb9, 0xc4, 0xf7, 0x3e, 0x31, - 0x71, 0xa0, 0xb0, 0x1d, 0xee, 0xe1, 0xe7, 0x23, 0x7b, 0x99, 0xcc, 0xeb, 0xbb, 0xb4, 0x93, 0x2b, - 0xd2, 0x73, 0x3d, 0xa4, 0x0d, 0x5b, 0x24, 0xb6, 0xc7, 0xc3, 0x89, 0xed, 0x67, 0x70, 0xad, 0xf6, - 0x94, 0x6e, 0x5c, 0xd7, 0xd7, 0x08, 0xda, 0x46, 0x2f, 0xe5, 0xf1, 0x28, 0xbc, 0x2f, 0x06, 0x13, - 0xe1, 0x7e, 0x13, 0xc3, 0xb1, 0x1d, 0xb5, 0x6e, 0xb6, 0xbb, 0x81, 0x74, 0x11, 0x52, 0x6b, 0x02, - 0x07, 0x65, 0xa0, 0xcf, 0xc6, 0x65, 0x43, 0xaf, 0xd8, 0xb4, 0xb3, 0x71, 0x45, 0x14, 0x49, 0x67, - 0x75, 0x55, 0x37, 0x6c, 0x7e, 0x40, 0x92, 0x15, 0x0a, 0x1f, 0x94, 0xba, 0x1b, 0xc9, 0x21, 0xb7, - 0x29, 0xd1, 0xd3, 0x07, 0xf7, 0x4a, 0xff, 0x53, 0x2d, 0x78, 0x5d, 0xf0, 0xe5, 0xfa, 0x3b, 0x55, - 0xc9, 0xbb, 0xe2, 0x70, 0xa4, 0x6c, 0xd8, 0x75, 0xc3, 0x2e, 0xb1, 0x11, 0x66, 0x05, 0xae, 0x8c, - 0x01, 0x7f, 0x55, 0x07, 0xf9, 0xff, 0x2b, 0x30, 0x44, 0x67, 0x01, 0xcd, 0x7c, 0x52, 0xc7, 0x13, - 0xb9, 0x56, 0xfc, 0xd1, 0xbf, 0xed, 0xa1, 0x56, 0x33, 0xe8, 0x12, 0xd2, 0xa3, 0x1d, 0x6b, 0x30, - 0xa6, 0xd5, 0xcd, 0x1a, 0xa6, 0xdf, 0x80, 0x4a, 0x6e, 0x5d, 0x34, 0xbf, 0x2f, 0x71, 0x7e, 0xa3, - 0x1e, 0xf9, 0xbc, 0xa0, 0xce, 0x2d, 0xc0, 0x88, 0x5a, 0x2e, 0x63, 0x33, 0xc0, 0x32, 0x62, 0x86, - 0x0a, 0x01, 0xd3, 0x9c, 0xd2, 0xe5, 0x56, 0xb8, 0xd4, 0x6e, 0x6c, 0x9f, 0xbb, 0xd7, 0x37, 0x68, - 0x16, 0xae, 0x62, 0xfd, 0x94, 0x8e, 0x9d, 0xeb, 0x86, 0xb5, 0xcd, 0xd5, 0x7b, 0x8a, 0x35, 0x25, - 0x06, 0xe1, 0x67, 0xe2, 0x30, 0xce, 0x2a, 0xa6, 0x37, 0x54, 0x1b, 0x4f, 0x5f, 0x7b, 0x64, 0x03, - 0x3b, 0xea, 0x23, 0xd3, 0x65, 0x43, 0xd3, 0xf9, 0x48, 0x8c, 0xf2, 0x71, 0x21, 0xf5, 0x53, 0xbc, - 0xbe, 0xcd, 0xc4, 0x9c, 0x83, 0xc4, 0x8c, 0xa1, 0xe9, 0xc4, 0x22, 0x2b, 0x58, 0x37, 0xea, 0x7c, - 0x5a, 0xb2, 0x02, 0xba, 0x1b, 0x7a, 0xd5, 0xba, 0xd1, 0xd0, 0x1d, 0xf6, 0xf9, 0xaa, 0xd0, 0xff, - 0xc5, 0x9b, 0x13, 0x07, 0xfe, 0xec, 0xe6, 0x44, 0x7c, 0x5e, 0x77, 0x14, 0x5e, 0x95, 0x4b, 0x7c, - 0xfb, 0xe3, 0x13, 0x92, 0xfc, 0x24, 0xf4, 0xcd, 0xe2, 0xf2, 0x7e, 0x78, 0xcd, 0xe2, 0x72, 0x88, - 0xd7, 0x03, 0x90, 0x9c, 0xd7, 0x1d, 0x76, 0x66, 0xf6, 0x38, 0xc4, 0x35, 0x9d, 0x9d, 0xc2, 0x0a, - 0xb5, 0x4f, 0xe0, 0x04, 0x75, 0x16, 0x97, 0x5d, 0xd4, 0x0a, 0x2e, 0x87, 0x51, 0x09, 0x7b, 0x02, - 0x2f, 0xcc, 0x7e, 0xed, 0xcf, 0xc7, 0x0f, 0xbc, 0xf4, 0xfa, 0xf8, 0x81, 0xb6, 0x23, 0xe1, 0x77, - 0x87, 0x5c, 0xc5, 0x7c, 0x08, 0xec, 0xca, 0xf6, 0xb4, 0x13, 0x98, 0x0b, 0x7f, 0x27, 0x06, 0xe3, - 0x4d, 0x26, 0xce, 0x17, 0x86, 0x76, 0xde, 0x21, 0x07, 0xc9, 0x59, 0xb1, 0xde, 0x74, 0xeb, 0x1c, - 0x7e, 0xb9, 0x4b, 0xe7, 0x30, 0x28, 0x5a, 0x12, 0xbe, 0xe1, 0x64, 0xb4, 0x6f, 0x10, 0xf2, 0xef, - 0xc3, 0x35, 0xbc, 0x96, 0x80, 0xe3, 0xf4, 0x52, 0x88, 0x55, 0xd7, 0x74, 0x67, 0xba, 0x6c, 0xed, - 0x9a, 0x0e, 0x5d, 0x4e, 0x8c, 0x4d, 0xae, 0x8d, 0x11, 0xaf, 0x7a, 0x8a, 0x55, 0xb7, 0x31, 0xc9, - 0x4d, 0xe8, 0x59, 0x21, 0x74, 0x44, 0x11, 0x8e, 0xe1, 0xa8, 0x35, 0xae, 0x20, 0x56, 0x20, 0x50, - 0x76, 0x91, 0x24, 0xc6, 0xa0, 0x9a, 0xb8, 0x43, 0x52, 0xc3, 0xea, 0x26, 0x3b, 0xb8, 0x1b, 0xa7, - 0x4b, 0x48, 0x92, 0x00, 0xe8, 0x19, 0xdd, 0x31, 0xe8, 0x51, 0x1b, 0xec, 0x93, 0x73, 0x9c, 0xac, - 0x2d, 0xb4, 0x20, 0x3f, 0x05, 0x7d, 0xfc, 0x33, 0x17, 0x4a, 0x43, 0x7c, 0x1b, 0xef, 0xd2, 0x76, - 0x06, 0x14, 0xf2, 0x13, 0x4d, 0x41, 0x0f, 0x15, 0x9e, 0xdf, 0x48, 0xc8, 0x4c, 0x35, 0x49, 0x3f, - 0x45, 0x85, 0x54, 0x18, 0x9a, 0xfc, 0x24, 0x24, 0x67, 0x8d, 0xba, 0xa6, 0x1b, 0x41, 0x6e, 0x29, - 0xc6, 0x8d, 0xca, 0x6c, 0x36, 0xb8, 0xe9, 0x2b, 0xac, 0x80, 0x0e, 0x41, 0x2f, 0x3b, 0xc8, 0xcd, - 0x3f, 0x9b, 0xf3, 0x92, 0x3c, 0x03, 0x7d, 0x94, 0xf7, 0xb2, 0x89, 0x10, 0xbf, 0xd9, 0xc3, 0x4f, - 0x8c, 0x53, 0x2f, 0xc9, 0xd9, 0xc7, 0x3c, 0x61, 0x11, 0x24, 0x2a, 0xaa, 0xa3, 0xf2, 0x7e, 0xd3, - 0xdf, 0xf2, 0x13, 0x90, 0xe4, 0x4c, 0x6c, 0x74, 0x1a, 0xe2, 0x86, 0x69, 0xf3, 0x0f, 0xdf, 0xd9, - 0x76, 0x5d, 0x59, 0x36, 0x0b, 0x09, 0x32, 0x69, 0x14, 0x82, 0x5c, 0x50, 0xda, 0xce, 0x92, 0x0b, - 0x3e, 0x43, 0xf2, 0x0d, 0xb9, 0xef, 0x27, 0x1b, 0xd2, 0x26, 0x73, 0x70, 0x8d, 0xe5, 0x13, 0x31, - 0x18, 0xf7, 0xd5, 0x5e, 0xc3, 0x16, 0xd9, 0xeb, 0xb1, 0x09, 0xc6, 0xad, 0x05, 0xf9, 0x84, 0xe4, - 0xf5, 0x6d, 0xcc, 0xe5, 0x71, 0x88, 0xe7, 0x4d, 0x13, 0x65, 0x21, 0xc9, 0x3e, 0x70, 0x1b, 0xcc, - 0x5e, 0x12, 0x8a, 0x5b, 0x26, 0x75, 0xb6, 0xb1, 0xe9, 0x5c, 0x57, 0x2d, 0xf7, 0x0a, 0x93, 0x28, - 0xcb, 0x8f, 0x41, 0x6a, 0xc6, 0xd0, 0x6d, 0xac, 0xdb, 0x0d, 0x3a, 0xf5, 0x36, 0x6a, 0x46, 0x79, - 0x9b, 0x73, 0x60, 0x05, 0xa2, 0x70, 0xd5, 0x34, 0x29, 0x65, 0x42, 0x21, 0x3f, 0x99, 0x9b, 0x2a, - 0xac, 0xb6, 0x55, 0xd1, 0x63, 0xdd, 0xab, 0x88, 0x77, 0xd2, 0xd5, 0xd1, 0xff, 0x92, 0xe0, 0x58, - 0xf3, 0x84, 0xda, 0xc6, 0xbb, 0x76, 0xb7, 0xf3, 0xe9, 0x59, 0x48, 0xad, 0xd0, 0x7b, 0xc4, 0x4f, - 0xe1, 0x5d, 0x94, 0x85, 0x3e, 0x5c, 0x39, 0x7d, 0xf6, 0xec, 0x23, 0x8f, 0x31, 0x6b, 0xbf, 0x72, - 0x40, 0x11, 0x00, 0x34, 0x0e, 0x29, 0x1b, 0x97, 0xcd, 0xd3, 0x67, 0xcf, 0x6d, 0x3f, 0xc2, 0xcc, - 0xeb, 0xca, 0x01, 0xc5, 0x03, 0xe5, 0x92, 0xa4, 0xd7, 0xdf, 0xfe, 0xc4, 0x84, 0x54, 0xe8, 0x81, - 0xb8, 0xdd, 0xa8, 0xdf, 0x51, 0x1b, 0x79, 0xb5, 0x07, 0x26, 0xfd, 0x94, 0xd4, 0x41, 0x5d, 0x53, - 0x6b, 0x5a, 0x45, 0xf5, 0x6e, 0x80, 0xa7, 0x7d, 0x3a, 0xa0, 0x18, 0xad, 0x55, 0x90, 0xdd, 0x53, - 0x93, 0xf2, 0x67, 0x24, 0x18, 0xb8, 0x2a, 0x38, 0xaf, 0x62, 0x07, 0x5d, 0x04, 0x70, 0x5b, 0x12, - 0xd3, 0xe6, 0xe8, 0x54, 0xb8, 0xad, 0x29, 0x97, 0x46, 0xf1, 0xa1, 0xa3, 0xf3, 0xd4, 0x10, 0x4d, - 0xc3, 0xe6, 0xf7, 0x5f, 0x22, 0x48, 0x5d, 0x64, 0xf4, 0x10, 0x20, 0xea, 0xe1, 0x4a, 0xd7, 0x0c, - 0x47, 0xd3, 0xab, 0x25, 0xd3, 0xb8, 0xce, 0x2f, 0x0b, 0xc6, 0x95, 0x34, 0xad, 0xb9, 0x4a, 0x2b, - 0x56, 0x08, 0x9c, 0x08, 0x9d, 0x72, 0xb9, 0x90, 0xd5, 0x44, 0xad, 0x54, 0x2c, 0x6c, 0xdb, 0xdc, - 0x89, 0x89, 0x22, 0xba, 0x08, 0x7d, 0x66, 0x63, 0xa3, 0x24, 0x3c, 0x46, 0xff, 0xe9, 0x63, 0xad, - 0xe6, 0xbf, 0xb0, 0x0f, 0xee, 0x01, 0x7a, 0xcd, 0xc6, 0x06, 0xb1, 0x96, 0xbb, 0x60, 0xa0, 0x85, - 0x30, 0xfd, 0xd7, 0x3c, 0x39, 0xe8, 0xf5, 0x75, 0xde, 0x83, 0x92, 0x69, 0x69, 0x86, 0xa5, 0x39, - 0xbb, 0xf4, 0xf4, 0x4a, 0x5c, 0x49, 0x8b, 0x8a, 0x15, 0x0e, 0x97, 0xb7, 0x61, 0x78, 0x95, 0x86, - 0x5a, 0x9e, 0xe4, 0x67, 0x3d, 0xf9, 0xa4, 0x68, 0xf9, 0xda, 0x4a, 0x16, 0x6b, 0x92, 0xac, 0xf0, - 0x74, 0x5b, 0xeb, 0x3c, 0xdf, 0xbd, 0x75, 0x06, 0x17, 0xff, 0xbf, 0x3c, 0x12, 0x98, 0x9c, 0x3c, - 0xb2, 0xf6, 0xb9, 0xaf, 0x4e, 0x0d, 0x33, 0x6a, 0x87, 0x91, 0xdd, 0x7b, 0x51, 0xcd, 0x46, 0xb8, - 0xd1, 0x6c, 0xe4, 0x14, 0x92, 0x1f, 0x83, 0xc1, 0x15, 0xd5, 0x72, 0x56, 0xb1, 0x73, 0x05, 0xab, - 0x15, 0x6c, 0x05, 0x57, 0xdd, 0x41, 0xb1, 0xea, 0x22, 0x48, 0xd0, 0xa5, 0x95, 0xad, 0x3a, 0xf4, - 0xb7, 0xbc, 0x05, 0x09, 0x7a, 0x82, 0xcd, 0x5d, 0x91, 0x39, 0x05, 0x5b, 0x91, 0x89, 0x2f, 0xdd, - 0x75, 0xb0, 0x2d, 0x36, 0x74, 0xb4, 0x80, 0xce, 0x88, 0x75, 0x35, 0xbe, 0xf7, 0xba, 0xca, 0x0d, - 0x91, 0xaf, 0xae, 0x35, 0xe8, 0x2b, 0x10, 0x57, 0x3c, 0x3f, 0xeb, 0x0a, 0x22, 0x79, 0x82, 0xa0, - 0x45, 0x18, 0x36, 0x55, 0xcb, 0xa1, 0x47, 0xf7, 0xb7, 0x68, 0x2f, 0xb8, 0xad, 0x4f, 0x34, 0xcf, - 0xbc, 0x40, 0x67, 0x79, 0x2b, 0x83, 0xa6, 0x1f, 0x28, 0xff, 0x45, 0x02, 0x7a, 0xb9, 0x32, 0x1e, - 0x87, 0x3e, 0xae, 0x56, 0x6e, 0x9d, 0xc7, 0xa7, 0x9a, 0x17, 0xa6, 0x29, 0x77, 0x01, 0xe1, 0xfc, - 0x04, 0x0d, 0xba, 0x0f, 0x92, 0xe5, 0x2d, 0x55, 0xd3, 0x4b, 0x5a, 0x45, 0x44, 0xbd, 0xaf, 0xdf, - 0x9c, 0xe8, 0x9b, 0x21, 0xb0, 0xf9, 0x59, 0xa5, 0x8f, 0x56, 0xce, 0x57, 0x48, 0x24, 0xb0, 0x85, - 0xb5, 0xea, 0x96, 0xc3, 0x67, 0x18, 0x2f, 0xa1, 0x0b, 0x90, 0x20, 0x06, 0xc1, 0x6f, 0x76, 0x65, - 0x9b, 0xf6, 0x1e, 0xee, 0x06, 0xb0, 0x90, 0x24, 0x0d, 0xbf, 0xef, 0xeb, 0x13, 0x92, 0x42, 0x29, - 0xd0, 0x0c, 0x0c, 0xd6, 0x54, 0xdb, 0x29, 0xd1, 0x15, 0x8c, 0x34, 0xdf, 0x43, 0x59, 0x1c, 0x69, - 0x56, 0x08, 0x57, 0x2c, 0x17, 0xbd, 0x9f, 0x50, 0x31, 0x50, 0x05, 0x9d, 0x80, 0x34, 0x65, 0x52, - 0x36, 0xea, 0x75, 0xcd, 0x61, 0xb1, 0x55, 0x2f, 0xd5, 0xfb, 0x10, 0x81, 0xcf, 0x50, 0x30, 0x8d, - 0xb0, 0x8e, 0x42, 0x8a, 0x5e, 0x25, 0xa1, 0x28, 0xec, 0xd8, 0x64, 0x92, 0x00, 0x68, 0xe5, 0xfd, - 0x30, 0xec, 0xf9, 0x47, 0x86, 0x92, 0x64, 0x5c, 0x3c, 0x30, 0x45, 0x7c, 0x18, 0xc6, 0x74, 0xbc, - 0x43, 0x0f, 0x72, 0x06, 0xb0, 0x53, 0x14, 0x1b, 0x91, 0xba, 0xab, 0x41, 0x8a, 0x7b, 0x61, 0xa8, - 0x2c, 0x94, 0xcf, 0x70, 0x81, 0xe2, 0x0e, 0xba, 0x50, 0x8a, 0x76, 0x04, 0x92, 0xaa, 0x69, 0x32, - 0x84, 0x7e, 0xee, 0x1f, 0x4d, 0x93, 0x56, 0x9d, 0x84, 0x11, 0xda, 0x47, 0x0b, 0xdb, 0x8d, 0x9a, - 0xc3, 0x99, 0x0c, 0x50, 0x9c, 0x61, 0x52, 0xa1, 0x30, 0x38, 0xc5, 0xbd, 0x1b, 0x06, 0xf1, 0x35, - 0xad, 0x82, 0xf5, 0x32, 0x66, 0x78, 0x83, 0x14, 0x6f, 0x40, 0x00, 0x29, 0xd2, 0x03, 0xe0, 0xfa, - 0xbd, 0x92, 0xf0, 0xc9, 0x43, 0x8c, 0x9f, 0x80, 0xe7, 0x19, 0x58, 0xce, 0x40, 0x62, 0x56, 0x75, - 0x54, 0x12, 0x60, 0x38, 0x3b, 0x6c, 0xa1, 0x19, 0x50, 0xc8, 0x4f, 0xf9, 0xdb, 0x31, 0x48, 0x5c, - 0x35, 0x1c, 0x8c, 0x1e, 0xf5, 0x05, 0x80, 0x43, 0xad, 0xec, 0x79, 0x55, 0xab, 0xea, 0xb8, 0xb2, - 0x68, 0x57, 0x7d, 0xf7, 0xb9, 0x3d, 0x73, 0x8a, 0x05, 0xcc, 0x69, 0x0c, 0x7a, 0x2c, 0xa3, 0xa1, - 0x57, 0xc4, 0x89, 0x43, 0x5a, 0x40, 0x45, 0x48, 0xba, 0x56, 0x92, 0x88, 0xb2, 0x92, 0x61, 0x62, - 0x25, 0xc4, 0x86, 0x39, 0x40, 0xe9, 0xdb, 0xe0, 0xc6, 0x52, 0x80, 0x94, 0xeb, 0xbc, 0xb8, 0xb5, - 0x75, 0x66, 0xb0, 0x1e, 0x19, 0x59, 0x4c, 0xdc, 0xb1, 0x77, 0x95, 0xc7, 0x2c, 0x2e, 0xed, 0x56, - 0x70, 0xed, 0x05, 0xcc, 0x8a, 0xdf, 0x2d, 0xef, 0xa3, 0xfd, 0xf2, 0xcc, 0x8a, 0xdd, 0x2f, 0x3f, - 0x06, 0x29, 0x5b, 0xab, 0xea, 0xaa, 0xd3, 0xb0, 0x30, 0xb7, 0x3c, 0x0f, 0x20, 0x7f, 0x5e, 0x82, - 0x5e, 0x66, 0xc9, 0x3e, 0xbd, 0x49, 0xad, 0xf5, 0x16, 0x6b, 0xa7, 0xb7, 0xf8, 0xfe, 0xf5, 0x96, - 0x07, 0x70, 0x85, 0xb1, 0xf9, 0xdd, 0xe0, 0x16, 0x11, 0x03, 0x13, 0x71, 0x55, 0xab, 0xf2, 0x89, - 0xea, 0x23, 0x92, 0xff, 0x83, 0x44, 0x82, 0x58, 0x5e, 0x8f, 0xf2, 0x30, 0x28, 0xe4, 0x2a, 0x6d, - 0xd6, 0xd4, 0x2a, 0xb7, 0x9d, 0xe3, 0x6d, 0x85, 0xbb, 0x5c, 0x53, 0xab, 0x4a, 0x3f, 0x97, 0x87, - 0x14, 0x5a, 0x8f, 0x43, 0xac, 0xcd, 0x38, 0x04, 0x06, 0x3e, 0xbe, 0xbf, 0x81, 0x0f, 0x0c, 0x51, - 0x22, 0x3c, 0x44, 0xbf, 0x13, 0xa3, 0x9b, 0x19, 0xd3, 0xb0, 0xd5, 0xda, 0x9b, 0x31, 0x23, 0x8e, - 0x42, 0xca, 0x34, 0x6a, 0x25, 0x56, 0xc3, 0x4e, 0xe2, 0x26, 0x4d, 0xa3, 0xa6, 0x34, 0x0d, 0x7b, - 0xcf, 0x6d, 0x9a, 0x2e, 0xbd, 0xb7, 0x41, 0x6b, 0x7d, 0x61, 0xad, 0x59, 0x30, 0xc0, 0x54, 0xc1, - 0xd7, 0xb2, 0x87, 0x89, 0x0e, 0xe8, 0xe2, 0x28, 0x35, 0xaf, 0xbd, 0x4c, 0x6c, 0x86, 0xa9, 0x70, - 0x3c, 0x42, 0xc1, 0x5c, 0x7f, 0xab, 0x5d, 0xb0, 0xdf, 0x2c, 0x15, 0x8e, 0x27, 0x7f, 0x50, 0x02, - 0x58, 0x20, 0x9a, 0xa5, 0xfd, 0x25, 0xab, 0x90, 0x4d, 0x45, 0x28, 0x05, 0x5a, 0x1e, 0x6f, 0x37, - 0x68, 0xbc, 0xfd, 0x01, 0xdb, 0x2f, 0xf7, 0x0c, 0x0c, 0x7a, 0xc6, 0x68, 0x63, 0x21, 0xcc, 0xf8, - 0x1e, 0x51, 0xf5, 0x2a, 0x76, 0x94, 0x81, 0x6b, 0xbe, 0x92, 0xfc, 0x07, 0x12, 0xa4, 0xa8, 0x4c, - 0x8b, 0xd8, 0x51, 0x03, 0x63, 0x28, 0xed, 0x7f, 0x0c, 0x8f, 0x03, 0x30, 0x36, 0xb6, 0xf6, 0x22, - 0xe6, 0x96, 0x95, 0xa2, 0x90, 0x55, 0xed, 0x45, 0x8c, 0xce, 0xb9, 0x0a, 0x8f, 0xef, 0xad, 0x70, - 0x11, 0x75, 0x73, 0xb5, 0x1f, 0x86, 0x3e, 0xfa, 0x44, 0xce, 0x8e, 0xcd, 0x03, 0xe9, 0x5e, 0xbd, - 0x51, 0x5f, 0xdb, 0xb1, 0xe5, 0xe7, 0xa1, 0x6f, 0x6d, 0x87, 0xe5, 0x46, 0x8e, 0x42, 0xca, 0x32, - 0x0c, 0xbe, 0x26, 0xb3, 0x58, 0x28, 0x49, 0x00, 0x74, 0x09, 0x12, 0xf9, 0x80, 0x98, 0x97, 0x0f, - 0xf0, 0x12, 0x1a, 0xf1, 0x8e, 0x12, 0x1a, 0x27, 0xbf, 0x2a, 0x41, 0xbf, 0xcf, 0x3f, 0xa0, 0x47, - 0xe0, 0x60, 0x61, 0x61, 0x79, 0xe6, 0xa9, 0xd2, 0xfc, 0x6c, 0xe9, 0xf2, 0x42, 0x7e, 0xce, 0xbb, - 0x6b, 0x92, 0x3d, 0xf4, 0xca, 0x8d, 0x49, 0xe4, 0xc3, 0x5d, 0xd7, 0xb7, 0x75, 0xe3, 0xba, 0x8e, - 0xa6, 0x61, 0x2c, 0x48, 0x92, 0x2f, 0xac, 0x16, 0x97, 0xd6, 0xd2, 0x52, 0xf6, 0xe0, 0x2b, 0x37, - 0x26, 0x47, 0x7c, 0x14, 0xf9, 0x0d, 0x1b, 0xeb, 0x4e, 0x33, 0xc1, 0xcc, 0xf2, 0xe2, 0xe2, 0xfc, - 0x5a, 0x3a, 0xd6, 0x44, 0xc0, 0x1d, 0xf6, 0x03, 0x30, 0x12, 0x24, 0x58, 0x9a, 0x5f, 0x48, 0xc7, - 0xb3, 0xe8, 0x95, 0x1b, 0x93, 0x43, 0x3e, 0xec, 0x25, 0xad, 0x96, 0x4d, 0xbe, 0xfc, 0xc9, 0xf1, - 0x03, 0x9f, 0xfe, 0xb5, 0x71, 0x89, 0xf4, 0x6c, 0x30, 0xe0, 0x23, 0xd0, 0x43, 0x70, 0x78, 0x75, - 0x7e, 0x6e, 0xa9, 0x38, 0x5b, 0x5a, 0x5c, 0x9d, 0x2b, 0xb1, 0x47, 0x36, 0xdc, 0xde, 0x0d, 0xbf, - 0x72, 0x63, 0xb2, 0x9f, 0x77, 0xa9, 0x1d, 0xf6, 0x8a, 0x52, 0xbc, 0xba, 0xbc, 0x56, 0x4c, 0x4b, - 0x0c, 0x7b, 0xc5, 0xc2, 0xd7, 0x0c, 0x87, 0xbd, 0xa1, 0xf5, 0x30, 0x1c, 0x69, 0x81, 0xed, 0x76, - 0x6c, 0xe4, 0x95, 0x1b, 0x93, 0x83, 0x2b, 0x16, 0x66, 0xf3, 0x87, 0x52, 0x4c, 0x41, 0xa6, 0x99, - 0x62, 0x79, 0x65, 0x79, 0x35, 0xbf, 0x90, 0x9e, 0xcc, 0xa6, 0x5f, 0xb9, 0x31, 0x39, 0x20, 0x9c, - 0x21, 0xc1, 0xf7, 0x7a, 0x76, 0x27, 0x77, 0x3c, 0x1f, 0x7c, 0x18, 0x8e, 0xdb, 0x8e, 0xba, 0xad, - 0xe9, 0x55, 0x37, 0xe3, 0xcc, 0xcb, 0x7c, 0xcb, 0x73, 0xbc, 0xa6, 0xbd, 0xd0, 0xd0, 0x2a, 0x02, - 0x28, 0xfe, 0xee, 0x99, 0x7e, 0xce, 0xb6, 0xff, 0xb2, 0x94, 0x8d, 0xc8, 0xae, 0x46, 0x6f, 0x9d, - 0xda, 0x7f, 0xaa, 0xc8, 0x46, 0x24, 0xd0, 0xb3, 0x7b, 0x6e, 0xee, 0xe4, 0xf7, 0x49, 0x30, 0x74, - 0x45, 0xb3, 0x1d, 0xc3, 0xd2, 0xca, 0x6a, 0x8d, 0xde, 0x30, 0x39, 0xd7, 0xa9, 0x6f, 0x0d, 0x4d, - 0xf5, 0xcb, 0xd0, 0x7b, 0x4d, 0xad, 0x31, 0xa7, 0xc6, 0x2e, 0xf1, 0xec, 0xa9, 0x45, 0xcf, 0xc3, - 0x09, 0x3e, 0x8c, 0x5a, 0xfe, 0xcd, 0x18, 0x0c, 0xd3, 0x39, 0x61, 0xb3, 0x97, 0x90, 0xc8, 0x56, - 0xab, 0x00, 0x09, 0x4b, 0x75, 0x78, 0xee, 0xb0, 0x30, 0xc5, 0xf3, 0xe1, 0xf7, 0x45, 0xe7, 0xb8, - 0xa7, 0x66, 0x71, 0x59, 0xa1, 0xb4, 0xe8, 0xff, 0x83, 0x64, 0x5d, 0xdd, 0x29, 0x51, 0x3e, 0x6c, - 0x03, 0x93, 0xef, 0x8e, 0xcf, 0xad, 0x9b, 0x13, 0xc3, 0xbb, 0x6a, 0xbd, 0x96, 0x93, 0x05, 0x1f, - 0x59, 0xe9, 0xab, 0xab, 0x3b, 0x44, 0x44, 0x64, 0xc2, 0x30, 0x81, 0x96, 0xb7, 0x54, 0xbd, 0x8a, - 0x59, 0x23, 0x34, 0x13, 0x5a, 0xb8, 0xd2, 0x75, 0x23, 0x87, 0xbc, 0x46, 0x7c, 0xec, 0x64, 0x65, - 0xb0, 0xae, 0xee, 0xcc, 0x50, 0x00, 0x69, 0x31, 0x97, 0xfc, 0xf0, 0xc7, 0x27, 0x0e, 0xd0, 0x6f, - 0x0c, 0x5f, 0x93, 0x00, 0x3c, 0x8d, 0xa1, 0x32, 0xa4, 0xcb, 0x6e, 0x89, 0xd2, 0xda, 0x7c, 0x28, - 0xa7, 0x22, 0x86, 0x24, 0xa4, 0x76, 0xb6, 0x52, 0x7f, 0xf9, 0xe6, 0x84, 0xa4, 0x0c, 0x97, 0x43, - 0x23, 0xf2, 0x13, 0xd0, 0xdf, 0x30, 0x2b, 0xaa, 0x83, 0x4b, 0x74, 0x57, 0x17, 0x8b, 0x5c, 0xf5, - 0xc7, 0x09, 0xaf, 0x5b, 0x37, 0x27, 0x10, 0xeb, 0x9d, 0x8f, 0x58, 0xa6, 0xb1, 0x00, 0x30, 0x08, - 0x21, 0xf0, 0x75, 0xed, 0x8f, 0x24, 0xe8, 0x9f, 0xf5, 0x9d, 0xfb, 0xca, 0x40, 0x5f, 0xdd, 0xd0, - 0xb5, 0x6d, 0x6e, 0x9d, 0x29, 0x45, 0x14, 0x51, 0x16, 0x92, 0xec, 0x0a, 0x9e, 0xb3, 0x2b, 0x12, - 0xa3, 0xa2, 0x4c, 0xa8, 0xae, 0xe3, 0x0d, 0x5b, 0x13, 0x83, 0xa2, 0x88, 0x22, 0xba, 0x0c, 0x69, - 0x1b, 0x97, 0x1b, 0x96, 0xe6, 0xec, 0x96, 0xca, 0x86, 0xee, 0xa8, 0x65, 0x87, 0x5d, 0xe6, 0x2a, - 0x1c, 0xbd, 0x75, 0x73, 0xe2, 0x30, 0x93, 0x35, 0x8c, 0x21, 0x2b, 0xc3, 0x02, 0x34, 0xc3, 0x20, - 0xa4, 0x85, 0x0a, 0x76, 0x54, 0xad, 0x66, 0x67, 0xd8, 0x57, 0x33, 0x51, 0xf4, 0xf5, 0xe5, 0x0b, - 0x7d, 0xfe, 0x34, 0xd7, 0x65, 0x48, 0x1b, 0x26, 0xb6, 0x02, 0x61, 0xa9, 0x14, 0x6e, 0x39, 0x8c, - 0x21, 0x2b, 0xc3, 0x02, 0x24, 0x42, 0x56, 0x87, 0x8c, 0xb6, 0xd8, 0x36, 0x9a, 0x8d, 0x0d, 0x2f, - 0x3b, 0x36, 0xd6, 0x34, 0x1a, 0x79, 0x7d, 0xb7, 0xf0, 0xa8, 0xc7, 0x3d, 0x4c, 0x27, 0x7f, 0xe9, - 0xb3, 0xa7, 0xc6, 0xb8, 0x73, 0xf1, 0xb2, 0x55, 0x4f, 0xe1, 0x5d, 0x32, 0xfc, 0x1c, 0x75, 0x85, - 0x62, 0x92, 0x20, 0xf4, 0x79, 0x55, 0xab, 0x89, 0x4b, 0xc9, 0x0a, 0x2f, 0xa1, 0x3c, 0xf4, 0xda, - 0x8e, 0xea, 0x34, 0x6c, 0xfe, 0x04, 0xd8, 0x03, 0x11, 0x16, 0x57, 0x30, 0xf4, 0xca, 0x2a, 0x25, - 0x50, 0x38, 0x21, 0xf1, 0x23, 0x8e, 0xb1, 0x8d, 0x75, 0xae, 0xc9, 0xae, 0x66, 0x3b, 0xfd, 0x96, - 0xc7, 0xa8, 0x89, 0x62, 0x2a, 0xb8, 0x86, 0xab, 0x2c, 0xd6, 0xda, 0x52, 0xc9, 0x96, 0x84, 0x3e, - 0x08, 0x56, 0x98, 0xef, 0x7a, 0x4a, 0x72, 0x85, 0x85, 0xf9, 0xc9, 0xca, 0xb0, 0x0b, 0x5a, 0xa5, - 0x10, 0xa4, 0x04, 0xce, 0x29, 0xf2, 0x57, 0xf3, 0x4e, 0x46, 0x68, 0xc1, 0x67, 0xe1, 0x22, 0x77, - 0xe1, 0x3f, 0xec, 0x78, 0x19, 0xd2, 0x0d, 0x7d, 0xc3, 0xd0, 0xe9, 0x3d, 0x42, 0x1e, 0xfb, 0x93, - 0xbd, 0x5f, 0xdc, 0x6f, 0x2a, 0x61, 0x0c, 0x59, 0x19, 0x76, 0x41, 0x57, 0xd8, 0x0e, 0xa1, 0x02, - 0x43, 0x1e, 0x16, 0x9d, 0xb6, 0xa9, 0xc8, 0x69, 0x7b, 0x17, 0x9f, 0xb6, 0x07, 0xc3, 0xad, 0x78, - 0x33, 0x77, 0xd0, 0x05, 0x12, 0x32, 0xb4, 0x0c, 0xe0, 0x39, 0x0b, 0x9a, 0xc3, 0xe8, 0x8f, 0x34, - 0x03, 0xcf, 0xf1, 0x88, 0x2d, 0xa1, 0xc7, 0x02, 0xbd, 0x03, 0x46, 0xeb, 0x9a, 0x5e, 0xb2, 0x71, - 0x6d, 0xb3, 0xc4, 0xd5, 0x4d, 0x38, 0xd3, 0xe7, 0x60, 0x0a, 0x0b, 0xdd, 0x59, 0xc7, 0xad, 0x9b, - 0x13, 0x59, 0xee, 0x5e, 0x9b, 0x59, 0xca, 0xca, 0x48, 0x5d, 0xd3, 0x57, 0x71, 0x6d, 0x73, 0xd6, - 0x85, 0xe5, 0x06, 0x5e, 0xfe, 0xf8, 0xc4, 0x01, 0x3e, 0x87, 0x0f, 0xc8, 0xe7, 0x68, 0x7a, 0x9d, - 0xcf, 0x3d, 0x6c, 0x93, 0x6d, 0x8b, 0x2a, 0x0a, 0x34, 0xe9, 0x91, 0x52, 0x3c, 0x00, 0x9b, 0xfb, - 0x2f, 0xfd, 0xfb, 0x49, 0x49, 0xfe, 0x75, 0x09, 0x7a, 0x67, 0xaf, 0xae, 0xa8, 0x9a, 0x85, 0xe6, - 0x61, 0xc4, 0xb3, 0xa3, 0xe0, 0xcc, 0x3f, 0x76, 0xeb, 0xe6, 0x44, 0x26, 0x6c, 0x6a, 0xee, 0xd4, - 0xf7, 0xcc, 0x59, 0xcc, 0xfd, 0xf9, 0x76, 0x7b, 0xdb, 0x00, 0xab, 0x26, 0x14, 0xb9, 0x79, 0xe7, - 0x1b, 0xea, 0xe6, 0x02, 0xf4, 0x31, 0x69, 0xe9, 0xe3, 0x17, 0x26, 0xf9, 0xc1, 0xbf, 0x1d, 0xdc, - 0x1b, 0x65, 0xca, 0x94, 0xcc, 0x4d, 0x79, 0x12, 0x4a, 0xf9, 0xfd, 0x31, 0x80, 0xd9, 0xab, 0x57, - 0xd7, 0x2c, 0xcd, 0xac, 0x61, 0xe7, 0x76, 0x2a, 0x60, 0x0d, 0x0e, 0xfa, 0xf6, 0x53, 0x56, 0x39, - 0xa4, 0x84, 0xc9, 0x5b, 0x37, 0x27, 0x8e, 0x85, 0x95, 0xe0, 0x43, 0x93, 0x95, 0x51, 0x6f, 0x67, - 0x65, 0x95, 0x5b, 0x72, 0xad, 0xd8, 0x8e, 0xcb, 0x35, 0xde, 0x9e, 0xab, 0x0f, 0xcd, 0xcf, 0x75, - 0xd6, 0x76, 0x5a, 0x6b, 0xf8, 0x39, 0xe8, 0xf7, 0x54, 0x62, 0xa3, 0xa7, 0x20, 0xe9, 0xf0, 0xdf, - 0x5c, 0xd1, 0x0f, 0x44, 0x2a, 0x5a, 0x50, 0x73, 0x65, 0xbb, 0x0c, 0xe4, 0xbf, 0x92, 0x00, 0x3c, - 0x0b, 0xfe, 0xf1, 0x34, 0x38, 0xe2, 0xe6, 0xb9, 0x53, 0x8e, 0xef, 0x2b, 0xa8, 0xe3, 0xd4, 0x21, - 0xb5, 0x7e, 0x20, 0x06, 0xa3, 0xeb, 0xc2, 0x1d, 0xfd, 0xd8, 0xeb, 0xe0, 0x19, 0xe8, 0xc3, 0xba, - 0x63, 0x69, 0x54, 0x09, 0x64, 0xd0, 0xcf, 0x47, 0x0c, 0x7a, 0x8b, 0xae, 0xd1, 0x47, 0x72, 0x44, - 0xb2, 0x9e, 0x73, 0x0b, 0x29, 0xe5, 0xbd, 0x71, 0xc8, 0xb4, 0xa3, 0x44, 0x33, 0x30, 0x5c, 0xb6, - 0x30, 0x05, 0x94, 0xfc, 0x19, 0xc3, 0x42, 0xd6, 0x0b, 0x45, 0x43, 0x08, 0xb2, 0x32, 0x24, 0x20, - 0x7c, 0x65, 0xa9, 0x02, 0x09, 0x10, 0x89, 0xf5, 0x11, 0xac, 0x0e, 0x23, 0x42, 0x99, 0x2f, 0x2d, - 0xa2, 0x91, 0x20, 0x03, 0xb6, 0xb6, 0x0c, 0x79, 0x50, 0xba, 0xb8, 0xbc, 0x00, 0xc3, 0x9a, 0xae, - 0x39, 0x9a, 0x5a, 0x2b, 0x6d, 0xa8, 0x35, 0x55, 0x2f, 0xef, 0x27, 0xcc, 0x66, 0xeb, 0x00, 0x6f, - 0x36, 0xc4, 0x4e, 0x56, 0x86, 0x38, 0xa4, 0xc0, 0x00, 0xe8, 0x0a, 0xf4, 0x89, 0xa6, 0x12, 0xfb, - 0x0a, 0x48, 0x04, 0xb9, 0x2f, 0x14, 0x7c, 0x4f, 0x1c, 0x46, 0x14, 0x5c, 0xf9, 0x7f, 0x43, 0xd1, - 0xdd, 0x50, 0x2c, 0x02, 0xb0, 0x59, 0x4f, 0xdc, 0xed, 0x3e, 0x46, 0x83, 0xf8, 0x8d, 0x14, 0xe3, - 0x30, 0x6b, 0x3b, 0xbe, 0xf1, 0xf8, 0x8f, 0x31, 0x18, 0xf0, 0x8f, 0xc7, 0xdf, 0xd2, 0x35, 0x0a, - 0xad, 0x78, 0x0e, 0x89, 0x65, 0xef, 0x1f, 0x8e, 0x70, 0x48, 0x4d, 0x46, 0xbc, 0xb7, 0x27, 0xfa, - 0x9f, 0x31, 0xe8, 0x5d, 0x51, 0x2d, 0xb5, 0x6e, 0xa3, 0x72, 0x53, 0x30, 0x2a, 0xb2, 0x97, 0x4d, - 0xef, 0x43, 0xf3, 0x64, 0x49, 0x44, 0x2c, 0xfa, 0xe1, 0x16, 0xb1, 0xe8, 0x5b, 0x61, 0x88, 0x6c, - 0xa3, 0x7d, 0x27, 0x20, 0x88, 0xd2, 0x07, 0x0b, 0x47, 0x3c, 0x2e, 0xc1, 0x7a, 0xb6, 0xcb, 0xbe, - 0xea, 0x3f, 0x02, 0xd1, 0x4f, 0x30, 0x3c, 0x37, 0x4d, 0xc8, 0x0f, 0x79, 0xfb, 0x58, 0x5f, 0xa5, - 0xac, 0x40, 0x5d, 0xdd, 0x29, 0xb2, 0x02, 0x5a, 0x00, 0xb4, 0xe5, 0x26, 0x56, 0x4a, 0x9e, 0x56, - 0x09, 0xfd, 0xf1, 0x5b, 0x37, 0x27, 0x8e, 0x30, 0xfa, 0x66, 0x1c, 0x59, 0x19, 0xf1, 0x80, 0x82, - 0xdb, 0x19, 0x00, 0xd2, 0xaf, 0x12, 0x3b, 0x8c, 0xc8, 0x36, 0x46, 0x07, 0x6f, 0xdd, 0x9c, 0x18, - 0x61, 0x5c, 0xbc, 0x3a, 0x59, 0x49, 0x91, 0xc2, 0x2c, 0xf9, 0xed, 0x33, 0xf0, 0xd7, 0x24, 0x40, - 0x9e, 0xe7, 0x57, 0xb0, 0x6d, 0x92, 0x0d, 0x1d, 0x89, 0xd5, 0x7d, 0x11, 0xb5, 0xd4, 0x51, 0xac, - 0xee, 0xb1, 0x11, 0xb1, 0xba, 0x6f, 0xde, 0x3c, 0xe6, 0x39, 0xcb, 0x18, 0x1f, 0xce, 0x16, 0x07, - 0x38, 0xa7, 0x66, 0x0c, 0x4d, 0x50, 0x37, 0x79, 0xc7, 0x03, 0xf2, 0x9f, 0x4a, 0x70, 0xa4, 0xc9, - 0xb0, 0x5c, 0x99, 0x31, 0x20, 0xcb, 0x57, 0xc9, 0x5f, 0x8d, 0x63, 0xb2, 0xef, 0xd7, 0x5c, 0x47, - 0xac, 0x26, 0x67, 0x7c, 0xfb, 0xdc, 0x3e, 0x3b, 0x08, 0xfa, 0xaf, 0x24, 0x18, 0xf3, 0x37, 0xef, - 0xf6, 0x67, 0x1d, 0x06, 0xfc, 0xad, 0xf3, 0x9e, 0x3c, 0xd8, 0x45, 0x4f, 0x78, 0x27, 0x02, 0x6c, - 0xd0, 0xb3, 0xde, 0x54, 0x66, 0xf9, 0xb8, 0x0b, 0xdd, 0xea, 0x46, 0x48, 0x18, 0x9e, 0xd2, 0x09, - 0x3a, 0x48, 0xff, 0x47, 0x82, 0xc4, 0x8a, 0x61, 0xd4, 0x90, 0x01, 0x23, 0xba, 0xe1, 0x94, 0x88, - 0xd5, 0xe1, 0x4a, 0x89, 0x6f, 0xdd, 0x99, 0xab, 0x9c, 0xe9, 0x4e, 0x65, 0xdf, 0xb9, 0x39, 0xd1, - 0xcc, 0x4a, 0x19, 0xd6, 0x0d, 0xa7, 0x40, 0x21, 0x6b, 0x6c, 0x63, 0xff, 0x0e, 0x18, 0x0c, 0x36, - 0xc6, 0x1c, 0xe9, 0x33, 0x5d, 0x37, 0x16, 0x64, 0x73, 0xeb, 0xe6, 0xc4, 0x98, 0x37, 0x9b, 0x5c, - 0xb0, 0xac, 0x0c, 0x6c, 0xf8, 0x5a, 0x67, 0x27, 0xc7, 0xbe, 0x47, 0x46, 0xf4, 0x33, 0x12, 0x8c, - 0x52, 0xa0, 0xf6, 0x22, 0xa6, 0xbb, 0x7f, 0x05, 0x97, 0x0d, 0xab, 0x82, 0x86, 0x20, 0xc6, 0xbf, - 0xc5, 0x24, 0x94, 0x98, 0x56, 0x41, 0x63, 0xd0, 0x63, 0x5c, 0xd7, 0xf9, 0x41, 0x8e, 0x94, 0xc2, - 0x0a, 0xe8, 0x24, 0x8c, 0xd0, 0x95, 0x88, 0x35, 0xc3, 0x27, 0x36, 0x7f, 0x73, 0x88, 0x56, 0x50, - 0xd6, 0x74, 0x1e, 0xa3, 0x7b, 0x61, 0xa8, 0x6e, 0x54, 0x1a, 0x35, 0x5c, 0x52, 0xcb, 0x65, 0x7a, - 0xee, 0x98, 0xbd, 0x62, 0x32, 0xc8, 0xa0, 0x79, 0x06, 0x24, 0x9b, 0x51, 0xd7, 0x93, 0xf1, 0x34, - 0x94, 0x07, 0x60, 0x66, 0x78, 0xf2, 0x73, 0x12, 0x80, 0x97, 0x74, 0x41, 0x0f, 0xc1, 0xe1, 0xc2, - 0xf2, 0xd2, 0x6c, 0x69, 0x75, 0x2d, 0xbf, 0xb6, 0xbe, 0x5a, 0x5a, 0x5f, 0x5a, 0x5d, 0x29, 0xce, - 0xcc, 0x5f, 0x9e, 0x2f, 0xce, 0x7a, 0x9f, 0x0b, 0x6c, 0x13, 0x97, 0xb5, 0x4d, 0x0d, 0x57, 0xd0, - 0x7d, 0x30, 0x16, 0xc4, 0x26, 0xa5, 0xe2, 0x6c, 0x5a, 0xca, 0x0e, 0xbc, 0x72, 0x63, 0x32, 0xc9, - 0x62, 0x4c, 0x5c, 0x41, 0x27, 0xe0, 0x60, 0x33, 0xde, 0xfc, 0xd2, 0x5c, 0x3a, 0x96, 0x1d, 0x7c, - 0xe5, 0xc6, 0x64, 0xca, 0x0d, 0x46, 0x91, 0x0c, 0xc8, 0x8f, 0xc9, 0xf9, 0xc5, 0xb3, 0xf0, 0xca, - 0x8d, 0xc9, 0x5e, 0x36, 0xea, 0xd9, 0xc4, 0xcb, 0x9f, 0x1c, 0x3f, 0x50, 0x78, 0x5b, 0xdb, 0x0f, - 0x02, 0x97, 0x7c, 0x03, 0xae, 0xbd, 0x50, 0x6b, 0xd8, 0x9a, 0xa1, 0x6b, 0x7a, 0x79, 0x9a, 0x99, - 0xbb, 0xe6, 0xec, 0x9e, 0xe2, 0xa6, 0x7e, 0x8a, 0xa9, 0x6b, 0x7a, 0x47, 0xa4, 0xfb, 0x43, 0x1f, - 0x06, 0xfe, 0xe4, 0x2e, 0xc8, 0x84, 0x3f, 0x0c, 0x38, 0x3b, 0x9d, 0x7d, 0x13, 0xd8, 0x23, 0xfb, - 0x1f, 0x99, 0xdd, 0x6f, 0xf3, 0x3d, 0x61, 0xff, 0x39, 0xff, 0xbd, 0x3f, 0x6f, 0xc8, 0xff, 0x2e, - 0x01, 0x68, 0xd1, 0xae, 0xce, 0x90, 0xc0, 0xd1, 0x77, 0x7c, 0x2d, 0x94, 0xba, 0x92, 0x6e, 0x47, - 0xea, 0x6a, 0x2d, 0x90, 0x0c, 0x8a, 0xed, 0x2b, 0x0b, 0xdd, 0x71, 0x46, 0x28, 0xfe, 0xa6, 0x64, - 0x84, 0x5a, 0xc7, 0x86, 0x89, 0xdb, 0xb7, 0x97, 0xec, 0xd9, 0xef, 0x7e, 0x9a, 0x67, 0x7f, 0x7b, - 0xf7, 0xc8, 0xfe, 0x66, 0xda, 0xa6, 0x78, 0x39, 0x35, 0x3a, 0x2b, 0x2e, 0x2f, 0xf5, 0x75, 0xb6, - 0x7e, 0xf3, 0xdb, 0x4d, 0xc9, 0x97, 0xc5, 0xea, 0x7d, 0x0c, 0xb2, 0xcd, 0xc6, 0x25, 0xd6, 0x12, - 0xf9, 0xd5, 0x38, 0xa4, 0x17, 0xed, 0x6a, 0xb1, 0xa2, 0x39, 0x77, 0xd6, 0xf2, 0x2e, 0xb5, 0xdf, - 0xa6, 0xa3, 0x5b, 0x37, 0x27, 0x86, 0x98, 0x6a, 0xf7, 0x50, 0x68, 0x1d, 0x86, 0x43, 0x9f, 0x51, - 0xb8, 0x81, 0xcd, 0xee, 0xe7, 0x6b, 0x4e, 0x88, 0x95, 0x4c, 0xb7, 0x53, 0x3e, 0x33, 0x47, 0x3b, - 0xad, 0x6d, 0x9a, 0xd9, 0xd5, 0x95, 0x3b, 0x99, 0xe1, 0xf4, 0x86, 0x2e, 0x0b, 0x99, 0xf0, 0xd8, - 0xb8, 0x03, 0xf7, 0x17, 0x12, 0xf4, 0x2f, 0xda, 0x22, 0x7d, 0x80, 0x7f, 0x4c, 0x33, 0x2a, 0xe7, - 0xdd, 0x9b, 0x39, 0xf1, 0xce, 0xcc, 0x57, 0xdc, 0xd6, 0xf1, 0x94, 0x70, 0x10, 0x46, 0x7d, 0xfd, - 0x74, 0xfb, 0xff, 0xc7, 0x31, 0xea, 0x34, 0x0b, 0xb8, 0xaa, 0xe9, 0x6e, 0xa8, 0x84, 0xff, 0xb6, - 0x6e, 0x14, 0x3d, 0x3d, 0x27, 0xf6, 0xab, 0xe7, 0x6d, 0xea, 0x27, 0x42, 0xfa, 0x74, 0xa3, 0xe2, - 0xc5, 0xe6, 0x34, 0x86, 0xd4, 0xc5, 0xc9, 0xa2, 0x50, 0xb2, 0x42, 0xfe, 0xb6, 0x04, 0x83, 0x8b, - 0x76, 0x75, 0x5d, 0xaf, 0xfc, 0x8d, 0xb7, 0xdf, 0x4d, 0x38, 0x18, 0xe8, 0xe9, 0x9d, 0x52, 0xe9, - 0x1f, 0xc4, 0x60, 0x64, 0xd1, 0xae, 0x06, 0x22, 0x60, 0xfb, 0x6f, 0x98, 0x5a, 0xc9, 0xec, 0x71, - 0x78, 0x07, 0x2b, 0xec, 0xa3, 0x5f, 0x89, 0xc5, 0xf2, 0x89, 0xf0, 0xec, 0x69, 0x89, 0x26, 0x2b, - 0xa3, 0x2e, 0x9c, 0x2a, 0x68, 0x99, 0x40, 0x7d, 0x83, 0xb5, 0x06, 0x47, 0x9a, 0x74, 0xe8, 0x0e, - 0x98, 0x27, 0xb5, 0xd4, 0x95, 0xd4, 0xf2, 0xa7, 0x25, 0xea, 0xc8, 0xc9, 0xb4, 0xc2, 0x75, 0xb6, - 0x6f, 0xd9, 0x74, 0xbf, 0x50, 0xde, 0xc6, 0x11, 0x3a, 0x1f, 0xb8, 0x07, 0xb9, 0x2f, 0x6b, 0x95, - 0x61, 0xb2, 0x9d, 0xa4, 0xae, 0xeb, 0xfd, 0xb0, 0x04, 0xe3, 0x44, 0x4b, 0x96, 0xaa, 0xdb, 0x9b, - 0xd8, 0x6a, 0xb5, 0xe7, 0x3a, 0x0f, 0x19, 0xa1, 0x68, 0xae, 0x7f, 0x8b, 0x56, 0x94, 0xdc, 0x9d, - 0x98, 0x3b, 0x8e, 0x3e, 0x32, 0x76, 0x5c, 0xdd, 0xa6, 0xc7, 0x5b, 0xf8, 0xee, 0x8c, 0x97, 0xe8, - 0x3b, 0xb7, 0xf8, 0x3a, 0x1f, 0x6c, 0xfe, 0x48, 0x80, 0x8e, 0xaf, 0x87, 0xc7, 0xef, 0x04, 0xdc, - 0xb7, 0xb7, 0x64, 0xa2, 0x13, 0xa7, 0xdf, 0x9b, 0x84, 0xf8, 0xa2, 0x5d, 0x45, 0x3f, 0x05, 0xc3, - 0xe1, 0xc0, 0xfb, 0x91, 0x88, 0x48, 0xa7, 0x39, 0x9c, 0xca, 0x3e, 0xd6, 0x35, 0x89, 0x6b, 0x55, - 0xbb, 0x30, 0x18, 0x8c, 0xbe, 0xa6, 0xa3, 0x79, 0x05, 0x08, 0xb2, 0xe7, 0xbb, 0x24, 0x70, 0x9b, - 0x7e, 0x1e, 0x92, 0x6e, 0xfc, 0x70, 0x32, 0x9a, 0x89, 0xc0, 0xcd, 0x9e, 0xee, 0x1c, 0xd7, 0x6d, - 0xeb, 0xa7, 0x60, 0x38, 0xbc, 0x56, 0x77, 0xa0, 0xe7, 0x10, 0x49, 0x27, 0x7a, 0x6e, 0xb7, 0x82, - 0x99, 0x00, 0xbe, 0xe5, 0xe6, 0xa1, 0x68, 0x46, 0x1e, 0x76, 0xf6, 0x4c, 0x37, 0xd8, 0x6e, 0x8b, - 0xef, 0x80, 0xa1, 0x90, 0x37, 0x7e, 0x38, 0x9a, 0x4f, 0x90, 0x22, 0x7b, 0xa1, 0x5b, 0x0a, 0xb7, - 0xf5, 0x97, 0x25, 0x96, 0x43, 0x17, 0xf3, 0x18, 0x75, 0x60, 0x26, 0x2d, 0xe7, 0x7d, 0xf6, 0xd2, - 0x3e, 0x09, 0x5d, 0x51, 0x3e, 0x29, 0xc1, 0xd1, 0xbd, 0xbc, 0xc5, 0xe3, 0x1d, 0x74, 0xb2, 0x3d, - 0x79, 0xb6, 0xf8, 0x86, 0xc8, 0xdd, 0xb4, 0xda, 0x9b, 0x90, 0xd1, 0xf8, 0x7a, 0x0c, 0x4e, 0xfa, - 0x73, 0x05, 0x2f, 0x34, 0xb0, 0xb5, 0xeb, 0x66, 0x05, 0x4c, 0xb5, 0xaa, 0xe9, 0xfe, 0x5b, 0xde, - 0x47, 0xfc, 0xee, 0x9b, 0xe2, 0x8a, 0x3e, 0xc9, 0x2f, 0x4b, 0xd0, 0xbf, 0xa2, 0x56, 0xb1, 0x82, - 0x5f, 0x68, 0x60, 0xdb, 0x69, 0x71, 0xcd, 0xf8, 0x10, 0xf4, 0x1a, 0x9b, 0x9b, 0xe2, 0x50, 0x73, - 0x42, 0xe1, 0x25, 0x34, 0x06, 0x3d, 0x35, 0xad, 0xae, 0xb1, 0xa5, 0x37, 0xa1, 0xb0, 0x02, 0x9a, - 0x80, 0x7e, 0x9a, 0xb4, 0x2a, 0xb1, 0x0b, 0x5a, 0x09, 0xf1, 0x04, 0x60, 0x43, 0x77, 0xd6, 0xe8, - 0x2d, 0xad, 0x0c, 0xf4, 0x59, 0xf8, 0x1a, 0xb6, 0x6c, 0xf6, 0x0c, 0x7a, 0x52, 0x11, 0x45, 0xf9, - 0x12, 0x0c, 0x30, 0x49, 0xf8, 0x68, 0x1f, 0x81, 0x24, 0xbd, 0x6a, 0xe3, 0xc9, 0xd3, 0x47, 0xca, - 0x4f, 0xb1, 0xcb, 0xca, 0x8c, 0x3f, 0x13, 0x89, 0x15, 0x0a, 0x85, 0xb6, 0x8a, 0x3f, 0x11, 0xbd, - 0xc7, 0x62, 0x3a, 0x74, 0x35, 0xfc, 0x87, 0x3d, 0x70, 0x90, 0xe7, 0x77, 0x54, 0x53, 0x9b, 0xde, - 0x72, 0x1c, 0xf1, 0xa0, 0x06, 0xf0, 0xa0, 0x4a, 0x35, 0x35, 0x79, 0x17, 0x12, 0x57, 0x1c, 0xc7, - 0x44, 0x27, 0xa1, 0xc7, 0x6a, 0xd4, 0xb0, 0xf8, 0xc6, 0xef, 0xee, 0xd1, 0x55, 0x53, 0x9b, 0x22, - 0x08, 0x4a, 0xa3, 0x86, 0x15, 0x86, 0x82, 0x8a, 0x30, 0xb1, 0xd9, 0xa8, 0xd5, 0x76, 0x4b, 0x15, - 0x4c, 0xff, 0x5f, 0xab, 0xfb, 0xaf, 0xd1, 0xf0, 0x8e, 0xa9, 0xea, 0x6e, 0x3e, 0x25, 0xa9, 0x1c, - 0xa3, 0x68, 0xb3, 0x14, 0x4b, 0xfc, 0x5b, 0xb4, 0xa2, 0xc0, 0x91, 0xff, 0x2c, 0x06, 0x49, 0xc1, - 0x9a, 0xde, 0x1e, 0xc6, 0x35, 0x5c, 0x76, 0x0c, 0x71, 0x7e, 0xce, 0x2d, 0x23, 0x04, 0xf1, 0x2a, - 0x1f, 0xbc, 0xd4, 0x95, 0x03, 0x0a, 0x29, 0x10, 0x98, 0x7b, 0xa7, 0x9b, 0xc0, 0xcc, 0x06, 0x19, - 0xcf, 0x84, 0x69, 0x88, 0xcf, 0x6f, 0x57, 0x0e, 0x28, 0xb4, 0x84, 0x32, 0xd0, 0x4b, 0xfc, 0x91, - 0xc3, 0x46, 0x8b, 0xc0, 0x79, 0x19, 0x1d, 0x82, 0x1e, 0x53, 0x75, 0xca, 0xec, 0xba, 0x15, 0xa9, - 0x60, 0x45, 0x12, 0x3c, 0xb0, 0xc7, 0x82, 0xc2, 0xff, 0x0c, 0x91, 0x28, 0x83, 0xbd, 0xca, 0x4c, - 0xe4, 0x5e, 0x51, 0x1d, 0x07, 0x5b, 0x3a, 0x61, 0xc8, 0xd0, 0x11, 0x82, 0xc4, 0x86, 0x51, 0xd9, - 0xe5, 0xff, 0xa0, 0x91, 0xfe, 0xe6, 0xff, 0x3a, 0x8e, 0xda, 0x43, 0x89, 0x56, 0xb2, 0xff, 0x4b, - 0x3b, 0x20, 0x80, 0x05, 0x82, 0x54, 0x84, 0x51, 0xb5, 0x52, 0xd1, 0x88, 0xc1, 0xab, 0xb5, 0xd2, - 0x86, 0x46, 0x53, 0x90, 0x36, 0xfd, 0xaf, 0xc3, 0xed, 0xc6, 0x02, 0x79, 0x04, 0x05, 0x8e, 0x5f, - 0x48, 0x41, 0x9f, 0xc9, 0x84, 0x92, 0x2f, 0xc2, 0x48, 0x93, 0xa4, 0x44, 0xbe, 0x6d, 0x4d, 0xaf, - 0x88, 0x8b, 0xee, 0xe4, 0x37, 0x81, 0xd1, 0x97, 0xd5, 0x59, 0x90, 0x41, 0x7f, 0x17, 0xde, 0xd5, - 0xfe, 0x19, 0x84, 0x21, 0xdf, 0x33, 0x08, 0xaa, 0xa9, 0x15, 0x52, 0x94, 0x3f, 0x7f, 0xfd, 0x20, - 0xcf, 0x2b, 0xd8, 0xcb, 0x07, 0x53, 0x86, 0x55, 0x9d, 0xae, 0x62, 0x5d, 0xe4, 0x0f, 0x49, 0x95, - 0x6a, 0x6a, 0x36, 0x35, 0x47, 0xef, 0xa5, 0x77, 0xfb, 0xa2, 0xef, 0x37, 0x7d, 0x14, 0x21, 0x31, - 0x97, 0x5f, 0x99, 0x77, 0xed, 0xf8, 0x0b, 0x31, 0x38, 0xe6, 0xb3, 0x63, 0x1f, 0x72, 0xb3, 0x39, - 0x67, 0x5b, 0x5b, 0x7c, 0x07, 0xef, 0xa4, 0x3c, 0x05, 0x09, 0x82, 0x8f, 0x22, 0xfe, 0xb1, 0x5b, - 0xe6, 0xb7, 0xbe, 0xf4, 0xcf, 0xe5, 0x60, 0x16, 0x2b, 0x30, 0x2a, 0x94, 0x49, 0xe1, 0xe7, 0x3a, - 0xd7, 0x5f, 0xda, 0x7b, 0xe4, 0xde, 0xbe, 0x7d, 0x6a, 0x0c, 0xeb, 0xf0, 0x43, 0x17, 0xe0, 0x68, - 0x38, 0xf3, 0xca, 0xbc, 0x68, 0x47, 0x29, 0xe4, 0x2e, 0x3c, 0x75, 0xbb, 0xbb, 0xe1, 0x7b, 0x8d, - 0x60, 0x54, 0x56, 0x78, 0x07, 0x0e, 0x3d, 0x4d, 0x1a, 0xf5, 0x3e, 0x7e, 0x0a, 0x5f, 0x7f, 0xc8, - 0x3d, 0xd4, 0x29, 0xf1, 0x18, 0x59, 0x9c, 0xd4, 0x04, 0x4f, 0x30, 0xbe, 0x05, 0xb8, 0x6f, 0xaa, - 0xed, 0x1a, 0x32, 0xe5, 0x5b, 0x3f, 0x14, 0x1f, 0xa5, 0xfc, 0x19, 0x09, 0x0e, 0x37, 0x35, 0xcd, - 0x9d, 0xfb, 0x52, 0x8b, 0xfb, 0xeb, 0xdd, 0x9e, 0x2c, 0xf7, 0x5f, 0x69, 0x9f, 0x6b, 0x21, 0xf3, - 0xfd, 0x91, 0x32, 0x33, 0x61, 0x02, 0x42, 0x3f, 0x01, 0x07, 0x83, 0x32, 0x0b, 0x6d, 0xdd, 0x0b, - 0x43, 0xc1, 0x3d, 0x29, 0xd7, 0xda, 0x60, 0x60, 0x57, 0x2a, 0x6f, 0x86, 0xd5, 0xed, 0x76, 0x79, - 0xc1, 0xff, 0x19, 0x87, 0xed, 0xfc, 0xba, 0xed, 0xb1, 0xc7, 0x40, 0x7e, 0xbf, 0x04, 0x93, 0xc1, - 0x86, 0xbc, 0xd4, 0x9f, 0xdd, 0x9d, 0xcc, 0xb7, 0x6d, 0xc0, 0xbf, 0x27, 0xc1, 0x5d, 0x7b, 0xc8, - 0xc4, 0xf5, 0xf0, 0xd3, 0x12, 0x8c, 0xf9, 0xbe, 0xf3, 0x0a, 0x57, 0x2e, 0xac, 0xe0, 0x91, 0x8e, - 0xbf, 0x53, 0xbb, 0x11, 0xd7, 0x51, 0xa2, 0x9c, 0xd7, 0xbe, 0x3e, 0x31, 0xda, 0x5c, 0x67, 0x2b, - 0xa3, 0xcd, 0xdf, 0x66, 0x6f, 0xa3, 0xb9, 0xbc, 0x2a, 0xc1, 0x03, 0xc1, 0x2e, 0xb7, 0x38, 0x91, - 0xf5, 0xa3, 0x1a, 0x8f, 0x6f, 0x48, 0x70, 0xb2, 0x13, 0xe1, 0xf8, 0xc0, 0x68, 0x30, 0xea, 0x9d, - 0xbd, 0x08, 0x0f, 0xcb, 0xe9, 0xee, 0x8f, 0xb0, 0x71, 0xa3, 0x45, 0x2e, 0xd3, 0x3b, 0xa0, 0x7f, - 0x93, 0x4f, 0x37, 0xff, 0xc8, 0xbb, 0xba, 0x0e, 0x26, 0x3b, 0x84, 0xae, 0x03, 0xe9, 0x8e, 0x16, - 0x43, 0x12, 0x6b, 0x31, 0x24, 0xbe, 0xd4, 0xc0, 0x3b, 0xb9, 0x53, 0x6b, 0x71, 0xec, 0x62, 0x03, - 0x46, 0x5b, 0x18, 0x36, 0x9f, 0xeb, 0xdd, 0xdb, 0xb5, 0x82, 0x9a, 0x4d, 0x57, 0xde, 0x85, 0x09, - 0xda, 0x7c, 0x0b, 0x7d, 0xdf, 0xe9, 0x9e, 0x3b, 0xdc, 0xe3, 0xb4, 0x6c, 0x9a, 0xab, 0x60, 0x05, - 0x7a, 0xd9, 0x70, 0xf3, 0x5e, 0xef, 0xdf, 0x6c, 0x38, 0x1f, 0xf9, 0x23, 0xc2, 0xd1, 0xcd, 0x0a, - 0xe9, 0x5b, 0x4f, 0xac, 0x4e, 0xba, 0x7c, 0x9b, 0x26, 0x96, 0x4f, 0x27, 0x5f, 0x13, 0x2e, 0xaf, - 0xb5, 0x74, 0x6e, 0x82, 0xe4, 0x36, 0x7b, 0x3c, 0xa6, 0xa2, 0x3b, 0xeb, 0xda, 0x7e, 0x4d, 0xb8, - 0x36, 0xb7, 0x6b, 0x11, 0xae, 0xed, 0x47, 0x33, 0x02, 0xae, 0x93, 0x8b, 0x10, 0xf3, 0xaf, 0xb1, - 0x93, 0xfb, 0x9e, 0x04, 0x47, 0x68, 0x17, 0xfd, 0x67, 0x79, 0xba, 0xd5, 0xfc, 0x43, 0x80, 0x6c, - 0xab, 0x5c, 0x6a, 0x39, 0xe5, 0xd3, 0xb6, 0x55, 0xbe, 0x1a, 0x58, 0x82, 0x1e, 0x02, 0x54, 0xb1, - 0x9d, 0x30, 0x36, 0x4b, 0x98, 0xa6, 0x2b, 0xb6, 0x73, 0x75, 0x8f, 0x05, 0x2b, 0x71, 0x1b, 0x46, - 0xf5, 0xab, 0x12, 0x64, 0x5b, 0x75, 0xd9, 0x4d, 0xc2, 0x1d, 0x0a, 0x1c, 0x16, 0x0b, 0x0f, 0xe4, - 0xa3, 0x5d, 0x1c, 0x8a, 0x0a, 0x4d, 0xaa, 0x83, 0x16, 0xbe, 0xd3, 0x11, 0xc3, 0x44, 0xd0, 0x5e, - 0x9b, 0x23, 0xf3, 0x1f, 0xd9, 0x64, 0xfa, 0xfd, 0x26, 0x67, 0xfb, 0xd7, 0x29, 0x76, 0xdf, 0x81, - 0xf1, 0x36, 0xc2, 0xdf, 0xe9, 0xa5, 0xd1, 0x68, 0x3b, 0xa6, 0x77, 0x28, 0xfc, 0x3f, 0xc3, 0xa7, - 0x47, 0xf0, 0x92, 0xaf, 0x6f, 0x67, 0xd7, 0xea, 0x95, 0x10, 0xf9, 0xff, 0x87, 0xa3, 0x2d, 0xa9, - 0xb8, 0x88, 0x79, 0x48, 0x6c, 0x69, 0xb6, 0xf8, 0x2c, 0x75, 0x2a, 0x42, 0xba, 0x10, 0x13, 0x4a, - 0x2a, 0x23, 0x48, 0xd3, 0x16, 0x56, 0x0c, 0xa3, 0xc6, 0xa5, 0x91, 0x15, 0x18, 0xf1, 0xc1, 0x78, - 0x5b, 0x8f, 0x43, 0xc2, 0x34, 0xf8, 0x43, 0x78, 0xfd, 0xa7, 0xef, 0x8e, 0x68, 0x8b, 0x90, 0x72, - 0x25, 0x50, 0x32, 0x79, 0x0c, 0x10, 0xe3, 0x49, 0x4f, 0x1d, 0x8b, 0x96, 0x9e, 0x83, 0xd1, 0x00, - 0x94, 0xb7, 0x35, 0x03, 0xbd, 0x26, 0x85, 0xf0, 0xd6, 0xa2, 0x2e, 0x3b, 0x31, 0x72, 0xf7, 0xa1, - 0x31, 0x5a, 0x3a, 0xfd, 0x1b, 0x87, 0xa1, 0x87, 0x32, 0x47, 0x9f, 0x92, 0x00, 0x7c, 0x47, 0x89, - 0xcf, 0x46, 0x70, 0x6b, 0xbd, 0xfb, 0xce, 0x9e, 0xeb, 0x96, 0x8c, 0x07, 0x80, 0x27, 0xdf, 0xf5, - 0xaf, 0xbf, 0xf5, 0x4b, 0xb1, 0x7b, 0x90, 0x2c, 0x32, 0x99, 0xe1, 0xed, 0xbf, 0x6f, 0x66, 0xfd, - 0x6e, 0xe0, 0x05, 0xb6, 0x33, 0x5d, 0xb5, 0x28, 0xe4, 0x3c, 0xdb, 0x25, 0x15, 0x17, 0xf3, 0x22, - 0x15, 0xf3, 0x2c, 0x7a, 0x34, 0x5a, 0xcc, 0xe9, 0xb7, 0x07, 0x27, 0xdb, 0x3b, 0xd1, 0xeb, 0x12, - 0x8c, 0xb5, 0xda, 0x43, 0xa2, 0x4b, 0x5d, 0x09, 0xd3, 0x1c, 0xa6, 0x64, 0xdf, 0xba, 0x7f, 0x06, - 0xbc, 0x63, 0x73, 0xb4, 0x63, 0x79, 0x74, 0x69, 0x1f, 0x1d, 0x9b, 0xf6, 0xad, 0x65, 0xe8, 0xe7, - 0x63, 0x70, 0x7c, 0xcf, 0x8d, 0x19, 0xba, 0xd2, 0x95, 0xb0, 0x7b, 0x44, 0x67, 0xd9, 0xf9, 0xdb, - 0xc0, 0x89, 0xf7, 0xff, 0x69, 0xda, 0xff, 0xa7, 0xd0, 0xfc, 0x7e, 0xfa, 0xef, 0x85, 0x5e, 0x7e, - 0x4d, 0xfc, 0x9b, 0xe0, 0xc5, 0xb6, 0x8e, 0x2c, 0xae, 0x69, 0xdb, 0xd3, 0xd9, 0x84, 0x6a, 0x8e, - 0xa5, 0xe5, 0x67, 0x69, 0x87, 0x14, 0xb4, 0xf2, 0x06, 0x07, 0x74, 0xfa, 0xed, 0xc1, 0xa5, 0xe5, - 0x9d, 0xe8, 0x67, 0xdb, 0xdc, 0x5a, 0x7b, 0xa2, 0x13, 0x49, 0xdb, 0x6f, 0xf0, 0xb2, 0x97, 0xf6, - 0x4d, 0xcf, 0xbb, 0x5c, 0xa7, 0x5d, 0xae, 0x22, 0x7c, 0xbb, 0xbb, 0xdc, 0x72, 0x80, 0xd1, 0x57, - 0x25, 0x18, 0x6b, 0xb5, 0x3f, 0xea, 0x6c, 0x3a, 0xef, 0xb1, 0xef, 0xeb, 0x6c, 0x3a, 0xef, 0xb5, - 0x35, 0x93, 0xdf, 0x42, 0x55, 0x71, 0x0e, 0x9d, 0x69, 0xa7, 0x8a, 0x3d, 0x47, 0x98, 0xcc, 0xe1, - 0x3d, 0xf7, 0x1d, 0x9d, 0xcd, 0xe1, 0x4e, 0x76, 0x58, 0x9d, 0xcd, 0xe1, 0x8e, 0x36, 0x41, 0xd1, - 0x73, 0xd8, 0xed, 0x67, 0x87, 0x43, 0x6c, 0xa3, 0x3f, 0x91, 0x60, 0x30, 0x10, 0xab, 0xa3, 0x0b, - 0x9d, 0xc8, 0xdb, 0x6a, 0x47, 0x13, 0xf9, 0x75, 0xbe, 0xfd, 0xc6, 0x40, 0x9e, 0xa7, 0x3d, 0x9b, - 0x41, 0xf9, 0xfd, 0xf4, 0xcc, 0x0a, 0xc8, 0x7f, 0x53, 0x82, 0xd1, 0x16, 0x61, 0x70, 0x67, 0xb3, - 0xb7, 0x7d, 0x70, 0x9f, 0xbd, 0xb4, 0x6f, 0x7a, 0xde, 0xc7, 0xcb, 0xb4, 0x8f, 0x6f, 0x45, 0x4f, - 0xec, 0xa7, 0x8f, 0xbe, 0xe8, 0xe0, 0xbb, 0xde, 0xe5, 0x21, 0x5f, 0x3b, 0x91, 0x5f, 0xd1, 0xf7, - 0x0e, 0xb1, 0xb3, 0x4f, 0xec, 0x97, 0x9c, 0xf7, 0xee, 0x19, 0xda, 0xbb, 0xa7, 0xd1, 0xf2, 0x1b, - 0xeb, 0x5d, 0x73, 0x50, 0xf1, 0x85, 0xe6, 0x37, 0x71, 0x3a, 0x32, 0xb4, 0x96, 0x21, 0x76, 0x36, - 0xb7, 0x1f, 0x52, 0xde, 0xc5, 0x0b, 0xb4, 0x8b, 0xa7, 0xd1, 0xc3, 0xed, 0xba, 0xe8, 0xbb, 0x3d, - 0xa6, 0xe9, 0x9b, 0xc6, 0xf4, 0xdb, 0x59, 0xfc, 0xfe, 0x4e, 0xf4, 0x5e, 0x71, 0x3b, 0x67, 0xba, - 0x93, 0xe6, 0x7d, 0x41, 0x78, 0xf6, 0xe1, 0xce, 0x09, 0xb8, 0x94, 0xf7, 0x50, 0x29, 0xc7, 0xd1, - 0xb1, 0x76, 0x52, 0x92, 0x40, 0x1c, 0x7d, 0x48, 0x72, 0xaf, 0xfe, 0x3d, 0xd2, 0x51, 0x13, 0xfe, - 0x80, 0x3d, 0xf2, 0x04, 0x50, 0x8b, 0x68, 0x5e, 0xbe, 0x8f, 0xca, 0x35, 0x89, 0xc6, 0xdb, 0xca, - 0xc5, 0xc2, 0xf7, 0x37, 0xe1, 0x1c, 0xc6, 0x0f, 0x7a, 0x9b, 0xbf, 0x0c, 0xaa, 0x0d, 0x67, 0xeb, - 0xc5, 0x37, 0xf4, 0xe0, 0xd4, 0xbe, 0x2f, 0x88, 0xc8, 0x7f, 0x1e, 0x07, 0xb4, 0xea, 0xa8, 0xdb, - 0x38, 0xdf, 0x70, 0xb6, 0x0c, 0x4b, 0x7b, 0x91, 0xad, 0xbf, 0x18, 0xa0, 0xae, 0xee, 0xf8, 0xef, - 0x70, 0xed, 0x79, 0xa6, 0xef, 0xc1, 0xd7, 0xbe, 0x3e, 0x71, 0x7f, 0x07, 0xa7, 0xd2, 0x09, 0xb2, - 0x92, 0xaa, 0xab, 0x3b, 0xfc, 0x60, 0xd0, 0x4f, 0x02, 0xa8, 0xb5, 0x9a, 0x71, 0xbd, 0x54, 0x23, - 0x9b, 0x48, 0xb6, 0x8f, 0x7f, 0x4b, 0xc4, 0x00, 0x37, 0x4b, 0x3b, 0xe5, 0x7b, 0x3f, 0xf5, 0x80, - 0x92, 0xa2, 0x1c, 0x17, 0x34, 0xdb, 0x41, 0x3f, 0x01, 0xa9, 0x0a, 0xd6, 0x77, 0x19, 0xf7, 0xf8, - 0x6d, 0xe1, 0x9e, 0x24, 0x0c, 0x29, 0xf3, 0x12, 0x20, 0xd5, 0x8f, 0x47, 0xff, 0xdb, 0x07, 0x7f, - 0xec, 0x26, 0x6a, 0xea, 0x04, 0x1a, 0xa0, 0x2f, 0x3a, 0x8e, 0xa8, 0x61, 0x50, 0xf6, 0xbe, 0xc0, - 0x9e, 0x31, 0xf0, 0x18, 0x76, 0xfc, 0x44, 0xca, 0x7d, 0x0c, 0x3b, 0x37, 0xf2, 0xa7, 0x9f, 0x3d, - 0x35, 0x18, 0xe0, 0x58, 0x18, 0xf0, 0xe7, 0x5b, 0x4e, 0x7e, 0x4c, 0x82, 0x91, 0xa6, 0x16, 0x91, - 0x0c, 0xe3, 0xf9, 0xf5, 0xb5, 0x2b, 0xcb, 0xca, 0xfc, 0x73, 0xf9, 0xb5, 0xf9, 0xe5, 0x25, 0xf1, - 0x44, 0x9c, 0xef, 0xde, 0x17, 0x9a, 0x80, 0xa3, 0x2d, 0x70, 0x66, 0x8b, 0x0b, 0xc5, 0xb9, 0xfc, - 0x5a, 0x31, 0x2d, 0xa1, 0xbb, 0xe0, 0x78, 0x4b, 0x26, 0x2e, 0x4a, 0xac, 0x0d, 0x8a, 0x52, 0x74, - 0x51, 0xe2, 0x6f, 0xc6, 0xbc, 0xfb, 0x54, 0xb2, 0xf9, 0xa9, 0xb7, 0x2a, 0xd6, 0xb1, 0xad, 0xd9, - 0x6f, 0x64, 0xe6, 0x45, 0x7c, 0x49, 0xff, 0xdf, 0x3d, 0x30, 0x30, 0xc7, 0x5a, 0x59, 0x75, 0x54, - 0xe7, 0xf6, 0xe4, 0x15, 0x90, 0xcd, 0x5f, 0x30, 0x66, 0x0f, 0xab, 0x7b, 0x4f, 0x85, 0x0f, 0x74, - 0xf5, 0x9e, 0x11, 0xbb, 0x21, 0xc2, 0xdf, 0x0c, 0x0a, 0xf3, 0x93, 0xd9, 0x63, 0xc8, 0xf4, 0x00, - 0x16, 0x7b, 0x12, 0xfd, 0x17, 0x25, 0x38, 0x48, 0xb1, 0xbc, 0x45, 0x92, 0x62, 0x8a, 0x07, 0x2b, - 0xa2, 0x5c, 0xf9, 0x82, 0xea, 0x4b, 0x01, 0xb3, 0xb7, 0xcc, 0xef, 0xe1, 0xb7, 0xb8, 0x8f, 0xf9, - 0x64, 0x08, 0x73, 0x97, 0x95, 0xd1, 0x5a, 0x13, 0xa5, 0x1d, 0x4a, 0x28, 0x26, 0xde, 0x70, 0x42, - 0xf1, 0x69, 0xe8, 0xf7, 0x05, 0x72, 0x99, 0x9e, 0xce, 0x1e, 0x5e, 0x09, 0xa7, 0xf4, 0xfd, 0x3c, - 0xd0, 0x7b, 0x24, 0x38, 0xd8, 0x32, 0xf0, 0xcd, 0xf4, 0xee, 0xfb, 0xcb, 0x41, 0x48, 0x63, 0x2d, - 0xd9, 0xcb, 0xca, 0x58, 0xa3, 0xd5, 0xb6, 0xe2, 0x19, 0x18, 0x0c, 0x44, 0xab, 0x99, 0x3e, 0x2a, - 0xc6, 0x3e, 0xae, 0x17, 0x07, 0xf9, 0xa0, 0x2c, 0x24, 0xf1, 0x8e, 0x69, 0x58, 0x0e, 0xae, 0xd0, - 0x03, 0x5c, 0x49, 0xc5, 0x2d, 0xcb, 0x4b, 0x80, 0x9a, 0x07, 0x3e, 0xfc, 0xb0, 0xbf, 0xe7, 0xcb, - 0xd0, 0x18, 0xf4, 0xf8, 0x9f, 0xbe, 0x67, 0x05, 0x2f, 0x6b, 0xfa, 0x26, 0x78, 0x8a, 0xff, 0x1b, - 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xcc, 0x3a, 0xa6, 0x9f, 0x00, 0x00, + // 10447 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0x66, 0x77, 0x01, 0xec, 0x3e, 0x7c, 0x2d, 0x1a, 0xb8, 0xbb, 0xbd, 0xbd, 0x3b, 0x00, + 0x1c, 0x92, 0x77, 0xc7, 0x23, 0x0f, 0x20, 0x8f, 0xbc, 0x0f, 0xe2, 0x44, 0x9e, 0x76, 0x81, 0x3d, + 0x1c, 0x48, 0x7c, 0x71, 0x00, 0x1c, 0x29, 0x2a, 0xaa, 0xcd, 0x60, 0xb7, 0xb1, 0x18, 0x62, 0x77, + 0x66, 0x38, 0x33, 0x7b, 0x07, 0x9c, 0xa4, 0x32, 0x2d, 0xf9, 0x83, 0xa6, 0xa3, 0xe8, 0xc3, 0x2e, + 0x5b, 0xa6, 0x74, 0x8a, 0x64, 0x29, 0x91, 0xc2, 0xd8, 0xb1, 0x2c, 0xc9, 0x4a, 0x1c, 0xe7, 0x87, + 0xe4, 0x2a, 0x27, 0xb2, 0xaa, 0x62, 0x4b, 0x4e, 0x25, 0x52, 0x9c, 0xe4, 0x24, 0x53, 0x8a, 0xa3, + 0x28, 0x4a, 0xac, 0x30, 0x52, 0xc5, 0x55, 0xaa, 0x54, 0x52, 0xfd, 0x35, 0x5f, 0xbb, 0x8b, 0xd9, + 0x05, 0xef, 0x28, 0xf9, 0xe3, 0x17, 0xd0, 0xdd, 0xef, 0xbd, 0x7e, 0xfd, 0xfa, 0xf5, 0xeb, 0xf7, + 0x5e, 0x77, 0xcf, 0xc2, 0x87, 0x2e, 0xc2, 0x44, 0xc5, 0x30, 0x2a, 0x55, 0x3c, 0x65, 0x5a, 0x86, + 0x63, 0x6c, 0xd4, 0x37, 0xa7, 0xca, 0xd8, 0x2e, 0x59, 0x9a, 0xe9, 0x18, 0xd6, 0x24, 0xad, 0x43, + 0x43, 0x0c, 0x62, 0x52, 0x40, 0xc8, 0x8b, 0x30, 0x7c, 0x59, 0xab, 0xe2, 0x59, 0x17, 0x70, 0x15, + 0x3b, 0xe8, 0x02, 0x24, 0x36, 0xb5, 0x2a, 0xce, 0x48, 0x13, 0xf1, 0x93, 0x7d, 0x67, 0xee, 0x99, + 0x0c, 0x21, 0x4d, 0x06, 0x31, 0x56, 0x48, 0xb5, 0x42, 0x31, 0xe4, 0x6f, 0x27, 0x60, 0xa4, 0x49, + 0x2b, 0x42, 0x90, 0xd0, 0xd5, 0x1a, 0xa1, 0x28, 0x9d, 0x4c, 0x29, 0xf4, 0x7f, 0x94, 0x81, 0x5e, + 0x53, 0x2d, 0x6d, 0xab, 0x15, 0x9c, 0x89, 0xd1, 0x6a, 0x51, 0x44, 0x63, 0x00, 0x65, 0x6c, 0x62, + 0xbd, 0x8c, 0xf5, 0xd2, 0x6e, 0x26, 0x3e, 0x11, 0x3f, 0x99, 0x52, 0x7c, 0x35, 0xe8, 0x7e, 0x18, + 0x36, 0xeb, 0x1b, 0x55, 0xad, 0x54, 0xf4, 0x81, 0xc1, 0x44, 0xfc, 0x64, 0xb7, 0x92, 0x66, 0x0d, + 0xb3, 0x1e, 0xf0, 0x09, 0x18, 0xba, 0x8e, 0xd5, 0x6d, 0x3f, 0x68, 0x1f, 0x05, 0x1d, 0x24, 0xd5, + 0x3e, 0xc0, 0x19, 0xe8, 0xaf, 0x61, 0xdb, 0x56, 0x2b, 0xb8, 0xe8, 0xec, 0x9a, 0x38, 0x93, 0xa0, + 0xa3, 0x9f, 0x68, 0x18, 0x7d, 0x78, 0xe4, 0x7d, 0x1c, 0x6b, 0x6d, 0xd7, 0xc4, 0x28, 0x07, 0x29, + 0xac, 0xd7, 0x6b, 0x8c, 0x42, 0x77, 0x0b, 0xf9, 0x15, 0xf4, 0x7a, 0x2d, 0x4c, 0x25, 0x49, 0xd0, + 0x38, 0x89, 0x5e, 0x1b, 0x5b, 0xd7, 0xb4, 0x12, 0xce, 0xf4, 0x50, 0x02, 0x27, 0x1a, 0x08, 0xac, + 0xb2, 0xf6, 0x30, 0x0d, 0x81, 0x87, 0x66, 0x20, 0x85, 0x77, 0x1c, 0xac, 0xdb, 0x9a, 0xa1, 0x67, + 0x7a, 0x29, 0x91, 0x7b, 0x9b, 0xcc, 0x22, 0xae, 0x96, 0xc3, 0x24, 0x3c, 0x3c, 0x74, 0x0e, 0x7a, + 0x0d, 0xd3, 0xd1, 0x0c, 0xdd, 0xce, 0x24, 0x27, 0xa4, 0x93, 0x7d, 0x67, 0x8e, 0x36, 0x55, 0x84, + 0x65, 0x06, 0xa3, 0x08, 0x60, 0x34, 0x0f, 0x69, 0xdb, 0xa8, 0x5b, 0x25, 0x5c, 0x2c, 0x19, 0x65, + 0x5c, 0xd4, 0xf4, 0x4d, 0x23, 0x93, 0xa2, 0x04, 0xc6, 0x1b, 0x07, 0x42, 0x01, 0x67, 0x8c, 0x32, + 0x9e, 0xd7, 0x37, 0x0d, 0x65, 0xd0, 0x0e, 0x94, 0xd1, 0x41, 0xe8, 0xb1, 0x77, 0x75, 0x47, 0xdd, + 0xc9, 0xf4, 0x53, 0x0d, 0xe1, 0x25, 0xf9, 0x77, 0x7b, 0x60, 0xa8, 0x1d, 0x15, 0xbb, 0x08, 0xdd, + 0x9b, 0x64, 0x94, 0x99, 0x58, 0x27, 0x32, 0x60, 0x38, 0x41, 0x21, 0xf6, 0xec, 0x53, 0x88, 0x39, + 0xe8, 0xd3, 0xb1, 0xed, 0xe0, 0x32, 0xd3, 0x88, 0x78, 0x9b, 0x3a, 0x05, 0x0c, 0xa9, 0x51, 0xa5, + 0x12, 0xfb, 0x52, 0xa9, 0x67, 0x60, 0xc8, 0x65, 0xa9, 0x68, 0xa9, 0x7a, 0x45, 0xe8, 0xe6, 0x54, + 0x14, 0x27, 0x93, 0x05, 0x81, 0xa7, 0x10, 0x34, 0x65, 0x10, 0x07, 0xca, 0x68, 0x16, 0xc0, 0xd0, + 0xb1, 0xb1, 0x59, 0x2c, 0xe3, 0x52, 0x35, 0x93, 0x6c, 0x21, 0xa5, 0x65, 0x02, 0xd2, 0x20, 0x25, + 0x83, 0xd5, 0x96, 0xaa, 0xe8, 0x51, 0x4f, 0xd5, 0x7a, 0x5b, 0x68, 0xca, 0x22, 0x5b, 0x64, 0x0d, + 0xda, 0xb6, 0x0e, 0x83, 0x16, 0x26, 0x7a, 0x8f, 0xcb, 0x7c, 0x64, 0x29, 0xca, 0xc4, 0x64, 0xe4, + 0xc8, 0x14, 0x8e, 0xc6, 0x06, 0x36, 0x60, 0xf9, 0x8b, 0xe8, 0x6e, 0x70, 0x2b, 0x8a, 0x54, 0xad, + 0x80, 0x5a, 0xa1, 0x7e, 0x51, 0xb9, 0xa4, 0xd6, 0x70, 0xf6, 0x06, 0x0c, 0x06, 0xc5, 0x83, 0x46, + 0xa1, 0xdb, 0x76, 0x54, 0xcb, 0xa1, 0x5a, 0xd8, 0xad, 0xb0, 0x02, 0x4a, 0x43, 0x1c, 0xeb, 0x65, + 0x6a, 0xe5, 0xba, 0x15, 0xf2, 0x2f, 0x7a, 0xb3, 0x37, 0xe0, 0x38, 0x1d, 0xf0, 0xf1, 0xc6, 0x19, + 0x0d, 0x50, 0x0e, 0x8f, 0x3b, 0x7b, 0x1e, 0x06, 0x02, 0x03, 0x68, 0xb7, 0x6b, 0xf9, 0x1d, 0x70, + 0xa0, 0x29, 0x69, 0xf4, 0x0c, 0x8c, 0xd6, 0x75, 0x4d, 0x77, 0xb0, 0x65, 0x5a, 0x98, 0x68, 0x2c, + 0xeb, 0x2a, 0xf3, 0x5f, 0x7b, 0x5b, 0xe8, 0xdc, 0xba, 0x1f, 0x9a, 0x51, 0x51, 0x46, 0xea, 0x8d, + 0x95, 0xa7, 0x52, 0xc9, 0xef, 0xf4, 0xa6, 0x5f, 0x78, 0xe1, 0x85, 0x17, 0x62, 0xf2, 0x07, 0x7b, + 0x60, 0xb4, 0xd9, 0x9a, 0x69, 0xba, 0x7c, 0x0f, 0x42, 0x8f, 0x5e, 0xaf, 0x6d, 0x60, 0x8b, 0x0a, + 0xa9, 0x5b, 0xe1, 0x25, 0x94, 0x83, 0xee, 0xaa, 0xba, 0x81, 0xab, 0x99, 0xc4, 0x84, 0x74, 0x72, + 0xf0, 0xcc, 0xfd, 0x6d, 0xad, 0xca, 0xc9, 0x05, 0x82, 0xa2, 0x30, 0x4c, 0xf4, 0x38, 0x24, 0xb8, + 0x89, 0x26, 0x14, 0x4e, 0xb5, 0x47, 0x81, 0xac, 0x25, 0x85, 0xe2, 0xa1, 0x23, 0x90, 0x22, 0x7f, + 0x99, 0x6e, 0xf4, 0x50, 0x9e, 0x93, 0xa4, 0x82, 0xe8, 0x05, 0xca, 0x42, 0x92, 0x2e, 0x93, 0x32, + 0x16, 0x5b, 0x9b, 0x5b, 0x26, 0x8a, 0x55, 0xc6, 0x9b, 0x6a, 0xbd, 0xea, 0x14, 0xaf, 0xa9, 0xd5, + 0x3a, 0xa6, 0x0a, 0x9f, 0x52, 0xfa, 0x79, 0xe5, 0x55, 0x52, 0x87, 0xc6, 0xa1, 0x8f, 0xad, 0x2a, + 0x4d, 0x2f, 0xe3, 0x1d, 0x6a, 0x3d, 0xbb, 0x15, 0xb6, 0xd0, 0xe6, 0x49, 0x0d, 0xe9, 0xfe, 0x39, + 0xdb, 0xd0, 0x85, 0x6a, 0xd2, 0x2e, 0x48, 0x05, 0xed, 0xfe, 0x7c, 0xd8, 0x70, 0x1f, 0x6b, 0x3e, + 0xbc, 0xb0, 0x4e, 0xc9, 0x9f, 0x8f, 0x41, 0x82, 0xda, 0x8b, 0x21, 0xe8, 0x5b, 0x7b, 0xcb, 0x4a, + 0xa1, 0x38, 0xbb, 0xbc, 0x9e, 0x5f, 0x28, 0xa4, 0x25, 0x34, 0x08, 0x40, 0x2b, 0x2e, 0x2f, 0x2c, + 0xe7, 0xd6, 0xd2, 0x31, 0xb7, 0x3c, 0xbf, 0xb4, 0x76, 0xee, 0x91, 0x74, 0xdc, 0x45, 0x58, 0x67, + 0x15, 0x09, 0x3f, 0xc0, 0xc3, 0x67, 0xd2, 0xdd, 0x28, 0x0d, 0xfd, 0x8c, 0xc0, 0xfc, 0x33, 0x85, + 0xd9, 0x73, 0x8f, 0xa4, 0x7b, 0x82, 0x35, 0x0f, 0x9f, 0x49, 0xf7, 0xa2, 0x01, 0x48, 0xd1, 0x9a, + 0xfc, 0xf2, 0xf2, 0x42, 0x3a, 0xe9, 0xd2, 0x5c, 0x5d, 0x53, 0xe6, 0x97, 0xe6, 0xd2, 0x29, 0x97, + 0xe6, 0x9c, 0xb2, 0xbc, 0xbe, 0x92, 0x06, 0x97, 0xc2, 0x62, 0x61, 0x75, 0x35, 0x37, 0x57, 0x48, + 0xf7, 0xb9, 0x10, 0xf9, 0xb7, 0xac, 0x15, 0x56, 0xd3, 0xfd, 0x01, 0xb6, 0x1e, 0x3e, 0x93, 0x1e, + 0x70, 0xbb, 0x28, 0x2c, 0xad, 0x2f, 0xa6, 0x07, 0xd1, 0x30, 0x0c, 0xb0, 0x2e, 0x04, 0x13, 0x43, + 0xa1, 0xaa, 0x73, 0x8f, 0xa4, 0xd3, 0x1e, 0x23, 0x8c, 0xca, 0x70, 0xa0, 0xe2, 0xdc, 0x23, 0x69, + 0x24, 0xcf, 0x40, 0x37, 0xd5, 0x2e, 0x84, 0x60, 0x70, 0x21, 0x97, 0x2f, 0x2c, 0x14, 0x97, 0x57, + 0xd6, 0xe6, 0x97, 0x97, 0x72, 0x0b, 0x69, 0xc9, 0xab, 0x53, 0x0a, 0x4f, 0xad, 0xcf, 0x2b, 0x85, + 0xd9, 0x74, 0xcc, 0x5f, 0xb7, 0x52, 0xc8, 0xad, 0x15, 0x66, 0xd3, 0x71, 0xb9, 0x04, 0xa3, 0xcd, + 0xec, 0x64, 0xd3, 0x95, 0xe1, 0x9b, 0xe2, 0x58, 0x8b, 0x29, 0xa6, 0xb4, 0x1a, 0xa6, 0xf8, 0x5b, + 0x31, 0x18, 0x69, 0xb2, 0x57, 0x34, 0xed, 0xe4, 0x12, 0x74, 0x33, 0x15, 0x65, 0xbb, 0xe7, 0x7d, + 0x4d, 0x37, 0x1d, 0xaa, 0xb0, 0x0d, 0x3b, 0x28, 0xc5, 0xf3, 0x7b, 0x10, 0xf1, 0x16, 0x1e, 0x04, + 0x21, 0xd1, 0x60, 0xd3, 0xdf, 0xd6, 0x60, 0xd3, 0xd9, 0xb6, 0x77, 0xae, 0x9d, 0x6d, 0x8f, 0xd6, + 0x75, 0x66, 0xdb, 0xbb, 0x9b, 0xd8, 0xf6, 0x8b, 0x30, 0xdc, 0x40, 0xa8, 0x6d, 0x1b, 0xfb, 0x6e, + 0x09, 0x32, 0xad, 0x84, 0x13, 0x61, 0xe9, 0x62, 0x01, 0x4b, 0x77, 0x31, 0x2c, 0xc1, 0xbb, 0x5a, + 0x4f, 0x42, 0xc3, 0x5c, 0x7f, 0x52, 0x82, 0x83, 0xcd, 0x3d, 0xc5, 0xa6, 0x3c, 0x3c, 0x0e, 0x3d, + 0x35, 0xec, 0x6c, 0x19, 0xc2, 0x5b, 0x3a, 0xde, 0x64, 0x0f, 0x26, 0xcd, 0xe1, 0xc9, 0xe6, 0x58, + 0xfe, 0x4d, 0x3c, 0xde, 0xca, 0xdd, 0x63, 0xdc, 0x34, 0x70, 0xfa, 0x0b, 0x31, 0x38, 0xd0, 0x94, + 0x78, 0x53, 0x46, 0x8f, 0x01, 0x68, 0xba, 0x59, 0x77, 0x98, 0x47, 0xc4, 0x0c, 0x6c, 0x8a, 0xd6, + 0x50, 0xe3, 0x45, 0x8c, 0x67, 0xdd, 0x71, 0xdb, 0xe3, 0xb4, 0x1d, 0x58, 0x15, 0x05, 0xb8, 0xe0, + 0x31, 0x9a, 0xa0, 0x8c, 0x8e, 0xb5, 0x18, 0x69, 0x83, 0x62, 0x3e, 0x08, 0xe9, 0x52, 0x55, 0xc3, + 0xba, 0x53, 0xb4, 0x1d, 0x0b, 0xab, 0x35, 0x4d, 0xaf, 0xd0, 0x1d, 0x24, 0x39, 0xdd, 0xbd, 0xa9, + 0x56, 0x6d, 0xac, 0x0c, 0xb1, 0xe6, 0x55, 0xd1, 0x4a, 0x30, 0xa8, 0x02, 0x59, 0x3e, 0x8c, 0x9e, + 0x00, 0x06, 0x6b, 0x76, 0x31, 0xe4, 0x0f, 0xa4, 0xa0, 0xcf, 0xe7, 0x57, 0xa3, 0xbb, 0xa0, 0xff, + 0x39, 0xf5, 0x9a, 0x5a, 0x14, 0xb1, 0x12, 0x93, 0x44, 0x1f, 0xa9, 0x5b, 0xe1, 0xf1, 0xd2, 0x83, + 0x30, 0x4a, 0x41, 0x8c, 0xba, 0x83, 0xad, 0x62, 0xa9, 0xaa, 0xda, 0x36, 0x15, 0x5a, 0x92, 0x82, + 0x22, 0xd2, 0xb6, 0x4c, 0x9a, 0x66, 0x44, 0x0b, 0x3a, 0x0b, 0x23, 0x14, 0xa3, 0x56, 0xaf, 0x3a, + 0x9a, 0x59, 0xc5, 0x45, 0x12, 0xbd, 0xd9, 0x74, 0x27, 0x71, 0x39, 0x1b, 0x26, 0x10, 0x8b, 0x1c, + 0x80, 0x70, 0x64, 0xa3, 0x59, 0x38, 0x46, 0xd1, 0x2a, 0x58, 0xc7, 0x96, 0xea, 0xe0, 0x22, 0x7e, + 0xbe, 0xae, 0x56, 0xed, 0xa2, 0xaa, 0x97, 0x8b, 0x5b, 0xaa, 0xbd, 0x95, 0x19, 0x25, 0x04, 0xf2, + 0xb1, 0x8c, 0xa4, 0x1c, 0x26, 0x80, 0x73, 0x1c, 0xae, 0x40, 0xc1, 0x72, 0x7a, 0xf9, 0x8a, 0x6a, + 0x6f, 0xa1, 0x69, 0x38, 0x48, 0xa9, 0xd8, 0x8e, 0xa5, 0xe9, 0x95, 0x62, 0x69, 0x0b, 0x97, 0xb6, + 0x8b, 0x75, 0x67, 0xf3, 0x42, 0xe6, 0x88, 0xbf, 0x7f, 0xca, 0xe1, 0x2a, 0x85, 0x99, 0x21, 0x20, + 0xeb, 0xce, 0xe6, 0x05, 0xb4, 0x0a, 0xfd, 0x64, 0x32, 0x6a, 0xda, 0x0d, 0x5c, 0xdc, 0x34, 0x2c, + 0xba, 0x35, 0x0e, 0x36, 0x31, 0x4d, 0x3e, 0x09, 0x4e, 0x2e, 0x73, 0x84, 0x45, 0xa3, 0x8c, 0xa7, + 0xbb, 0x57, 0x57, 0x0a, 0x85, 0x59, 0xa5, 0x4f, 0x50, 0xb9, 0x6c, 0x58, 0x44, 0xa1, 0x2a, 0x86, + 0x2b, 0xe0, 0x3e, 0xa6, 0x50, 0x15, 0x43, 0x88, 0xf7, 0x2c, 0x8c, 0x94, 0x4a, 0x6c, 0xcc, 0x5a, + 0xa9, 0xc8, 0x63, 0x2c, 0x3b, 0x93, 0x0e, 0x08, 0xab, 0x54, 0x9a, 0x63, 0x00, 0x5c, 0xc7, 0x6d, + 0xf4, 0x28, 0x1c, 0xf0, 0x84, 0xe5, 0x47, 0x1c, 0x6e, 0x18, 0x65, 0x18, 0xf5, 0x2c, 0x8c, 0x98, + 0xbb, 0x8d, 0x88, 0x28, 0xd0, 0xa3, 0xb9, 0x1b, 0x46, 0x3b, 0x0f, 0xa3, 0xe6, 0x96, 0xd9, 0x88, + 0x77, 0xca, 0x8f, 0x87, 0xcc, 0x2d, 0x33, 0x8c, 0x78, 0x2f, 0x0d, 0xb8, 0x2d, 0x5c, 0x52, 0x1d, + 0x5c, 0xce, 0x1c, 0xf2, 0x83, 0xfb, 0x1a, 0xd0, 0x14, 0xa4, 0x4b, 0xa5, 0x22, 0xd6, 0xd5, 0x8d, + 0x2a, 0x2e, 0xaa, 0x16, 0xd6, 0x55, 0x3b, 0x33, 0xee, 0x07, 0x1e, 0x2c, 0x95, 0x0a, 0xb4, 0x35, + 0x47, 0x1b, 0xd1, 0x29, 0x18, 0x36, 0x36, 0x9e, 0x2b, 0x31, 0x95, 0x2c, 0x9a, 0x16, 0xde, 0xd4, + 0x76, 0x32, 0xf7, 0x50, 0xf9, 0x0e, 0x91, 0x06, 0xaa, 0x90, 0x2b, 0xb4, 0x1a, 0xdd, 0x07, 0xe9, + 0x92, 0xbd, 0xa5, 0x5a, 0x26, 0xb5, 0xc9, 0xb6, 0xa9, 0x96, 0x70, 0xe6, 0x5e, 0x06, 0xca, 0xea, + 0x97, 0x44, 0x35, 0x59, 0x12, 0xf6, 0x75, 0x6d, 0xd3, 0x11, 0x14, 0x4f, 0xb0, 0x25, 0x41, 0xeb, + 0x38, 0xb5, 0x93, 0x90, 0x26, 0xa2, 0x08, 0x74, 0x7c, 0x92, 0x82, 0x0d, 0x9a, 0x5b, 0xa6, 0xbf, + 0xdf, 0xbb, 0x61, 0x80, 0x40, 0x7a, 0x9d, 0xde, 0xc7, 0x1c, 0x32, 0x73, 0xcb, 0xd7, 0xe3, 0x23, + 0x70, 0x90, 0x00, 0xd5, 0xb0, 0xa3, 0x96, 0x55, 0x47, 0xf5, 0x41, 0x3f, 0x40, 0xa1, 0x89, 0xdc, + 0x17, 0x79, 0x63, 0x80, 0x4f, 0xab, 0xbe, 0xb1, 0xeb, 0x6a, 0xd6, 0x69, 0xc6, 0x27, 0xa9, 0x13, + 0xba, 0x75, 0xc7, 0x9c, 0x6e, 0x79, 0x1a, 0xfa, 0xfd, 0x8a, 0x8f, 0x52, 0xc0, 0x54, 0x3f, 0x2d, + 0x11, 0x2f, 0x68, 0x66, 0x79, 0x96, 0xf8, 0x2f, 0xcf, 0x16, 0xd2, 0x31, 0xe2, 0x47, 0x2d, 0xcc, + 0xaf, 0x15, 0x8a, 0xca, 0xfa, 0xd2, 0xda, 0xfc, 0x62, 0x21, 0x1d, 0xf7, 0x39, 0xec, 0x4f, 0x24, + 0x92, 0xc7, 0xd3, 0x27, 0xe4, 0xaf, 0xc6, 0x60, 0x30, 0x18, 0x81, 0xa1, 0x37, 0xc1, 0x21, 0x91, + 0x2e, 0xb1, 0xb1, 0x53, 0xbc, 0xae, 0x59, 0x74, 0x45, 0xd6, 0x54, 0xb6, 0x3b, 0xba, 0x3a, 0x31, + 0xca, 0xa1, 0x56, 0xb1, 0xf3, 0xb4, 0x66, 0x91, 0xf5, 0x56, 0x53, 0x1d, 0xb4, 0x00, 0xe3, 0xba, + 0x51, 0xb4, 0x1d, 0x55, 0x2f, 0xab, 0x56, 0xb9, 0xe8, 0x25, 0xaa, 0x8a, 0x6a, 0xa9, 0x84, 0x6d, + 0xdb, 0x60, 0x3b, 0xa1, 0x4b, 0xe5, 0xa8, 0x6e, 0xac, 0x72, 0x60, 0x6f, 0x8b, 0xc8, 0x71, 0xd0, + 0x90, 0xfe, 0xc6, 0x5b, 0xe9, 0xef, 0x11, 0x48, 0xd5, 0x54, 0xb3, 0x88, 0x75, 0xc7, 0xda, 0xa5, + 0x7e, 0x77, 0x52, 0x49, 0xd6, 0x54, 0xb3, 0x40, 0xca, 0x6f, 0x48, 0xf8, 0xf3, 0x44, 0x22, 0x99, + 0x4c, 0xa7, 0x9e, 0x48, 0x24, 0x53, 0x69, 0x90, 0x5f, 0x8d, 0x43, 0xbf, 0xdf, 0x0f, 0x27, 0x61, + 0x4d, 0x89, 0x6e, 0x59, 0x12, 0x35, 0x6a, 0x77, 0xef, 0xe9, 0xb5, 0x4f, 0xce, 0x90, 0xbd, 0x6c, + 0xba, 0x87, 0x79, 0xc7, 0x0a, 0xc3, 0x24, 0x7e, 0x04, 0x51, 0x36, 0xcc, 0xbc, 0x91, 0xa4, 0xc2, + 0x4b, 0x68, 0x0e, 0x7a, 0x9e, 0xb3, 0x29, 0xed, 0x1e, 0x4a, 0xfb, 0x9e, 0xbd, 0x69, 0x3f, 0xb1, + 0x4a, 0x89, 0xa7, 0x9e, 0x58, 0x2d, 0x2e, 0x2d, 0x2b, 0x8b, 0xb9, 0x05, 0x85, 0xa3, 0xa3, 0xc3, + 0x90, 0xa8, 0xaa, 0x37, 0x76, 0x83, 0xbb, 0x1e, 0xad, 0x6a, 0x77, 0x12, 0x0e, 0x43, 0xe2, 0x3a, + 0x56, 0xb7, 0x83, 0x7b, 0x0d, 0xad, 0xba, 0x83, 0x8b, 0x61, 0x0a, 0xba, 0xa9, 0xbc, 0x10, 0x00, + 0x97, 0x58, 0xba, 0x0b, 0x25, 0x21, 0x31, 0xb3, 0xac, 0x90, 0x05, 0x91, 0x86, 0x7e, 0x56, 0x5b, + 0x5c, 0x99, 0x2f, 0xcc, 0x14, 0xd2, 0x31, 0xf9, 0x2c, 0xf4, 0x30, 0x21, 0x90, 0xc5, 0xe2, 0x8a, + 0x21, 0xdd, 0xc5, 0x8b, 0x9c, 0x86, 0x24, 0x5a, 0xd7, 0x17, 0xf3, 0x05, 0x25, 0x1d, 0x0b, 0x4e, + 0x75, 0x22, 0xdd, 0x2d, 0xdb, 0xd0, 0xef, 0x77, 0xc4, 0xdf, 0x98, 0x20, 0xfb, 0x0b, 0x12, 0xf4, + 0xf9, 0x1c, 0x6b, 0xe2, 0x11, 0xa9, 0xd5, 0xaa, 0x71, 0xbd, 0xa8, 0x56, 0x35, 0xd5, 0xe6, 0xaa, + 0x01, 0xb4, 0x2a, 0x47, 0x6a, 0xda, 0x9d, 0xba, 0x37, 0x68, 0x89, 0x74, 0xa7, 0x7b, 0xe4, 0x8f, + 0x48, 0x90, 0x0e, 0x7b, 0xb6, 0x21, 0x36, 0xa5, 0x1f, 0x27, 0x9b, 0xf2, 0x87, 0x25, 0x18, 0x0c, + 0xba, 0xb3, 0x21, 0xf6, 0xee, 0xfa, 0xb1, 0xb2, 0xf7, 0xcd, 0x18, 0x0c, 0x04, 0x9c, 0xd8, 0x76, + 0xb9, 0x7b, 0x1e, 0x86, 0xb5, 0x32, 0xae, 0x99, 0x86, 0x83, 0xf5, 0xd2, 0x6e, 0xb1, 0x8a, 0xaf, + 0xe1, 0x6a, 0x46, 0xa6, 0x46, 0x63, 0x6a, 0x6f, 0x37, 0x79, 0x72, 0xde, 0xc3, 0x5b, 0x20, 0x68, + 0xd3, 0x23, 0xf3, 0xb3, 0x85, 0xc5, 0x95, 0xe5, 0xb5, 0xc2, 0xd2, 0xcc, 0x5b, 0x8a, 0xeb, 0x4b, + 0x4f, 0x2e, 0x2d, 0x3f, 0xbd, 0xa4, 0xa4, 0xb5, 0x10, 0xd8, 0x1d, 0x5c, 0xf6, 0x2b, 0x90, 0x0e, + 0x33, 0x85, 0x0e, 0x41, 0x33, 0xb6, 0xd2, 0x5d, 0x68, 0x04, 0x86, 0x96, 0x96, 0x8b, 0xab, 0xf3, + 0xb3, 0x85, 0x62, 0xe1, 0xf2, 0xe5, 0xc2, 0xcc, 0xda, 0x2a, 0x4b, 0x7c, 0xb8, 0xd0, 0x6b, 0x81, + 0x05, 0x2e, 0xbf, 0x1c, 0x87, 0x91, 0x26, 0x9c, 0xa0, 0x1c, 0x0f, 0x59, 0x58, 0x14, 0x75, 0xba, + 0x1d, 0xee, 0x27, 0x89, 0xcf, 0xb0, 0xa2, 0x5a, 0x0e, 0x8f, 0x70, 0xee, 0x03, 0x22, 0x25, 0xdd, + 0xd1, 0x36, 0x35, 0x6c, 0xf1, 0x3c, 0x11, 0x8b, 0x63, 0x86, 0xbc, 0x7a, 0x96, 0x2a, 0x7a, 0x00, + 0x90, 0x69, 0xd8, 0x9a, 0xa3, 0x5d, 0xc3, 0x45, 0x4d, 0x17, 0x49, 0x25, 0x12, 0xd7, 0x24, 0x94, + 0xb4, 0x68, 0x99, 0xd7, 0x1d, 0x17, 0x5a, 0xc7, 0x15, 0x35, 0x04, 0x4d, 0x8c, 0x79, 0x5c, 0x49, + 0x8b, 0x16, 0x17, 0xfa, 0x2e, 0xe8, 0x2f, 0x1b, 0x75, 0xe2, 0xec, 0x31, 0x38, 0xb2, 0x77, 0x48, + 0x4a, 0x1f, 0xab, 0x73, 0x41, 0xb8, 0x1b, 0xef, 0x65, 0xb3, 0xfa, 0x95, 0x3e, 0x56, 0xc7, 0x40, + 0x4e, 0xc0, 0x90, 0x5a, 0xa9, 0x58, 0x84, 0xb8, 0x20, 0xc4, 0x02, 0x93, 0x41, 0xb7, 0x9a, 0x02, + 0x66, 0x9f, 0x80, 0xa4, 0x90, 0x03, 0xd9, 0xaa, 0x89, 0x24, 0x8a, 0x26, 0x8b, 0xb6, 0x63, 0x27, + 0x53, 0x4a, 0x52, 0x17, 0x8d, 0x77, 0x41, 0xbf, 0x66, 0x17, 0xbd, 0xe4, 0x7c, 0x6c, 0x22, 0x76, + 0x32, 0xa9, 0xf4, 0x69, 0xb6, 0x9b, 0xd8, 0x94, 0x3f, 0x19, 0x83, 0xc1, 0xe0, 0xe1, 0x02, 0x9a, + 0x85, 0x64, 0xd5, 0x28, 0xa9, 0x54, 0xb5, 0xd8, 0xc9, 0xd6, 0xc9, 0x88, 0xf3, 0x88, 0xc9, 0x05, + 0x0e, 0xaf, 0xb8, 0x98, 0xd9, 0x3f, 0x92, 0x20, 0x29, 0xaa, 0xd1, 0x41, 0x48, 0x98, 0xaa, 0xb3, + 0x45, 0xc9, 0x75, 0xe7, 0x63, 0x69, 0x49, 0xa1, 0x65, 0x52, 0x6f, 0x9b, 0xaa, 0x4e, 0x55, 0x80, + 0xd7, 0x93, 0x32, 0x99, 0xd7, 0x2a, 0x56, 0xcb, 0x34, 0xea, 0x31, 0x6a, 0x35, 0xac, 0x3b, 0xb6, + 0x98, 0x57, 0x5e, 0x3f, 0xc3, 0xab, 0xd1, 0xfd, 0x30, 0xec, 0x58, 0xaa, 0x56, 0x0d, 0xc0, 0x26, + 0x28, 0x6c, 0x5a, 0x34, 0xb8, 0xc0, 0xd3, 0x70, 0x58, 0xd0, 0x2d, 0x63, 0x47, 0x2d, 0x6d, 0xe1, + 0xb2, 0x87, 0xd4, 0x43, 0xb3, 0x1b, 0x87, 0x38, 0xc0, 0x2c, 0x6f, 0x17, 0xb8, 0xf2, 0x57, 0x25, + 0x18, 0x16, 0x71, 0x5a, 0xd9, 0x15, 0xd6, 0x22, 0x80, 0xaa, 0xeb, 0x86, 0xe3, 0x17, 0x57, 0xa3, + 0x2a, 0x37, 0xe0, 0x4d, 0xe6, 0x5c, 0x24, 0xc5, 0x47, 0x20, 0x5b, 0x03, 0xf0, 0x5a, 0x5a, 0x8a, + 0x6d, 0x1c, 0xfa, 0xf8, 0xc9, 0x11, 0x3d, 0x7e, 0x64, 0x91, 0x3d, 0xb0, 0x2a, 0x12, 0xd0, 0xa1, + 0x51, 0xe8, 0xde, 0xc0, 0x15, 0x4d, 0xe7, 0xf9, 0x60, 0x56, 0x10, 0xf9, 0x97, 0x84, 0x9b, 0x7f, + 0xc9, 0xbf, 0x57, 0x82, 0x91, 0x92, 0x51, 0x0b, 0xf3, 0x9b, 0x4f, 0x87, 0xd2, 0x0b, 0xf6, 0x15, + 0xe9, 0xd9, 0xc7, 0x2b, 0x9a, 0xb3, 0x55, 0xdf, 0x98, 0x2c, 0x19, 0xb5, 0xa9, 0x8a, 0x51, 0x55, + 0xf5, 0x8a, 0x77, 0x7e, 0x4a, 0xff, 0x29, 0x9d, 0xae, 0x60, 0xfd, 0x74, 0xc5, 0xf0, 0x9d, 0xa6, + 0x5e, 0xf4, 0xfe, 0xfd, 0x4b, 0x49, 0xfa, 0xf5, 0x58, 0x7c, 0x6e, 0x25, 0xff, 0x4a, 0x2c, 0x3b, + 0xc7, 0xba, 0x5b, 0x11, 0xe2, 0x51, 0xf0, 0x66, 0x15, 0x97, 0xc8, 0x90, 0xe1, 0xbb, 0xf7, 0xc3, + 0x68, 0xc5, 0xa8, 0x18, 0x94, 0xe2, 0x14, 0xf9, 0x8f, 0x9f, 0xc8, 0xa6, 0xdc, 0xda, 0x6c, 0xe4, + 0xf1, 0xed, 0xf4, 0x12, 0x8c, 0x70, 0xe0, 0x22, 0x3d, 0x12, 0x62, 0x81, 0x0d, 0xda, 0x33, 0xad, + 0x96, 0xf9, 0xed, 0x6f, 0xd3, 0x0d, 0x5d, 0x19, 0xe6, 0xa8, 0xa4, 0x8d, 0xc5, 0x3e, 0xd3, 0x0a, + 0x1c, 0x08, 0xd0, 0x63, 0xcb, 0x16, 0x5b, 0x11, 0x14, 0xff, 0x80, 0x53, 0x1c, 0xf1, 0x51, 0x5c, + 0xe5, 0xa8, 0xd3, 0x33, 0x30, 0xd0, 0x09, 0xad, 0x7f, 0xc5, 0x69, 0xf5, 0x63, 0x3f, 0x91, 0x39, + 0x18, 0xa2, 0x44, 0x4a, 0x75, 0xdb, 0x31, 0x6a, 0xd4, 0x26, 0xee, 0x4d, 0xe6, 0x5f, 0x7f, 0x9b, + 0xad, 0xa3, 0x41, 0x82, 0x36, 0xe3, 0x62, 0x4d, 0x4f, 0x03, 0x3d, 0x05, 0x2b, 0xe3, 0x52, 0x35, + 0x82, 0xc2, 0x97, 0x38, 0x23, 0x2e, 0xfc, 0xf4, 0x55, 0x18, 0x25, 0xff, 0x53, 0x93, 0xe5, 0xe7, + 0x24, 0x3a, 0x07, 0x97, 0xf9, 0xea, 0xbb, 0xd9, 0x52, 0x1d, 0x71, 0x09, 0xf8, 0x78, 0xf2, 0xcd, + 0x62, 0x05, 0x3b, 0x0e, 0xb6, 0xec, 0xa2, 0x5a, 0x6d, 0xc6, 0x9e, 0x2f, 0x89, 0x91, 0xf9, 0xb5, + 0xef, 0x05, 0x67, 0x71, 0x8e, 0x61, 0xe6, 0xaa, 0xd5, 0xe9, 0x75, 0x38, 0xd4, 0x44, 0x2b, 0xda, + 0xa0, 0xf9, 0x32, 0xa7, 0x39, 0xda, 0xa0, 0x19, 0x84, 0xec, 0x0a, 0x88, 0x7a, 0x77, 0x2e, 0xdb, + 0xa0, 0xf9, 0x21, 0x4e, 0x13, 0x71, 0x5c, 0x31, 0xa5, 0x84, 0xe2, 0x13, 0x30, 0x7c, 0x0d, 0x5b, + 0x1b, 0x86, 0xcd, 0x13, 0x47, 0x6d, 0x90, 0xfb, 0x30, 0x27, 0x37, 0xc4, 0x11, 0x69, 0x26, 0x89, + 0xd0, 0x7a, 0x14, 0x92, 0x9b, 0x6a, 0x09, 0xb7, 0x41, 0xe2, 0x26, 0x27, 0xd1, 0x4b, 0xe0, 0x09, + 0x6a, 0x0e, 0xfa, 0x2b, 0x06, 0xdf, 0xb5, 0xa2, 0xd1, 0x3f, 0xc2, 0xd1, 0xfb, 0x04, 0x0e, 0x27, + 0x61, 0x1a, 0x66, 0xbd, 0x4a, 0xb6, 0xb4, 0x68, 0x12, 0xff, 0x40, 0x90, 0x10, 0x38, 0x9c, 0x44, + 0x07, 0x62, 0xfd, 0xa8, 0x20, 0x61, 0xfb, 0xe4, 0x79, 0x09, 0xfa, 0x0c, 0xbd, 0xba, 0x6b, 0xe8, + 0xed, 0x30, 0xf1, 0x31, 0x4e, 0x01, 0x38, 0x0a, 0x21, 0x70, 0x11, 0x52, 0xed, 0x4e, 0xc4, 0x3f, + 0xfc, 0x9e, 0x58, 0x1e, 0x62, 0x06, 0xe6, 0x60, 0x48, 0x18, 0x28, 0xcd, 0xd0, 0xdb, 0x20, 0xf1, + 0x8f, 0x38, 0x89, 0x41, 0x1f, 0x1a, 0x1f, 0x86, 0x83, 0x6d, 0xa7, 0x82, 0xdb, 0x21, 0xf2, 0x49, + 0x31, 0x0c, 0x8e, 0xc2, 0x45, 0xb9, 0x81, 0xf5, 0xd2, 0x56, 0x7b, 0x14, 0x3e, 0x25, 0x44, 0x29, + 0x70, 0x08, 0x89, 0x19, 0x18, 0xa8, 0xa9, 0x96, 0xbd, 0xa5, 0x56, 0xdb, 0x9a, 0x8e, 0x7f, 0xcc, + 0x69, 0xf4, 0xbb, 0x48, 0x5c, 0x22, 0x75, 0xbd, 0x13, 0x32, 0xaf, 0x08, 0x89, 0xf8, 0xd0, 0xf8, + 0xd2, 0xb3, 0x1d, 0x9a, 0x65, 0xeb, 0x84, 0xda, 0x3f, 0x11, 0x4b, 0x8f, 0xe1, 0x2e, 0xfa, 0x29, + 0x5e, 0x84, 0x94, 0xad, 0xdd, 0x68, 0x8b, 0xcc, 0x6f, 0x88, 0x99, 0xa6, 0x08, 0x04, 0xf9, 0x2d, + 0x70, 0xb8, 0xe9, 0x36, 0xd1, 0x06, 0xb1, 0xdf, 0xe4, 0xc4, 0x0e, 0x36, 0xd9, 0x2a, 0xb8, 0x49, + 0xe8, 0x94, 0xe4, 0x3f, 0x15, 0x26, 0x01, 0x87, 0x68, 0xad, 0x90, 0x38, 0xc2, 0x56, 0x37, 0x3b, + 0x93, 0xda, 0x6f, 0x09, 0xa9, 0x31, 0xdc, 0x80, 0xd4, 0xd6, 0xe0, 0x20, 0xa7, 0xd8, 0xd9, 0xbc, + 0x7e, 0x5a, 0x18, 0x56, 0x86, 0xbd, 0x1e, 0x9c, 0xdd, 0xb7, 0x42, 0xd6, 0x15, 0xa7, 0x70, 0x58, + 0xed, 0x62, 0x4d, 0x35, 0xdb, 0xa0, 0xfc, 0xdb, 0x9c, 0xb2, 0xb0, 0xf8, 0xae, 0xc7, 0x6b, 0x2f, + 0xaa, 0x26, 0x21, 0xfe, 0x0c, 0x64, 0x04, 0xf1, 0xba, 0x6e, 0xe1, 0x92, 0x51, 0xd1, 0xb5, 0x1b, + 0xb8, 0xdc, 0x06, 0xe9, 0xcf, 0x84, 0xa6, 0x6a, 0xdd, 0x87, 0x4e, 0x28, 0xcf, 0x43, 0xda, 0xf5, + 0x55, 0x8a, 0x5a, 0xcd, 0x34, 0x2c, 0x27, 0x82, 0xe2, 0x67, 0xc5, 0x4c, 0xb9, 0x78, 0xf3, 0x14, + 0x6d, 0xba, 0x00, 0x83, 0xb4, 0xd8, 0xae, 0x4a, 0x7e, 0x8e, 0x13, 0x1a, 0xf0, 0xb0, 0xb8, 0xe1, + 0x28, 0x19, 0x35, 0x53, 0xb5, 0xda, 0xb1, 0x7f, 0xbf, 0x23, 0x0c, 0x07, 0x47, 0xe1, 0x86, 0xc3, + 0xd9, 0x35, 0x31, 0xd9, 0xed, 0xdb, 0xa0, 0xf0, 0x79, 0x61, 0x38, 0x04, 0x0e, 0x27, 0x21, 0x1c, + 0x86, 0x36, 0x48, 0xfc, 0x33, 0x41, 0x42, 0xe0, 0x10, 0x12, 0x4f, 0x79, 0x1b, 0xad, 0x85, 0x2b, + 0x9a, 0xed, 0x58, 0xcc, 0x4d, 0xde, 0x9b, 0xd4, 0x3f, 0xff, 0x5e, 0xd0, 0x09, 0x53, 0x7c, 0xa8, + 0xc4, 0x12, 0xf1, 0xb4, 0x2b, 0x8d, 0xa2, 0xa2, 0x19, 0xfb, 0x5d, 0x61, 0x89, 0x7c, 0x68, 0x84, + 0x37, 0x9f, 0x87, 0x48, 0xc4, 0x5e, 0x22, 0xb1, 0x43, 0x1b, 0xe4, 0xfe, 0x45, 0x88, 0xb9, 0x55, + 0x81, 0x4b, 0x68, 0xfa, 0xfc, 0x9f, 0xba, 0xbe, 0x8d, 0x77, 0xdb, 0xd2, 0xce, 0xdf, 0x0b, 0xf9, + 0x3f, 0xeb, 0x0c, 0x93, 0xd9, 0x90, 0xa1, 0x90, 0x3f, 0x85, 0xa2, 0xee, 0x0f, 0x65, 0x7e, 0xfa, + 0x07, 0x7c, 0xbc, 0x41, 0x77, 0x6a, 0x7a, 0x81, 0x28, 0x79, 0xd0, 0xe9, 0x89, 0x26, 0xf6, 0xee, + 0x1f, 0xb8, 0x7a, 0x1e, 0xf0, 0x79, 0xa6, 0x2f, 0xc3, 0x40, 0xc0, 0xe1, 0x89, 0x26, 0xf5, 0x33, + 0x9c, 0x54, 0xbf, 0xdf, 0xdf, 0x99, 0x3e, 0x0b, 0x09, 0xe2, 0xbc, 0x44, 0xa3, 0xff, 0x2c, 0x47, + 0xa7, 0xe0, 0xd3, 0x8f, 0x41, 0x52, 0x38, 0x2d, 0xd1, 0xa8, 0x3f, 0xc7, 0x51, 0x5d, 0x14, 0x82, + 0x2e, 0x1c, 0x96, 0x68, 0xf4, 0x9f, 0x17, 0xe8, 0x02, 0x85, 0xa0, 0xb7, 0x2f, 0xc2, 0x2f, 0xfc, + 0x62, 0x82, 0x6f, 0x3a, 0x42, 0x76, 0x17, 0xa1, 0x97, 0x7b, 0x2a, 0xd1, 0xd8, 0xbf, 0xc0, 0x3b, + 0x17, 0x18, 0xd3, 0xe7, 0xa1, 0xbb, 0x4d, 0x81, 0xbf, 0x87, 0xa3, 0x32, 0xf8, 0xe9, 0x19, 0xe8, + 0xf3, 0x79, 0x27, 0xd1, 0xe8, 0x7f, 0x9f, 0xa3, 0xfb, 0xb1, 0x08, 0xeb, 0xdc, 0x3b, 0x89, 0x26, + 0xf0, 0x5e, 0xc1, 0x3a, 0xc7, 0x20, 0x62, 0x13, 0x8e, 0x49, 0x34, 0xf6, 0xfb, 0x84, 0xd4, 0x05, + 0xca, 0xf4, 0x25, 0x48, 0xb9, 0x9b, 0x4d, 0x34, 0xfe, 0xfb, 0x39, 0xbe, 0x87, 0x43, 0x24, 0xe0, + 0xdb, 0xec, 0xa2, 0x49, 0x7c, 0x40, 0x48, 0xc0, 0x87, 0x45, 0x96, 0x51, 0xd8, 0x81, 0x89, 0xa6, + 0xf4, 0x4b, 0x62, 0x19, 0x85, 0xfc, 0x17, 0x32, 0x9b, 0xd4, 0xe6, 0x47, 0x93, 0xf8, 0x65, 0x31, + 0x9b, 0x14, 0x9e, 0xb0, 0x11, 0xf6, 0x08, 0xa2, 0x69, 0xfc, 0xaa, 0x60, 0x23, 0xe4, 0x10, 0x4c, + 0xaf, 0x00, 0x6a, 0xf4, 0x06, 0xa2, 0xe9, 0x7d, 0x90, 0xd3, 0x1b, 0x6e, 0x70, 0x06, 0xa6, 0x9f, + 0x86, 0x83, 0xcd, 0x3d, 0x81, 0x68, 0xaa, 0xbf, 0xf6, 0x83, 0x50, 0xec, 0xe6, 0x77, 0x04, 0xa6, + 0xd7, 0xbc, 0x2d, 0xc5, 0xef, 0x05, 0x44, 0x93, 0x7d, 0xf9, 0x07, 0x41, 0xc3, 0xed, 0x77, 0x02, + 0xa6, 0x73, 0x00, 0xde, 0x06, 0x1c, 0x4d, 0xeb, 0xc3, 0x9c, 0x96, 0x0f, 0x89, 0x2c, 0x0d, 0xbe, + 0xff, 0x46, 0xe3, 0xdf, 0x14, 0x4b, 0x83, 0x63, 0x90, 0xa5, 0x21, 0xb6, 0xde, 0x68, 0xec, 0x8f, + 0x88, 0xa5, 0x21, 0x50, 0x88, 0x66, 0xfb, 0x76, 0xb7, 0x68, 0x0a, 0x1f, 0x13, 0x9a, 0xed, 0xc3, + 0x9a, 0x5e, 0x82, 0xe1, 0x86, 0x0d, 0x31, 0x9a, 0xd4, 0xaf, 0x73, 0x52, 0xe9, 0xf0, 0x7e, 0xe8, + 0xdf, 0xbc, 0xf8, 0x66, 0x18, 0x4d, 0xed, 0xe3, 0xa1, 0xcd, 0x8b, 0xef, 0x85, 0xd3, 0x17, 0x21, + 0xa9, 0xd7, 0xab, 0x55, 0xb2, 0x78, 0xd0, 0xde, 0x77, 0xfe, 0x32, 0xff, 0xed, 0x47, 0x5c, 0x3a, + 0x02, 0x61, 0xfa, 0x2c, 0x74, 0xe3, 0xda, 0x06, 0x2e, 0x47, 0x61, 0x7e, 0xf7, 0x47, 0xc2, 0x60, + 0x12, 0xe8, 0xe9, 0x4b, 0x00, 0x2c, 0x35, 0x42, 0x8f, 0x07, 0x23, 0x70, 0xff, 0xfb, 0x8f, 0xf8, + 0x6d, 0x1c, 0x0f, 0xc5, 0x23, 0xc0, 0xee, 0xf6, 0xec, 0x4d, 0xe0, 0x7b, 0x41, 0x02, 0x74, 0x46, + 0x1e, 0x85, 0xde, 0xe7, 0x6c, 0x43, 0x77, 0xd4, 0x4a, 0x14, 0xf6, 0xff, 0xe0, 0xd8, 0x02, 0x9e, + 0x08, 0xac, 0x66, 0x58, 0xd8, 0x51, 0x2b, 0x76, 0x14, 0xee, 0xff, 0xe4, 0xb8, 0x2e, 0x02, 0x41, + 0x2e, 0xa9, 0xb6, 0xd3, 0xce, 0xb8, 0xff, 0x42, 0x20, 0x0b, 0x04, 0xc2, 0x34, 0xf9, 0x7f, 0x1b, + 0xef, 0x46, 0xe1, 0x7e, 0x5f, 0x30, 0xcd, 0xe1, 0xa7, 0x1f, 0x83, 0x14, 0xf9, 0x97, 0x5d, 0xb1, + 0x8b, 0x40, 0xfe, 0x5f, 0x1c, 0xd9, 0xc3, 0x20, 0x3d, 0xdb, 0x4e, 0xd9, 0xd1, 0xa2, 0x85, 0xfd, + 0x1a, 0x9f, 0x69, 0x01, 0x3f, 0x9d, 0x83, 0x3e, 0xdb, 0x29, 0x97, 0xeb, 0xdc, 0x3f, 0x8d, 0x40, + 0xff, 0xdf, 0x3f, 0x72, 0x53, 0x16, 0x2e, 0x0e, 0x99, 0xed, 0xeb, 0xdb, 0x8e, 0x69, 0xd0, 0x23, + 0x90, 0x28, 0x0a, 0x3f, 0xe0, 0x14, 0x7c, 0x28, 0xd3, 0x33, 0xd0, 0x4f, 0xc6, 0x62, 0x61, 0x13, + 0xd3, 0xf3, 0xaa, 0x08, 0x12, 0x3f, 0xe4, 0x02, 0x08, 0x20, 0xe5, 0xdf, 0xf6, 0xa5, 0x57, 0xc7, + 0xa4, 0xaf, 0xbc, 0x3a, 0x26, 0x7d, 0xf3, 0xd5, 0x31, 0xe9, 0x7d, 0xdf, 0x1a, 0xeb, 0xfa, 0xca, + 0xb7, 0xc6, 0xba, 0xbe, 0xfe, 0xad, 0xb1, 0xae, 0xe6, 0x69, 0x63, 0x98, 0x33, 0xe6, 0x0c, 0x96, + 0x30, 0x7e, 0x56, 0x0e, 0xa4, 0x8b, 0x2b, 0x86, 0x97, 0xad, 0x75, 0x83, 0x1c, 0xf8, 0xa1, 0x44, + 0x02, 0xe6, 0x60, 0x2e, 0x57, 0xd5, 0x77, 0x5b, 0xbc, 0xc1, 0xc9, 0x36, 0x4d, 0x0c, 0xcb, 0x6f, + 0x82, 0x78, 0x4e, 0xdf, 0x45, 0x87, 0x99, 0xcd, 0x2b, 0xd6, 0xad, 0x2a, 0xbf, 0xfa, 0xd5, 0x4b, + 0xca, 0xeb, 0x56, 0x15, 0x8d, 0x7a, 0xf7, 0x33, 0xa5, 0x93, 0xfd, 0xfc, 0xd2, 0xe5, 0x74, 0xe2, + 0xfb, 0x1f, 0x1b, 0xef, 0xca, 0x6f, 0x87, 0x47, 0xf8, 0x85, 0xc8, 0x51, 0x26, 0x73, 0xfa, 0x2e, + 0x1d, 0xe4, 0x8a, 0xf4, 0x6c, 0x37, 0xe9, 0xc3, 0x16, 0x89, 0xed, 0xb1, 0x70, 0x62, 0xfb, 0x69, + 0x5c, 0xad, 0x3e, 0xa9, 0x1b, 0xd7, 0xf5, 0x35, 0x02, 0xb6, 0xd1, 0x43, 0x69, 0x3c, 0x0c, 0xef, + 0x8b, 0xc1, 0x78, 0x78, 0xdc, 0x44, 0x71, 0x6c, 0x47, 0xad, 0x99, 0xad, 0x5e, 0x20, 0x5d, 0x84, + 0xd4, 0x9a, 0x80, 0x41, 0x19, 0xe8, 0xb5, 0x71, 0xc9, 0xd0, 0xcb, 0x36, 0x1d, 0x6c, 0x5c, 0x11, + 0x45, 0x32, 0x58, 0x5d, 0xd5, 0x0d, 0x9b, 0x5f, 0x90, 0x64, 0x85, 0xfc, 0xaf, 0x48, 0x9d, 0xcd, + 0xe4, 0xa0, 0xdb, 0x95, 0x18, 0xe9, 0xfd, 0x7b, 0xa5, 0xff, 0xa9, 0x14, 0xbc, 0x21, 0xf8, 0x72, + 0xfd, 0xed, 0x8a, 0xe4, 0x5d, 0x71, 0x38, 0x5c, 0x32, 0xec, 0x9a, 0x61, 0x17, 0xd9, 0x0c, 0xb3, + 0x02, 0x17, 0x46, 0xbf, 0xbf, 0xa9, 0x8d, 0xfc, 0xff, 0x15, 0x18, 0xa4, 0xab, 0x80, 0x66, 0x3e, + 0xa9, 0xe1, 0x89, 0xdc, 0x2b, 0xfe, 0xf0, 0xdf, 0x77, 0x53, 0xad, 0x19, 0x70, 0x11, 0xe9, 0xd5, + 0x8e, 0x35, 0x18, 0xd5, 0x6a, 0x66, 0x15, 0xd3, 0x33, 0xa0, 0xa2, 0xdb, 0x16, 0x4d, 0xef, 0xcb, + 0x9c, 0xde, 0x88, 0x87, 0x3e, 0x2f, 0xb0, 0xa7, 0x17, 0x60, 0x58, 0x2d, 0x95, 0xb0, 0x19, 0x20, + 0x19, 0xb1, 0x42, 0x05, 0x83, 0x69, 0x8e, 0xe9, 0x52, 0xcb, 0x5f, 0x6a, 0x35, 0xb7, 0xcf, 0xde, + 0xeb, 0x9b, 0x34, 0x0b, 0x57, 0xb0, 0x7e, 0x5a, 0xc7, 0xce, 0x75, 0xc3, 0xda, 0xe6, 0xe2, 0x3d, + 0xcd, 0xba, 0x12, 0x93, 0xf0, 0x33, 0x71, 0x18, 0x63, 0x0d, 0x53, 0x1b, 0xaa, 0x8d, 0xa7, 0xae, + 0x3d, 0xb4, 0x81, 0x1d, 0xf5, 0xa1, 0xa9, 0x92, 0xa1, 0xe9, 0x7c, 0x26, 0x46, 0xf8, 0xbc, 0x90, + 0xf6, 0x49, 0xde, 0xde, 0x62, 0x61, 0xce, 0x41, 0x62, 0xc6, 0xd0, 0x74, 0xa2, 0x91, 0x65, 0xac, + 0x1b, 0x35, 0xbe, 0x2c, 0x59, 0x01, 0xdd, 0x0d, 0x3d, 0x6a, 0xcd, 0xa8, 0xeb, 0x0e, 0x3b, 0xbe, + 0xca, 0xf7, 0x7d, 0xe9, 0xd6, 0x78, 0xd7, 0x9f, 0xde, 0x1a, 0x8f, 0xcf, 0xeb, 0x8e, 0xc2, 0x9b, + 0xa6, 0x13, 0xdf, 0xf9, 0xe8, 0xb8, 0x24, 0x3f, 0x01, 0xbd, 0xb3, 0xb8, 0xb4, 0x1f, 0x5a, 0xb3, + 0xb8, 0x14, 0xa2, 0x75, 0x1f, 0x24, 0xe7, 0x75, 0x87, 0xdd, 0x99, 0x3d, 0x06, 0x71, 0x4d, 0x67, + 0xb7, 0xb0, 0x42, 0xfd, 0x93, 0x7a, 0x02, 0x3a, 0x8b, 0x4b, 0x2e, 0x68, 0x19, 0x97, 0xc2, 0xa0, + 0x84, 0x3c, 0xa9, 0xcf, 0xcf, 0x7e, 0xfd, 0xcf, 0xc6, 0xba, 0x5e, 0x78, 0x75, 0xac, 0xab, 0xe5, + 0x4c, 0xf8, 0xcd, 0x21, 0x17, 0x31, 0x9f, 0x02, 0xbb, 0xbc, 0x3d, 0xe5, 0x04, 0xd6, 0xc2, 0xdf, + 0x8b, 0xc1, 0x58, 0x83, 0x8a, 0xf3, 0x8d, 0xa1, 0x95, 0x75, 0x98, 0x86, 0xe4, 0xac, 0xd8, 0x6f, + 0x3a, 0x35, 0x0e, 0xbf, 0xdc, 0xa1, 0x71, 0x18, 0x10, 0x3d, 0x09, 0xdb, 0x70, 0x2a, 0xda, 0x36, + 0x08, 0xfe, 0xf7, 0x61, 0x1a, 0x5e, 0x49, 0xc0, 0x31, 0xfa, 0x28, 0xc4, 0xaa, 0x69, 0xba, 0x33, + 0x55, 0xb2, 0x76, 0x4d, 0x87, 0x6e, 0x27, 0xc6, 0x26, 0x97, 0xc6, 0xb0, 0xd7, 0x3c, 0xc9, 0x9a, + 0x5b, 0xa8, 0xe4, 0x26, 0x74, 0xaf, 0x10, 0x3c, 0x22, 0x08, 0xc7, 0x70, 0xd4, 0x2a, 0x17, 0x10, + 0x2b, 0x90, 0x5a, 0xf6, 0x90, 0x24, 0xc6, 0x6a, 0x35, 0xf1, 0x86, 0xa4, 0x8a, 0xd5, 0x4d, 0x76, + 0x71, 0x37, 0x4e, 0xb7, 0x90, 0x24, 0xa9, 0xa0, 0x77, 0x74, 0x47, 0xa1, 0x5b, 0xad, 0xb3, 0x23, + 0xe7, 0x38, 0xd9, 0x5b, 0x68, 0x41, 0x7e, 0x12, 0x7a, 0xf9, 0x31, 0x17, 0x4a, 0x43, 0x7c, 0x1b, + 0xef, 0xd2, 0x7e, 0xfa, 0x15, 0xf2, 0x2f, 0x9a, 0x84, 0x6e, 0xca, 0x3c, 0x7f, 0x91, 0x90, 0x99, + 0x6c, 0xe0, 0x7e, 0x92, 0x32, 0xa9, 0x30, 0x30, 0xf9, 0x09, 0x48, 0xce, 0x1a, 0x35, 0x4d, 0x37, + 0x82, 0xd4, 0x52, 0x8c, 0x1a, 0xe5, 0xd9, 0xac, 0x73, 0xd5, 0x57, 0x58, 0x01, 0x1d, 0x84, 0x1e, + 0x76, 0x91, 0x9b, 0x1f, 0x9b, 0xf3, 0x92, 0x3c, 0x03, 0xbd, 0x94, 0xf6, 0xb2, 0x89, 0x10, 0x7f, + 0xd9, 0xc3, 0x6f, 0x8c, 0x53, 0x2b, 0xc9, 0xc9, 0xc7, 0x3c, 0x66, 0x11, 0x24, 0xca, 0xaa, 0xa3, + 0xf2, 0x71, 0xd3, 0xff, 0xe5, 0xc7, 0x21, 0xc9, 0x89, 0xd8, 0xe8, 0x0c, 0xc4, 0x0d, 0xd3, 0xe6, + 0x07, 0xdf, 0xd9, 0x56, 0x43, 0x59, 0x36, 0xf3, 0x09, 0xb2, 0x68, 0x14, 0x02, 0x9c, 0x57, 0x5a, + 0xae, 0x92, 0x0b, 0x3e, 0x45, 0xf2, 0x4d, 0xb9, 0xef, 0x5f, 0x36, 0xa5, 0x0d, 0xea, 0xe0, 0x2a, + 0xcb, 0xc7, 0x62, 0x30, 0xe6, 0x6b, 0xbd, 0x86, 0x2d, 0x12, 0xeb, 0xb1, 0x05, 0xc6, 0xb5, 0x05, + 0xf9, 0x98, 0xe4, 0xed, 0x2d, 0xd4, 0xe5, 0x31, 0x88, 0xe7, 0x4c, 0x13, 0x65, 0x21, 0xc9, 0x0e, + 0xb8, 0x0d, 0xa6, 0x2f, 0x09, 0xc5, 0x2d, 0x93, 0x36, 0xdb, 0xd8, 0x74, 0xae, 0xab, 0x96, 0xfb, + 0x84, 0x49, 0x94, 0xe5, 0x47, 0x21, 0x35, 0x63, 0xe8, 0x36, 0xd6, 0xed, 0x3a, 0x5d, 0x7a, 0x1b, + 0x55, 0xa3, 0xb4, 0xcd, 0x29, 0xb0, 0x02, 0x11, 0xb8, 0x6a, 0x9a, 0x14, 0x33, 0xa1, 0x90, 0x7f, + 0x99, 0x99, 0xca, 0xaf, 0xb6, 0x14, 0xd1, 0xa3, 0x9d, 0x8b, 0x88, 0x0f, 0xd2, 0x95, 0xd1, 0xff, + 0x95, 0xe0, 0x68, 0xe3, 0x82, 0xda, 0xc6, 0xbb, 0x76, 0xa7, 0xeb, 0xe9, 0x19, 0x48, 0xad, 0xd0, + 0x77, 0xc4, 0x4f, 0xe2, 0x5d, 0x94, 0x85, 0x5e, 0x5c, 0x3e, 0x73, 0xf6, 0xec, 0x43, 0x8f, 0x32, + 0x6d, 0xbf, 0xd2, 0xa5, 0x88, 0x0a, 0x34, 0x06, 0x29, 0x1b, 0x97, 0xcc, 0x33, 0x67, 0xcf, 0x6d, + 0x3f, 0xc4, 0xd4, 0xeb, 0x4a, 0x97, 0xe2, 0x55, 0x4d, 0x27, 0xc9, 0xa8, 0xbf, 0xf3, 0xb1, 0x71, + 0x29, 0xdf, 0x0d, 0x71, 0xbb, 0x5e, 0xbb, 0xa3, 0x3a, 0xf2, 0x72, 0x37, 0x4c, 0xf8, 0x31, 0xa9, + 0x81, 0xba, 0xa6, 0x56, 0xb5, 0xb2, 0xea, 0xbd, 0x00, 0x4f, 0xfb, 0x64, 0x40, 0x21, 0x9a, 0x8b, + 0x20, 0xbb, 0xa7, 0x24, 0xe5, 0xcf, 0x48, 0xd0, 0x7f, 0x55, 0x50, 0x5e, 0xc5, 0x0e, 0xba, 0x08, + 0xe0, 0xf6, 0x24, 0x96, 0xcd, 0x91, 0xc9, 0x70, 0x5f, 0x93, 0x2e, 0x8e, 0xe2, 0x03, 0x47, 0xe7, + 0xa9, 0x22, 0x9a, 0x86, 0xcd, 0xdf, 0xbf, 0x44, 0xa0, 0xba, 0xc0, 0xe8, 0x01, 0x40, 0xd4, 0xc2, + 0x15, 0xaf, 0x19, 0x8e, 0xa6, 0x57, 0x8a, 0xa6, 0x71, 0x9d, 0x3f, 0x16, 0x8c, 0x2b, 0x69, 0xda, + 0x72, 0x95, 0x36, 0xac, 0x90, 0x7a, 0xc2, 0x74, 0xca, 0xa5, 0x42, 0x76, 0x13, 0xb5, 0x5c, 0xb6, + 0xb0, 0x6d, 0x73, 0x23, 0x26, 0x8a, 0xe8, 0x22, 0xf4, 0x9a, 0xf5, 0x8d, 0xa2, 0xb0, 0x18, 0x7d, + 0x67, 0x8e, 0x36, 0x5b, 0xff, 0x42, 0x3f, 0xb8, 0x05, 0xe8, 0x31, 0xeb, 0x1b, 0x44, 0x5b, 0xee, + 0x82, 0xfe, 0x26, 0xcc, 0xf4, 0x5d, 0xf3, 0xf8, 0xa0, 0xcf, 0xd7, 0xf9, 0x08, 0x8a, 0xa6, 0xa5, + 0x19, 0x96, 0xe6, 0xec, 0xd2, 0xdb, 0x2b, 0x71, 0x25, 0x2d, 0x1a, 0x56, 0x78, 0xbd, 0xbc, 0x0d, + 0x43, 0xab, 0xd4, 0xd5, 0xf2, 0x38, 0x3f, 0xeb, 0xf1, 0x27, 0x45, 0xf3, 0xd7, 0x92, 0xb3, 0x58, + 0x03, 0x67, 0xf9, 0xa7, 0x5a, 0x6a, 0xe7, 0xf9, 0xce, 0xb5, 0x33, 0xb8, 0xf9, 0xff, 0xc5, 0xe1, + 0xc0, 0xe2, 0xe4, 0x9e, 0xb5, 0xcf, 0x7c, 0xb5, 0xab, 0x98, 0x51, 0x11, 0x46, 0x76, 0xef, 0x4d, + 0x35, 0x1b, 0x61, 0x46, 0xb3, 0x91, 0x4b, 0x48, 0x7e, 0x14, 0x06, 0x56, 0x54, 0xcb, 0x59, 0xc5, + 0xce, 0x15, 0xac, 0x96, 0xb1, 0x15, 0xdc, 0x75, 0x07, 0xc4, 0xae, 0x8b, 0x20, 0x41, 0xb7, 0x56, + 0xb6, 0xeb, 0xd0, 0xff, 0xe5, 0x2d, 0x48, 0xd0, 0x1b, 0x6c, 0xee, 0x8e, 0xcc, 0x31, 0xd8, 0x8e, + 0x4c, 0x6c, 0xe9, 0xae, 0x83, 0x6d, 0x11, 0xd0, 0xd1, 0x02, 0x7a, 0x44, 0xec, 0xab, 0xf1, 0xbd, + 0xf7, 0x55, 0xae, 0x88, 0x7c, 0x77, 0xad, 0x42, 0x6f, 0x9e, 0x98, 0xe2, 0xf9, 0x59, 0x97, 0x11, + 0xc9, 0x63, 0x04, 0x2d, 0xc2, 0x90, 0xa9, 0x5a, 0x0e, 0xbd, 0xba, 0xbf, 0x45, 0x47, 0xc1, 0x75, + 0x7d, 0xbc, 0x71, 0xe5, 0x05, 0x06, 0xcb, 0x7b, 0x19, 0x30, 0xfd, 0x95, 0xf2, 0x9f, 0x27, 0xa0, + 0x87, 0x0b, 0xe3, 0x31, 0xe8, 0xe5, 0x62, 0xe5, 0xda, 0x79, 0x6c, 0xb2, 0x71, 0x63, 0x9a, 0x74, + 0x37, 0x10, 0x4e, 0x4f, 0xe0, 0xa0, 0xe3, 0x90, 0x2c, 0x6d, 0xa9, 0x9a, 0x5e, 0xd4, 0xca, 0xc2, + 0xeb, 0x7d, 0xf5, 0xd6, 0x78, 0xef, 0x0c, 0xa9, 0x9b, 0x9f, 0x55, 0x7a, 0x69, 0xe3, 0x7c, 0x99, + 0x78, 0x02, 0x5b, 0x58, 0xab, 0x6c, 0x39, 0x7c, 0x85, 0xf1, 0x12, 0xba, 0x00, 0x09, 0xa2, 0x10, + 0xfc, 0x65, 0x57, 0xb6, 0x21, 0xf6, 0x70, 0x03, 0xc0, 0x7c, 0x92, 0x74, 0xfc, 0xbe, 0x6f, 0x8c, + 0x4b, 0x0a, 0xc5, 0x40, 0x33, 0x30, 0x50, 0x55, 0x6d, 0xa7, 0x48, 0x77, 0x30, 0xd2, 0x7d, 0x37, + 0x25, 0x71, 0xb8, 0x51, 0x20, 0x5c, 0xb0, 0x9c, 0xf5, 0x3e, 0x82, 0xc5, 0xaa, 0xca, 0xe8, 0x24, + 0xa4, 0x29, 0x91, 0x92, 0x51, 0xab, 0x69, 0x0e, 0xf3, 0xad, 0x7a, 0xa8, 0xdc, 0x07, 0x49, 0xfd, + 0x0c, 0xad, 0xa6, 0x1e, 0xd6, 0x11, 0x48, 0xd1, 0xa7, 0x24, 0x14, 0x84, 0x5d, 0x9b, 0x4c, 0x92, + 0x0a, 0xda, 0x78, 0x02, 0x86, 0x3c, 0xfb, 0xc8, 0x40, 0x92, 0x8c, 0x8a, 0x57, 0x4d, 0x01, 0x1f, + 0x84, 0x51, 0x1d, 0xef, 0xd0, 0x8b, 0x9c, 0x01, 0xe8, 0x14, 0x85, 0x46, 0xa4, 0xed, 0x6a, 0x10, + 0xe3, 0x5e, 0x18, 0x2c, 0x09, 0xe1, 0x33, 0x58, 0xa0, 0xb0, 0x03, 0x6e, 0x2d, 0x05, 0x3b, 0x0c, + 0x49, 0xd5, 0x34, 0x19, 0x40, 0x1f, 0xb7, 0x8f, 0xa6, 0x49, 0x9b, 0x4e, 0xc1, 0x30, 0x1d, 0xa3, + 0x85, 0xed, 0x7a, 0xd5, 0xe1, 0x44, 0xfa, 0x29, 0xcc, 0x10, 0x69, 0x50, 0x58, 0x3d, 0x85, 0xbd, + 0x1b, 0x06, 0xf0, 0x35, 0xad, 0x8c, 0xf5, 0x12, 0x66, 0x70, 0x03, 0x14, 0xae, 0x5f, 0x54, 0x52, + 0xa0, 0xfb, 0xc0, 0xb5, 0x7b, 0x45, 0x61, 0x93, 0x07, 0x19, 0x3d, 0x51, 0x9f, 0x63, 0xd5, 0x72, + 0x06, 0x12, 0xb3, 0xaa, 0xa3, 0x12, 0x07, 0xc3, 0xd9, 0x61, 0x1b, 0x4d, 0xbf, 0x42, 0xfe, 0x95, + 0xbf, 0x13, 0x83, 0xc4, 0x55, 0xc3, 0xc1, 0xe8, 0x61, 0x9f, 0x03, 0x38, 0xd8, 0x4c, 0x9f, 0x57, + 0xb5, 0x8a, 0x8e, 0xcb, 0x8b, 0x76, 0xc5, 0xf7, 0x9e, 0xdb, 0x53, 0xa7, 0x58, 0x40, 0x9d, 0x46, + 0xa1, 0xdb, 0x32, 0xea, 0x7a, 0x59, 0xdc, 0x38, 0xa4, 0x05, 0x54, 0x80, 0xa4, 0xab, 0x25, 0x89, + 0x28, 0x2d, 0x19, 0x22, 0x5a, 0x42, 0x74, 0x98, 0x57, 0x28, 0xbd, 0x1b, 0x5c, 0x59, 0xf2, 0x90, + 0x72, 0x8d, 0x17, 0xd7, 0xb6, 0xf6, 0x14, 0xd6, 0x43, 0x23, 0x9b, 0x89, 0x3b, 0xf7, 0xae, 0xf0, + 0x98, 0xc6, 0xa5, 0xdd, 0x06, 0x2e, 0xbd, 0x80, 0x5a, 0xf1, 0xb7, 0xe5, 0xbd, 0x74, 0x5c, 0x9e, + 0x5a, 0xb1, 0xf7, 0xe5, 0x47, 0x21, 0x65, 0x6b, 0x15, 0x5d, 0x75, 0xea, 0x16, 0xe6, 0x9a, 0xe7, + 0x55, 0xc8, 0x5f, 0x90, 0xa0, 0x87, 0x69, 0xb2, 0x4f, 0x6e, 0x52, 0x73, 0xb9, 0xc5, 0x5a, 0xc9, + 0x2d, 0xbe, 0x7f, 0xb9, 0xe5, 0x00, 0x5c, 0x66, 0x6c, 0xfe, 0x36, 0xb8, 0x89, 0xc7, 0xc0, 0x58, + 0x5c, 0xd5, 0x2a, 0x7c, 0xa1, 0xfa, 0x90, 0xe4, 0xff, 0x2c, 0x11, 0x27, 0x96, 0xb7, 0xa3, 0x1c, + 0x0c, 0x08, 0xbe, 0x8a, 0x9b, 0x55, 0xb5, 0xc2, 0x75, 0xe7, 0x58, 0x4b, 0xe6, 0x2e, 0x57, 0xd5, + 0x8a, 0xd2, 0xc7, 0xf9, 0x21, 0x85, 0xe6, 0xf3, 0x10, 0x6b, 0x31, 0x0f, 0x81, 0x89, 0x8f, 0xef, + 0x6f, 0xe2, 0x03, 0x53, 0x94, 0x08, 0x4f, 0xd1, 0x67, 0x63, 0x34, 0x98, 0x31, 0x0d, 0x5b, 0xad, + 0xbe, 0x11, 0x2b, 0xe2, 0x08, 0xa4, 0x4c, 0xa3, 0x5a, 0x64, 0x2d, 0xec, 0x26, 0x6e, 0xd2, 0x34, + 0xaa, 0x4a, 0xc3, 0xb4, 0x77, 0xdf, 0xa6, 0xe5, 0xd2, 0x73, 0x1b, 0xa4, 0xd6, 0x1b, 0x96, 0x9a, + 0x05, 0xfd, 0x4c, 0x14, 0x7c, 0x2f, 0x7b, 0x90, 0xc8, 0x80, 0x6e, 0x8e, 0x52, 0xe3, 0xde, 0xcb, + 0xd8, 0x66, 0x90, 0x0a, 0x87, 0x23, 0x18, 0xcc, 0xf4, 0x37, 0x8b, 0x82, 0xfd, 0x6a, 0xa9, 0x70, + 0x38, 0xf9, 0x57, 0x24, 0x80, 0x05, 0x22, 0x59, 0x3a, 0x5e, 0xb2, 0x0b, 0xd9, 0x94, 0x85, 0x62, + 0xa0, 0xe7, 0xb1, 0x56, 0x93, 0xc6, 0xfb, 0xef, 0xb7, 0xfd, 0x7c, 0xcf, 0xc0, 0x80, 0xa7, 0x8c, + 0x36, 0x16, 0xcc, 0x8c, 0xed, 0xe1, 0x55, 0xaf, 0x62, 0x47, 0xe9, 0xbf, 0xe6, 0x2b, 0xc9, 0xbf, + 0x2f, 0x41, 0x8a, 0xf2, 0xb4, 0x88, 0x1d, 0x35, 0x30, 0x87, 0xd2, 0xfe, 0xe7, 0xf0, 0x18, 0x00, + 0x23, 0x63, 0x6b, 0x37, 0x30, 0xd7, 0xac, 0x14, 0xad, 0x59, 0xd5, 0x6e, 0x60, 0x74, 0xce, 0x15, + 0x78, 0x7c, 0x6f, 0x81, 0x0b, 0xaf, 0x9b, 0x8b, 0xfd, 0x10, 0xf4, 0xd2, 0x4f, 0xe4, 0xec, 0xd8, + 0xdc, 0x91, 0xee, 0xd1, 0xeb, 0xb5, 0xb5, 0x1d, 0x5b, 0x7e, 0x0e, 0x7a, 0xd7, 0x76, 0x58, 0x6e, + 0xe4, 0x08, 0xa4, 0x2c, 0xc3, 0xe0, 0x7b, 0x32, 0xf3, 0x85, 0x92, 0xa4, 0x82, 0x6e, 0x41, 0x22, + 0x1f, 0x10, 0xf3, 0xf2, 0x01, 0x5e, 0x42, 0x23, 0xde, 0x56, 0x42, 0xe3, 0xd4, 0xd7, 0x24, 0xe8, + 0xf3, 0xd9, 0x07, 0xf4, 0x10, 0x1c, 0xc8, 0x2f, 0x2c, 0xcf, 0x3c, 0x59, 0x9c, 0x9f, 0x2d, 0x5e, + 0x5e, 0xc8, 0xcd, 0x79, 0x6f, 0x4d, 0xb2, 0x07, 0x5f, 0xba, 0x39, 0x81, 0x7c, 0xb0, 0xeb, 0xfa, + 0xb6, 0x6e, 0x5c, 0xd7, 0xd1, 0x14, 0x8c, 0x06, 0x51, 0x72, 0xf9, 0xd5, 0xc2, 0xd2, 0x5a, 0x5a, + 0xca, 0x1e, 0x78, 0xe9, 0xe6, 0xc4, 0xb0, 0x0f, 0x23, 0xb7, 0x61, 0x63, 0xdd, 0x69, 0x44, 0x98, + 0x59, 0x5e, 0x5c, 0x9c, 0x5f, 0x4b, 0xc7, 0x1a, 0x10, 0xb8, 0xc1, 0xbe, 0x0f, 0x86, 0x83, 0x08, + 0x4b, 0xf3, 0x0b, 0xe9, 0x78, 0x16, 0xbd, 0x74, 0x73, 0x62, 0xd0, 0x07, 0xbd, 0xa4, 0x55, 0xb3, + 0xc9, 0x17, 0x3f, 0x3e, 0xd6, 0xf5, 0xa9, 0x4f, 0x8c, 0x49, 0x64, 0x64, 0x03, 0x01, 0x1b, 0x81, + 0x1e, 0x80, 0x43, 0xab, 0xf3, 0x73, 0x4b, 0x85, 0xd9, 0xe2, 0xe2, 0xea, 0x5c, 0x91, 0x7d, 0x64, + 0xc3, 0x1d, 0xdd, 0xd0, 0x4b, 0x37, 0x27, 0xfa, 0xf8, 0x90, 0x5a, 0x41, 0xaf, 0x28, 0x85, 0xab, + 0xcb, 0x6b, 0x85, 0xb4, 0xc4, 0xa0, 0x57, 0x2c, 0x7c, 0xcd, 0x70, 0xd8, 0x37, 0xb4, 0x1e, 0x84, + 0xc3, 0x4d, 0xa0, 0xdd, 0x81, 0x0d, 0xbf, 0x74, 0x73, 0x62, 0x60, 0xc5, 0xc2, 0x6c, 0xfd, 0x50, + 0x8c, 0x49, 0xc8, 0x34, 0x62, 0x2c, 0xaf, 0x2c, 0xaf, 0xe6, 0x16, 0xd2, 0x13, 0xd9, 0xf4, 0x4b, + 0x37, 0x27, 0xfa, 0x85, 0x31, 0x24, 0xf0, 0xde, 0xc8, 0xee, 0x64, 0xc4, 0xf3, 0x81, 0x07, 0xe1, + 0x98, 0xed, 0xa8, 0xdb, 0x9a, 0x5e, 0x71, 0x33, 0xce, 0xbc, 0xcc, 0x43, 0x9e, 0x63, 0x55, 0xed, + 0xf9, 0xba, 0x56, 0x16, 0x95, 0xe2, 0xef, 0x9e, 0xe9, 0xe7, 0x6c, 0xeb, 0x93, 0xa5, 0x6c, 0x44, + 0x76, 0x35, 0x3a, 0x74, 0x6a, 0x7d, 0x54, 0x91, 0x8d, 0x48, 0xa0, 0x67, 0xf7, 0x0c, 0xee, 0xe4, + 0xf7, 0x49, 0x30, 0x78, 0x45, 0xb3, 0x1d, 0xc3, 0xd2, 0x4a, 0x6a, 0x95, 0xbe, 0x30, 0x39, 0xd7, + 0xae, 0x6d, 0x0d, 0x2d, 0xf5, 0xcb, 0xd0, 0x73, 0x4d, 0xad, 0x32, 0xa3, 0xc6, 0x1e, 0xf1, 0xec, + 0x29, 0x45, 0xcf, 0xc2, 0x09, 0x3a, 0x0c, 0x5b, 0xfe, 0xad, 0x18, 0x0c, 0xd1, 0x35, 0x61, 0xb3, + 0x2f, 0x21, 0x91, 0x50, 0x2b, 0x0f, 0x09, 0x4b, 0x75, 0x78, 0xee, 0x30, 0x3f, 0xc9, 0xf3, 0xe1, + 0xc7, 0xa3, 0x73, 0xdc, 0x93, 0xb3, 0xb8, 0xa4, 0x50, 0x5c, 0xf4, 0x77, 0x20, 0x59, 0x53, 0x77, + 0x8a, 0x94, 0x0e, 0x0b, 0x60, 0x72, 0x9d, 0xd1, 0x79, 0xed, 0xd6, 0xf8, 0xd0, 0xae, 0x5a, 0xab, + 0x4e, 0xcb, 0x82, 0x8e, 0xac, 0xf4, 0xd6, 0xd4, 0x1d, 0xc2, 0x22, 0x32, 0x61, 0x88, 0xd4, 0x96, + 0xb6, 0x54, 0xbd, 0x82, 0x59, 0x27, 0x34, 0x13, 0x9a, 0xbf, 0xd2, 0x71, 0x27, 0x07, 0xbd, 0x4e, + 0x7c, 0xe4, 0x64, 0x65, 0xa0, 0xa6, 0xee, 0xcc, 0xd0, 0x0a, 0xd2, 0xe3, 0x74, 0xf2, 0x83, 0x1f, + 0x1d, 0xef, 0xa2, 0x67, 0x0c, 0x5f, 0x97, 0x00, 0x3c, 0x89, 0xa1, 0x12, 0xa4, 0x4b, 0x6e, 0x89, + 0xe2, 0xda, 0x7c, 0x2a, 0x27, 0x23, 0xa6, 0x24, 0x24, 0x76, 0xb6, 0x53, 0x7f, 0xe5, 0xd6, 0xb8, + 0xa4, 0x0c, 0x95, 0x42, 0x33, 0xf2, 0x56, 0xe8, 0xab, 0x9b, 0x65, 0xd5, 0xc1, 0x45, 0x1a, 0xd5, + 0xc5, 0x22, 0x77, 0xfd, 0x31, 0x42, 0xeb, 0xb5, 0x5b, 0xe3, 0x88, 0x8d, 0xce, 0x87, 0x2c, 0x53, + 0x5f, 0x00, 0x58, 0x0d, 0x41, 0xf0, 0x0d, 0xed, 0x0f, 0x25, 0xe8, 0x9b, 0xf5, 0xdd, 0xfb, 0xca, + 0x40, 0x6f, 0xcd, 0xd0, 0xb5, 0x6d, 0xae, 0x9d, 0x29, 0x45, 0x14, 0x51, 0x16, 0x92, 0xec, 0x09, + 0x9e, 0xb3, 0x2b, 0x12, 0xa3, 0xa2, 0x4c, 0xb0, 0xae, 0xe3, 0x0d, 0x5b, 0x13, 0x93, 0xa2, 0x88, + 0x22, 0xba, 0x0c, 0x69, 0x1b, 0x97, 0xea, 0x96, 0xe6, 0xec, 0x16, 0x4b, 0x86, 0xee, 0xa8, 0x25, + 0x87, 0x3d, 0xe6, 0xca, 0x1f, 0x79, 0xed, 0xd6, 0xf8, 0x21, 0xc6, 0x6b, 0x18, 0x42, 0x56, 0x86, + 0x44, 0xd5, 0x0c, 0xab, 0x21, 0x3d, 0x94, 0xb1, 0xa3, 0x6a, 0x55, 0x3b, 0xc3, 0x4e, 0xcd, 0x44, + 0xd1, 0x37, 0x96, 0x2f, 0xf6, 0xfa, 0xd3, 0x5c, 0x97, 0x21, 0x6d, 0x98, 0xd8, 0x0a, 0xb8, 0xa5, + 0x52, 0xb8, 0xe7, 0x30, 0x84, 0xac, 0x0c, 0x89, 0x2a, 0xe1, 0xb2, 0x3a, 0x64, 0xb6, 0x45, 0xd8, + 0x68, 0xd6, 0x37, 0xbc, 0xec, 0xd8, 0x68, 0xc3, 0x6c, 0xe4, 0xf4, 0xdd, 0xfc, 0xc3, 0x1e, 0xf5, + 0x30, 0x9e, 0xfc, 0xe5, 0xcf, 0x9d, 0x1e, 0xe5, 0xc6, 0xc5, 0xcb, 0x56, 0x3d, 0x89, 0x77, 0xc9, + 0xf4, 0x73, 0xd0, 0x15, 0x0a, 0x49, 0x9c, 0xd0, 0xe7, 0x54, 0xad, 0x2a, 0x1e, 0x25, 0x2b, 0xbc, + 0x84, 0x72, 0xd0, 0x63, 0x3b, 0xaa, 0x53, 0xb7, 0xf9, 0x27, 0xc0, 0xee, 0x8b, 0xd0, 0xb8, 0xbc, + 0xa1, 0x97, 0x57, 0x29, 0x82, 0xc2, 0x11, 0x89, 0x1d, 0x71, 0x8c, 0x6d, 0xac, 0x73, 0x49, 0x76, + 0xb4, 0xda, 0xe9, 0x59, 0x1e, 0xc3, 0x26, 0x82, 0x29, 0xe3, 0x2a, 0xae, 0x30, 0x5f, 0x6b, 0x4b, + 0x25, 0x21, 0x09, 0xfd, 0x20, 0x58, 0x7e, 0xbe, 0xe3, 0x25, 0xc9, 0x05, 0x16, 0xa6, 0x27, 0x2b, + 0x43, 0x6e, 0xd5, 0x2a, 0xad, 0x41, 0x4a, 0xe0, 0x9e, 0x22, 0xff, 0x6a, 0xde, 0xa9, 0x08, 0x29, + 0xf8, 0x34, 0x5c, 0xe4, 0x2e, 0xfc, 0x97, 0x1d, 0x2f, 0x43, 0xba, 0xae, 0x6f, 0x18, 0x3a, 0x7d, + 0x47, 0xc8, 0x7d, 0x7f, 0x12, 0xfb, 0xc5, 0xfd, 0xaa, 0x12, 0x86, 0x90, 0x95, 0x21, 0xb7, 0xea, + 0x0a, 0x8b, 0x10, 0xca, 0x30, 0xe8, 0x41, 0xd1, 0x65, 0x9b, 0x8a, 0x5c, 0xb6, 0x77, 0xf1, 0x65, + 0x7b, 0x20, 0xdc, 0x8b, 0xb7, 0x72, 0x07, 0xdc, 0x4a, 0x82, 0x86, 0x96, 0x01, 0x3c, 0x63, 0x41, + 0x73, 0x18, 0x7d, 0x91, 0x6a, 0xe0, 0x19, 0x1e, 0x11, 0x12, 0x7a, 0x24, 0xd0, 0x3b, 0x60, 0xa4, + 0xa6, 0xe9, 0x45, 0x1b, 0x57, 0x37, 0x8b, 0x5c, 0xdc, 0x84, 0x32, 0xfd, 0x1c, 0x4c, 0x7e, 0xa1, + 0x33, 0xed, 0x78, 0xed, 0xd6, 0x78, 0x96, 0x9b, 0xd7, 0x46, 0x92, 0xb2, 0x32, 0x5c, 0xd3, 0xf4, + 0x55, 0x5c, 0xdd, 0x9c, 0x75, 0xeb, 0xa6, 0xfb, 0x5f, 0xfc, 0xe8, 0x78, 0x17, 0x5f, 0xc3, 0x5d, + 0xf2, 0x39, 0x9a, 0x5e, 0xe7, 0x6b, 0x0f, 0xdb, 0x24, 0x6c, 0x51, 0x45, 0x81, 0x26, 0x3d, 0x52, + 0x8a, 0x57, 0xc1, 0xd6, 0xfe, 0x0b, 0xff, 0x69, 0x42, 0x92, 0x7f, 0x43, 0x82, 0x9e, 0xd9, 0xab, + 0x2b, 0xaa, 0x66, 0xa1, 0x79, 0x18, 0xf6, 0xf4, 0x28, 0xb8, 0xf2, 0x8f, 0xbe, 0x76, 0x6b, 0x3c, + 0x13, 0x56, 0x35, 0x77, 0xe9, 0x7b, 0xea, 0x2c, 0xd6, 0xfe, 0x7c, 0xab, 0xd8, 0x36, 0x40, 0xaa, + 0x01, 0x44, 0x6e, 0x8c, 0x7c, 0x43, 0xc3, 0x5c, 0x80, 0x5e, 0xc6, 0x2d, 0xfd, 0xf8, 0x85, 0x49, + 0xfe, 0xe1, 0x67, 0x07, 0xf7, 0x46, 0xa9, 0x32, 0x45, 0x73, 0x53, 0x9e, 0x04, 0x53, 0x7e, 0x7f, + 0x0c, 0x60, 0xf6, 0xea, 0xd5, 0x35, 0x4b, 0x33, 0xab, 0xd8, 0xb9, 0x9d, 0x02, 0x58, 0x83, 0x03, + 0xbe, 0x78, 0xca, 0x2a, 0x85, 0x84, 0x30, 0xf1, 0xda, 0xad, 0xf1, 0xa3, 0x61, 0x21, 0xf8, 0xc0, + 0x64, 0x65, 0xc4, 0x8b, 0xac, 0xac, 0x52, 0x53, 0xaa, 0x65, 0xdb, 0x71, 0xa9, 0xc6, 0x5b, 0x53, + 0xf5, 0x81, 0xf9, 0xa9, 0xce, 0xda, 0x4e, 0x73, 0x09, 0x3f, 0x0b, 0x7d, 0x9e, 0x48, 0x6c, 0xf4, + 0x24, 0x24, 0x1d, 0xfe, 0x3f, 0x17, 0xf4, 0x7d, 0x91, 0x82, 0x16, 0xd8, 0x5c, 0xd8, 0x2e, 0x01, + 0xf9, 0x2f, 0x25, 0x00, 0x4f, 0x83, 0x7f, 0x32, 0x15, 0x8e, 0x98, 0x79, 0x6e, 0x94, 0xe3, 0xfb, + 0x72, 0xea, 0x38, 0x76, 0x48, 0xac, 0x1f, 0x88, 0xc1, 0xc8, 0xba, 0x30, 0x47, 0x3f, 0xf1, 0x32, + 0x78, 0x1a, 0x7a, 0xb1, 0xee, 0x58, 0x1a, 0x15, 0x02, 0x99, 0xf4, 0xf3, 0x11, 0x93, 0xde, 0x64, + 0x68, 0xf4, 0x23, 0x39, 0x22, 0x59, 0xcf, 0xa9, 0x85, 0x84, 0xf2, 0xde, 0x38, 0x64, 0x5a, 0x61, + 0xa2, 0x19, 0x18, 0x2a, 0x59, 0x98, 0x56, 0x14, 0xfd, 0x19, 0xc3, 0x7c, 0xd6, 0x73, 0x45, 0x43, + 0x00, 0xb2, 0x32, 0x28, 0x6a, 0xf8, 0xce, 0x52, 0x01, 0xe2, 0x20, 0x12, 0xed, 0x23, 0x50, 0x6d, + 0x7a, 0x84, 0x32, 0xdf, 0x5a, 0x44, 0x27, 0x41, 0x02, 0x6c, 0x6f, 0x19, 0xf4, 0x6a, 0xe9, 0xe6, + 0xf2, 0x3c, 0x0c, 0x69, 0xba, 0xe6, 0x68, 0x6a, 0xb5, 0xb8, 0xa1, 0x56, 0x55, 0xbd, 0xb4, 0x1f, + 0x37, 0x9b, 0xed, 0x03, 0xbc, 0xdb, 0x10, 0x39, 0x59, 0x19, 0xe4, 0x35, 0x79, 0x56, 0x81, 0xae, + 0x40, 0xaf, 0xe8, 0x2a, 0xb1, 0x2f, 0x87, 0x44, 0xa0, 0xfb, 0x5c, 0xc1, 0xf7, 0xc4, 0x61, 0x58, + 0xc1, 0xe5, 0xbf, 0x9d, 0x8a, 0xce, 0xa6, 0x62, 0x11, 0x80, 0xad, 0x7a, 0x62, 0x6e, 0xf7, 0x31, + 0x1b, 0xc4, 0x6e, 0xa4, 0x18, 0x85, 0x59, 0xdb, 0xf1, 0xcd, 0xc7, 0x7f, 0x89, 0x41, 0xbf, 0x7f, + 0x3e, 0xfe, 0x86, 0xee, 0x51, 0x68, 0xc5, 0x33, 0x48, 0x2c, 0x7b, 0xff, 0x60, 0x84, 0x41, 0x6a, + 0x50, 0xe2, 0xbd, 0x2d, 0xd1, 0x6b, 0x31, 0xe8, 0x59, 0x51, 0x2d, 0xb5, 0x66, 0xa3, 0x27, 0x1a, + 0x9c, 0x51, 0x91, 0xbd, 0x6c, 0xf8, 0x3e, 0x34, 0x4f, 0x96, 0xb0, 0x70, 0xf4, 0x83, 0x4d, 0x5c, + 0xce, 0x7b, 0x61, 0x90, 0x44, 0xcb, 0xbe, 0x8b, 0x0e, 0x31, 0x7a, 0x7c, 0x4b, 0x22, 0x66, 0xef, + 0x94, 0x0d, 0x8d, 0x43, 0x1f, 0x01, 0xf3, 0x4c, 0x2e, 0x81, 0x81, 0x9a, 0xba, 0x53, 0x60, 0x35, + 0xe8, 0x34, 0xa0, 0x2d, 0x37, 0x19, 0x52, 0xf4, 0x24, 0x41, 0xe0, 0x86, 0xbd, 0x16, 0x01, 0x7e, + 0x0c, 0x80, 0x70, 0x51, 0x64, 0x37, 0x04, 0x59, 0xdc, 0x97, 0x22, 0x35, 0xb3, 0xf4, 0x96, 0x20, + 0xf7, 0x5b, 0x43, 0xb1, 0x38, 0x8f, 0x41, 0x16, 0x3a, 0x8e, 0x41, 0x7c, 0x7e, 0x6b, 0x88, 0x24, + 0xf3, 0x5b, 0x83, 0xc1, 0xbb, 0x4f, 0xb9, 0x5f, 0x91, 0x00, 0x79, 0x56, 0x5f, 0xc1, 0xb6, 0x49, + 0x82, 0x39, 0xe2, 0xa7, 0xfb, 0xbc, 0x69, 0xa9, 0x2d, 0x3f, 0xdd, 0x23, 0x23, 0xfc, 0x74, 0xdf, + 0x9a, 0x79, 0xd4, 0x33, 0x94, 0x31, 0x3e, 0x95, 0x4d, 0x2e, 0x6f, 0x4e, 0xce, 0x18, 0x9a, 0xc0, + 0x6e, 0xb0, 0x8c, 0x5d, 0xf2, 0x9f, 0x48, 0x70, 0xb8, 0x41, 0xa9, 0x5c, 0x9e, 0x31, 0x20, 0xcb, + 0xd7, 0xc8, 0xbf, 0x18, 0xc7, 0x78, 0xdf, 0xaf, 0xaa, 0x0e, 0x5b, 0x0d, 0x86, 0xf8, 0xf6, 0x99, + 0x7c, 0x76, 0x09, 0xf4, 0xdf, 0x48, 0x30, 0xea, 0xef, 0xde, 0x1d, 0xcf, 0x3a, 0xf4, 0xfb, 0x7b, + 0xe7, 0x23, 0xb9, 0xbf, 0x83, 0x91, 0xf0, 0x41, 0x04, 0xc8, 0xa0, 0x67, 0xbc, 0x65, 0xcc, 0x72, + 0x71, 0x17, 0x3a, 0x95, 0x8d, 0xe0, 0x30, 0xbc, 0x9c, 0x13, 0x74, 0x92, 0xfe, 0x9f, 0x04, 0x89, + 0x15, 0xc3, 0xa8, 0x22, 0x03, 0x86, 0x75, 0xc3, 0x29, 0x12, 0x9d, 0xc7, 0xe5, 0x22, 0x0f, 0xdb, + 0x99, 0x99, 0x9c, 0xe9, 0x4c, 0x64, 0xdf, 0xbd, 0x35, 0xde, 0x48, 0x4a, 0x19, 0xd2, 0x0d, 0x27, + 0x4f, 0x6b, 0xd6, 0x58, 0x50, 0xff, 0x0e, 0x18, 0x08, 0x76, 0xc6, 0x8c, 0xe8, 0xd3, 0x1d, 0x77, + 0x16, 0x24, 0xf3, 0xda, 0xad, 0xf1, 0x51, 0xb6, 0xbc, 0x02, 0xd5, 0xb2, 0xd2, 0xbf, 0xe1, 0xeb, + 0x9d, 0xdd, 0x1a, 0xfb, 0x3e, 0x99, 0xd1, 0xcf, 0x48, 0x30, 0x42, 0x2b, 0xb5, 0x1b, 0x98, 0x46, + 0xfe, 0x0a, 0x2e, 0x19, 0x56, 0x19, 0x0d, 0x42, 0x8c, 0x9f, 0xc3, 0x24, 0x94, 0x98, 0x56, 0x46, + 0xa3, 0xd0, 0x6d, 0x5c, 0xd7, 0xf9, 0x25, 0x8e, 0x94, 0xc2, 0x0a, 0xe8, 0x14, 0x0c, 0xd3, 0x5d, + 0x88, 0x75, 0xc3, 0xed, 0x07, 0xff, 0xde, 0x10, 0x6d, 0xa0, 0xa4, 0x99, 0x15, 0x21, 0xb6, 0xcd, + 0x28, 0xd7, 0xab, 0xb8, 0xa8, 0x96, 0x4a, 0xf4, 0xce, 0x31, 0xfb, 0x82, 0xc9, 0x00, 0xab, 0xcd, + 0xb1, 0x4a, 0x12, 0x88, 0xba, 0xe6, 0x4f, 0x98, 0x22, 0xb7, 0x82, 0xa9, 0xe1, 0xa9, 0xcf, 0x4b, + 0x00, 0x5e, 0xc2, 0x05, 0x3d, 0x00, 0x87, 0xf2, 0xcb, 0x4b, 0xb3, 0xc5, 0xd5, 0xb5, 0xdc, 0xda, + 0xfa, 0x6a, 0x71, 0x7d, 0x69, 0x75, 0xa5, 0x30, 0x33, 0x7f, 0x79, 0xbe, 0x30, 0xeb, 0x1d, 0x15, + 0xd8, 0x26, 0x2e, 0x69, 0x9b, 0x1a, 0x2e, 0xa3, 0xe3, 0x30, 0x1a, 0x84, 0x26, 0xa5, 0xc2, 0x6c, + 0x5a, 0xca, 0xf6, 0xbf, 0x74, 0x73, 0x22, 0xc9, 0xfc, 0x4b, 0x5c, 0x46, 0x27, 0xe1, 0x40, 0x23, + 0xdc, 0xfc, 0xd2, 0x5c, 0x3a, 0x96, 0x1d, 0x78, 0xe9, 0xe6, 0x44, 0xca, 0x75, 0x44, 0x91, 0x0c, + 0xc8, 0x0f, 0xc9, 0xe9, 0xc5, 0xb3, 0xf0, 0xd2, 0xcd, 0x89, 0x1e, 0x36, 0xeb, 0xd9, 0xc4, 0x8b, + 0x1f, 0x1f, 0xeb, 0xca, 0xbf, 0xa5, 0xe5, 0x61, 0xc0, 0x25, 0xdf, 0x84, 0x6b, 0xcf, 0x57, 0xeb, + 0xc4, 0xfc, 0x69, 0x7a, 0x69, 0x8a, 0xa9, 0xbb, 0xe6, 0xec, 0x9e, 0xe6, 0xaa, 0x7e, 0x9a, 0x89, + 0x6b, 0x6a, 0x47, 0xa4, 0xfa, 0x43, 0x87, 0x02, 0x7f, 0x7c, 0x17, 0x64, 0xc2, 0x87, 0x02, 0xce, + 0x4e, 0x7b, 0xe7, 0x01, 0x7b, 0x64, 0xfe, 0x23, 0x33, 0xfb, 0x2d, 0xce, 0x12, 0xf6, 0x9f, 0xef, + 0xdf, 0xfb, 0x68, 0x43, 0xfe, 0x8f, 0x09, 0x40, 0x8b, 0x76, 0x65, 0x86, 0x38, 0x8d, 0xbe, 0xab, + 0x6b, 0xa1, 0xb4, 0x95, 0x74, 0x3b, 0xd2, 0x56, 0x6b, 0x81, 0x44, 0x50, 0x6c, 0x5f, 0x19, 0xe8, + 0xb6, 0xb3, 0x41, 0xf1, 0x37, 0x24, 0x1b, 0xd4, 0xdc, 0x2f, 0x4c, 0xdc, 0xbe, 0x38, 0xb2, 0x7b, + 0xbf, 0xb1, 0x34, 0xcf, 0xfc, 0xf6, 0xec, 0x91, 0xf9, 0xcd, 0xb4, 0x4c, 0xef, 0x72, 0x6c, 0x74, + 0x56, 0x3c, 0x5c, 0xea, 0x6d, 0x6f, 0xff, 0xe6, 0x2f, 0x9b, 0x92, 0x2f, 0x8a, 0xdd, 0xfb, 0x28, + 0x64, 0x1b, 0x95, 0x4b, 0xec, 0x25, 0xf2, 0xcb, 0x71, 0x48, 0x2f, 0xda, 0x95, 0x42, 0x59, 0x73, + 0xee, 0xac, 0xe6, 0x5d, 0x6a, 0x1d, 0xa2, 0xa3, 0xd7, 0x6e, 0x8d, 0x0f, 0x32, 0xd1, 0xee, 0x21, + 0xd0, 0x1a, 0x0c, 0x85, 0xdd, 0x36, 0xa6, 0x60, 0xb3, 0xfb, 0x39, 0xc9, 0x69, 0x70, 0xd7, 0x06, + 0x83, 0xa7, 0x29, 0x68, 0xa7, 0xb9, 0x4e, 0x33, 0xbd, 0xba, 0x72, 0x27, 0xb3, 0x9b, 0xde, 0xd4, + 0x65, 0x21, 0x13, 0x9e, 0x1b, 0x77, 0xe2, 0xfe, 0x5c, 0x82, 0xbe, 0x45, 0x5b, 0xa4, 0x0e, 0xf0, + 0x4f, 0x68, 0x36, 0xe5, 0xbc, 0xfb, 0x2a, 0x27, 0xde, 0x9e, 0xfa, 0x8a, 0x97, 0x3a, 0x9e, 0x10, + 0x0e, 0xc0, 0x88, 0x6f, 0x9c, 0xee, 0xf8, 0xff, 0x28, 0x46, 0x8d, 0x66, 0x1e, 0x57, 0x34, 0xdd, + 0x75, 0x95, 0xf0, 0xdf, 0xd4, 0x20, 0xd1, 0x93, 0x73, 0x62, 0xbf, 0x72, 0xde, 0xa6, 0x76, 0x22, + 0x24, 0x4f, 0xd7, 0x2b, 0x5e, 0x6c, 0x4c, 0x61, 0x48, 0x1d, 0xdc, 0x2a, 0x0a, 0x25, 0x2a, 0xe4, + 0xef, 0x48, 0x30, 0xb0, 0x68, 0x57, 0xd6, 0xf5, 0xf2, 0x5f, 0x7b, 0xfd, 0xdd, 0x84, 0x03, 0x81, + 0x91, 0xde, 0x29, 0x91, 0xfe, 0x7e, 0x0c, 0x86, 0x17, 0xed, 0x4a, 0xc0, 0x03, 0xb6, 0xff, 0x9a, + 0x89, 0x95, 0xac, 0x1e, 0x87, 0x0f, 0xb0, 0xcc, 0x0e, 0xfc, 0x8a, 0xcc, 0x97, 0x4f, 0x84, 0x57, + 0x4f, 0x53, 0x30, 0x59, 0x19, 0x71, 0xeb, 0xa9, 0x80, 0x96, 0x49, 0xad, 0x6f, 0xb2, 0xd6, 0xe0, + 0x70, 0x83, 0x0c, 0xdd, 0x09, 0xf3, 0xb8, 0x96, 0x3a, 0xe2, 0x5a, 0xfe, 0x94, 0x44, 0x0d, 0x39, + 0x59, 0x56, 0xb8, 0xc6, 0xe2, 0x96, 0x4d, 0xf7, 0x74, 0xf2, 0x36, 0xce, 0xd0, 0xf9, 0xc0, 0x1b, + 0xc8, 0x7d, 0x69, 0xab, 0x0c, 0x13, 0xad, 0x38, 0x75, 0x4d, 0xef, 0x07, 0x25, 0x18, 0x23, 0x52, + 0xb2, 0x54, 0xdd, 0xde, 0xc4, 0x56, 0xb3, 0x98, 0xeb, 0x3c, 0x64, 0x84, 0xa0, 0xb9, 0xfc, 0x2d, + 0xda, 0x50, 0x74, 0x23, 0x31, 0x77, 0x1e, 0x7d, 0x68, 0xec, 0xaa, 0xba, 0x4d, 0xaf, 0xb6, 0xf0, + 0xe8, 0x8c, 0x97, 0xe8, 0x37, 0x6e, 0xf1, 0x75, 0x3e, 0xd9, 0xfc, 0x03, 0x01, 0x3a, 0xbe, 0x1e, + 0x9e, 0xbf, 0x93, 0x70, 0x7c, 0x6f, 0xce, 0xc4, 0x20, 0xce, 0xbc, 0x37, 0x09, 0xf1, 0x45, 0xbb, + 0x82, 0x7e, 0x0a, 0x86, 0xc2, 0x8e, 0xf7, 0x43, 0x11, 0x9e, 0x4e, 0xa3, 0x3b, 0x95, 0x7d, 0xb4, + 0x63, 0x14, 0x57, 0xab, 0x76, 0x61, 0x20, 0xe8, 0x7d, 0x4d, 0x45, 0xd3, 0x0a, 0x20, 0x64, 0xcf, + 0x77, 0x88, 0xe0, 0x76, 0xfd, 0x1c, 0x24, 0x5d, 0xff, 0xe1, 0x54, 0x34, 0x11, 0x01, 0x9b, 0x3d, + 0xd3, 0x3e, 0xac, 0xdb, 0xd7, 0x4f, 0xc1, 0x50, 0x78, 0xaf, 0x6e, 0x43, 0xce, 0x21, 0x94, 0x76, + 0xe4, 0xdc, 0x6a, 0x07, 0x33, 0x01, 0x7c, 0xdb, 0xcd, 0x03, 0xd1, 0x84, 0x3c, 0xe8, 0xec, 0x23, + 0x9d, 0x40, 0xbb, 0x3d, 0xbe, 0x03, 0x06, 0x43, 0xd6, 0xf8, 0xc1, 0x68, 0x3a, 0x41, 0x8c, 0xec, + 0x85, 0x4e, 0x31, 0xdc, 0xde, 0x5f, 0x94, 0x58, 0xfe, 0x5c, 0xac, 0x63, 0xd4, 0x86, 0x9a, 0x34, + 0x5d, 0xf7, 0xd9, 0x4b, 0xfb, 0x44, 0x74, 0x59, 0xf9, 0xb8, 0x04, 0x47, 0xf6, 0xb2, 0x16, 0x8f, + 0xb5, 0x31, 0xc8, 0xd6, 0xe8, 0xd9, 0xc2, 0xeb, 0x42, 0x77, 0xd3, 0x6a, 0x6f, 0x40, 0x46, 0xe3, + 0x1b, 0x31, 0x38, 0xe5, 0xcf, 0x15, 0x3c, 0x5f, 0xc7, 0xd6, 0xae, 0x9b, 0x15, 0x30, 0xd5, 0x8a, + 0xa6, 0xfb, 0x5f, 0x78, 0x1f, 0xf6, 0x9b, 0x6f, 0x0a, 0x2b, 0xc6, 0x24, 0xbf, 0x28, 0x41, 0xdf, + 0x8a, 0x5a, 0xc1, 0x0a, 0x7e, 0xbe, 0x8e, 0x6d, 0xa7, 0xc9, 0x13, 0xe3, 0x83, 0xd0, 0x63, 0x6c, + 0x6e, 0x8a, 0x0b, 0xcd, 0x09, 0x85, 0x97, 0xd0, 0x28, 0x74, 0x57, 0xb5, 0x9a, 0xc6, 0xb6, 0xde, + 0x84, 0xc2, 0x0a, 0x68, 0x1c, 0xfa, 0x68, 0xd2, 0xaa, 0xc8, 0x1e, 0x67, 0x25, 0xc4, 0xe7, 0xff, + 0xea, 0xba, 0xb3, 0x46, 0x5f, 0x68, 0x65, 0xa0, 0xd7, 0xc2, 0xd7, 0xb0, 0x65, 0xb3, 0x4f, 0xa0, + 0x27, 0x15, 0x51, 0x94, 0x2f, 0x41, 0x3f, 0xe3, 0x84, 0xcf, 0xf6, 0x61, 0x48, 0xd2, 0x67, 0x36, + 0x1e, 0x3f, 0xbd, 0xa4, 0xfc, 0x24, 0x7b, 0xa8, 0xcc, 0xe8, 0x33, 0x96, 0x58, 0x21, 0x9f, 0x6f, + 0x29, 0xf8, 0x93, 0xd1, 0x31, 0x16, 0x93, 0xa1, 0x2b, 0xe1, 0x3f, 0xe8, 0x86, 0x03, 0x3c, 0xbf, + 0xa3, 0x9a, 0xda, 0xd4, 0x96, 0xe3, 0x88, 0x8f, 0x69, 0x00, 0x77, 0xaa, 0x54, 0x53, 0x93, 0x77, + 0x21, 0x71, 0xc5, 0x71, 0x4c, 0x74, 0x0a, 0xba, 0xad, 0x7a, 0x15, 0x8b, 0xf3, 0x7d, 0x37, 0x46, + 0x57, 0x4d, 0x6d, 0x92, 0x00, 0x28, 0xf5, 0x2a, 0x56, 0x18, 0x08, 0x2a, 0xc0, 0xf8, 0x66, 0xbd, + 0x5a, 0xdd, 0x2d, 0x96, 0x31, 0xfd, 0xad, 0x56, 0xf7, 0x67, 0xd1, 0xf0, 0x8e, 0xa9, 0xea, 0x6e, + 0x3e, 0x25, 0xa9, 0x1c, 0xa5, 0x60, 0xb3, 0x14, 0x4a, 0xfc, 0x24, 0x5a, 0x41, 0xc0, 0xc8, 0x7f, + 0x1a, 0x83, 0xa4, 0x20, 0x4d, 0x5f, 0x0e, 0xe3, 0x2a, 0x2e, 0x39, 0x86, 0xb8, 0x3b, 0xe7, 0x96, + 0x11, 0x82, 0x78, 0x85, 0x4f, 0x5e, 0xea, 0x4a, 0x97, 0x42, 0x0a, 0xa4, 0xce, 0x7d, 0xcf, 0x4d, + 0xea, 0xcc, 0x3a, 0x99, 0xcf, 0x84, 0x69, 0x88, 0xa3, 0xb7, 0x2b, 0x5d, 0x0a, 0x2d, 0xa1, 0x0c, + 0xf4, 0x10, 0x7b, 0xe4, 0xb0, 0xd9, 0x22, 0xf5, 0xbc, 0x8c, 0x0e, 0x42, 0xb7, 0xa9, 0x3a, 0x25, + 0xf6, 0xd4, 0x8a, 0x34, 0xb0, 0x22, 0x71, 0x1e, 0xd8, 0x87, 0x82, 0xc2, 0x3f, 0x84, 0x48, 0x84, + 0xc1, 0xbe, 0xc8, 0x4c, 0xf8, 0x5e, 0x51, 0x1d, 0x07, 0x5b, 0x3a, 0x21, 0xc8, 0xc0, 0x11, 0x82, + 0xc4, 0x86, 0x51, 0xde, 0xe5, 0x3f, 0xce, 0x48, 0xff, 0xe7, 0x3f, 0x1b, 0x47, 0xf5, 0xa1, 0x48, + 0x1b, 0xd9, 0x6f, 0xd2, 0xf6, 0x8b, 0xca, 0x3c, 0x01, 0x2a, 0xc0, 0x88, 0x5a, 0x2e, 0x6b, 0x44, + 0xe1, 0xd5, 0x6a, 0x71, 0x43, 0xa3, 0x29, 0x48, 0x9b, 0xfe, 0xe2, 0x70, 0xab, 0xb9, 0x40, 0x1e, + 0x42, 0x9e, 0xc3, 0xe7, 0x53, 0xd0, 0x6b, 0x32, 0xa6, 0xe4, 0x8b, 0x30, 0xdc, 0xc0, 0x29, 0xe1, + 0x6f, 0x5b, 0xd3, 0xcb, 0xe2, 0x91, 0x3b, 0xf9, 0x9f, 0xd4, 0xd1, 0xaf, 0xaa, 0x33, 0x27, 0x83, + 0xfe, 0x9f, 0x7f, 0x57, 0xeb, 0x4f, 0x20, 0x0c, 0xfa, 0x3e, 0x81, 0xa0, 0x9a, 0x5a, 0x3e, 0x45, + 0xe9, 0xf3, 0x2f, 0x1f, 0xe4, 0x78, 0x03, 0xfb, 0xea, 0xc1, 0xa4, 0x61, 0x55, 0xa6, 0x2a, 0x58, + 0x17, 0xf9, 0x43, 0xd2, 0xa4, 0x9a, 0x9a, 0x4d, 0xd5, 0xd1, 0xfb, 0xca, 0xbb, 0x7d, 0xd1, 0xf7, + 0x3f, 0xfd, 0x20, 0x42, 0x62, 0x2e, 0xb7, 0x32, 0xef, 0xea, 0xf1, 0x17, 0x63, 0x70, 0xd4, 0xa7, + 0xc7, 0x3e, 0xe0, 0x46, 0x75, 0xce, 0x36, 0xd7, 0xf8, 0x36, 0xbe, 0x91, 0xf2, 0x24, 0x24, 0x08, + 0x3c, 0x8a, 0xf8, 0x51, 0xb7, 0xcc, 0xa7, 0xbf, 0xfc, 0x2f, 0xe5, 0x60, 0x16, 0x2b, 0x30, 0x2b, + 0x94, 0x48, 0xfe, 0xe7, 0xda, 0x97, 0x5f, 0xda, 0xfb, 0xc0, 0xbd, 0x7d, 0xfb, 0xc4, 0x18, 0x96, + 0xe1, 0xff, 0x99, 0x83, 0x23, 0xe1, 0xcc, 0x2b, 0xb3, 0xa2, 0x6d, 0xa5, 0x90, 0x3b, 0xb0, 0xd4, + 0xad, 0xde, 0x85, 0xef, 0x35, 0x83, 0x11, 0x59, 0xe1, 0xa8, 0xa4, 0xb2, 0xbc, 0x03, 0x07, 0x9f, + 0x22, 0x4c, 0x79, 0x87, 0xa9, 0x62, 0x2f, 0x38, 0xe8, 0x5e, 0xf8, 0x94, 0xb8, 0x0f, 0x2d, 0x6e, + 0x71, 0x82, 0xc7, 0x38, 0x0f, 0x11, 0x8e, 0x4f, 0xb6, 0xdc, 0x63, 0x26, 0x7d, 0xfb, 0x8b, 0xe2, + 0xc3, 0x94, 0x3f, 0x23, 0xc1, 0xa1, 0x86, 0xae, 0xb9, 0xf1, 0x5f, 0x6a, 0xf2, 0xb6, 0xbd, 0xd3, + 0x5b, 0xe7, 0xfe, 0xe7, 0xee, 0x73, 0x4d, 0x78, 0x3e, 0x11, 0xc9, 0x33, 0x63, 0x26, 0xc0, 0xf4, + 0xe3, 0x70, 0x20, 0xc8, 0xb3, 0x90, 0xd6, 0xbd, 0x30, 0x18, 0x8c, 0x59, 0xb9, 0xd4, 0x06, 0x02, + 0x51, 0xab, 0xbc, 0x19, 0x16, 0xb7, 0x3b, 0xe4, 0x05, 0xff, 0x31, 0x0f, 0x8b, 0x0c, 0x3b, 0x1d, + 0xb1, 0x47, 0x40, 0x7e, 0xbf, 0x04, 0x13, 0xc1, 0x8e, 0xbc, 0xd4, 0xa0, 0xdd, 0x19, 0xcf, 0xb7, + 0x6d, 0xc2, 0xbf, 0x2f, 0xc1, 0x5d, 0x7b, 0xf0, 0xc4, 0xe5, 0xf0, 0xd3, 0x12, 0x8c, 0xfa, 0xce, + 0x81, 0x85, 0xa9, 0x17, 0x5a, 0xf0, 0x50, 0xdb, 0xe7, 0xd8, 0xae, 0x47, 0x76, 0x84, 0x08, 0xe7, + 0x95, 0x6f, 0x8c, 0x8f, 0x34, 0xb6, 0xd9, 0xca, 0x48, 0xe3, 0xd9, 0xed, 0x6d, 0x54, 0x97, 0x97, + 0x25, 0xb8, 0x2f, 0x38, 0xe4, 0x26, 0xb7, 0xb5, 0x7e, 0x5c, 0xf3, 0xf1, 0x4d, 0x09, 0x4e, 0xb5, + 0xc3, 0x1c, 0x9f, 0x18, 0x0d, 0x46, 0xbc, 0x6b, 0x1d, 0xe1, 0x69, 0x39, 0xd3, 0xf9, 0xf5, 0x36, + 0xae, 0xb4, 0xc8, 0x25, 0x7a, 0x07, 0xe4, 0x6f, 0xf2, 0xe5, 0xe6, 0x9f, 0x79, 0x57, 0xd6, 0xc1, + 0x64, 0x88, 0x90, 0x75, 0x20, 0x1d, 0xd2, 0x64, 0x4a, 0x62, 0x4d, 0xa6, 0xc4, 0x97, 0x3a, 0x78, + 0x27, 0x37, 0x6a, 0x4d, 0xae, 0x65, 0x6c, 0xc0, 0x48, 0x13, 0xc5, 0xe6, 0x6b, 0xbd, 0x73, 0xbd, + 0x56, 0x50, 0xa3, 0xea, 0xca, 0xbb, 0x30, 0x4e, 0xbb, 0x6f, 0x22, 0xef, 0x3b, 0x3d, 0x72, 0x87, + 0x5b, 0x9c, 0xa6, 0x5d, 0x73, 0x11, 0xac, 0x40, 0x0f, 0x9b, 0x6e, 0x3e, 0xea, 0xfd, 0xab, 0x0d, + 0xa7, 0x23, 0x7f, 0x48, 0x18, 0xba, 0x59, 0xc1, 0x7d, 0xf3, 0x85, 0xd5, 0xce, 0x90, 0x6f, 0xd3, + 0xc2, 0xf2, 0xc9, 0xe4, 0xeb, 0xc2, 0xe4, 0x35, 0xe7, 0xce, 0x4d, 0xa0, 0xdc, 0x66, 0x8b, 0xc7, + 0x44, 0x74, 0x67, 0x4d, 0xdb, 0x27, 0x84, 0x69, 0x73, 0x87, 0x16, 0x61, 0xda, 0x7e, 0x3c, 0x33, + 0xe0, 0x1a, 0xb9, 0x08, 0x36, 0xff, 0x0a, 0x1b, 0xb9, 0xef, 0x4b, 0x70, 0x98, 0x0e, 0xd1, 0x7f, + 0xd7, 0xa7, 0x53, 0xc9, 0x3f, 0x00, 0xc8, 0xb6, 0x4a, 0xc5, 0xa6, 0x4b, 0x3e, 0x6d, 0x5b, 0xa5, + 0xab, 0x81, 0x2d, 0xe8, 0x01, 0x40, 0x65, 0xdb, 0x09, 0x43, 0xb3, 0x84, 0x6a, 0xba, 0x6c, 0x3b, + 0x57, 0xf7, 0xd8, 0xb0, 0x12, 0xb7, 0x61, 0x56, 0xbf, 0x26, 0x41, 0xb6, 0xd9, 0x90, 0xdd, 0x24, + 0xdd, 0xc1, 0xc0, 0x65, 0xb2, 0xf0, 0x44, 0x3e, 0xdc, 0xc1, 0xa5, 0xa9, 0xd0, 0xa2, 0x3a, 0x60, + 0xe1, 0x3b, 0xed, 0x31, 0x8c, 0x07, 0xf5, 0xb5, 0xd1, 0x33, 0xff, 0xb1, 0x2d, 0xa6, 0xdf, 0x6b, + 0x30, 0xb6, 0x7f, 0x95, 0x7c, 0xf7, 0x1d, 0x18, 0x6b, 0xc1, 0xfc, 0x9d, 0xde, 0x1a, 0x8d, 0x96, + 0x73, 0x7a, 0x87, 0xdc, 0xff, 0x47, 0xf8, 0xf2, 0x08, 0x3e, 0x00, 0xf6, 0x45, 0x76, 0xcd, 0xbe, + 0x20, 0x22, 0xff, 0x5d, 0x38, 0xd2, 0x14, 0x8b, 0xb3, 0x98, 0x83, 0xc4, 0x96, 0x66, 0x8b, 0x63, + 0xab, 0xd3, 0x11, 0xdc, 0x85, 0x88, 0x50, 0x54, 0x19, 0x41, 0x9a, 0xf6, 0xb0, 0x62, 0x18, 0x55, + 0xce, 0x8d, 0xac, 0xc0, 0xb0, 0xaf, 0x8e, 0xf7, 0xf5, 0x18, 0x24, 0x4c, 0x83, 0x7f, 0x24, 0xaf, + 0xef, 0xcc, 0xdd, 0x11, 0x7d, 0x11, 0x54, 0x2e, 0x04, 0x8a, 0x26, 0x8f, 0x02, 0x62, 0x34, 0xe9, + 0x8d, 0x64, 0xd1, 0xd3, 0xb3, 0x30, 0x12, 0xa8, 0xe5, 0x7d, 0xcd, 0x40, 0x8f, 0x49, 0x6b, 0x78, + 0x6f, 0x51, 0x0f, 0xa1, 0x18, 0xba, 0xfb, 0x11, 0x32, 0x5a, 0x92, 0xcf, 0xc2, 0xdd, 0x94, 0x76, + 0x93, 0xd4, 0x70, 0x7e, 0x77, 0xbe, 0x2c, 0x44, 0x1f, 0xba, 0x45, 0x28, 0xef, 0xc0, 0x3d, 0x7b, + 0xa3, 0x79, 0x8e, 0x13, 0x3b, 0xfa, 0x6a, 0xd3, 0x71, 0x6a, 0x46, 0x8f, 0x33, 0xcc, 0xe8, 0xc8, + 0x8f, 0xc3, 0xf1, 0xd6, 0x3d, 0xd3, 0x0b, 0x8a, 0x82, 0xe7, 0xa6, 0x5f, 0x4a, 0x95, 0xdf, 0x0e, + 0x27, 0x22, 0xf1, 0xef, 0x18, 0xf3, 0x8f, 0xc1, 0xbd, 0xad, 0x3a, 0xb7, 0x97, 0xaf, 0xeb, 0xb8, + 0xec, 0xe3, 0x9d, 0x1d, 0xf6, 0x49, 0xbe, 0x5b, 0x9a, 0xf2, 0x3b, 0x5a, 0x8f, 0x5d, 0xa0, 0x73, + 0xd6, 0x15, 0xe8, 0x65, 0x5d, 0xb6, 0xeb, 0x03, 0xb4, 0xe6, 0x5d, 0x10, 0x92, 0xef, 0xe5, 0xaa, + 0x92, 0xab, 0x56, 0x9b, 0x31, 0x20, 0xb4, 0xf5, 0x06, 0x57, 0x8d, 0x96, 0x60, 0x77, 0x90, 0xc5, + 0x13, 0x5c, 0xbe, 0x0b, 0xaa, 0xed, 0xac, 0x35, 0x3b, 0x61, 0x15, 0x4c, 0x5e, 0xe0, 0x92, 0xdc, + 0x03, 0x90, 0xb3, 0x19, 0xd6, 0xfc, 0x13, 0xee, 0x14, 0x3a, 0x6a, 0x70, 0x80, 0xe5, 0x9c, 0x6d, + 0x63, 0xc7, 0x95, 0x43, 0xd1, 0x9d, 0xac, 0x96, 0x80, 0xbc, 0x0b, 0xf7, 0x92, 0x9b, 0xd4, 0xc9, + 0x25, 0xb7, 0x33, 0x9f, 0x1d, 0x87, 0x6e, 0xda, 0x03, 0xfa, 0xa4, 0x04, 0xe0, 0x7b, 0x55, 0x70, + 0x36, 0x42, 0x90, 0xcd, 0x13, 0x67, 0xd9, 0x73, 0x9d, 0xa2, 0xf1, 0xd8, 0xed, 0xd4, 0xbb, 0xfe, + 0xed, 0xb7, 0x7f, 0x29, 0x76, 0x0f, 0x92, 0xc5, 0x21, 0x45, 0x38, 0xb3, 0xe7, 0xdb, 0x14, 0x7f, + 0x27, 0xf0, 0x61, 0xc5, 0x47, 0x3a, 0xea, 0x51, 0xf0, 0x79, 0xb6, 0x43, 0x2c, 0xce, 0xe6, 0x45, + 0xca, 0xe6, 0x59, 0xf4, 0x70, 0x34, 0x9b, 0x53, 0x6f, 0x0f, 0xee, 0x93, 0xef, 0x44, 0xaf, 0x4a, + 0x30, 0xda, 0x2c, 0xfd, 0x83, 0x2e, 0x75, 0xc4, 0x4c, 0x63, 0x84, 0x91, 0x7d, 0xf3, 0xfe, 0x09, + 0xf0, 0x81, 0xcd, 0xd1, 0x81, 0xe5, 0xd0, 0xa5, 0x7d, 0x0c, 0x6c, 0xca, 0xe7, 0x86, 0xa2, 0x9f, + 0x8f, 0xc1, 0xb1, 0x3d, 0x73, 0x2a, 0xe8, 0x4a, 0x47, 0xcc, 0xee, 0x11, 0x58, 0x65, 0xe7, 0x6f, + 0x03, 0x25, 0x3e, 0xfe, 0xa7, 0xe8, 0xf8, 0x9f, 0x44, 0xf3, 0xfb, 0x19, 0xbf, 0x17, 0x35, 0xf9, + 0x25, 0xf1, 0xef, 0x82, 0xef, 0x55, 0xdb, 0xd2, 0xb8, 0x86, 0x8c, 0x45, 0x7b, 0x0b, 0xaa, 0x31, + 0x0c, 0x96, 0x9f, 0xa1, 0x03, 0x52, 0xd0, 0xca, 0xeb, 0x9c, 0xd0, 0xa9, 0xb7, 0x07, 0xbd, 0xc2, + 0x77, 0xa2, 0x9f, 0x6d, 0xf1, 0x18, 0xf5, 0xf1, 0x76, 0x38, 0x6d, 0x9d, 0x9b, 0xc9, 0x5e, 0xda, + 0x37, 0x3e, 0x1f, 0x72, 0x8d, 0x0e, 0xb9, 0x82, 0xf0, 0xed, 0x1e, 0x72, 0xd3, 0x09, 0x46, 0x5f, + 0x93, 0x60, 0xb4, 0x59, 0x6a, 0xa3, 0xbd, 0xe5, 0xbc, 0x47, 0xca, 0xa6, 0xbd, 0xe5, 0xbc, 0x57, + 0x56, 0x45, 0x7e, 0x13, 0x15, 0xc5, 0x39, 0xf4, 0x48, 0x2b, 0x51, 0xec, 0x39, 0xc3, 0x64, 0x0d, + 0xef, 0x99, 0x32, 0x68, 0x6f, 0x0d, 0xb7, 0x93, 0x1c, 0x69, 0x6f, 0x0d, 0xb7, 0x95, 0xbf, 0x88, + 0x5e, 0xc3, 0xee, 0x38, 0xdb, 0x9c, 0x62, 0x1b, 0xfd, 0xb1, 0x04, 0x03, 0x81, 0x30, 0x1b, 0x5d, + 0x68, 0x87, 0xdf, 0x66, 0xc9, 0x88, 0xc8, 0x8b, 0x37, 0xad, 0x63, 0x7a, 0x79, 0x9e, 0x8e, 0x6c, + 0x06, 0xe5, 0xf6, 0x33, 0x32, 0x2b, 0xc0, 0xff, 0x2d, 0x09, 0x46, 0x9a, 0x44, 0xb0, 0xed, 0xad, + 0xde, 0xd6, 0x71, 0x79, 0xf6, 0xd2, 0xbe, 0xf1, 0xf9, 0x18, 0x2f, 0xd3, 0x31, 0xbe, 0x19, 0x3d, + 0xbe, 0x9f, 0x31, 0xfa, 0xbc, 0x83, 0xef, 0x79, 0xef, 0x02, 0x7d, 0xfd, 0x44, 0x5e, 0x90, 0xd9, + 0x3b, 0x3a, 0xce, 0x3e, 0xbe, 0x5f, 0x74, 0x3e, 0xba, 0xa7, 0xe9, 0xe8, 0x9e, 0x42, 0xcb, 0xaf, + 0x6f, 0x74, 0x8d, 0x4e, 0xc5, 0x17, 0x1b, 0x3f, 0x75, 0xd5, 0x96, 0xa2, 0x35, 0x8d, 0x8e, 0xb3, + 0xd3, 0xfb, 0x41, 0xe5, 0x43, 0xbc, 0x40, 0x87, 0x78, 0x06, 0x3d, 0xd8, 0x6a, 0x88, 0xbe, 0x47, + 0xa8, 0x9a, 0xbe, 0x69, 0x4c, 0xbd, 0x9d, 0x85, 0xde, 0xef, 0x44, 0xef, 0x15, 0x0f, 0xef, 0xa6, + 0xda, 0xe9, 0xde, 0x17, 0x3f, 0x67, 0x1f, 0x6c, 0x1f, 0x81, 0x73, 0x79, 0x0f, 0xe5, 0x72, 0x0c, + 0x1d, 0x6d, 0xc5, 0x25, 0x89, 0xa1, 0xd1, 0xaf, 0x4a, 0xee, 0x8b, 0xde, 0x87, 0xda, 0xea, 0xc2, + 0x1f, 0x6b, 0x47, 0x5e, 0xee, 0x6b, 0x12, 0x88, 0xcb, 0xc7, 0x29, 0x5f, 0x13, 0x68, 0xac, 0x25, + 0x5f, 0x8c, 0x9d, 0x4f, 0x48, 0x70, 0xa8, 0x45, 0xc0, 0x8c, 0xf2, 0xed, 0xf4, 0xbb, 0x77, 0x90, + 0x9e, 0x9d, 0x79, 0x5d, 0x34, 0xf8, 0x60, 0xba, 0xd0, 0x6f, 0x4a, 0x90, 0x6d, 0x1d, 0x1d, 0xa3, + 0xc2, 0xbe, 0x7b, 0xf1, 0x47, 0xe7, 0xd9, 0xcb, 0xaf, 0x97, 0x8c, 0xcb, 0xef, 0x2b, 0x12, 0x1c, + 0x6e, 0x19, 0x11, 0xa3, 0xd9, 0x7d, 0xf6, 0x13, 0x88, 0xc7, 0xb3, 0x85, 0xd7, 0x49, 0xc5, 0x65, + 0x96, 0xe8, 0x40, 0x8b, 0xc8, 0xb8, 0x3d, 0x1d, 0xd8, 0x3b, 0xfa, 0x6e, 0x4f, 0x07, 0x22, 0x42, + 0x73, 0x2e, 0xd3, 0x96, 0xb1, 0x71, 0x7b, 0x32, 0x8d, 0x8a, 0xc1, 0xdb, 0x93, 0x69, 0x64, 0x80, + 0xee, 0x2a, 0x40, 0x8b, 0x28, 0xbb, 0x5d, 0x05, 0xd8, 0x3b, 0x9a, 0x6f, 0x57, 0x01, 0x22, 0x42, + 0x7d, 0xf9, 0x0d, 0x79, 0x39, 0xfa, 0xc3, 0x9e, 0xc6, 0x9b, 0x3f, 0x6a, 0xdd, 0xd9, 0xba, 0xf1, + 0xba, 0x3e, 0x26, 0xb9, 0xef, 0x07, 0xa0, 0xf2, 0x9f, 0xc5, 0x01, 0xad, 0x3a, 0xea, 0x36, 0xce, + 0xd5, 0x9d, 0x2d, 0xc3, 0xd2, 0x6e, 0x30, 0x27, 0x1c, 0x03, 0xd4, 0xd4, 0x1d, 0xff, 0x1b, 0xed, + 0x3d, 0x73, 0x1f, 0xf7, 0xbf, 0xf2, 0x8d, 0xf1, 0x13, 0x6d, 0xbc, 0x3a, 0x23, 0xc0, 0x4a, 0xaa, + 0xa6, 0xee, 0xf0, 0x8b, 0xbf, 0x6f, 0x03, 0x50, 0xab, 0x55, 0xe3, 0x7a, 0xb1, 0xaa, 0xd9, 0xe2, + 0x69, 0xc0, 0x9b, 0x22, 0x66, 0xb3, 0x91, 0xdb, 0x49, 0xdf, 0xb7, 0xd1, 0xbb, 0x94, 0x14, 0xa5, + 0xb8, 0xa0, 0xd9, 0x0e, 0x7a, 0x2b, 0xa4, 0xca, 0x58, 0xdf, 0x65, 0xd4, 0xe3, 0xb7, 0x85, 0x7a, + 0x92, 0x10, 0xa4, 0xc4, 0x8b, 0x80, 0x54, 0x3f, 0x1c, 0xfd, 0x25, 0x2f, 0xfe, 0x21, 0xbb, 0xa8, + 0xfd, 0x33, 0xd0, 0x01, 0xfd, 0x5a, 0xf3, 0xb0, 0x1a, 0xae, 0xca, 0x1e, 0x0f, 0x24, 0x8e, 0x02, + 0x3f, 0x74, 0x11, 0x3f, 0x99, 0x72, 0x7f, 0xe8, 0x62, 0x7a, 0xf8, 0x4f, 0x3e, 0x77, 0x7a, 0x20, + 0x40, 0x31, 0xdf, 0xef, 0x3f, 0x2f, 0x39, 0xf5, 0x11, 0x09, 0x86, 0x1b, 0x7a, 0x44, 0x32, 0x8c, + 0xe5, 0xd6, 0xd7, 0xae, 0x2c, 0x2b, 0xf3, 0xcf, 0xe6, 0xd6, 0xe6, 0x97, 0x97, 0xc4, 0xe7, 0x5f, + 0x7d, 0xef, 0xba, 0xd1, 0x38, 0x1c, 0x69, 0x02, 0x33, 0x5b, 0x58, 0x28, 0xcc, 0xe5, 0xd6, 0x0a, + 0x69, 0x09, 0xdd, 0x05, 0xc7, 0x9a, 0x12, 0x71, 0x41, 0x62, 0x2d, 0x40, 0x94, 0x82, 0x0b, 0x12, + 0x7f, 0x23, 0xd6, 0xdd, 0x7f, 0x48, 0x35, 0x7e, 0xc6, 0xb5, 0x82, 0x75, 0x6c, 0x6b, 0xf6, 0xeb, + 0x59, 0x79, 0x11, 0xef, 0xa7, 0x3f, 0xdd, 0x0b, 0xfd, 0x73, 0xac, 0x97, 0x55, 0x47, 0x75, 0x6e, + 0xcf, 0xb9, 0x00, 0xb2, 0xf9, 0xaf, 0x13, 0xb0, 0x1f, 0x4d, 0xf1, 0x7e, 0x06, 0xa4, 0xbf, 0xa3, + 0x6f, 0x15, 0xb2, 0x17, 0xa0, 0xfc, 0x7b, 0x80, 0x61, 0x7a, 0x32, 0xfb, 0xa1, 0x03, 0x6a, 0x34, + 0xd9, 0xcf, 0x9d, 0xfc, 0xa2, 0x04, 0x07, 0x28, 0x94, 0xe7, 0x29, 0x53, 0x48, 0xf1, 0x31, 0xaa, + 0x28, 0x7f, 0x8e, 0x6c, 0x16, 0xae, 0x3a, 0xb3, 0xdf, 0x29, 0xb9, 0x87, 0x7f, 0x47, 0xe8, 0xa8, + 0x8f, 0x87, 0x30, 0x75, 0x59, 0x19, 0xa9, 0x36, 0x60, 0xda, 0xa1, 0x03, 0xc1, 0xc4, 0xeb, 0x3e, + 0x10, 0x7c, 0x0a, 0xfa, 0x7c, 0xd1, 0x5c, 0xa6, 0xbb, 0xbd, 0x8f, 0xaa, 0x85, 0x8f, 0xe4, 0xfd, + 0x34, 0xd0, 0x7b, 0x24, 0x38, 0xd0, 0x34, 0xfa, 0xcd, 0xf4, 0xec, 0xfb, 0xe4, 0x3f, 0x24, 0xb1, + 0xa6, 0xe4, 0x65, 0x65, 0xb4, 0xde, 0x2c, 0xb7, 0xf0, 0x34, 0x0c, 0x04, 0x42, 0xd6, 0x4c, 0x2f, + 0x65, 0x63, 0x1f, 0x9f, 0x0f, 0x09, 0xd2, 0x41, 0x59, 0x48, 0xe2, 0x1d, 0xd3, 0xb0, 0x1c, 0x5c, + 0xa6, 0x17, 0xb4, 0x93, 0x8a, 0x5b, 0x46, 0x3a, 0x1c, 0x6c, 0xfa, 0xda, 0xca, 0xce, 0xa4, 0x5e, + 0xe7, 0xb9, 0xc2, 0xa8, 0xd3, 0xcc, 0x4d, 0x7b, 0x33, 0x1c, 0xe3, 0xaa, 0xdc, 0xe2, 0x89, 0x17, + 0xd0, 0xc3, 0x82, 0xc3, 0xd5, 0x56, 0xae, 0x8b, 0xbc, 0x04, 0xa8, 0x51, 0x55, 0xc3, 0x3f, 0x33, + 0xe4, 0x59, 0x5f, 0x34, 0x0a, 0xdd, 0xfe, 0x1f, 0xe2, 0x61, 0x05, 0xef, 0x9c, 0xf6, 0x0d, 0xb0, + 0x6d, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x80, 0x5b, 0xaf, 0xd0, 0x34, 0xa8, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2186,6 +2206,9 @@ func (this *Params) Equal(that interface{}) bool { if this.BondDenom != that1.BondDenom { return false } + if !this.MinCommissionRate.Equal(that1.MinCommissionRate) { + return false + } return true } func (this *RedelegationEntryResponse) Equal(that interface{}) bool { @@ -3072,6 +3095,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size := m.MinCommissionRate.Size() + i -= size + if _, err := m.MinCommissionRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 if len(m.BondDenom) > 0 { i -= len(m.BondDenom) copy(dAtA[i:], m.BondDenom) @@ -3669,6 +3702,8 @@ func (m *Params) Size() (n int) { if l > 0 { n += 1 + l + sovStaking(uint64(l)) } + l = m.MinCommissionRate.Size() + n += 1 + l + sovStaking(uint64(l)) return n } @@ -6274,6 +6309,40 @@ func (m *Params) Unmarshal(dAtA []byte) error { } m.BondDenom = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinCommissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MinCommissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) From 30e6c018b5eb2b99f76fc80520c09548aae484b0 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 24 Mar 2022 02:00:04 +1000 Subject: [PATCH 05/57] update app with latest v046 changes --- app/README.md | 2 +- app/app.go | 60 +++++++++++++++++++++------ app/app_test.go | 56 +++++++++++++++---------- app/helpers/test_helpers.go | 2 + app/params/encoding.go | 7 ++-- app/params/proto.go | 6 +-- app/sim_test.go | 17 +++++++- app/state.go | 6 +-- app/utils.go | 10 ++--- cmd/liquidstakingd/cmd/genaccounts.go | 2 +- cmd/liquidstakingd/cmd/testnet.go | 4 ++ 11 files changed, 118 insertions(+), 54 deletions(-) diff --git a/app/README.md b/app/README.md index 4d00c0c2..4179392c 100644 --- a/app/README.md +++ b/app/README.md @@ -37,7 +37,7 @@ in this testnet. 9. Modify your `config/config.toml` (in the simapp working directory) to include the other participants as persistent peers: - ``` + ```text # Comma separated list of nodes to keep persistent connections to persistent_peers = "[validator_address]@[ip_address]:[port],[validator_address]@[ip_address]:[port]" ``` diff --git a/app/app.go b/app/app.go index 93724d5e..222784ff 100644 --- a/app/app.go +++ b/app/app.go @@ -7,6 +7,8 @@ import ( "os" "path/filepath" + "github.com/cosmos/cosmos-sdk/testutil/testdata_pulsar" + "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" @@ -25,8 +27,8 @@ import ( "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" + "github.com/cosmos/cosmos-sdk/store/streaming" storetypes "github.com/cosmos/cosmos-sdk/store/types" - "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" @@ -37,17 +39,16 @@ import ( authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/auth/vesting" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + "github.com/cosmos/cosmos-sdk/x/authz" + authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" + authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/bank" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/capability" capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - - vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - "github.com/cosmos/cosmos-sdk/x/authz" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/crisis" crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" @@ -65,9 +66,15 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" govv1beta2 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta2" + "github.com/cosmos/cosmos-sdk/x/group" + groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" + groupmodule "github.com/cosmos/cosmos-sdk/x/group/module" "github.com/cosmos/cosmos-sdk/x/mint" mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + "github.com/cosmos/cosmos-sdk/x/nft" + nftkeeper "github.com/cosmos/cosmos-sdk/x/nft/keeper" + nftmodule "github.com/cosmos/cosmos-sdk/x/nft/module" "github.com/cosmos/cosmos-sdk/x/params" paramsclient "github.com/cosmos/cosmos-sdk/x/params/client" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" @@ -119,7 +126,9 @@ var ( upgrade.AppModuleBasic{}, evidence.AppModuleBasic{}, authzmodule.AppModuleBasic{}, + groupmodule.AppModuleBasic{}, vesting.AppModuleBasic{}, + nftmodule.AppModuleBasic{}, ) // module account permissions @@ -130,6 +139,7 @@ var ( stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, govtypes.ModuleName: {authtypes.Burner}, + nft.ModuleName: nil, } ) @@ -171,6 +181,8 @@ type SimApp struct { AuthzKeeper authzkeeper.Keeper EvidenceKeeper evidencekeeper.Keeper FeeGrantKeeper feegrantkeeper.Keeper + GroupKeeper groupkeeper.Keeper + NFTKeeper nftkeeper.Keeper // the module manager mm *module.Manager @@ -212,13 +224,19 @@ func NewSimApp( minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, govtypes.StoreKey, paramstypes.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, evidencetypes.StoreKey, capabilitytypes.StoreKey, - authzkeeper.StoreKey, + authzkeeper.StoreKey, nftkeeper.StoreKey, group.StoreKey, ) tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) // NOTE: The testingkey is just mounted for testing purposes. Actual applications should // not include this key. memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey, "testingkey") + // configure state listening capabilities using AppOptions + // we are doing nothing with the returned streamingServices and waitGroup in this case + if _, _, err := streaming.LoadStreamingServices(bApp, appOpts, appCodec, keys); err != nil { + tmos.Exit(err.Error()) + } + app := &SimApp{ BaseApp: bApp, legacyAmino: legacyAmino, @@ -268,7 +286,6 @@ func NewSimApp( ) app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper) - app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, authtypes.NewModuleAddress(govtypes.ModuleName).String()) // register the staking hooks // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks @@ -278,6 +295,13 @@ func NewSimApp( app.AuthzKeeper = authzkeeper.NewKeeper(keys[authzkeeper.StoreKey], appCodec, app.msgSvcRouter, app.AccountKeeper) + groupConfig := group.DefaultConfig() + /* + Example of setting group params: + groupConfig.MaxMetadataLen = 1000 + */ + app.GroupKeeper = groupkeeper.NewKeeper(keys[group.StoreKey], appCodec, app.msgSvcRouter, app.AccountKeeper, groupConfig) + // register the proposal types govRouter := govv1beta1.NewRouter() govRouter.AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). @@ -299,6 +323,9 @@ func NewSimApp( // register the governance hooks ), ) + // set the governance module account as the authority for conducting upgrades + app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + app.NFTKeeper = nftkeeper.NewKeeper(keys[nftkeeper.StoreKey], appCodec, app.AccountKeeper, app.BankKeeper) // create evidence keeper with router evidenceKeeper := evidencekeeper.NewKeeper( @@ -335,6 +362,8 @@ func NewSimApp( evidence.NewAppModule(app.EvidenceKeeper), params.NewAppModule(app.ParamsKeeper), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + nftmodule.NewAppModule(appCodec, app.NFTKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), ) // During begin block slashing happens after distr.BeginBlocker so that @@ -346,7 +375,7 @@ func NewSimApp( upgradetypes.ModuleName, capabilitytypes.ModuleName, minttypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, evidencetypes.ModuleName, stakingtypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, - authz.ModuleName, feegrant.ModuleName, + authz.ModuleName, feegrant.ModuleName, nft.ModuleName, group.ModuleName, paramstypes.ModuleName, vestingtypes.ModuleName, ) app.mm.SetOrderEndBlockers( @@ -354,12 +383,13 @@ func NewSimApp( capabilitytypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, minttypes.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, - feegrant.ModuleName, + feegrant.ModuleName, nft.ModuleName, group.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, ) // NOTE: The genutils module must occur after staking so that pools are // properly initialized with tokens from genesis accounts. + // NOTE: The genutils module must also occur after auth so that it can access the params from auth. // NOTE: Capability module must occur first so that it can initialize any capabilities // so that other modules that want to create or claim capabilities afterwards in InitChain // can do so safely. @@ -367,17 +397,20 @@ func NewSimApp( capabilitytypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, stakingtypes.ModuleName, slashingtypes.ModuleName, govtypes.ModuleName, minttypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, authz.ModuleName, - feegrant.ModuleName, + feegrant.ModuleName, nft.ModuleName, group.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, ) + // Uncomment if you want to set a custom migration order here. + // app.mm.SetOrderMigrations(custom order) + app.mm.RegisterInvariants(&app.CrisisKeeper) app.mm.RegisterRoutes(app.legacyRouter, app.QueryRouter(), encodingConfig.Amino) app.configurator = module.NewConfigurator(app.appCodec, app.msgSvcRouter, app.GRPCQueryRouter()) app.mm.RegisterServices(app.configurator) // add test gRPC service for testing gRPC queries in isolation - testdata.RegisterQueryServer(app.GRPCQueryRouter(), testdata.QueryImpl{}) + testdata_pulsar.RegisterQueryServer(app.GRPCQueryRouter(), testdata_pulsar.QueryImpl{}) // create the simulation manager and define the order of the modules for deterministic simulations // @@ -396,6 +429,8 @@ func NewSimApp( params.NewAppModule(app.ParamsKeeper), evidence.NewAppModule(app.EvidenceKeeper), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + nftmodule.NewAppModule(appCodec, app.NFTKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), ) app.sm.RegisterStoreDecoders() @@ -408,7 +443,6 @@ func NewSimApp( // initialize BaseApp app.SetInitChainer(app.InitChainer) app.SetBeginBlocker(app.BeginBlocker) - app.SetEndBlocker(app.EndBlocker) app.setTxHandler(encodingConfig.TxConfig, cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))) diff --git a/app/app_test.go b/app/app_test.go index e73991ed..23df9efc 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -5,6 +5,9 @@ import ( "testing" "github.com/golang/mock/gomock" + "github.com/iqlusioninc/liquidity-staking-module/x/distribution" + "github.com/iqlusioninc/liquidity-staking-module/x/slashing" + "github.com/iqlusioninc/liquidity-staking-module/x/staking" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" @@ -27,20 +30,25 @@ import ( feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/cosmos/cosmos-sdk/x/gov" + group "github.com/cosmos/cosmos-sdk/x/group/module" "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/upgrade" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing" - "github.com/iqlusioninc/liquidity-staking-module/x/staking" ) func TestSimAppExportAndBlockedAddrs(t *testing.T) { encCfg := MakeTestEncodingConfig() db := dbm.NewMemDB() logger, _ := log.NewDefaultLogger("plain", "info", false) - - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + app := NewSimappWithCustomOptions(t, false, SetupOptions{ + Logger: logger, + DB: db, + InvCheckPeriod: 0, + EncConfig: encCfg, + HomePath: DefaultNodeHome, + SkipUpgradeHeights: map[int64]bool{}, + AppOpts: EmptyAppOptions{}, + }) for acc := range maccPerms { require.True( @@ -77,6 +85,7 @@ func TestRunMigrations(t *testing.T) { msr := authmiddleware.NewMsgServiceRouter(encCfg.InterfaceRegistry) app.BaseApp = bApp app.configurator = module.NewConfigurator(app.appCodec, msr, app.GRPCQueryRouter()) + // We register all modules on the Configurator, except x/bank. x/bank will // serve as the test subject on which we run the migration tests. // @@ -97,7 +106,7 @@ func TestRunMigrations(t *testing.T) { testCases := []struct { name string moduleName string - forVersion uint64 + fromVersion uint64 expRegErr bool // errors while registering migration expRegErrMsg string expRunErr bool // errors while running migration @@ -115,12 +124,17 @@ func TestRunMigrations(t *testing.T) { false, "", true, "no migrations found for module bank: not found", 0, }, { - "can register and run migration handler for x/bank", + "can register 1->2 migration handler for x/bank, cannot run migration", "bank", 1, + false, "", true, "no migration found for module bank from version 2 to version 3: not found", 0, + }, + { + "can register 2->3 migration handler for x/bank, can run migration", + "bank", 2, false, "", false, "", 1, }, { - "cannot register migration handler for same module & forVersion", + "cannot register migration handler for same module & fromVersion", "bank", 1, true, "another migration for module bank and version 1 already exists: internal logic error", false, "", 0, }, @@ -137,8 +151,8 @@ func TestRunMigrations(t *testing.T) { called := 0 if tc.moduleName != "" { - // Register migration for module from version `forVersion` to `forVersion+1`. - err = app.configurator.RegisterMigration(tc.moduleName, tc.forVersion, func(sdk.Context) error { + // Register migration for module from version `fromVersion` to `fromVersion+1`. + err = app.configurator.RegisterMigration(tc.moduleName, tc.fromVersion, func(sdk.Context) error { called++ return nil @@ -166,6 +180,7 @@ func TestRunMigrations(t *testing.T) { "distribution": distribution.AppModule{}.ConsensusVersion(), "slashing": slashing.AppModule{}.ConsensusVersion(), "gov": gov.AppModule{}.ConsensusVersion(), + "group": group.AppModule{}.ConsensusVersion(), "params": params.AppModule{}.ConsensusVersion(), "upgrade": upgrade.AppModule{}.ConsensusVersion(), "vesting": vesting.AppModule{}.ConsensusVersion(), @@ -235,18 +250,15 @@ func TestUpgradeStateOnGenesis(t *testing.T) { encCfg := MakeTestEncodingConfig() db := dbm.NewMemDB() logger, _ := log.NewDefaultLogger("plain", "info", false) - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) - genesisState := NewDefaultGenesisState(encCfg.Codec) - stateBytes, err := json.MarshalIndent(genesisState, "", " ") - require.NoError(t, err) - - // Initialize the chain - app.InitChain( - abci.RequestInitChain{ - Validators: []abci.ValidatorUpdate{}, - AppStateBytes: stateBytes, - }, - ) + app := NewSimappWithCustomOptions(t, false, SetupOptions{ + Logger: logger, + DB: db, + InvCheckPeriod: 0, + EncConfig: encCfg, + HomePath: DefaultNodeHome, + SkipUpgradeHeights: map[int64]bool{}, + AppOpts: EmptyAppOptions{}, + }) // make sure the upgrade keeper has version map in state ctx := app.NewContext(false, tmproto.Header{}) diff --git a/app/helpers/test_helpers.go b/app/helpers/test_helpers.go index 9ccecbd9..f0be36ad 100644 --- a/app/helpers/test_helpers.go +++ b/app/helpers/test_helpers.go @@ -57,9 +57,11 @@ func GenTx(gen client.TxConfig, msgs []sdk.Msg, feeAmt sdk.Coins, gas uint64, ch // 2nd round: once all signer infos are set, every signer can sign. for i, p := range priv { signerData := authsign.SignerData{ + Address: sdk.AccAddress(p.PubKey().Address()).String(), ChainID: chainID, AccountNumber: accNums[i], Sequence: accSeqs[i], + PubKey: p.PubKey(), } signBytes, err := gen.SignModeHandler().GetSignBytes(signMode, signerData, tx.GetTx()) if err != nil { diff --git a/app/params/encoding.go b/app/params/encoding.go index 2cd16263..8ff9ea04 100644 --- a/app/params/encoding.go +++ b/app/params/encoding.go @@ -10,8 +10,7 @@ import ( // This is provided for compatibility between protobuf and amino implementations. type EncodingConfig struct { InterfaceRegistry types.InterfaceRegistry - // NOTE: this field will be renamed to Codec - Marshaler codec.Codec - TxConfig client.TxConfig - Amino *codec.LegacyAmino + Codec codec.Codec + TxConfig client.TxConfig + Amino *codec.LegacyAmino } diff --git a/app/params/proto.go b/app/params/proto.go index a752d107..2a38fff0 100644 --- a/app/params/proto.go +++ b/app/params/proto.go @@ -16,12 +16,12 @@ import ( func MakeTestEncodingConfig() EncodingConfig { cdc := codec.NewLegacyAmino() interfaceRegistry := types.NewInterfaceRegistry() - marshaler := codec.NewProtoCodec(interfaceRegistry) + codec := codec.NewProtoCodec(interfaceRegistry) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, - Marshaler: marshaler, - TxConfig: tx.NewTxConfig(marshaler, tx.DefaultSignModes), + Codec: codec, + TxConfig: tx.NewTxConfig(codec, tx.DefaultSignModes), Amino: cdc, } } diff --git a/app/sim_test.go b/app/sim_test.go index 7efa2f1e..6c02edd3 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -5,6 +5,8 @@ import ( "fmt" "math/rand" "os" + "runtime/debug" + "strings" "testing" storetypes "github.com/cosmos/cosmos-sdk/store/types" @@ -153,6 +155,17 @@ func TestAppImportExport(t *testing.T) { err = json.Unmarshal(exported.AppState, &genesisState) require.NoError(t, err) + defer func() { + if r := recover(); r != nil { + err := fmt.Sprintf("%v", r) + if !strings.Contains(err, "validator set is empty after InitGenesis") { + panic(r) + } + logger.Info("Skipping simulation as all validators have been unbonded") + logger.Info("err", err, "stacktrace", string(debug.Stack())) + } + }() + ctxA := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) ctxB := newApp.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) newApp.mm.InitGenesis(ctxB, app.AppCodec(), genesisState) @@ -175,7 +188,7 @@ func TestAppImportExport(t *testing.T) { {app.keys[govtypes.StoreKey], newApp.keys[govtypes.StoreKey], [][]byte{}}, {app.keys[evidencetypes.StoreKey], newApp.keys[evidencetypes.StoreKey], [][]byte{}}, {app.keys[capabilitytypes.StoreKey], newApp.keys[capabilitytypes.StoreKey], [][]byte{}}, - {app.keys[authzkeeper.StoreKey], newApp.keys[authzkeeper.StoreKey], [][]byte{}}, + {app.keys[authzkeeper.StoreKey], newApp.keys[authzkeeper.StoreKey], [][]byte{authzkeeper.GrantKey, authzkeeper.GrantQueuePrefix}}, } for _, skp := range storeKeysPrefixes { @@ -186,7 +199,7 @@ func TestAppImportExport(t *testing.T) { require.Equal(t, len(failedKVAs), len(failedKVBs), "unequal sets of key-values to compare") fmt.Printf("compared %d different key/value pairs between %s and %s\n", len(failedKVAs), skp.A, skp.B) - require.Equal(t, len(failedKVAs), 0, GetSimulationLog(skp.A.Name(), app.SimulationManager().StoreDecoders, failedKVAs, failedKVBs)) + require.Equal(t, 0, len(failedKVAs), GetSimulationLog(skp.A.Name(), app.SimulationManager().StoreDecoders, failedKVAs, failedKVBs)) } } diff --git a/app/state.go b/app/state.go index f3be3d94..019be84b 100644 --- a/app/state.go +++ b/app/state.go @@ -4,8 +4,8 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "math/rand" + "os" "time" tmjson "github.com/tendermint/tendermint/libs/json" @@ -56,7 +56,7 @@ func AppStateFn(cdc codec.JSONCodec, simManager *module.SimulationManager) simty case config.ParamsFile != "": appParams := make(simtypes.AppParams) - bz, err := ioutil.ReadFile(config.ParamsFile) + bz, err := os.ReadFile(config.ParamsFile) if err != nil { panic(err) } @@ -195,7 +195,7 @@ func AppStateRandomizedFn( // AppStateFromGenesisFileFn util function to generate the genesis AppState // from a genesis.json file. func AppStateFromGenesisFileFn(r io.Reader, cdc codec.JSONCodec, genesisFile string) (tmtypes.GenesisDoc, []simtypes.Account) { - bytes, err := ioutil.ReadFile(genesisFile) + bytes, err := os.ReadFile(genesisFile) if err != nil { panic(err) } diff --git a/app/utils.go b/app/utils.go index a1614198..51d8ef54 100644 --- a/app/utils.go +++ b/app/utils.go @@ -3,7 +3,7 @@ package simapp import ( "encoding/json" "fmt" - "io/ioutil" + "os" "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" @@ -34,7 +34,7 @@ func SetupSimulation(dirPrefix, dbName string) (simtypes.Config, dbm.DB, string, logger = log.NewNopLogger() } - dir, err := ioutil.TempDir("", dirPrefix) + dir, err := os.MkdirTemp("", dirPrefix) if err != nil { return simtypes.Config{}, nil, "", nil, false, err } @@ -56,7 +56,7 @@ func SimulationOperations(app App, cdc codec.JSONCodec, config simtypes.Config) } if config.ParamsFile != "" { - bz, err := ioutil.ReadFile(config.ParamsFile) + bz, err := os.ReadFile(config.ParamsFile) if err != nil { panic(err) } @@ -84,7 +84,7 @@ func CheckExportSimulation( return err } - if err := ioutil.WriteFile(config.ExportStatePath, []byte(exported.AppState), 0600); err != nil { + if err := os.WriteFile(config.ExportStatePath, []byte(exported.AppState), 0600); err != nil { return err } } @@ -96,7 +96,7 @@ func CheckExportSimulation( return err } - if err := ioutil.WriteFile(config.ExportParamsPath, paramsBz, 0600); err != nil { + if err := os.WriteFile(config.ExportParamsPath, paramsBz, 0600); err != nil { return err } } diff --git a/cmd/liquidstakingd/cmd/genaccounts.go b/cmd/liquidstakingd/cmd/genaccounts.go index d54f3cd9..97275a41 100644 --- a/cmd/liquidstakingd/cmd/genaccounts.go +++ b/cmd/liquidstakingd/cmd/genaccounts.go @@ -39,7 +39,6 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) - serverCtx := server.GetServerContextFromCmd(cmd) config := serverCtx.Config @@ -50,6 +49,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa if err != nil { inBuf := bufio.NewReader(cmd.InOrStdin()) keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) + if keyringBackend != "" && clientCtx.Keyring == nil { var err error kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf, clientCtx.Codec) diff --git a/cmd/liquidstakingd/cmd/testnet.go b/cmd/liquidstakingd/cmd/testnet.go index 1ce39073..a26a0566 100644 --- a/cmd/liquidstakingd/cmd/testnet.go +++ b/cmd/liquidstakingd/cmd/testnet.go @@ -107,9 +107,12 @@ func testnetInitFilesCmd(mbm module.BasicManager, genBalIterator banktypes.Genes Short: "Initialize config directories & files for a multi-validator testnet running locally via separate processes (e.g. Docker Compose or similar)", Long: `init-files will setup "v" number of directories and populate each with necessary files (private validator, genesis, config, etc.) for running "v" validator nodes. + Booting up a network with these validator folders is intended to be used with Docker Compose, or a similar setup where each node has a manually configurable IP address. + Note, strict routability for addresses is turned off in the config file. + Example: simd testnet init-files --v 4 --output-dir ./.testnets --starting-ip-address 192.168.10.2 `, @@ -155,6 +158,7 @@ func testnetStartCmd() *cobra.Command { Long: `testnet will launch an in-process multi-validator testnet, and generate "v" directories, populated with necessary validator configuration files (private validator, genesis, config, etc.). + Example: simd testnet --v 4 --output-dir ./.testnets `, From 00d8395bf4d17647d164a804cb99a7ca86f8d4f4 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 24 Mar 2022 10:52:40 +1000 Subject: [PATCH 06/57] further updates for sdk v046 changes --- app/app.go | 2 +- x/distribution/README.md | 7 + x/distribution/client/cli/tx.go | 5 +- x/distribution/client/cli/utils.go | 4 +- x/distribution/client/common/common_test.go | 5 +- x/distribution/client/testutil/cli_test.go | 16 +- .../client/testutil/grpc_query_suite.go | 467 ++ x/distribution/client/testutil/suite.go | 50 +- .../client/testutil/withdraw_all_suite.go | 123 + x/distribution/keeper/allocation_test.go | 7 + x/distribution/keeper/delegation.go | 3 +- x/distribution/keeper/delegation_test.go | 76 + x/distribution/keeper/fee_pool.go | 3 +- x/distribution/keeper/grpc_query.go | 5 +- x/distribution/keeper/grpc_query_test.go | 2 + x/distribution/keeper/hooks.go | 43 +- x/distribution/keeper/keeper.go | 22 +- x/distribution/keeper/keeper_test.go | 3 + x/distribution/keeper/proposal_handler.go | 7 +- x/distribution/keeper/querier.go | 5 +- x/distribution/keeper/querier_test.go | 3 + x/distribution/migrations/v034/types.go | 100 + x/distribution/migrations/v036/types.go | 136 + x/distribution/migrations/v038/types.go | 59 + x/distribution/migrations/v040/keys.go | 187 + x/distribution/migrations/v040/migrate.go | 108 + x/distribution/migrations/v043/helpers.go | 71 + x/distribution/migrations/v043/store.go | 24 + x/distribution/migrations/v043/store_test.go | 99 + x/distribution/module.go | 11 +- x/distribution/module_test.go | 15 +- x/distribution/proposal_handler_test.go | 3 + x/distribution/simulation/operations_test.go | 43 +- x/distribution/spec/03_begin_block.md | 10 +- x/distribution/spec/04_messages.md | 2 +- x/distribution/spec/08_client.md | 469 ++ x/distribution/types/codec.go | 28 +- x/distribution/types/errors.go | 34 +- x/distribution/types/expected_keepers.go | 4 +- x/distribution/types/keys.go | 37 +- x/distribution/types/msg.go | 64 +- x/distribution/types/params.go | 2 +- x/distribution/types/proposal.go | 7 +- x/slashing/README.md | 7 + x/slashing/app_test.go | 3 +- x/slashing/client/testutil/grpc.go | 102 + x/slashing/handler.go | 26 - x/slashing/handler_test.go | 295 - x/slashing/keeper/hooks.go | 49 +- x/slashing/keeper/keeper.go | 7 +- x/slashing/keeper/keeper_test.go | 6 +- x/slashing/keeper/querier.go | 3 +- x/slashing/keeper/unjail.go | 14 +- x/slashing/migrations/v039/types.go | 79 + x/slashing/migrations/v040/keys.go | 69 + x/slashing/migrations/v040/migrate.go | 64 + x/slashing/migrations/v040/migrate_test.go | 140 + x/slashing/migrations/v043/store.go | 21 + x/slashing/migrations/v043/store_test.go | 68 + x/slashing/module.go | 14 +- x/slashing/simulation/operations_test.go | 66 +- x/slashing/spec/02_state.md | 6 +- x/slashing/spec/03_messages.md | 2 +- x/slashing/spec/05_hooks.md | 8 +- x/slashing/spec/06_events.md | 15 +- x/slashing/spec/07_tombstone.md | 4 +- x/slashing/spec/09_client.md | 294 + x/slashing/spec/README.md | 32 +- x/slashing/types/codec.go | 20 +- x/slashing/types/errors.go | 26 +- x/slashing/types/events.go | 1 + x/slashing/types/expected_keepers.go | 8 +- x/slashing/types/keys.go | 2 + x/slashing/types/msg.go | 16 +- x/staking/README.md | 7 + x/staking/client/cli/flags.go | 3 +- x/staking/client/cli/tx.go | 2 +- x/staking/client/testutil/cli_test.go | 1 + x/staking/client/testutil/grpc.go | 770 ++ x/staking/client/testutil/suite.go | 62 +- x/staking/genesis.go | 25 +- x/staking/genesis_test.go | 14 +- x/staking/handler_test.go | 1189 --- x/staking/keeper/delegation.go | 66 +- x/staking/keeper/delegation_test.go | 9 + x/staking/keeper/grpc_query.go | 7 +- x/staking/keeper/grpc_query_test.go | 6 +- x/staking/keeper/historical_info_test.go | 14 +- x/staking/keeper/hooks.go | 51 +- x/staking/keeper/msg_server.go | 39 +- x/staking/keeper/querier.go | 15 +- x/staking/keeper/querier_test.go | 10 +- x/staking/keeper/query_utils.go | 7 +- x/staking/keeper/slash.go | 5 +- x/staking/keeper/slash_test.go | 13 + x/staking/keeper/validator.go | 4 + x/staking/keeper/validator_test.go | 26 +- x/staking/migrations/v034/types.go | 190 + x/staking/migrations/v036/types.go | 137 + x/staking/migrations/v038/types.go | 163 + x/staking/migrations/v040/genesis.pb.go | 944 +++ x/staking/migrations/v040/keys.go | 326 + x/staking/migrations/v040/migrate.go | 140 + x/staking/migrations/v040/migrate_test.go | 96 + x/staking/migrations/v040/staking.pb.go | 6525 +++++++++++++++++ x/staking/migrations/v040/types.go | 205 + x/staking/migrations/v043/store.go | 79 + x/staking/migrations/v043/store_test.go | 138 + x/staking/migrations/v046/store.go | 24 + x/staking/migrations/v046/store_test.go | 32 + x/staking/module.go | 23 +- x/staking/module_test.go | 15 +- x/staking/simulation/operations.go | 2 +- x/staking/simulation/operations_test.go | 132 +- x/staking/spec/08_params.md | 16 +- x/staking/spec/09_client.md | 2088 ++++++ x/staking/teststaking/helper.go | 82 +- x/staking/types/codec.go | 33 +- x/staking/types/commission.go | 23 +- x/staking/types/delegation.go | 2 +- x/staking/types/errors.go | 89 +- x/staking/types/expected_keepers.go | 28 +- x/staking/types/exported.go | 40 + x/staking/types/historical_info.go | 5 +- x/staking/types/historical_info_test.go | 7 +- x/staking/types/hooks.go | 82 +- x/staking/types/keys.go | 14 + x/staking/types/msg.go | 120 +- x/staking/types/params_test.go | 15 + x/staking/types/validator.go | 17 +- 130 files changed, 15773 insertions(+), 2242 deletions(-) create mode 100644 x/distribution/README.md create mode 100644 x/distribution/client/testutil/grpc_query_suite.go create mode 100644 x/distribution/client/testutil/withdraw_all_suite.go create mode 100644 x/distribution/migrations/v034/types.go create mode 100644 x/distribution/migrations/v036/types.go create mode 100644 x/distribution/migrations/v038/types.go create mode 100644 x/distribution/migrations/v040/keys.go create mode 100644 x/distribution/migrations/v040/migrate.go create mode 100644 x/distribution/migrations/v043/helpers.go create mode 100644 x/distribution/migrations/v043/store.go create mode 100644 x/distribution/migrations/v043/store_test.go create mode 100644 x/distribution/spec/08_client.md create mode 100644 x/slashing/README.md create mode 100644 x/slashing/client/testutil/grpc.go delete mode 100644 x/slashing/handler.go delete mode 100644 x/slashing/handler_test.go create mode 100644 x/slashing/migrations/v039/types.go create mode 100644 x/slashing/migrations/v040/keys.go create mode 100644 x/slashing/migrations/v040/migrate.go create mode 100644 x/slashing/migrations/v040/migrate_test.go create mode 100644 x/slashing/migrations/v043/store.go create mode 100644 x/slashing/migrations/v043/store_test.go create mode 100644 x/slashing/spec/09_client.md create mode 100644 x/staking/README.md create mode 100644 x/staking/client/testutil/grpc.go create mode 100644 x/staking/migrations/v034/types.go create mode 100644 x/staking/migrations/v036/types.go create mode 100644 x/staking/migrations/v038/types.go create mode 100644 x/staking/migrations/v040/genesis.pb.go create mode 100644 x/staking/migrations/v040/keys.go create mode 100644 x/staking/migrations/v040/migrate.go create mode 100644 x/staking/migrations/v040/migrate_test.go create mode 100644 x/staking/migrations/v040/staking.pb.go create mode 100644 x/staking/migrations/v040/types.go create mode 100644 x/staking/migrations/v043/store.go create mode 100644 x/staking/migrations/v043/store_test.go create mode 100644 x/staking/migrations/v046/store.go create mode 100644 x/staking/migrations/v046/store_test.go create mode 100644 x/staking/spec/09_client.md create mode 100644 x/staking/types/exported.go diff --git a/app/app.go b/app/app.go index 222784ff..020ba0c8 100644 --- a/app/app.go +++ b/app/app.go @@ -276,7 +276,7 @@ func NewSimApp( ) app.DistrKeeper = distrkeeper.NewKeeper( appCodec, keys[distrtypes.StoreKey], app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, authtypes.FeeCollectorName, app.ModuleAccountAddrs(), + &stakingKeeper, authtypes.FeeCollectorName, ) app.SlashingKeeper = slashingkeeper.NewKeeper( appCodec, keys[slashingtypes.StoreKey], &stakingKeeper, app.GetSubspace(slashingtypes.ModuleName), diff --git a/x/distribution/README.md b/x/distribution/README.md new file mode 100644 index 00000000..2c542da7 --- /dev/null +++ b/x/distribution/README.md @@ -0,0 +1,7 @@ + + +# Distribution + +* [Distribution](spec/README.md) - Fee distribution, and staking token provision distribution. diff --git a/x/distribution/client/cli/tx.go b/x/distribution/client/cli/tx.go index a740dac9..286da7b2 100644 --- a/x/distribution/client/cli/tx.go +++ b/x/distribution/client/cli/tx.go @@ -171,14 +171,11 @@ $ %[1]s tx distribution withdraw-all-rewards --from mykey } msg := types.NewMsgWithdrawDelegatorReward(delAddr, val) - if err := msg.ValidateBasic(); err != nil { - return err - } msgs = append(msgs, msg) } chunkSize, _ := cmd.Flags().GetInt(FlagMaxMessagesPerTx) - if clientCtx.BroadcastMode != flags.BroadcastBlock && chunkSize > 0 { + if !clientCtx.GenerateOnly && clientCtx.BroadcastMode != flags.BroadcastBlock && chunkSize > 0 { return fmt.Errorf("cannot use broadcast mode %[1]s with %[2]s != 0", clientCtx.BroadcastMode, FlagMaxMessagesPerTx) } diff --git a/x/distribution/client/cli/utils.go b/x/distribution/client/cli/utils.go index 200b3792..56912904 100644 --- a/x/distribution/client/cli/utils.go +++ b/x/distribution/client/cli/utils.go @@ -1,7 +1,7 @@ package cli import ( - "io/ioutil" + "os" "github.com/cosmos/cosmos-sdk/codec" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -11,7 +11,7 @@ import ( func ParseCommunityPoolSpendProposalWithDeposit(cdc codec.JSONCodec, proposalFile string) (types.CommunityPoolSpendProposalWithDeposit, error) { proposal := types.CommunityPoolSpendProposalWithDeposit{} - contents, err := ioutil.ReadFile(proposalFile) + contents, err := os.ReadFile(proposalFile) if err != nil { return proposal, err } diff --git a/x/distribution/client/common/common_test.go b/x/distribution/client/common/common_test.go index 51bce92d..ff9bb88d 100644 --- a/x/distribution/client/common/common_test.go +++ b/x/distribution/client/common/common_test.go @@ -3,14 +3,15 @@ package common import ( "testing" + "github.com/cosmos/cosmos-sdk/codec/legacy" + "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/client" - "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) func TestQueryDelegationRewardsAddrValidation(t *testing.T) { - clientCtx := client.Context{}.WithLegacyAmino(types.ModuleCdc.LegacyAmino) + clientCtx := client.Context{}.WithLegacyAmino(legacy.Cdc) type args struct { delAddr string diff --git a/x/distribution/client/testutil/cli_test.go b/x/distribution/client/testutil/cli_test.go index dd36a6af..d7ab22d4 100644 --- a/x/distribution/client/testutil/cli_test.go +++ b/x/distribution/client/testutil/cli_test.go @@ -1,17 +1,19 @@ -// +build norace - package testutil import ( "testing" - "github.com/cosmos/cosmos-sdk/testutil/network" - "github.com/stretchr/testify/suite" ) func TestIntegrationTestSuite(t *testing.T) { - cfg := network.DefaultConfig() - cfg.NumValidators = 1 - suite.Run(t, NewIntegrationTestSuite(cfg)) + suite.Run(t, new(IntegrationTestSuite)) +} + +func TestGRPCQueryTestSuite(t *testing.T) { + suite.Run(t, new(GRPCQueryTestSuite)) +} + +func TestWithdrawAllSuite(t *testing.T) { + suite.Run(t, new(WithdrawAllTestSuite)) } diff --git a/x/distribution/client/testutil/grpc_query_suite.go b/x/distribution/client/testutil/grpc_query_suite.go new file mode 100644 index 00000000..956449a3 --- /dev/null +++ b/x/distribution/client/testutil/grpc_query_suite.go @@ -0,0 +1,467 @@ +package testutil + +import ( + "fmt" + + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/suite" + + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/network" + "github.com/cosmos/cosmos-sdk/testutil/rest" + sdk "github.com/cosmos/cosmos-sdk/types" + grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/cosmos/cosmos-sdk/x/distribution/types" +) + +type GRPCQueryTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network +} + +func (s *GRPCQueryTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite") + + cfg := network.DefaultConfig() + cfg.NumValidators = 1 + s.cfg = cfg + + var err error + s.network, err = network.New(s.T(), s.T().TempDir(), cfg) + s.Require().NoError(err) + + _, err = s.network.WaitForHeight(1) + s.Require().NoError(err) +} + +// TearDownSuite cleans up the curret test network after _each_ test. +func (s *GRPCQueryTestSuite) TearDownSuite() { + s.T().Log("tearing down integration test suite1") + s.network.Cleanup() +} + +func (s *GRPCQueryTestSuite) TestQueryParamsGRPC() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + respType proto.Message + expected proto.Message + }{ + { + "gRPC request params", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/params", baseURL), + &types.QueryParamsResponse{}, + &types.QueryParamsResponse{ + Params: types.DefaultParams(), + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := rest.GetRequest(tc.url) + s.Run(tc.name, func() { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected, tc.respType) + }) + } +} + +func (s *GRPCQueryTestSuite) TestQueryOutstandingRewardsGRPC() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + rewards, err := sdk.ParseDecCoins("19.6stake") + s.Require().NoError(err) + + testCases := []struct { + name string + url string + headers map[string]string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "gRPC request params with wrong validator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/outstanding_rewards", baseURL, "wrongAddress"), + map[string]string{}, + true, + &types.QueryValidatorOutstandingRewardsResponse{}, + &types.QueryValidatorOutstandingRewardsResponse{}, + }, + { + "gRPC request params valid address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/outstanding_rewards", baseURL, val.ValAddress.String()), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "2", + }, + false, + &types.QueryValidatorOutstandingRewardsResponse{}, + &types.QueryValidatorOutstandingRewardsResponse{ + Rewards: types.ValidatorOutstandingRewards{ + Rewards: rewards, + }, + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) + s.Run(tc.name, func() { + if tc.expErr { + s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + } else { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *GRPCQueryTestSuite) TestQueryValidatorCommissionGRPC() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + commission, err := sdk.ParseDecCoins("9.8stake") + s.Require().NoError(err) + + testCases := []struct { + name string + url string + headers map[string]string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "gRPC request params with wrong validator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/commission", baseURL, "wrongAddress"), + map[string]string{}, + true, + &types.QueryValidatorCommissionResponse{}, + &types.QueryValidatorCommissionResponse{}, + }, + { + "gRPC request params valid address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/commission", baseURL, val.ValAddress.String()), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "2", + }, + false, + &types.QueryValidatorCommissionResponse{}, + &types.QueryValidatorCommissionResponse{ + Commission: types.ValidatorAccumulatedCommission{ + Commission: commission, + }, + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) + s.Run(tc.name, func() { + if tc.expErr { + s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + } else { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *GRPCQueryTestSuite) TestQuerySlashesGRPC() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "invalid validator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/slashes", baseURL, ""), + true, + &types.QueryValidatorSlashesResponse{}, + nil, + }, + { + "invalid start height", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/slashes?starting_height=%s&ending_height=%s", baseURL, val.ValAddress.String(), "-1", "3"), + true, + &types.QueryValidatorSlashesResponse{}, + nil, + }, + { + "invalid start height", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/slashes?starting_height=%s&ending_height=%s", baseURL, val.ValAddress.String(), "1", "-3"), + true, + &types.QueryValidatorSlashesResponse{}, + nil, + }, + { + "valid request get slashes", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/validators/%s/slashes?starting_height=%s&ending_height=%s", baseURL, val.ValAddress.String(), "1", "3"), + false, + &types.QueryValidatorSlashesResponse{}, + &types.QueryValidatorSlashesResponse{ + Pagination: &query.PageResponse{}, + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := rest.GetRequest(tc.url) + + s.Run(tc.name, func() { + if tc.expErr { + s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + } else { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *GRPCQueryTestSuite) TestQueryDelegatorRewardsGRPC() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + rewards, err := sdk.ParseDecCoins("9.8stake") + s.Require().NoError(err) + + testCases := []struct { + name string + url string + headers map[string]string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "wrong delegator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/rewards", baseURL, "wrongDelegatorAddress"), + map[string]string{}, + true, + &types.QueryDelegationTotalRewardsResponse{}, + nil, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/rewards", baseURL, val.Address.String()), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "2", + }, + false, + &types.QueryDelegationTotalRewardsResponse{}, + &types.QueryDelegationTotalRewardsResponse{ + Rewards: []types.DelegationDelegatorReward{ + types.NewDelegationDelegatorReward(val.ValAddress, rewards), + }, + Total: rewards, + }, + }, + { + "wrong validator address(specific validator rewards)", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/rewards/%s", baseURL, val.Address.String(), "wrongValAddress"), + map[string]string{}, + true, + &types.QueryDelegationTotalRewardsResponse{}, + nil, + }, + { + "valid request(specific validator rewards)", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/rewards/%s", baseURL, val.Address.String(), val.ValAddress.String()), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "2", + }, + false, + &types.QueryDelegationRewardsResponse{}, + &types.QueryDelegationRewardsResponse{ + Rewards: rewards, + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) + + s.Run(tc.name, func() { + if tc.expErr { + s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + } else { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *GRPCQueryTestSuite) TestQueryDelegatorValidatorsGRPC() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "empty delegator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/validators", baseURL, ""), + true, + &types.QueryDelegatorValidatorsResponse{}, + nil, + }, + { + "wrong delegator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/validators", baseURL, "wrongDelegatorAddress"), + true, + &types.QueryDelegatorValidatorsResponse{}, + nil, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/validators", baseURL, val.Address.String()), + false, + &types.QueryDelegatorValidatorsResponse{}, + &types.QueryDelegatorValidatorsResponse{ + Validators: []string{val.ValAddress.String()}, + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := rest.GetRequest(tc.url) + + s.Run(tc.name, func() { + if tc.expErr { + s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + } else { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *GRPCQueryTestSuite) TestQueryWithdrawAddressGRPC() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "empty delegator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/withdraw_address", baseURL, ""), + true, + &types.QueryDelegatorWithdrawAddressResponse{}, + nil, + }, + { + "wrong delegator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/withdraw_address", baseURL, "wrongDelegatorAddress"), + true, + &types.QueryDelegatorWithdrawAddressResponse{}, + nil, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/delegators/%s/withdraw_address", baseURL, val.Address.String()), + false, + &types.QueryDelegatorWithdrawAddressResponse{}, + &types.QueryDelegatorWithdrawAddressResponse{ + WithdrawAddress: val.Address.String(), + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := rest.GetRequest(tc.url) + + s.Run(tc.name, func() { + if tc.expErr { + s.Require().Error(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + } else { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *GRPCQueryTestSuite) TestQueryValidatorCommunityPoolGRPC() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + communityPool, err := sdk.ParseDecCoins("0.4stake") + s.Require().NoError(err) + + testCases := []struct { + name string + url string + headers map[string]string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "gRPC request params with wrong validator address", + fmt.Sprintf("%s/cosmos/distribution/v1beta1/community_pool", baseURL), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "2", + }, + false, + &types.QueryCommunityPoolResponse{}, + &types.QueryCommunityPoolResponse{ + Pool: communityPool, + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) + + s.Run(tc.name, func() { + if tc.expErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} diff --git a/x/distribution/client/testutil/suite.go b/x/distribution/client/testutil/suite.go index 6f64f305..8678ea38 100644 --- a/x/distribution/client/testutil/suite.go +++ b/x/distribution/client/testutil/suite.go @@ -29,13 +29,17 @@ func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite { return &IntegrationTestSuite{cfg: cfg} } -// SetupTest creates a new network for _each_ integration test. We create a new +// SetupSuite creates a new network for _each_ integration test. We create a new // network for each test because there are some state modifications that are // needed to be made in order to make useful queries. However, we don't want // these state changes to be present in other tests. -func (s *IntegrationTestSuite) SetupTest() { +func (s *IntegrationTestSuite) SetupSuite() { s.T().Log("setting up integration test suite") + cfg := network.DefaultConfig() + cfg.NumValidators = 1 + s.cfg = cfg + genesisState := s.cfg.GenesisState var mintData minttypes.GenesisState s.Require().NoError(s.cfg.Codec.UnmarshalJSON(genesisState[minttypes.ModuleName], &mintData)) @@ -57,9 +61,9 @@ func (s *IntegrationTestSuite) SetupTest() { s.Require().NoError(err) } -// TearDownTest cleans up the curret test network after _each_ test. -func (s *IntegrationTestSuite) TearDownTest() { - s.T().Log("tearing down integration test suite") +// TearDownSuite cleans up the curret test network after _each_ test. +func (s *IntegrationTestSuite) TearDownSuite() { + s.T().Log("tearing down integration test suite1") s.network.Cleanup() } @@ -129,7 +133,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryValidatorOutstandingRewards() { fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, false, - `{"rewards":[{"denom":"stake","amount":"1164.240000000000000000"}]}`, + `{"rewards":[{"denom":"stake","amount":"232.260000000000000000"}]}`, }, { "text output", @@ -140,7 +144,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryValidatorOutstandingRewards() { }, false, `rewards: -- amount: "1164.240000000000000000" +- amount: "232.260000000000000000" denom: stake`, }, } @@ -192,7 +196,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryValidatorCommission() { fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, false, - `{"commission":[{"denom":"stake","amount":"464.520000000000000000"}]}`, + `{"commission":[{"denom":"stake","amount":"116.130000000000000000"}]}`, }, { "text output", @@ -203,7 +207,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryValidatorCommission() { }, false, `commission: -- amount: "464.520000000000000000" +- amount: "116.130000000000000000" denom: stake`, }, } @@ -345,7 +349,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryDelegatorRewards() { fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, false, - fmt.Sprintf(`{"rewards":[{"validator_address":"%s","reward":[{"denom":"stake","amount":"387.100000000000000000"}]}],"total":[{"denom":"stake","amount":"387.100000000000000000"}]}`, valAddr.String()), + fmt.Sprintf(`{"rewards":[{"validator_address":"%s","reward":[{"denom":"stake","amount":"193.550000000000000000"}]}],"total":[{"denom":"stake","amount":"193.550000000000000000"}]}`, valAddr.String()), }, { "json output (specific validator)", @@ -355,7 +359,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryDelegatorRewards() { fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, false, - `{"rewards":[{"denom":"stake","amount":"387.100000000000000000"}]}`, + `{"rewards":[{"denom":"stake","amount":"193.550000000000000000"}]}`, }, { "text output", @@ -367,11 +371,11 @@ func (s *IntegrationTestSuite) TestGetCmdQueryDelegatorRewards() { false, fmt.Sprintf(`rewards: - reward: - - amount: "387.100000000000000000" + - amount: "193.550000000000000000" denom: stake validator_address: %s total: -- amount: "387.100000000000000000" +- amount: "193.550000000000000000" denom: stake`, valAddr.String()), }, { @@ -383,7 +387,7 @@ total: }, false, `rewards: -- amount: "387.100000000000000000" +- amount: "193.550000000000000000" denom: stake`, }, } @@ -685,7 +689,21 @@ func (s *IntegrationTestSuite) TestGetCmdSubmitProposal() { "deposit": -324foocoin }` + // fund some tokens to the community pool + args := []string{sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5431))).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String())} + invalidPropFile := testutil.WriteToNewTempFile(s.T(), invalidProp) + cmd := cli.NewFundCommunityPoolCmd() + out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, args) + s.Require().NoError(err) + + var txResp sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &txResp), out.String()) + s.Require().Equal(uint32(0), txResp.Code) validProp := fmt.Sprintf(`{ "title": "Community Pool Spend", @@ -709,7 +727,7 @@ func (s *IntegrationTestSuite) TestGetCmdSubmitProposal() { invalidPropFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), }, true, 0, nil, @@ -720,7 +738,7 @@ func (s *IntegrationTestSuite) TestGetCmdSubmitProposal() { validPropFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), // sync mode as there are no funds yet + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), }, false, 0, &sdk.TxResponse{}, diff --git a/x/distribution/client/testutil/withdraw_all_suite.go b/x/distribution/client/testutil/withdraw_all_suite.go new file mode 100644 index 00000000..7b459a4d --- /dev/null +++ b/x/distribution/client/testutil/withdraw_all_suite.go @@ -0,0 +1,123 @@ +package testutil + +import ( + "fmt" + "strings" + + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + banktestutil "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" + "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" + stakingcli "github.com/cosmos/cosmos-sdk/x/staking/client/cli" + "github.com/stretchr/testify/suite" +) + +type WithdrawAllTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network +} + +func (s *WithdrawAllTestSuite) SetupSuite() { + cfg := network.DefaultConfig() + cfg.NumValidators = 2 + s.cfg = cfg + + s.T().Log("setting up integration test suite") + network, err := network.New(s.T(), s.T().TempDir(), s.cfg) + s.Require().NoError(err) + s.network = network + + _, err = s.network.WaitForHeight(1) + s.Require().NoError(err) +} + +// TearDownSuite cleans up the curret test network after _each_ test. +func (s *WithdrawAllTestSuite) TearDownSuite() { + s.T().Log("tearing down integration test suite") + s.network.Cleanup() +} + +// This test requires multiple validators, if I add this test to `IntegrationTestSuite` by increasing +// `NumValidators` the existing tests are leading to non-determnism so created new suite for this test. +func (s *WithdrawAllTestSuite) TestNewWithdrawAllRewardsGenerateOnly() { + require := s.Require() + val := s.network.Validators[0] + val1 := s.network.Validators[1] + clientCtx := val.ClientCtx + + info, _, err := val.ClientCtx.Keyring.NewMnemonic("newAccount", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + require.NoError(err) + + pubkey, err := info.GetPubKey() + require.NoError(err) + + newAddr := sdk.AccAddress(pubkey.Address()) + _, err = banktestutil.MsgSendExec( + val.ClientCtx, + val.Address, + newAddr, + sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(2000))), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + ) + require.NoError(err) + + // delegate 500 tokens to validator1 + args := []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(500)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + } + cmd := stakingcli.NewDelegateCmd() + _, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args) + require.NoError(err) + + // delegate 500 tokens to validator2 + args = []string{ + val1.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(500)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + } + _, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args) + require.NoError(err) + + args = []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + fmt.Sprintf("--%s=1", cli.FlagMaxMessagesPerTx), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + } + cmd = cli.NewWithdrawAllRewardsCmd() + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, args) + require.NoError(err) + // expect 2 transactions in the generated file when --max-msgs in a tx set 1. + s.Require().Equal(2, len(strings.Split(strings.Trim(out.String(), "\n"), "\n"))) + + args = []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + fmt.Sprintf("--%s=2", cli.FlagMaxMessagesPerTx), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + } + cmd = cli.NewWithdrawAllRewardsCmd() + out, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args) + require.NoError(err) + // expect 1 transaction in the generated file when --max-msgs in a tx set 2, since there are only delegations. + s.Require().Equal(1, len(strings.Split(strings.Trim(out.String(), "\n"), "\n"))) +} diff --git a/x/distribution/keeper/allocation_test.go b/x/distribution/keeper/allocation_test.go index 73fe27dd..c6c5a01c 100644 --- a/x/distribution/keeper/allocation_test.go +++ b/x/distribution/keeper/allocation_test.go @@ -11,6 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/bank/testutil" simapp "github.com/iqlusioninc/liquidity-staking-module/app" + distrtypes "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -48,6 +49,9 @@ func TestAllocateTokensToManyValidators(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + // reset fee pool + app.DistrKeeper.SetFeePool(ctx, distrtypes.InitialFeePool()) + addrs := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1234)) valAddrs := simapp.ConvertAddrsToValAddrs(addrs) tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) @@ -119,6 +123,9 @@ func TestAllocateTokensTruncation(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + // reset fee pool + app.DistrKeeper.SetFeePool(ctx, distrtypes.InitialFeePool()) + addrs := simapp.AddTestAddrs(app, ctx, 3, sdk.NewInt(1234)) valAddrs := simapp.ConvertAddrsToValAddrs(addrs) tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) diff --git a/x/distribution/keeper/delegation.go b/x/distribution/keeper/delegation.go index 5aa761c4..d1a276bb 100644 --- a/x/distribution/keeper/delegation.go +++ b/x/distribution/keeper/delegation.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution/types" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) @@ -139,7 +140,7 @@ func (k Keeper) CalculateDelegationRewards(ctx sdk.Context, val sdkstaking.Valid func (k Keeper) withdrawDelegationRewards(ctx sdk.Context, val sdkstaking.ValidatorI, del sdkstaking.DelegationI) (sdk.Coins, error) { // check existence of delegator starting info if !k.HasDelegatorStartingInfo(ctx, del.GetValidatorAddr(), del.GetDelegatorAddr()) { - return nil, types.ErrEmptyDelegationDistInfo + return nil, sdkdistr.ErrEmptyDelegationDistInfo } // end current period and calculate rewards diff --git a/x/distribution/keeper/delegation_test.go b/x/distribution/keeper/delegation_test.go index 089f8c98..25c7d1aa 100644 --- a/x/distribution/keeper/delegation_test.go +++ b/x/distribution/keeper/delegation_test.go @@ -20,6 +20,9 @@ import ( func TestCalculateRewardsBasic(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + + app.DistrKeeper.DeleteAllValidatorHistoricalRewards(ctx) + tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1000)) @@ -392,6 +395,8 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + app.DistrKeeper.DeleteAllValidatorHistoricalRewards(ctx) + balancePower := int64(1000) balanceTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, balancePower) addr := simapp.AddTestAddrs(app, ctx, 1, sdk.NewInt(1000000000)) @@ -605,6 +610,8 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + app.DistrKeeper.DeleteAllValidatorHistoricalRewards(ctx) + tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1000000000)) valAddrs := simapp.ConvertAddrsToValAddrs(addr) @@ -745,3 +752,72 @@ func TestCalculateRewardsMultiDelegatorMultWithdraw(t *testing.T) { // commission should be zero require.True(t, app.DistrKeeper.GetValidatorAccumulatedCommission(ctx, valAddrs[0]).Commission.IsZero()) } + +func Test100PercentCommissionReward(t *testing.T) { + app := simapp.Setup(t, false) + ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + + tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) + addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(1000000000)) + valAddrs := simapp.ConvertAddrsToValAddrs(addr) + initial := int64(20) + + // set module account coins + distrAcc := app.DistrKeeper.GetDistributionAccount(ctx) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, distrAcc.GetName(), sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000))))) + app.AccountKeeper.SetModuleAccount(ctx, distrAcc) + + tokens := sdk.DecCoins{sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(initial))} + + // create validator with 100% commission + tstaking.Commission = stakingtypes.NewCommissionRates(sdk.NewDecWithPrec(10, 1), sdk.NewDecWithPrec(10, 1), sdk.NewDec(0)) + tstaking.CreateValidator(valAddrs[0], valConsPk1, sdk.NewInt(100), true) + app.StakingKeeper.Delegation(ctx, sdk.AccAddress(valAddrs[0]), valAddrs[0]) + + // end block to bond validator + staking.EndBlocker(ctx, app.StakingKeeper) + // next block + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + + // fetch validator + val := app.StakingKeeper.Validator(ctx, valAddrs[0]) + + // allocate some rewards + app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) + + // end block + staking.EndBlocker(ctx, app.StakingKeeper) + + // next block + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + + // allocate some more rewards + app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) + + // next block + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + + // allocate some more rewards + app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) + + rewards, err := app.DistrKeeper.WithdrawDelegationRewards(ctx, sdk.AccAddress(valAddrs[0]), valAddrs[0]) + require.NoError(t, err) + + denom, _ := sdk.GetBaseDenom() + zeroRewards := sdk.Coins{ + sdk.Coin{ + Denom: denom, + Amount: sdk.ZeroInt(), + }, + } + require.True(t, rewards.IsEqual(zeroRewards)) + events := ctx.EventManager().Events() + lastEvent := events[len(events)-1] + hasValue := false + for _, attr := range lastEvent.Attributes { + if string(attr.Key) == "amount" && string(attr.Value) == "0" { + hasValue = true + } + } + require.True(t, hasValue) +} diff --git a/x/distribution/keeper/fee_pool.go b/x/distribution/keeper/fee_pool.go index 2294258e..c75d9413 100644 --- a/x/distribution/keeper/fee_pool.go +++ b/x/distribution/keeper/fee_pool.go @@ -2,6 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" + sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) @@ -15,7 +16,7 @@ func (k Keeper) DistributeFromFeePool(ctx sdk.Context, amount sdk.Coins, receive // must be reduced separately from the SendCoinsFromModuleToAccount call newPool, negative := feePool.CommunityPool.SafeSub(sdk.NewDecCoinsFromCoins(amount...)) if negative { - return types.ErrBadDistribution + return sdkdistr.ErrBadDistribution } feePool.CommunityPool = newPool diff --git a/x/distribution/keeper/grpc_query.go b/x/distribution/keeper/grpc_query.go index 800d5b1f..a96d471b 100644 --- a/x/distribution/keeper/grpc_query.go +++ b/x/distribution/keeper/grpc_query.go @@ -10,6 +10,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/query" + sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution/types" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) @@ -138,7 +139,7 @@ func (k Keeper) DelegationRewards(c context.Context, req *types.QueryDelegationR val := k.stakingKeeper.Validator(ctx, valAdr) if val == nil { - return nil, sdkerrors.Wrap(types.ErrNoValidatorExists, req.ValidatorAddress) + return nil, sdkerrors.Wrap(sdkdistr.ErrNoValidatorExists, req.ValidatorAddress) } delAdr, err := sdk.AccAddressFromBech32(req.DelegatorAddress) @@ -147,7 +148,7 @@ func (k Keeper) DelegationRewards(c context.Context, req *types.QueryDelegationR } del := k.stakingKeeper.Delegation(ctx, delAdr, valAdr) if del == nil { - return nil, types.ErrNoDelegationExists + return nil, sdkdistr.ErrNoDelegationExists } endingPeriod := k.IncrementValidatorPeriod(ctx, val) diff --git a/x/distribution/keeper/grpc_query_test.go b/x/distribution/keeper/grpc_query_test.go index 318055f2..0c291ce1 100644 --- a/x/distribution/keeper/grpc_query_test.go +++ b/x/distribution/keeper/grpc_query_test.go @@ -603,6 +603,8 @@ func (suite *KeeperTestSuite) TestGRPCDelegatorWithdrawAddress() { func (suite *KeeperTestSuite) TestGRPCCommunityPool() { app, ctx, queryClient, addrs := suite.app, suite.ctx, suite.queryClient, suite.addrs + // reset fee pool + app.DistrKeeper.SetFeePool(ctx, types.InitialFeePool()) var ( req *types.QueryCommunityPoolRequest diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index a1330019..1c324931 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -17,13 +17,14 @@ var _ stakingtypes.StakingHooks = Hooks{} func (k Keeper) Hooks() Hooks { return Hooks{k} } // initialize validator distribution record -func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { +func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error { val := h.k.stakingKeeper.Validator(ctx, valAddr) h.k.initializeValidator(ctx, val) + return nil } // AfterValidatorRemoved performs clean up after a validator is removed -func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr sdk.ValAddress) { +func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr sdk.ValAddress) error { // fetch outstanding outstanding := h.k.GetValidatorOutstandingRewardsCoins(ctx, valAddr) @@ -47,7 +48,7 @@ func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr withdrawAddr := h.k.GetDelegatorWithdrawAddr(ctx, accAddr) if err := h.k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, withdrawAddr, coins); err != nil { - panic(err) + return err } } } @@ -73,42 +74,56 @@ func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, _ sdk.ConsAddress, valAddr // clear current rewards h.k.DeleteValidatorCurrentRewards(ctx, valAddr) + + return nil } -func (h Hooks) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) { +func (h Hooks) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) error { err := h.k.WithdrawSingleShareRecordReward(ctx, recordId) if err != nil { h.k.Logger(ctx).Error(err.Error()) } + return err } // increment period -func (h Hooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (h Hooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { val := h.k.stakingKeeper.Validator(ctx, valAddr) - h.k.IncrementValidatorPeriod(ctx, val) + _ = h.k.IncrementValidatorPeriod(ctx, val) + return nil } // withdraw delegation rewards (which also increments period) -func (h Hooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (h Hooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { val := h.k.stakingKeeper.Validator(ctx, valAddr) del := h.k.stakingKeeper.Delegation(ctx, delAddr, valAddr) if _, err := h.k.withdrawDelegationRewards(ctx, val, del); err != nil { - panic(err) + return err } + + return nil } // create new delegation period record -func (h Hooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (h Hooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { h.k.initializeDelegation(ctx, valAddr, delAddr) + return nil } // record the slash event -func (h Hooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) { +func (h Hooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) error { h.k.updateValidatorSlashFraction(ctx, valAddr, fraction) + return nil } -func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) {} -func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) {} -func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) {} -func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} +func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) error { return nil } +func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) error { + return nil +} +func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) error { + return nil +} +func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { + return nil +} diff --git a/x/distribution/keeper/keeper.go b/x/distribution/keeper/keeper.go index c0f83871..58f74a6d 100644 --- a/x/distribution/keeper/keeper.go +++ b/x/distribution/keeper/keeper.go @@ -9,6 +9,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) @@ -31,7 +32,7 @@ type Keeper struct { func NewKeeper( cdc codec.BinaryCodec, key storetypes.StoreKey, paramSpace paramtypes.Subspace, ak types.AccountKeeper, bk types.BankKeeper, sk types.StakingKeeper, - feeCollectorName string, blockedAddrs map[string]bool, + feeCollectorName string, ) Keeper { // ensure distribution module account is set @@ -52,7 +53,6 @@ func NewKeeper( bankKeeper: bk, stakingKeeper: sk, feeCollectorName: feeCollectorName, - blockedAddrs: blockedAddrs, } } @@ -63,12 +63,12 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger { // SetWithdrawAddr sets a new address that will receive the rewards upon withdrawal func (k Keeper) SetWithdrawAddr(ctx sdk.Context, delegatorAddr sdk.AccAddress, withdrawAddr sdk.AccAddress) error { - if k.blockedAddrs[withdrawAddr.String()] { + if k.bankKeeper.BlockedAddr(withdrawAddr) { return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive external funds", withdrawAddr) } if !k.GetWithdrawAddrEnabled(ctx) { - return types.ErrSetWithdrawAddrDisabled + return sdkdistr.ErrSetWithdrawAddrDisabled } ctx.EventManager().EmitEvent( @@ -86,12 +86,12 @@ func (k Keeper) SetWithdrawAddr(ctx sdk.Context, delegatorAddr sdk.AccAddress, w func (k Keeper) WithdrawDelegationRewards(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (sdk.Coins, error) { val := k.stakingKeeper.Validator(ctx, valAddr) if val == nil { - return nil, types.ErrNoValidatorDistInfo + return nil, sdkdistr.ErrNoValidatorDistInfo } del := k.stakingKeeper.Delegation(ctx, delAddr, valAddr) if del == nil { - return nil, types.ErrEmptyDelegationDistInfo + return nil, sdkdistr.ErrEmptyDelegationDistInfo } // withdraw rewards @@ -100,6 +100,14 @@ func (k Keeper) WithdrawDelegationRewards(ctx sdk.Context, delAddr sdk.AccAddres return nil, err } + if rewards.IsZero() { + baseDenom, _ := sdk.GetBaseDenom() + rewards = sdk.Coins{sdk.Coin{ + Denom: baseDenom, + Amount: sdk.ZeroInt(), + }} + } + ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeWithdrawRewards, @@ -118,7 +126,7 @@ func (k Keeper) WithdrawValidatorCommission(ctx sdk.Context, valAddr sdk.ValAddr // fetch validator accumulated commission accumCommission := k.GetValidatorAccumulatedCommission(ctx, valAddr) if accumCommission.Commission.IsZero() { - return nil, types.ErrNoValidatorCommission + return nil, sdkdistr.ErrNoValidatorCommission } commission, remainder := accumCommission.Commission.TruncateDecimal() diff --git a/x/distribution/keeper/keeper_test.go b/x/distribution/keeper/keeper_test.go index 7e7039d7..90dcafc3 100644 --- a/x/distribution/keeper/keeper_test.go +++ b/x/distribution/keeper/keeper_test.go @@ -112,6 +112,9 @@ func TestFundCommunityPool(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + // reset fee pool + app.DistrKeeper.SetFeePool(ctx, types.InitialFeePool()) + addr := simapp.AddTestAddrs(app, ctx, 2, sdk.ZeroInt()) amount := sdk.NewCoins(sdk.NewInt64Coin("stake", 100)) diff --git a/x/distribution/keeper/proposal_handler.go b/x/distribution/keeper/proposal_handler.go index 4e3ce217..ecbf75a0 100644 --- a/x/distribution/keeper/proposal_handler.go +++ b/x/distribution/keeper/proposal_handler.go @@ -8,15 +8,16 @@ import ( // HandleCommunityPoolSpendProposal is a handler for executing a passed community spend proposal func HandleCommunityPoolSpendProposal(ctx sdk.Context, k Keeper, p *types.CommunityPoolSpendProposal) error { - if k.blockedAddrs[p.Recipient] { - return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive external funds", p.Recipient) - } recipient, addrErr := sdk.AccAddressFromBech32(p.Recipient) if addrErr != nil { return addrErr } + if k.bankKeeper.BlockedAddr(recipient) { + return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive external funds", p.Recipient) + } + err := k.DistributeFromFeePool(ctx, p.Amount, recipient) if err != nil { return err diff --git a/x/distribution/keeper/querier.go b/x/distribution/keeper/querier.go index ca73bb76..827e332a 100644 --- a/x/distribution/keeper/querier.go +++ b/x/distribution/keeper/querier.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution/types" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" ) @@ -134,12 +135,12 @@ func queryDelegationRewards(ctx sdk.Context, _ []string, req abci.RequestQuery, val := k.stakingKeeper.Validator(ctx, params.ValidatorAddress) if val == nil { - return nil, sdkerrors.Wrap(types.ErrNoValidatorExists, params.ValidatorAddress.String()) + return nil, sdkerrors.Wrap(sdkdistr.ErrNoValidatorExists, params.ValidatorAddress.String()) } del := k.stakingKeeper.Delegation(ctx, params.DelegatorAddress, params.ValidatorAddress) if del == nil { - return nil, types.ErrNoDelegationExists + return nil, sdkdistr.ErrNoDelegationExists } endingPeriod := k.IncrementValidatorPeriod(ctx, val) diff --git a/x/distribution/keeper/querier_test.go b/x/distribution/keeper/querier_test.go index df1bbc7a..12e15382 100644 --- a/x/distribution/keeper/querier_test.go +++ b/x/distribution/keeper/querier_test.go @@ -119,6 +119,9 @@ func TestQueries(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + // reset fee pool + app.DistrKeeper.SetFeePool(ctx, types.InitialFeePool()) + addr := simapp.AddTestAddrs(app, ctx, 1, sdk.NewInt(1000000000)) valAddrs := simapp.ConvertAddrsToValAddrs(addr) valOpAddr1 := valAddrs[0] diff --git a/x/distribution/migrations/v034/types.go b/x/distribution/migrations/v034/types.go new file mode 100644 index 00000000..e32b92a5 --- /dev/null +++ b/x/distribution/migrations/v034/types.go @@ -0,0 +1,100 @@ +// Package v034 is used for legacy migration scripts. Actual migration scripts +// for v034 have been removed, but the v039->v042 migration script still +// references types from this file, so we're keeping it for now. +// DONTCOVER +package v034 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// ---------------------------------------------------------------------------- +// Types and Constants +// ---------------------------------------------------------------------------- + +const ( + ModuleName = "distr" +) + +type ( + ValidatorAccumulatedCommission = sdk.DecCoins + + DelegatorStartingInfo struct { + PreviousPeriod uint64 `json:"previous_period"` + Stake sdk.Dec `json:"stake"` + Height uint64 `json:"height"` + } + + DelegatorWithdrawInfo struct { + DelegatorAddress sdk.AccAddress `json:"delegator_address"` + WithdrawAddress sdk.AccAddress `json:"withdraw_address"` + } + + ValidatorOutstandingRewardsRecord struct { + ValidatorAddress sdk.ValAddress `json:"validator_address"` + OutstandingRewards sdk.DecCoins `json:"outstanding_rewards"` + } + + ValidatorAccumulatedCommissionRecord struct { + ValidatorAddress sdk.ValAddress `json:"validator_address"` + Accumulated ValidatorAccumulatedCommission `json:"accumulated"` + } + + ValidatorHistoricalRewardsRecord struct { + ValidatorAddress sdk.ValAddress `json:"validator_address"` + Period uint64 `json:"period"` + Rewards ValidatorHistoricalRewards `json:"rewards"` + } + + ValidatorHistoricalRewards struct { + CumulativeRewardRatio sdk.DecCoins `json:"cumulative_reward_ratio"` + ReferenceCount uint16 `json:"reference_count"` + } + + ValidatorCurrentRewards struct { + Rewards sdk.DecCoins `json:"rewards"` + Period uint64 `json:"period"` + } + + ValidatorCurrentRewardsRecord struct { + ValidatorAddress sdk.ValAddress `json:"validator_address"` + Rewards ValidatorCurrentRewards `json:"rewards"` + } + + DelegatorStartingInfoRecord struct { + DelegatorAddress sdk.AccAddress `json:"delegator_address"` + ValidatorAddress sdk.ValAddress `json:"validator_address"` + StartingInfo DelegatorStartingInfo `json:"starting_info"` + } + + ValidatorSlashEventRecord struct { + ValidatorAddress sdk.ValAddress `json:"validator_address"` + Height uint64 `json:"height"` + Event ValidatorSlashEvent `json:"validator_slash_event"` + } + + FeePool struct { + CommunityPool sdk.DecCoins `json:"community_pool"` + } + + ValidatorSlashEvent struct { + ValidatorPeriod uint64 `json:"validator_period"` + Fraction sdk.Dec `json:"fraction"` + } + + GenesisState struct { + FeePool FeePool `json:"fee_pool"` + CommunityTax sdk.Dec `json:"community_tax"` + BaseProposerReward sdk.Dec `json:"base_proposer_reward"` + BonusProposerReward sdk.Dec `json:"bonus_proposer_reward"` + WithdrawAddrEnabled bool `json:"withdraw_addr_enabled"` + DelegatorWithdrawInfos []DelegatorWithdrawInfo `json:"delegator_withdraw_infos"` + PreviousProposer sdk.ConsAddress `json:"previous_proposer"` + OutstandingRewards []ValidatorOutstandingRewardsRecord `json:"outstanding_rewards"` + ValidatorAccumulatedCommissions []ValidatorAccumulatedCommissionRecord `json:"validator_accumulated_commissions"` + ValidatorHistoricalRewards []ValidatorHistoricalRewardsRecord `json:"validator_historical_rewards"` + ValidatorCurrentRewards []ValidatorCurrentRewardsRecord `json:"validator_current_rewards"` + DelegatorStartingInfos []DelegatorStartingInfoRecord `json:"delegator_starting_infos"` + ValidatorSlashEvents []ValidatorSlashEventRecord `json:"validator_slash_events"` + } +) diff --git a/x/distribution/migrations/v036/types.go b/x/distribution/migrations/v036/types.go new file mode 100644 index 00000000..df1e55a9 --- /dev/null +++ b/x/distribution/migrations/v036/types.go @@ -0,0 +1,136 @@ +// Package v036 is used for legacy migration scripts. Actual migration scripts +// for v036 have been removed, but the v039->v042 migration script still +// references types from this file, so we're keeping it for now. +// DONTCOVER +package v036 + +import ( + "fmt" + "strings" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v034" + "github.com/cosmos/cosmos-sdk/x/distribution/types" + v036gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v036" +) + +// ---------------------------------------------------------------------------- +// Types and Constants +// ---------------------------------------------------------------------------- + +const ( + ModuleName = "distribution" + + // RouterKey is the message route for distribution + RouterKey = ModuleName + + // ProposalTypeCommunityPoolSpend defines the type for a CommunityPoolSpendProposal + ProposalTypeCommunityPoolSpend = "CommunityPoolSpend" +) + +type ( + ValidatorAccumulatedCommission = sdk.DecCoins + + ValidatorSlashEventRecord struct { + ValidatorAddress sdk.ValAddress `json:"validator_address"` + Height uint64 `json:"height"` + Period uint64 `json:"period"` + Event v034distr.ValidatorSlashEvent `json:"validator_slash_event"` + } + + GenesisState struct { + FeePool v034distr.FeePool `json:"fee_pool"` + CommunityTax sdk.Dec `json:"community_tax"` + BaseProposerReward sdk.Dec `json:"base_proposer_reward"` + BonusProposerReward sdk.Dec `json:"bonus_proposer_reward"` + WithdrawAddrEnabled bool `json:"withdraw_addr_enabled"` + DelegatorWithdrawInfos []v034distr.DelegatorWithdrawInfo `json:"delegator_withdraw_infos"` + PreviousProposer sdk.ConsAddress `json:"previous_proposer"` + OutstandingRewards []v034distr.ValidatorOutstandingRewardsRecord `json:"outstanding_rewards"` + ValidatorAccumulatedCommissions []v034distr.ValidatorAccumulatedCommissionRecord `json:"validator_accumulated_commissions"` + ValidatorHistoricalRewards []v034distr.ValidatorHistoricalRewardsRecord `json:"validator_historical_rewards"` + ValidatorCurrentRewards []v034distr.ValidatorCurrentRewardsRecord `json:"validator_current_rewards"` + DelegatorStartingInfos []v034distr.DelegatorStartingInfoRecord `json:"delegator_starting_infos"` + ValidatorSlashEvents []ValidatorSlashEventRecord `json:"validator_slash_events"` + } + + // CommunityPoolSpendProposal spends from the community pool + CommunityPoolSpendProposal struct { + Title string `json:"title" yaml:"title"` + Description string `json:"description" yaml:"description"` + Recipient sdk.AccAddress `json:"recipient" yaml:"recipient"` + Amount sdk.Coins `json:"amount" yaml:"amount"` + } +) + +func NewGenesisState( + feePool v034distr.FeePool, communityTax, baseProposerReward, bonusProposerReward sdk.Dec, + withdrawAddrEnabled bool, dwis []v034distr.DelegatorWithdrawInfo, pp sdk.ConsAddress, + r []v034distr.ValidatorOutstandingRewardsRecord, acc []v034distr.ValidatorAccumulatedCommissionRecord, + historical []v034distr.ValidatorHistoricalRewardsRecord, cur []v034distr.ValidatorCurrentRewardsRecord, + dels []v034distr.DelegatorStartingInfoRecord, slashes []ValidatorSlashEventRecord, +) GenesisState { + + return GenesisState{ + FeePool: feePool, + CommunityTax: communityTax, + BaseProposerReward: baseProposerReward, + BonusProposerReward: bonusProposerReward, + WithdrawAddrEnabled: withdrawAddrEnabled, + DelegatorWithdrawInfos: dwis, + PreviousProposer: pp, + OutstandingRewards: r, + ValidatorAccumulatedCommissions: acc, + ValidatorHistoricalRewards: historical, + ValidatorCurrentRewards: cur, + DelegatorStartingInfos: dels, + ValidatorSlashEvents: slashes, + } +} + +var _ v036gov.Content = CommunityPoolSpendProposal{} + +// GetTitle returns the title of a community pool spend proposal. +func (csp CommunityPoolSpendProposal) GetTitle() string { return csp.Title } + +// GetDescription returns the description of a community pool spend proposal. +func (csp CommunityPoolSpendProposal) GetDescription() string { return csp.Description } + +// GetDescription returns the routing key of a community pool spend proposal. +func (csp CommunityPoolSpendProposal) ProposalRoute() string { return RouterKey } + +// ProposalType returns the type of a community pool spend proposal. +func (csp CommunityPoolSpendProposal) ProposalType() string { return ProposalTypeCommunityPoolSpend } + +// ValidateBasic runs basic stateless validity checks +func (csp CommunityPoolSpendProposal) ValidateBasic() error { + err := v036gov.ValidateAbstract(csp) + if err != nil { + return err + } + if !csp.Amount.IsValid() { + return types.ErrInvalidProposalAmount + } + if csp.Recipient.Empty() { + return types.ErrEmptyProposalRecipient + } + + return nil +} + +// String implements the Stringer interface. +func (csp CommunityPoolSpendProposal) String() string { + var b strings.Builder + b.WriteString(fmt.Sprintf(`Community Pool Spend Proposal: + Title: %s + Description: %s + Recipient: %s + Amount: %s +`, csp.Title, csp.Description, csp.Recipient, csp.Amount)) + return b.String() +} + +func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil) +} diff --git a/x/distribution/migrations/v038/types.go b/x/distribution/migrations/v038/types.go new file mode 100644 index 00000000..cfdc0d50 --- /dev/null +++ b/x/distribution/migrations/v038/types.go @@ -0,0 +1,59 @@ +// Package v038 is used for legacy migration scripts. Actual migration scripts +// for v038 have been removed, but the v039->v042 migration script still +// references types from this file, so we're keeping it for now. +package v038 + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + v034distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v034" + v036distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v036" +) + +// DONTCOVER + +const ( + ModuleName = "distribution" +) + +type ( + GenesisState struct { + Params Params `json:"params" yaml:"params"` + FeePool v034distr.FeePool `json:"fee_pool"` + DelegatorWithdrawInfos []v034distr.DelegatorWithdrawInfo `json:"delegator_withdraw_infos"` + PreviousProposer sdk.ConsAddress `json:"previous_proposer" yaml:"previous_proposer"` + OutstandingRewards []v034distr.ValidatorOutstandingRewardsRecord `json:"outstanding_rewards"` + ValidatorAccumulatedCommissions []v034distr.ValidatorAccumulatedCommissionRecord `json:"validator_accumulated_commissions"` + ValidatorHistoricalRewards []v034distr.ValidatorHistoricalRewardsRecord `json:"validator_historical_rewards"` + ValidatorCurrentRewards []v034distr.ValidatorCurrentRewardsRecord `json:"validator_current_rewards"` + DelegatorStartingInfos []v034distr.DelegatorStartingInfoRecord `json:"delegator_starting_infos"` + ValidatorSlashEvents []v036distr.ValidatorSlashEventRecord `json:"validator_slash_events" yaml:"validator_slash_events"` + } + + Params struct { + CommunityTax sdk.Dec `json:"community_tax" yaml:"community_tax"` + BaseProposerReward sdk.Dec `json:"base_proposer_reward" yaml:"base_proposer_reward"` + BonusProposerReward sdk.Dec `json:"bonus_proposer_reward" yaml:"bonus_proposer_reward"` + WithdrawAddrEnabled bool `json:"withdraw_addr_enabled" yaml:"withdraw_addr_enabled"` + } +) + +func NewGenesisState( + params Params, feePool v034distr.FeePool, dwis []v034distr.DelegatorWithdrawInfo, pp sdk.ConsAddress, + r []v034distr.ValidatorOutstandingRewardsRecord, acc []v034distr.ValidatorAccumulatedCommissionRecord, + historical []v034distr.ValidatorHistoricalRewardsRecord, cur []v034distr.ValidatorCurrentRewardsRecord, + dels []v034distr.DelegatorStartingInfoRecord, slashes []v036distr.ValidatorSlashEventRecord, +) GenesisState { + + return GenesisState{ + FeePool: feePool, + Params: params, + DelegatorWithdrawInfos: dwis, + PreviousProposer: pp, + OutstandingRewards: r, + ValidatorAccumulatedCommissions: acc, + ValidatorHistoricalRewards: historical, + ValidatorCurrentRewards: cur, + DelegatorStartingInfos: dels, + ValidatorSlashEvents: slashes, + } +} diff --git a/x/distribution/migrations/v040/keys.go b/x/distribution/migrations/v040/keys.go new file mode 100644 index 00000000..db8b1548 --- /dev/null +++ b/x/distribution/migrations/v040/keys.go @@ -0,0 +1,187 @@ +// Package v040 is copy-pasted from: +// https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/distribution/types/keys.go +package v040 + +import ( + "encoding/binary" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/kv" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" +) + +const ( + // ModuleName is the module name constant used in many places + ModuleName = "distribution" + + // StoreKey is the store key string for distribution + StoreKey = ModuleName + + // RouterKey is the message route for distribution + RouterKey = ModuleName + + // QuerierRoute is the querier route for distribution + QuerierRoute = ModuleName +) + +// Keys for distribution store +// Items are stored with the following key: values +// +// - 0x00: FeePol +// +// - 0x01: sdk.ConsAddress +// +// - 0x02: ValidatorOutstandingRewards +// +// - 0x03: sdk.AccAddress +// +// - 0x04: DelegatorStartingInfo +// +// - 0x05: ValidatorHistoricalRewards +// +// - 0x06: ValidatorCurrentRewards +// +// - 0x07: ValidatorCurrentRewards +// +// - 0x08: ValidatorSlashEvent +var ( + FeePoolKey = []byte{0x00} // key for global distribution state + ProposerKey = []byte{0x01} // key for the proposer operator address + ValidatorOutstandingRewardsPrefix = []byte{0x02} // key for outstanding rewards + + DelegatorWithdrawAddrPrefix = []byte{0x03} // key for delegator withdraw address + DelegatorStartingInfoPrefix = []byte{0x04} // key for delegator starting info + ValidatorHistoricalRewardsPrefix = []byte{0x05} // key for historical validators rewards / stake + ValidatorCurrentRewardsPrefix = []byte{0x06} // key for current validator rewards + ValidatorAccumulatedCommissionPrefix = []byte{0x07} // key for accumulated validator commission + ValidatorSlashEventPrefix = []byte{0x08} // key for validator slash fraction +) + +// gets an address from a validator's outstanding rewards key +func GetValidatorOutstandingRewardsAddress(key []byte) (valAddr sdk.ValAddress) { + kv.AssertKeyAtLeastLength(key, 2) + addr := key[1:] + kv.AssertKeyLength(addr, v040auth.AddrLen) + return sdk.ValAddress(addr) +} + +// gets an address from a delegator's withdraw info key +func GetDelegatorWithdrawInfoAddress(key []byte) (delAddr sdk.AccAddress) { + kv.AssertKeyAtLeastLength(key, 2) + addr := key[1:] + kv.AssertKeyLength(addr, v040auth.AddrLen) + return sdk.AccAddress(addr) +} + +// gets the addresses from a delegator starting info key +func GetDelegatorStartingInfoAddresses(key []byte) (valAddr sdk.ValAddress, delAddr sdk.AccAddress) { + kv.AssertKeyAtLeastLength(key, 2+v040auth.AddrLen) + addr := key[1 : 1+v040auth.AddrLen] + kv.AssertKeyLength(addr, v040auth.AddrLen) + valAddr = sdk.ValAddress(addr) + addr = key[1+v040auth.AddrLen:] + kv.AssertKeyLength(addr, v040auth.AddrLen) + delAddr = sdk.AccAddress(addr) + return +} + +// gets the address & period from a validator's historical rewards key +func GetValidatorHistoricalRewardsAddressPeriod(key []byte) (valAddr sdk.ValAddress, period uint64) { + kv.AssertKeyAtLeastLength(key, 2+v040auth.AddrLen) + addr := key[1 : 1+v040auth.AddrLen] + kv.AssertKeyLength(addr, v040auth.AddrLen) + valAddr = sdk.ValAddress(addr) + b := key[1+v040auth.AddrLen:] + kv.AssertKeyLength(addr, 8) + period = binary.LittleEndian.Uint64(b) + return +} + +// gets the address from a validator's current rewards key +func GetValidatorCurrentRewardsAddress(key []byte) (valAddr sdk.ValAddress) { + kv.AssertKeyAtLeastLength(key, 2) + addr := key[1:] + kv.AssertKeyLength(addr, v040auth.AddrLen) + return sdk.ValAddress(addr) +} + +// gets the address from a validator's accumulated commission key +func GetValidatorAccumulatedCommissionAddress(key []byte) (valAddr sdk.ValAddress) { + kv.AssertKeyAtLeastLength(key, 2) + addr := key[1:] + kv.AssertKeyLength(addr, v040auth.AddrLen) + return sdk.ValAddress(addr) +} + +// gets the height from a validator's slash event key +func GetValidatorSlashEventAddressHeight(key []byte) (valAddr sdk.ValAddress, height uint64) { + kv.AssertKeyAtLeastLength(key, 2+v040auth.AddrLen) + addr := key[1 : 1+v040auth.AddrLen] + kv.AssertKeyLength(addr, v040auth.AddrLen) + valAddr = sdk.ValAddress(addr) + startB := 1 + v040auth.AddrLen + kv.AssertKeyAtLeastLength(key, startB+9) + b := key[startB : startB+8] // the next 8 bytes represent the height + height = binary.BigEndian.Uint64(b) + return +} + +// gets the outstanding rewards key for a validator +func GetValidatorOutstandingRewardsKey(valAddr sdk.ValAddress) []byte { + return append(ValidatorOutstandingRewardsPrefix, valAddr.Bytes()...) +} + +// gets the key for a delegator's withdraw addr +func GetDelegatorWithdrawAddrKey(delAddr sdk.AccAddress) []byte { + return append(DelegatorWithdrawAddrPrefix, delAddr.Bytes()...) +} + +// gets the key for a delegator's starting info +func GetDelegatorStartingInfoKey(v sdk.ValAddress, d sdk.AccAddress) []byte { + return append(append(DelegatorStartingInfoPrefix, v.Bytes()...), d.Bytes()...) +} + +// gets the prefix key for a validator's historical rewards +func GetValidatorHistoricalRewardsPrefix(v sdk.ValAddress) []byte { + return append(ValidatorHistoricalRewardsPrefix, v.Bytes()...) +} + +// gets the key for a validator's historical rewards +func GetValidatorHistoricalRewardsKey(v sdk.ValAddress, k uint64) []byte { + b := make([]byte, 8) + binary.LittleEndian.PutUint64(b, k) + return append(append(ValidatorHistoricalRewardsPrefix, v.Bytes()...), b...) +} + +// gets the key for a validator's current rewards +func GetValidatorCurrentRewardsKey(v sdk.ValAddress) []byte { + return append(ValidatorCurrentRewardsPrefix, v.Bytes()...) +} + +// gets the key for a validator's current commission +func GetValidatorAccumulatedCommissionKey(v sdk.ValAddress) []byte { + return append(ValidatorAccumulatedCommissionPrefix, v.Bytes()...) +} + +// gets the prefix key for a validator's slash fractions +func GetValidatorSlashEventPrefix(v sdk.ValAddress) []byte { + return append(ValidatorSlashEventPrefix, v.Bytes()...) +} + +// gets the prefix key for a validator's slash fraction (ValidatorSlashEventPrefix + height) +func GetValidatorSlashEventKeyPrefix(v sdk.ValAddress, height uint64) []byte { + heightBz := make([]byte, 8) + binary.BigEndian.PutUint64(heightBz, height) + return append( + ValidatorSlashEventPrefix, + append(v.Bytes(), heightBz...)..., + ) +} + +// gets the key for a validator's slash fraction +func GetValidatorSlashEventKey(v sdk.ValAddress, height, period uint64) []byte { + periodBz := make([]byte, 8) + binary.BigEndian.PutUint64(periodBz, period) + prefix := GetValidatorSlashEventKeyPrefix(v, height) + return append(prefix, periodBz...) +} diff --git a/x/distribution/migrations/v040/migrate.go b/x/distribution/migrations/v040/migrate.go new file mode 100644 index 00000000..a5024e44 --- /dev/null +++ b/x/distribution/migrations/v040/migrate.go @@ -0,0 +1,108 @@ +package v040 + +import ( + v038distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v038" + v040distribution "github.com/cosmos/cosmos-sdk/x/distribution/types" +) + +// Migrate accepts exported x/distribution genesis state from v0.38 and migrates it +// to v0.40 x/distribution genesis state. The migration includes: +// +// - Convert addresses from bytes to bech32 strings. +// - Re-encode in v0.40 GenesisState. +func Migrate(oldDistributionState v038distribution.GenesisState) *v040distribution.GenesisState { + newDelegatorWithdrawInfos := make([]v040distribution.DelegatorWithdrawInfo, len(oldDistributionState.DelegatorWithdrawInfos)) + for i, oldDelegatorWithdrawInfo := range oldDistributionState.DelegatorWithdrawInfos { + newDelegatorWithdrawInfos[i] = v040distribution.DelegatorWithdrawInfo{ + DelegatorAddress: oldDelegatorWithdrawInfo.DelegatorAddress.String(), + WithdrawAddress: oldDelegatorWithdrawInfo.WithdrawAddress.String(), + } + } + + newValidatorOutstandingRewards := make([]v040distribution.ValidatorOutstandingRewardsRecord, len(oldDistributionState.OutstandingRewards)) + for i, oldValidatorOutstandingReward := range oldDistributionState.OutstandingRewards { + newValidatorOutstandingRewards[i] = v040distribution.ValidatorOutstandingRewardsRecord{ + ValidatorAddress: oldValidatorOutstandingReward.ValidatorAddress.String(), + OutstandingRewards: oldValidatorOutstandingReward.OutstandingRewards, + } + } + + newValidatorAccumulatedCommissions := make([]v040distribution.ValidatorAccumulatedCommissionRecord, len(oldDistributionState.ValidatorAccumulatedCommissions)) + for i, oldValidatorAccumulatedCommission := range oldDistributionState.ValidatorAccumulatedCommissions { + newValidatorAccumulatedCommissions[i] = v040distribution.ValidatorAccumulatedCommissionRecord{ + ValidatorAddress: oldValidatorAccumulatedCommission.ValidatorAddress.String(), + Accumulated: v040distribution.ValidatorAccumulatedCommission{ + Commission: oldValidatorAccumulatedCommission.Accumulated, + }, + } + } + + newValidatorHistoricalRewards := make([]v040distribution.ValidatorHistoricalRewardsRecord, len(oldDistributionState.ValidatorHistoricalRewards)) + for i, oldValidatorHistoricalReward := range oldDistributionState.ValidatorHistoricalRewards { + newValidatorHistoricalRewards[i] = v040distribution.ValidatorHistoricalRewardsRecord{ + ValidatorAddress: oldValidatorHistoricalReward.ValidatorAddress.String(), + Period: oldValidatorHistoricalReward.Period, + Rewards: v040distribution.ValidatorHistoricalRewards{ + CumulativeRewardRatio: oldValidatorHistoricalReward.Rewards.CumulativeRewardRatio, + ReferenceCount: uint32(oldValidatorHistoricalReward.Rewards.ReferenceCount), + }, + } + } + + newValidatorCurrentRewards := make([]v040distribution.ValidatorCurrentRewardsRecord, len(oldDistributionState.ValidatorCurrentRewards)) + for i, oldValidatorCurrentReward := range oldDistributionState.ValidatorCurrentRewards { + newValidatorCurrentRewards[i] = v040distribution.ValidatorCurrentRewardsRecord{ + ValidatorAddress: oldValidatorCurrentReward.ValidatorAddress.String(), + Rewards: v040distribution.ValidatorCurrentRewards{ + Rewards: oldValidatorCurrentReward.Rewards.Rewards, + Period: oldValidatorCurrentReward.Rewards.Period, + }, + } + } + + newDelegatorStartingInfos := make([]v040distribution.DelegatorStartingInfoRecord, len(oldDistributionState.DelegatorStartingInfos)) + for i, oldDelegatorStartingInfo := range oldDistributionState.DelegatorStartingInfos { + newDelegatorStartingInfos[i] = v040distribution.DelegatorStartingInfoRecord{ + DelegatorAddress: oldDelegatorStartingInfo.DelegatorAddress.String(), + ValidatorAddress: oldDelegatorStartingInfo.ValidatorAddress.String(), + StartingInfo: v040distribution.DelegatorStartingInfo{ + PreviousPeriod: oldDelegatorStartingInfo.StartingInfo.PreviousPeriod, + Stake: oldDelegatorStartingInfo.StartingInfo.Stake, + Height: oldDelegatorStartingInfo.StartingInfo.Height, + }, + } + } + + newValidatorSlashEvents := make([]v040distribution.ValidatorSlashEventRecord, len(oldDistributionState.ValidatorSlashEvents)) + for i, oldValidatorSlashEvent := range oldDistributionState.ValidatorSlashEvents { + newValidatorSlashEvents[i] = v040distribution.ValidatorSlashEventRecord{ + ValidatorAddress: oldValidatorSlashEvent.ValidatorAddress.String(), + Height: oldValidatorSlashEvent.Height, + Period: oldValidatorSlashEvent.Period, + ValidatorSlashEvent: v040distribution.ValidatorSlashEvent{ + ValidatorPeriod: oldValidatorSlashEvent.Event.ValidatorPeriod, + Fraction: oldValidatorSlashEvent.Event.Fraction, + }, + } + } + + return &v040distribution.GenesisState{ + Params: v040distribution.Params{ + CommunityTax: oldDistributionState.Params.CommunityTax, + BaseProposerReward: oldDistributionState.Params.BaseProposerReward, + BonusProposerReward: oldDistributionState.Params.BonusProposerReward, + WithdrawAddrEnabled: oldDistributionState.Params.WithdrawAddrEnabled, + }, + FeePool: v040distribution.FeePool{ + CommunityPool: oldDistributionState.FeePool.CommunityPool, + }, + DelegatorWithdrawInfos: newDelegatorWithdrawInfos, + PreviousProposer: oldDistributionState.PreviousProposer.String(), + OutstandingRewards: newValidatorOutstandingRewards, + ValidatorAccumulatedCommissions: newValidatorAccumulatedCommissions, + ValidatorHistoricalRewards: newValidatorHistoricalRewards, + ValidatorCurrentRewards: newValidatorCurrentRewards, + DelegatorStartingInfos: newDelegatorStartingInfos, + ValidatorSlashEvents: newValidatorSlashEvents, + } +} diff --git a/x/distribution/migrations/v043/helpers.go b/x/distribution/migrations/v043/helpers.go new file mode 100644 index 00000000..18568221 --- /dev/null +++ b/x/distribution/migrations/v043/helpers.go @@ -0,0 +1,71 @@ +package v043 + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" +) + +// MigratePrefixAddress is a helper function that migrates all keys of format: +// prefix_bytes | address_bytes +// into format: +// prefix_bytes | address_len (1 byte) | address_bytes +func MigratePrefixAddress(store sdk.KVStore, prefixBz []byte) { + oldStore := prefix.NewStore(store, prefixBz) + + oldStoreIter := oldStore.Iterator(nil, nil) + defer oldStoreIter.Close() + + for ; oldStoreIter.Valid(); oldStoreIter.Next() { + addr := oldStoreIter.Key() + var newStoreKey = prefixBz + newStoreKey = append(newStoreKey, address.MustLengthPrefix(addr)...) + + // Set new key on store. Values don't change. + store.Set(newStoreKey, oldStoreIter.Value()) + oldStore.Delete(oldStoreIter.Key()) + } +} + +// MigratePrefixAddressBytes is a helper function that migrates all keys of format: +// prefix_bytes | address_bytes | arbitrary_bytes +// into format: +// prefix_bytes | address_len (1 byte) | address_bytes | arbitrary_bytes +func MigratePrefixAddressBytes(store sdk.KVStore, prefixBz []byte) { + oldStore := prefix.NewStore(store, prefixBz) + + oldStoreIter := oldStore.Iterator(nil, nil) + defer oldStoreIter.Close() + + for ; oldStoreIter.Valid(); oldStoreIter.Next() { + addr := oldStoreIter.Key()[:v040auth.AddrLen] + endBz := oldStoreIter.Key()[v040auth.AddrLen:] + newStoreKey := append(append(prefixBz, address.MustLengthPrefix(addr)...), endBz...) + + // Set new key on store. Values don't change. + store.Set(newStoreKey, oldStoreIter.Value()) + oldStore.Delete(oldStoreIter.Key()) + } +} + +// MigratePrefixAddressAddress is a helper function that migrates all keys of format: +// prefix_bytes | address_1_bytes | address_2_bytes +// into format: +// prefix_bytes | address_1_len (1 byte) | address_1_bytes | address_2_len (1 byte) | address_2_bytes +func MigratePrefixAddressAddress(store sdk.KVStore, prefixBz []byte) { + oldStore := prefix.NewStore(store, prefixBz) + + oldStoreIter := oldStore.Iterator(nil, nil) + defer oldStoreIter.Close() + + for ; oldStoreIter.Valid(); oldStoreIter.Next() { + addr1 := oldStoreIter.Key()[:v040auth.AddrLen] + addr2 := oldStoreIter.Key()[v040auth.AddrLen:] + newStoreKey := append(append(prefixBz, address.MustLengthPrefix(addr1)...), address.MustLengthPrefix(addr2)...) + + // Set new key on store. Values don't change. + store.Set(newStoreKey, oldStoreIter.Value()) + oldStore.Delete(oldStoreIter.Key()) + } +} diff --git a/x/distribution/migrations/v043/store.go b/x/distribution/migrations/v043/store.go new file mode 100644 index 00000000..b757c7f2 --- /dev/null +++ b/x/distribution/migrations/v043/store.go @@ -0,0 +1,24 @@ +package v043 + +import ( + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + v040distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v040" +) + +// MigrateStore performs in-place store migrations from v0.40 to v0.43. The +// migration includes: +// +// - Change addresses to be length-prefixed. +func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey) error { + store := ctx.KVStore(storeKey) + MigratePrefixAddress(store, v040distribution.ValidatorOutstandingRewardsPrefix) + MigratePrefixAddress(store, v040distribution.DelegatorWithdrawAddrPrefix) + MigratePrefixAddressAddress(store, v040distribution.DelegatorStartingInfoPrefix) + MigratePrefixAddressBytes(store, v040distribution.ValidatorHistoricalRewardsPrefix) + MigratePrefixAddress(store, v040distribution.ValidatorCurrentRewardsPrefix) + MigratePrefixAddress(store, v040distribution.ValidatorAccumulatedCommissionPrefix) + MigratePrefixAddressBytes(store, v040distribution.ValidatorSlashEventPrefix) + + return nil +} diff --git a/x/distribution/migrations/v043/store_test.go b/x/distribution/migrations/v043/store_test.go new file mode 100644 index 00000000..9804e97d --- /dev/null +++ b/x/distribution/migrations/v043/store_test.go @@ -0,0 +1,99 @@ +package v043_test + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" + v040distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v040" + v043distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v043" + "github.com/cosmos/cosmos-sdk/x/distribution/types" +) + +func TestStoreMigration(t *testing.T) { + distributionKey := sdk.NewKVStoreKey("distribution") + ctx := testutil.DefaultContext(distributionKey, sdk.NewTransientStoreKey("transient_test")) + store := ctx.KVStore(distributionKey) + + _, _, addr1 := testdata.KeyTestPubAddr() + valAddr := sdk.ValAddress(addr1) + _, _, addr2 := testdata.KeyTestPubAddr() + // Use dummy value for all keys. + value := []byte("foo") + + testCases := []struct { + name string + oldKey []byte + newKey []byte + }{ + { + "FeePoolKey", + v040distribution.FeePoolKey, + types.FeePoolKey, + }, + { + "ProposerKey", + v040distribution.ProposerKey, + types.ProposerKey, + }, + { + "ValidatorOutstandingRewards", + v040distribution.GetValidatorOutstandingRewardsKey(valAddr), + types.GetValidatorOutstandingRewardsKey(valAddr), + }, + { + "DelegatorWithdrawAddr", + v040distribution.GetDelegatorWithdrawAddrKey(addr2), + types.GetDelegatorWithdrawAddrKey(addr2), + }, + { + "DelegatorStartingInfo", + v040distribution.GetDelegatorStartingInfoKey(valAddr, addr2), + types.GetDelegatorStartingInfoKey(valAddr, addr2), + }, + { + "ValidatorHistoricalRewards", + v040distribution.GetValidatorHistoricalRewardsKey(valAddr, 6), + types.GetValidatorHistoricalRewardsKey(valAddr, 6), + }, + { + "ValidatorCurrentRewards", + v040distribution.GetValidatorCurrentRewardsKey(valAddr), + types.GetValidatorCurrentRewardsKey(valAddr), + }, + { + "ValidatorAccumulatedCommission", + v040distribution.GetValidatorAccumulatedCommissionKey(valAddr), + types.GetValidatorAccumulatedCommissionKey(valAddr), + }, + { + "ValidatorSlashEvent", + v040distribution.GetValidatorSlashEventKey(valAddr, 6, 8), + types.GetValidatorSlashEventKey(valAddr, 6, 8), + }, + } + + // Set all the old keys to the store + for _, tc := range testCases { + store.Set(tc.oldKey, value) + } + + // Run migrations. + err := v043distribution.MigrateStore(ctx, distributionKey) + require.NoError(t, err) + + // Make sure the new keys are set and old keys are deleted. + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + if !bytes.Equal(tc.oldKey, tc.newKey) { + require.Nil(t, store.Get(tc.oldKey)) + } + require.Equal(t, value, store.Get(tc.newKey)) + }) + } +} diff --git a/x/distribution/module.go b/x/distribution/module.go index 38e184a4..bb3b3783 100644 --- a/x/distribution/module.go +++ b/x/distribution/module.go @@ -6,9 +6,8 @@ import ( "fmt" "math/rand" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" abci "github.com/tendermint/tendermint/abci/types" @@ -69,7 +68,9 @@ func (AppModuleBasic) RegisterRESTRoutes(_ sdkclient.Context, _ *mux.Router) {} // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the distribution module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx sdkclient.Context, mux *runtime.ServeMux) { - types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) + if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)); err != nil { + panic(err) + } } // GetTxCmd returns the root tx command for the distribution module. @@ -121,9 +122,9 @@ func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { keeper.RegisterInvariants(ir, am.keeper) } -// Route returns the message routing key for the distribution module. +// Deprecated: Route returns the message routing key for the distribution module. func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) + return sdk.Route{} } // QuerierRoute returns the distribution module's querier route name. diff --git a/x/distribution/module_test.go b/x/distribution/module_test.go index e31a3ffb..3012fbb9 100644 --- a/x/distribution/module_test.go +++ b/x/distribution/module_test.go @@ -5,7 +5,10 @@ import ( "github.com/stretchr/testify/require" abcitypes "github.com/tendermint/tendermint/abci/types" + tmjson "github.com/tendermint/tendermint/libs/json" + "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + dbm "github.com/tendermint/tm-db" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" @@ -13,16 +16,22 @@ import ( ) func TestItCreatesModuleAccountOnInitBlock(t *testing.T) { - app := simapp.Setup(t, false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + db := dbm.NewMemDB() + encCdc := simapp.MakeTestEncodingConfig() + app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, encCdc, simapp.EmptyAppOptions{}) + + genesisState := simapp.GenesisStateWithSingleValidator(t, app) + stateBytes, err := tmjson.Marshal(genesisState) + require.NoError(t, err) app.InitChain( abcitypes.RequestInitChain{ - AppStateBytes: []byte("{}"), + AppStateBytes: stateBytes, ChainId: "test-chain-id", }, ) + ctx := app.BaseApp.NewContext(false, tmproto.Header{}) acc := app.AccountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.ModuleName)) require.NotNil(t, acc) } diff --git a/x/distribution/proposal_handler_test.go b/x/distribution/proposal_handler_test.go index b594588a..4e71bb77 100644 --- a/x/distribution/proposal_handler_test.go +++ b/x/distribution/proposal_handler_test.go @@ -58,6 +58,9 @@ func TestProposalHandlerFailed(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + // reset fee pool + app.DistrKeeper.SetFeePool(ctx, types.InitialFeePool()) + recipient := delAddr1 account := app.AccountKeeper.NewAccountWithAddress(ctx, recipient) diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index 16b7036c..91cdee85 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -4,6 +4,8 @@ import ( "math/rand" "testing" + "github.com/cosmos/cosmos-sdk/codec/legacy" + "github.com/stretchr/testify/suite" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" @@ -42,7 +44,6 @@ func (suite *SimTestSuite) TestWeightedOperations() { {simappparams.DefaultWeightMsgWithdrawDelegationReward, types.ModuleName, types.TypeMsgWithdrawDelegatorReward}, {simappparams.DefaultWeightMsgWithdrawValidatorCommission, types.ModuleName, types.TypeMsgWithdrawValidatorCommission}, {simappparams.DefaultWeightMsgFundCommunityPool, types.ModuleName, types.TypeMsgFundCommunityPool}, - {simappparams.DefaultWeightMsgWithdrawDelegationReward, types.ModuleName, types.TypeMsgWithdrawTokenizeShareRecordReward}, } for i, w := range weightesOps { @@ -74,7 +75,7 @@ func (suite *SimTestSuite) TestSimulateMsgSetWithdrawAddress() { suite.Require().NoError(err) var msg types.MsgSetWithdrawAddress - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) suite.Require().True(operationMsg.OK) suite.Require().Equal("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) @@ -115,7 +116,7 @@ func (suite *SimTestSuite) TestSimulateMsgWithdrawDelegatorReward() { suite.Require().NoError(err) var msg types.MsgWithdrawDelegatorReward - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) suite.Require().True(operationMsg.OK) suite.Require().Equal("cosmosvaloper1l4s054098kk9hmr5753c6k3m2kw65h686d3mhr", msg.ValidatorAddress) @@ -158,9 +159,11 @@ func (suite *SimTestSuite) testSimulateMsgWithdrawValidatorCommission(tokenName ) suite.app.DistrKeeper.SetValidatorOutstandingRewards(suite.ctx, validator0.GetOperator(), types.ValidatorOutstandingRewards{Rewards: valCommission}) + suite.app.DistrKeeper.SetValidatorOutstandingRewards(suite.ctx, suite.genesisVals[0].GetOperator(), types.ValidatorOutstandingRewards{Rewards: valCommission}) // setup validator accumulated commission suite.app.DistrKeeper.SetValidatorAccumulatedCommission(suite.ctx, validator0.GetOperator(), types.ValidatorAccumulatedCommission{Commission: valCommission}) + suite.app.DistrKeeper.SetValidatorAccumulatedCommission(suite.ctx, suite.genesisVals[0].GetOperator(), types.ValidatorAccumulatedCommission{Commission: valCommission}) // begin a new block suite.app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: suite.app.LastBlockHeight() + 1, AppHash: suite.app.LastCommitID().Hash}}) @@ -168,16 +171,20 @@ func (suite *SimTestSuite) testSimulateMsgWithdrawValidatorCommission(tokenName // execute operation op := simulation.SimulateMsgWithdrawValidatorCommission(suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.DistrKeeper, suite.app.StakingKeeper) operationMsg, futureOperations, err := op(r, suite.app.BaseApp, suite.ctx, accounts, "") - suite.Require().NoError(err) - - var msg types.MsgWithdrawValidatorCommission - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) - - suite.Require().True(operationMsg.OK) - suite.Require().Equal("cosmosvaloper1tnh2q55v8wyygtt9srz5safamzdengsn9dsd7z", msg.ValidatorAddress) - suite.Require().Equal(types.TypeMsgWithdrawValidatorCommission, msg.Type()) - suite.Require().Equal(types.ModuleName, msg.Route()) - suite.Require().Len(futureOperations, 0) + if !operationMsg.OK { + suite.Require().Equal("could not find account", operationMsg.Comment) + } else { + suite.Require().NoError(err) + + var msg types.MsgWithdrawValidatorCommission + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) + + suite.Require().True(operationMsg.OK) + suite.Require().Equal("cosmosvaloper1tnh2q55v8wyygtt9srz5safamzdengsn9dsd7z", msg.ValidatorAddress) + suite.Require().Equal(types.TypeMsgWithdrawValidatorCommission, msg.Type()) + suite.Require().Equal(types.ModuleName, msg.Route()) + suite.Require().Len(futureOperations, 0) + } } // TestSimulateMsgFundCommunityPool tests the normal scenario of a valid message of type TypeMsgFundCommunityPool. @@ -197,7 +204,7 @@ func (suite *SimTestSuite) TestSimulateMsgFundCommunityPool() { suite.Require().NoError(err) var msg types.MsgFundCommunityPool - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) suite.Require().True(operationMsg.OK) suite.Require().Equal("4896096stake", msg.Amount.String()) @@ -210,8 +217,9 @@ func (suite *SimTestSuite) TestSimulateMsgFundCommunityPool() { type SimTestSuite struct { suite.Suite - ctx sdk.Context - app *simapp.SimApp + ctx sdk.Context + app *simapp.SimApp + genesisVals []stakingtypes.Validator } func (suite *SimTestSuite) SetupTest() { @@ -219,6 +227,9 @@ func (suite *SimTestSuite) SetupTest() { app := simapp.Setup(suite.T(), checkTx) suite.app = app suite.ctx = app.BaseApp.NewContext(checkTx, tmproto.Header{}) + genesisVals := app.StakingKeeper.GetAllValidators(suite.ctx) + suite.Require().Len(genesisVals, 1) + suite.genesisVals = genesisVals } func (suite *SimTestSuite) getTestingAccounts(r *rand.Rand, n int) []simtypes.Account { diff --git a/x/distribution/spec/03_begin_block.md b/x/distribution/spec/03_begin_block.md index bf279759..0b68aa79 100644 --- a/x/distribution/spec/03_begin_block.md +++ b/x/distribution/spec/03_begin_block.md @@ -9,9 +9,9 @@ the distribution `ModuleAccount` account. When a delegator or validator withdraws their rewards, they are taken out of the `ModuleAccount`. During begin block, the different claims on the fees collected are updated as follows: -- The block proposer of the previous height and its delegators receive between 1% and 5% of fee rewards. -- The reserve community tax is charged. -- The remainder is distributed proportionally by voting power to all bonded validators +* The block proposer of the previous height and its delegators receive between 1% and 5% of fee rewards. +* The reserve community tax is charged. +* The remainder is distributed proportionally by voting power to all bonded validators To incentivize validators to wait and include additional pre-commits in the block, the block proposer reward is calculated from Tendermint pre-commit messages. @@ -45,7 +45,7 @@ only bonded validators can supply valid precommits) and is always larger than Any remaining fees are distributed among all the bonded validators, including the proposer, in proportion to their consensus power. -``` +```text powFrac = validator power / total bonded validator power proposerMul = baseproposerreward + bonusproposerreward * P voteMul = 1 - communitytax - proposerMul @@ -79,7 +79,7 @@ blocks. Then hold `(precommits included) / (total bonded validator power)` constant so that the amortized block reward for the validator is `( validator power / total bonded power) * (1 - community tax rate)` of the total rewards. Consequently, the reward for a single delegator is: -``` +```text (delegator proportion of the validator power / validator power) * (validator power / total bonded power) * (1 - community tax rate) * (1 - validator commision rate) = (delegator proportion of the validator power / total bonded power) * (1 - diff --git a/x/distribution/spec/04_messages.md b/x/distribution/spec/04_messages.md index ecd68116..2017a570 100644 --- a/x/distribution/spec/04_messages.md +++ b/x/distribution/spec/04_messages.md @@ -47,7 +47,7 @@ Taking the slashes into account requires iteration. Let `F(X)` be the fraction a validator is to be slashed for a slashing event that happened at period `X`. If the validator was slashed at periods `P1, ..., PN`, where `A < P1`, `PN < B`, the distribution module calculates the individual delegator's rewards, `T(A, B)`, as follows: -``` +```go stake := initial stake rewards := 0 previous := A diff --git a/x/distribution/spec/08_client.md b/x/distribution/spec/08_client.md new file mode 100644 index 00000000..8e547ba4 --- /dev/null +++ b/x/distribution/spec/08_client.md @@ -0,0 +1,469 @@ + + +# Client + +## CLI + +A user can query and interact with the `distribution` module using the CLI. + +### Query + +The `query` commands allow users to query `distribution` state. + +```sh +simd query distribution --help +``` + +#### commission + +The `commission` command allows users to query validator commission rewards by address. + +```sh +simd query distribution commission [address] [flags] +``` + +Example: + +```sh +simd query distribution commission cosmosvaloper1.. +``` + +Example Output: + +```yml +commission: +- amount: "1000000.000000000000000000" + denom: stake +``` + +#### community-pool + +The `community-pool` command allows users to query all coin balances within the community pool. + +```sh +simd query distribution community-pool [flags] +``` + +Example: + +```sh +simd query distribution community-pool +``` + +Example Output: + +```yml +pool: +- amount: "1000000.000000000000000000" + denom: stake +``` + +#### params + +The `params` command allows users to query the parameters of the `distribution` module. + +```sh +simd query distribution params [flags] +``` + +Example: + +```sh +simd query distribution params +``` + +Example Output: + +```yml +base_proposer_reward: "0.010000000000000000" +bonus_proposer_reward: "0.040000000000000000" +community_tax: "0.020000000000000000" +withdraw_addr_enabled: true +``` + +#### rewards + +The `rewards` command allows users to query delegator rewards. Users can optionally include the validator address to query rewards earned from a specific validator. + +```sh +simd query distribution rewards [delegator-addr] [validator-addr] [flags] +``` + +Example: + +```sh +simd query distribution rewards cosmos1.. +``` + +Example Output: + +```yml +rewards: +- reward: + - amount: "1000000.000000000000000000" + denom: stake + validator_address: cosmosvaloper1.. +total: +- amount: "1000000.000000000000000000" + denom: stake +``` + +#### slashes + +The `slashes` command allows users to query all slashes for a given block range. + +```sh +simd query distribution slashes [validator] [start-height] [end-height] [flags] +``` + +Example: + +```sh +simd query distribution slashes cosmosvaloper1.. 1 1000 +``` + +Example Output: + +```yml +pagination: + next_key: null + total: "0" +slashes: +- validator_period: 20, + fraction: "0.009999999999999999" +``` + +#### validator-outstanding-rewards + +The `validator-outstanding-rewards` command allows users to query all outstanding (un-withdrawn) rewards for a validator and all their delegations. + +```sh +simd query distribution validator-outstanding-rewards [validator] [flags] +``` + +Example: + +```sh +simd query distribution validator-outstanding-rewards cosmosvaloper1.. +``` + +Example Output: + +```yml +rewards: +- amount: "1000000.000000000000000000" + denom: stake +``` + +### Transactions + +The `tx` commands allow users to interact with the `distribution` module. + +```sh +simd tx distribution --help +``` + +#### fund-community-pool + +The `fund-community-pool` command allows users to send funds to the community pool. + +```sh +simd tx distribution fund-community-pool [amount] [flags] +``` + +Example: + +```sh +simd tx distribution fund-community-pool 100stake --from cosmos1.. +``` + +#### set-withdraw-addr + +The `set-withdraw-addr` command allows users to set the withdraw address for rewards associated with a delegator address. + +```sh +simd tx distribution set-withdraw-addr [withdraw-addr] [flags] +``` + +Example: + +```sh +simd tx distribution set-withdraw-addr cosmos1.. --from cosmos1.. +``` + +#### withdraw-all-rewards + +The `withdraw-all-rewards` command allows users to withdraw all rewards for a delegator. + +```sh +simd tx distribution withdraw-all-rewards [flags] +``` + +Example: + +```sh +simd tx distribution withdraw-all-rewards --from cosmos1.. +``` + +#### withdraw-rewards + +The `withdraw-rewards` command allows users to withdraw all rewards from a given delegation address, +and optionally withdraw validator commission if the delegation address given is a validator operator and the user proves the `--commision` flag. + +```sh +simd tx distribution withdraw-rewards [validator-addr] [flags] +``` + +Example: + +```sh +simd tx distribution withdraw-rewards cosmosvaloper1.. --from cosmos1.. --commision +``` + +## gRPC + +A user can query the `distribution` module using gRPC endpoints. + +### Params + +The `Params` endpoint allows users to query parameters of the `distribution` module. + +Example: + +```sh +grpcurl -plaintext \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/Params +``` + +Example Output: + +```json +{ + "params": { + "communityTax": "20000000000000000", + "baseProposerReward": "10000000000000000", + "bonusProposerReward": "40000000000000000", + "withdrawAddrEnabled": true + } +} +``` + +### ValidatorOutstandingRewards + +The `ValidatorOutstandingRewards` endpoint allows users to query rewards of a validator address. + +Example: + +```sh +grpcurl -plaintext \ + -d '{"validator_address":"cosmosvalop1.."}' \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/ValidatorOutstandingRewards +``` + +Example Output: + +```json +{ + "rewards": { + "rewards": [ + { + "denom": "stake", + "amount": "1000000000000000" + } + ] + } +} +``` + +### ValidatorCommission + +The `ValidatorCommission` endpoint allows users to query accumulated commission for a validator. + +Example: + +```sh +grpcurl -plaintext \ + -d '{"validator_address":"cosmosvalop1.."}' \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/ValidatorCommission +``` + +Example Output: + +```json +{ + "commission": { + "commission": [ + { + "denom": "stake", + "amount": "1000000000000000" + } + ] + } +} +``` + +### ValidatorSlashes + +The `ValidatorSlashes` endpoint allows users to query slash events of a validator. + +Example: + +```sh +grpcurl -plaintext \ + -d '{"validator_address":"cosmosvalop1.."}' \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/ValidatorSlashes +``` + +Example Output: + +```json +{ + "slashes": [ + { + "validator_period": "20", + "fraction": "0.009999999999999999" + } + ], + "pagination": { + "total": "1" + } +} +``` + +### DelegationRewards + +The `DelegationRewards` endpoint allows users to query the total rewards accrued by a delegation. + +Example: + +```sh +grpcurl -plaintext \ + -d '{"delegator_address":"cosmos1..","validator_address":"cosmosvalop1.."}' \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/DelegationRewards +``` + +Example Output: + +```json +{ + "rewards": [ + { + "denom": "stake", + "amount": "1000000000000000" + } + ] +} +``` + +### DelegationTotalRewards + +The `DelegationTotalRewards` endpoint allows users to query the total rewards accrued by each validator. + +Example: + +```sh +grpcurl -plaintext \ + -d '{"delegator_address":"cosmos1.."}' \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/DelegationTotalRewards +``` + +Example Output: + +```json +{ + "rewards": [ + { + "validatorAddress": "cosmosvaloper1..", + "reward": [ + { + "denom": "stake", + "amount": "1000000000000000" + } + ] + } + ], + "total": [ + { + "denom": "stake", + "amount": "1000000000000000" + } + ] +} +``` + +### DelegatorValidators + +The `DelegatorValidators` endpoint allows users to query all validators for given delegator. + +Example: + +```sh +grpcurl -plaintext \ + -d '{"delegator_address":"cosmos1.."}' \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/DelegatorValidators +``` + +Example Output: + +```json +{ + "validators": [ + "cosmosvaloper1.." + ] +} +``` + +### DelegatorWithdrawAddress + +The `DelegatorWithdrawAddress` endpoint allows users to query the withdraw address of a delegator. + +Example: + +```sh +grpcurl -plaintext \ + -d '{"delegator_address":"cosmos1.."}' \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/DelegatorWithdrawAddress +``` + +Example Output: + +```json +{ + "withdrawAddress": "cosmos1.." +} +``` + +### CommunityPool + +The `CommunityPool` endpoint allows users to query the community pool coins. + +Example: + +```sh +grpcurl -plaintext \ + localhost:9090 \ + cosmos.distribution.v1beta1.Query/CommunityPool +``` + +Example Output: + +```json +{ + "pool": [ + { + "denom": "stake", + "amount": "1000000000000000000" + } + ] +} +``` diff --git a/x/distribution/types/codec.go b/x/distribution/types/codec.go index e64a9cf4..9c5d8456 100644 --- a/x/distribution/types/codec.go +++ b/x/distribution/types/codec.go @@ -2,8 +2,8 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/legacy" "github.com/cosmos/cosmos-sdk/codec/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/msgservice" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" @@ -12,11 +12,11 @@ import ( // RegisterLegacyAminoCodec registers the necessary x/distribution interfaces and concrete types // on the provided LegacyAmino codec. These types are used for Amino JSON serialization. func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - cdc.RegisterConcrete(&MsgWithdrawDelegatorReward{}, "cosmos-sdk/MsgWithdrawDelegationReward", nil) - cdc.RegisterConcrete(&MsgWithdrawValidatorCommission{}, "cosmos-sdk/MsgWithdrawValidatorCommission", nil) - cdc.RegisterConcrete(&MsgSetWithdrawAddress{}, "cosmos-sdk/MsgModifyWithdrawAddress", nil) - cdc.RegisterConcrete(&MsgFundCommunityPool{}, "cosmos-sdk/MsgFundCommunityPool", nil) - cdc.RegisterConcrete(&CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil) + // cdc.RegisterConcrete(&MsgWithdrawDelegatorReward{}, "cosmos-sdk/MsgWithdrawDelegationReward", nil) + // cdc.RegisterConcrete(&MsgWithdrawValidatorCommission{}, "cosmos-sdk/MsgWithdrawValidatorCommission", nil) + // cdc.RegisterConcrete(&MsgSetWithdrawAddress{}, "cosmos-sdk/MsgModifyWithdrawAddress", nil) + // cdc.RegisterConcrete(&MsgFundCommunityPool{}, "cosmos-sdk/MsgFundCommunityPool", nil) + // cdc.RegisterConcrete(&CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil) cdc.RegisterConcrete(&MsgWithdrawTokenizeShareRecordReward{}, "cosmos-sdk/MsgWithdrawTokenizeShareRecordReward", nil) } @@ -37,20 +37,6 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } -var ( - amino = codec.NewLegacyAmino() - - // ModuleCdc references the global x/distribution module codec. Note, the codec - // should ONLY be used in certain instances of tests and for JSON encoding as Amino - // is still used for that purpose. - // - // The actual codec used for serialization should be provided to x/distribution and - // defined at the application level. - ModuleCdc = codec.NewAminoCodec(amino) -) - func init() { - RegisterLegacyAminoCodec(amino) - cryptocodec.RegisterCrypto(amino) - amino.Seal() + RegisterLegacyAminoCodec(legacy.Cdc) } diff --git a/x/distribution/types/errors.go b/x/distribution/types/errors.go index f67b647b..ff400459 100644 --- a/x/distribution/types/errors.go +++ b/x/distribution/types/errors.go @@ -1,21 +1,21 @@ package types -import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) +// import ( +// sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +// ) // x/distribution module sentinel errors -var ( - ErrEmptyDelegatorAddr = sdkerrors.New(ModuleName, 2, "delegator address is empty") - ErrEmptyWithdrawAddr = sdkerrors.New(ModuleName, 3, "withdraw address is empty") - ErrEmptyValidatorAddr = sdkerrors.New(ModuleName, 4, "validator address is empty") - ErrEmptyDelegationDistInfo = sdkerrors.New(ModuleName, 5, "no delegation distribution info") - ErrNoValidatorDistInfo = sdkerrors.New(ModuleName, 6, "no validator distribution info") - ErrNoValidatorCommission = sdkerrors.New(ModuleName, 7, "no validator commission to withdraw") - ErrSetWithdrawAddrDisabled = sdkerrors.New(ModuleName, 8, "set withdraw address disabled") - ErrBadDistribution = sdkerrors.New(ModuleName, 9, "community pool does not have sufficient coins to distribute") - ErrInvalidProposalAmount = sdkerrors.New(ModuleName, 10, "invalid community pool spend proposal amount") - ErrEmptyProposalRecipient = sdkerrors.New(ModuleName, 11, "invalid community pool spend proposal recipient") - ErrNoValidatorExists = sdkerrors.New(ModuleName, 12, "validator does not exist") - ErrNoDelegationExists = sdkerrors.New(ModuleName, 13, "delegation does not exist") -) +// var ( +// ErrEmptyDelegatorAddr = sdkerrors.Register(ModuleName, 2, "delegator address is empty") +// ErrEmptyWithdrawAddr = sdkerrors.Register(ModuleName, 3, "withdraw address is empty") +// ErrEmptyValidatorAddr = sdkerrors.Register(ModuleName, 4, "validator address is empty") +// ErrEmptyDelegationDistInfo = sdkerrors.Register(ModuleName, 5, "no delegation distribution info") +// ErrNoValidatorDistInfo = sdkerrors.Register(ModuleName, 6, "no validator distribution info") +// ErrNoValidatorCommission = sdkerrors.Register(ModuleName, 7, "no validator commission to withdraw") +// ErrSetWithdrawAddrDisabled = sdkerrors.Register(ModuleName, 8, "set withdraw address disabled") +// ErrBadDistribution = sdkerrors.Register(ModuleName, 9, "community pool does not have sufficient coins to distribute") +// ErrInvalidProposalAmount = sdkerrors.Register(ModuleName, 10, "invalid community pool spend proposal amount") +// ErrEmptyProposalRecipient = sdkerrors.Register(ModuleName, 11, "invalid community pool spend proposal recipient") +// ErrNoValidatorExists = sdkerrors.Register(ModuleName, 12, "validator does not exist") +// ErrNoDelegationExists = sdkerrors.Register(ModuleName, 13, "delegation does not exist") +// ) diff --git a/x/distribution/types/expected_keepers.go b/x/distribution/types/expected_keepers.go index 2f19d23b..065d9fa8 100644 --- a/x/distribution/types/expected_keepers.go +++ b/x/distribution/types/expected_keepers.go @@ -29,6 +29,8 @@ type BankKeeper interface { SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error + + BlockedAddr(addr sdk.AccAddress) bool } // StakingKeeper expected staking keeper (noalias) @@ -49,7 +51,7 @@ type StakingKeeper interface { ValidatorByConsAddr(sdk.Context, sdk.ConsAddress) sdkstaking.ValidatorI // get a particular validator by consensus address // slash the validator and delegators of the validator, specifying offence height, offence power, and slash fraction - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) sdk.Int Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator diff --git a/x/distribution/types/keys.go b/x/distribution/types/keys.go index d28ba2d6..e0458459 100644 --- a/x/distribution/types/keys.go +++ b/x/distribution/types/keys.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/address" + "github.com/cosmos/cosmos-sdk/types/kv" ) const ( @@ -60,10 +61,9 @@ func GetValidatorOutstandingRewardsAddress(key []byte) (valAddr sdk.ValAddress) // 0x02 // Remove prefix and address length. + kv.AssertKeyAtLeastLength(key, 3) addr := key[2:] - if len(addr) != int(key[1]) { - panic("unexpected key length") - } + kv.AssertKeyLength(addr, int(key[1])) return sdk.ValAddress(addr) } @@ -74,10 +74,9 @@ func GetDelegatorWithdrawInfoAddress(key []byte) (delAddr sdk.AccAddress) { // 0x03 // Remove prefix and address length. + kv.AssertKeyAtLeastLength(key, 3) addr := key[2:] - if len(addr) != int(key[1]) { - panic("unexpected key length") - } + kv.AssertKeyLength(addr, int(key[1])) return sdk.AccAddress(addr) } @@ -86,13 +85,14 @@ func GetDelegatorWithdrawInfoAddress(key []byte) (delAddr sdk.AccAddress) { func GetDelegatorStartingInfoAddresses(key []byte) (valAddr sdk.ValAddress, delAddr sdk.AccAddress) { // key is in the format: // 0x04 + kv.AssertKeyAtLeastLength(key, 2) valAddrLen := int(key[1]) + kv.AssertKeyAtLeastLength(key, 3+valAddrLen) valAddr = sdk.ValAddress(key[2 : 2+valAddrLen]) delAddrLen := int(key[2+valAddrLen]) + kv.AssertKeyAtLeastLength(key, 4+valAddrLen) delAddr = sdk.AccAddress(key[3+valAddrLen:]) - if len(delAddr.Bytes()) != delAddrLen { - panic("unexpected key length") - } + kv.AssertKeyLength(delAddr.Bytes(), delAddrLen) return } @@ -101,12 +101,12 @@ func GetDelegatorStartingInfoAddresses(key []byte) (valAddr sdk.ValAddress, delA func GetValidatorHistoricalRewardsAddressPeriod(key []byte) (valAddr sdk.ValAddress, period uint64) { // key is in the format: // 0x05 + kv.AssertKeyAtLeastLength(key, 2) valAddrLen := int(key[1]) + kv.AssertKeyAtLeastLength(key, 3+valAddrLen) valAddr = sdk.ValAddress(key[2 : 2+valAddrLen]) b := key[2+valAddrLen:] - if len(b) != 8 { - panic("unexpected key length") - } + kv.AssertKeyLength(b, 8) period = binary.LittleEndian.Uint64(b) return } @@ -117,10 +117,9 @@ func GetValidatorCurrentRewardsAddress(key []byte) (valAddr sdk.ValAddress) { // 0x06: ValidatorCurrentRewards // Remove prefix and address length. + kv.AssertKeyAtLeastLength(key, 3) addr := key[2:] - if len(addr) != int(key[1]) { - panic("unexpected key length") - } + kv.AssertKeyLength(addr, int(key[1])) return sdk.ValAddress(addr) } @@ -131,10 +130,9 @@ func GetValidatorAccumulatedCommissionAddress(key []byte) (valAddr sdk.ValAddres // 0x07: ValidatorCurrentRewards // Remove prefix and address length. + kv.AssertKeyAtLeastLength(key, 3) addr := key[2:] - if len(addr) != int(key[1]) { - panic("unexpected key length") - } + kv.AssertKeyLength(addr, int(key[1])) return sdk.ValAddress(addr) } @@ -143,9 +141,12 @@ func GetValidatorAccumulatedCommissionAddress(key []byte) (valAddr sdk.ValAddres func GetValidatorSlashEventAddressHeight(key []byte) (valAddr sdk.ValAddress, height uint64) { // key is in the format: // 0x08: ValidatorSlashEvent + kv.AssertKeyAtLeastLength(key, 2) valAddrLen := int(key[1]) + kv.AssertKeyAtLeastLength(key, 3+valAddrLen) valAddr = key[2 : 2+valAddrLen] startB := 2 + valAddrLen + kv.AssertKeyAtLeastLength(key, startB+9) b := key[startB : startB+8] // the next 8 bytes represent the height height = binary.BigEndian.Uint64(b) return diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 99511a2a..25701f81 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -1,6 +1,7 @@ package types import ( + "github.com/cosmos/cosmos-sdk/codec/legacy" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) @@ -30,26 +31,23 @@ func (msg MsgSetWithdrawAddress) Type() string { return TypeMsgSetWithdrawAddre // Return address that must sign over msg.GetSignBytes() func (msg MsgSetWithdrawAddress) GetSigners() []sdk.AccAddress { - delAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) - if err != nil { - panic(err) - } - return []sdk.AccAddress{delAddr} + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + return []sdk.AccAddress{delegator} } // get the bytes for the message signer to sign on func (msg MsgSetWithdrawAddress) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } // quick validity check func (msg MsgSetWithdrawAddress) ValidateBasic() error { - if msg.DelegatorAddress == "" { - return ErrEmptyDelegatorAddr + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) } - if msg.WithdrawAddress == "" { - return ErrEmptyWithdrawAddr + if _, err := sdk.AccAddressFromBech32(msg.WithdrawAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid withdraw address: %s", err) } return nil @@ -67,26 +65,23 @@ func (msg MsgWithdrawDelegatorReward) Type() string { return TypeMsgWithdrawDel // Return address that must sign over msg.GetSignBytes() func (msg MsgWithdrawDelegatorReward) GetSigners() []sdk.AccAddress { - delAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) - if err != nil { - panic(err) - } - return []sdk.AccAddress{delAddr} + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + return []sdk.AccAddress{delegator} } // get the bytes for the message signer to sign on func (msg MsgWithdrawDelegatorReward) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } // quick validity check func (msg MsgWithdrawDelegatorReward) ValidateBasic() error { - if msg.DelegatorAddress == "" { - return ErrEmptyDelegatorAddr + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) } - if msg.ValidatorAddress == "" { - return ErrEmptyValidatorAddr + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } return nil } @@ -102,23 +97,20 @@ func (msg MsgWithdrawValidatorCommission) Type() string { return TypeMsgWithdra // Return address that must sign over msg.GetSignBytes() func (msg MsgWithdrawValidatorCommission) GetSigners() []sdk.AccAddress { - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) - if err != nil { - panic(err) - } - return []sdk.AccAddress{valAddr.Bytes()} + valAddr, _ := sdk.ValAddressFromBech32(msg.ValidatorAddress) + return []sdk.AccAddress{sdk.AccAddress(valAddr)} } // get the bytes for the message signer to sign on func (msg MsgWithdrawValidatorCommission) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } // quick validity check func (msg MsgWithdrawValidatorCommission) ValidateBasic() error { - if msg.ValidatorAddress == "" { - return ErrEmptyValidatorAddr + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } return nil } @@ -141,17 +133,14 @@ func (msg MsgFundCommunityPool) Type() string { return TypeMsgFundCommunityPool // GetSigners returns the signer addresses that are expected to sign the result // of GetSignBytes. func (msg MsgFundCommunityPool) GetSigners() []sdk.AccAddress { - depoAddr, err := sdk.AccAddressFromBech32(msg.Depositor) - if err != nil { - panic(err) - } - return []sdk.AccAddress{depoAddr} + depositor, _ := sdk.AccAddressFromBech32(msg.Depositor) + return []sdk.AccAddress{depositor} } // GetSignBytes returns the raw bytes for a MsgFundCommunityPool message that // the expected signer needs to sign. func (msg MsgFundCommunityPool) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } @@ -160,10 +149,9 @@ func (msg MsgFundCommunityPool) ValidateBasic() error { if !msg.Amount.IsValid() { return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) } - if msg.Depositor == "" { - return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Depositor) + if _, err := sdk.AccAddressFromBech32(msg.Depositor); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid depositor address: %s", err) } - return nil } @@ -186,7 +174,7 @@ func (msg MsgWithdrawTokenizeShareRecordReward) GetSigners() []sdk.AccAddress { // get the bytes for the message signer to sign on func (msg MsgWithdrawTokenizeShareRecordReward) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } diff --git a/x/distribution/types/params.go b/x/distribution/types/params.go index 212b0b99..a4ea2dde 100644 --- a/x/distribution/types/params.go +++ b/x/distribution/types/params.go @@ -3,7 +3,7 @@ package types import ( "fmt" - yaml "gopkg.in/yaml.v2" + "sigs.k8s.io/yaml" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" diff --git a/x/distribution/types/proposal.go b/x/distribution/types/proposal.go index 74c2a0d0..2829df25 100644 --- a/x/distribution/types/proposal.go +++ b/x/distribution/types/proposal.go @@ -5,6 +5,7 @@ import ( "strings" sdk "github.com/cosmos/cosmos-sdk/types" + sdkdistr "github.com/cosmos/cosmos-sdk/x/distribution/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) @@ -22,7 +23,7 @@ func init() { // govtypes.RegisterProposalTypeCodec(&CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal") } -// NewCommunityPoolSpendProposal creates a new community pool spned proposal. +// NewCommunityPoolSpendProposal creates a new community pool spend proposal. //nolint:interfacer func NewCommunityPoolSpendProposal(title, description string, recipient sdk.AccAddress, amount sdk.Coins) *CommunityPoolSpendProposal { return &CommunityPoolSpendProposal{title, description, recipient.String(), amount} @@ -47,10 +48,10 @@ func (csp *CommunityPoolSpendProposal) ValidateBasic() error { return err } if !csp.Amount.IsValid() { - return ErrInvalidProposalAmount + return sdkdistr.ErrInvalidProposalAmount } if csp.Recipient == "" { - return ErrEmptyProposalRecipient + return sdkdistr.ErrEmptyProposalRecipient } return nil diff --git a/x/slashing/README.md b/x/slashing/README.md new file mode 100644 index 00000000..9f79636b --- /dev/null +++ b/x/slashing/README.md @@ -0,0 +1,7 @@ + + +# Slashing + +* [Slashing](spec/README.md) - validator punishment mechanisms. diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 5f215e1e..7ff82387 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -13,6 +13,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + sdkslashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" @@ -91,5 +92,5 @@ func TestSlashingMsgs(t *testing.T) { _, res, err := simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{unjailMsg}, "", []uint64{0}, []uint64{1}, false, false, priv1) require.Error(t, err) require.Nil(t, res) - require.True(t, errors.Is(types.ErrValidatorNotJailed, err)) + require.True(t, errors.Is(sdkslashingtypes.ErrValidatorNotJailed, err)) } diff --git a/x/slashing/client/testutil/grpc.go b/x/slashing/client/testutil/grpc.go new file mode 100644 index 00000000..fc41baf9 --- /dev/null +++ b/x/slashing/client/testutil/grpc.go @@ -0,0 +1,102 @@ +package testutil + +import ( + "fmt" + "time" + + "github.com/gogo/protobuf/proto" + + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/cosmos/cosmos-sdk/x/slashing/types" +) + +func (s *IntegrationTestSuite) TestGRPCQueries() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + consAddr := sdk.ConsAddress(val.PubKey.Address()).String() + + testCases := []struct { + name string + url string + headers map[string]string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "get signing infos (height specific)", + fmt.Sprintf("%s/cosmos/slashing/v1beta1/signing_infos", baseURL), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "1", + }, + false, + &types.QuerySigningInfosResponse{}, + &types.QuerySigningInfosResponse{ + Info: []types.ValidatorSigningInfo{ + { + Address: sdk.ConsAddress(val.PubKey.Address()).String(), + JailedUntil: time.Unix(0, 0), + }, + }, + Pagination: &query.PageResponse{ + Total: uint64(1), + }, + }, + }, + { + "get signing info (height specific)", + fmt.Sprintf("%s/cosmos/slashing/v1beta1/signing_infos/%s", baseURL, consAddr), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "1", + }, + false, + &types.QuerySigningInfoResponse{}, + &types.QuerySigningInfoResponse{ + ValSigningInfo: types.ValidatorSigningInfo{ + Address: sdk.ConsAddress(val.PubKey.Address()).String(), + JailedUntil: time.Unix(0, 0), + }, + }, + }, + { + "get signing info wrong address", + fmt.Sprintf("%s/cosmos/slashing/v1beta1/signing_infos/%s", baseURL, "wrongAddress"), + map[string]string{}, + true, + &types.QuerySigningInfoResponse{}, + nil, + }, + { + "params", + fmt.Sprintf("%s/cosmos/slashing/v1beta1/params", baseURL), + map[string]string{}, + false, + &types.QueryParamsResponse{}, + &types.QueryParamsResponse{ + Params: types.DefaultParams(), + }, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) + s.Require().NoError(err) + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType) + + if tc.expErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} diff --git a/x/slashing/handler.go b/x/slashing/handler.go deleted file mode 100644 index b23d66c9..00000000 --- a/x/slashing/handler.go +++ /dev/null @@ -1,26 +0,0 @@ -package slashing - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/keeper" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" -) - -// NewHandler creates an sdk.Handler for all the slashing type messages -func NewHandler(k keeper.Keeper) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - ctx = ctx.WithEventManager(sdk.NewEventManager()) - - msgServer := keeper.NewMsgServerImpl(k) - - switch msg := msg.(type) { - case *types.MsgUnjail: - res, err := msgServer.Unjail(sdk.WrapSDKContext(ctx), msg) - return sdk.WrapServiceResult(ctx, res, err) - - default: - return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized %s message type: %T", types.ModuleName, msg) - } - } -} diff --git a/x/slashing/handler_test.go b/x/slashing/handler_test.go deleted file mode 100644 index b88bc8bd..00000000 --- a/x/slashing/handler_test.go +++ /dev/null @@ -1,295 +0,0 @@ -package slashing_test - -import ( - "errors" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" - simapp "github.com/iqlusioninc/liquidity-staking-module/app" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/keeper" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/testslashing" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" - "github.com/iqlusioninc/liquidity-staking-module/x/staking" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" -) - -func TestCannotUnjailUnlessJailed(t *testing.T) { - // initial setup - app := simapp.Setup(t, false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - pks := simapp.CreateTestPubKeys(1) - simapp.AddTestAddrsFromPubKeys(app, ctx, pks, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) - - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - slh := slashing.NewHandler(app.SlashingKeeper) - addr, val := sdk.ValAddress(pks[0].Address()), pks[0] - - amt := tstaking.CreateValidatorWithValPower(addr, val, 100, true) - staking.EndBlocker(ctx, app.StakingKeeper) - require.Equal( - t, app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)), - sdk.Coins{sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, InitTokens.Sub(amt))}, - ) - require.Equal(t, amt, app.StakingKeeper.Validator(ctx, addr).GetBondedTokens()) - - // assert non-jailed validator can't be unjailed - res, err := slh(ctx, types.NewMsgUnjail(addr)) - require.Error(t, err) - require.Nil(t, res) - require.True(t, errors.Is(types.ErrValidatorNotJailed, err)) -} - -func TestCannotUnjailUnlessMeetMinSelfDelegation(t *testing.T) { - // initial setup - app := simapp.Setup(t, false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - pks := simapp.CreateTestPubKeys(1) - simapp.AddTestAddrsFromPubKeys(app, ctx, pks, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) - - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - slh := slashing.NewHandler(app.SlashingKeeper) - addr, val := sdk.ValAddress(pks[0].Address()), pks[0] - amt := app.StakingKeeper.TokensFromConsensusPower(ctx, 100) - msg := tstaking.CreateValidatorMsg(addr, val, amt) - msg.MinSelfDelegation = amt - tstaking.Handle(msg, true) - - staking.EndBlocker(ctx, app.StakingKeeper) - require.Equal( - t, app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)), - sdk.Coins{sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, InitTokens.Sub(amt))}, - ) - - tstaking.Undelegate(sdk.AccAddress(addr), addr, sdk.OneInt(), true) - require.True(t, app.StakingKeeper.Validator(ctx, addr).IsJailed()) - - // assert non-jailed validator can't be unjailed - res, err := slh(ctx, types.NewMsgUnjail(addr)) - require.Error(t, err) - require.Nil(t, res) - require.True(t, errors.Is(types.ErrSelfDelegationTooLowToUnjail, err)) -} - -func TestJailedValidatorDelegations(t *testing.T) { - // initial setup - app := simapp.Setup(t, false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{Time: time.Unix(0, 0)}) - pks := simapp.CreateTestPubKeys(3) - - simapp.AddTestAddrsFromPubKeys(app, ctx, pks, app.StakingKeeper.TokensFromConsensusPower(ctx, 20)) - app.SlashingKeeper.SetParams(ctx, testslashing.TestParams()) - - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - stakingParams := app.StakingKeeper.GetParams(ctx) - app.StakingKeeper.SetParams(ctx, stakingParams) - valAddr, consAddr := sdk.ValAddress(pks[1].Address()), sdk.ConsAddress(pks[0].Address()) - - amt := tstaking.CreateValidatorWithValPower(valAddr, pks[1], 10, true) - staking.EndBlocker(ctx, app.StakingKeeper) - - // set dummy signing info - newInfo := types.NewValidatorSigningInfo(consAddr, 0, 0, time.Unix(0, 0), false, 0) - app.SlashingKeeper.SetValidatorSigningInfo(ctx, consAddr, newInfo) - - // delegate tokens to the validator - delAddr := sdk.AccAddress(pks[2].Address()) - tstaking.Delegate(delAddr, valAddr, amt) - - // unbond validator total self-delegations (which should jail the validator) - valAcc := sdk.AccAddress(valAddr) - tstaking.Undelegate(valAcc, valAddr, amt, true) - _, err := app.StakingKeeper.CompleteUnbonding(ctx, sdk.AccAddress(valAddr), valAddr) - require.Nil(t, err, "expected complete unbonding validator to be ok, got: %v", err) - - // verify validator still exists and is jailed - validator, found := app.StakingKeeper.GetValidator(ctx, valAddr) - require.True(t, found) - require.True(t, validator.IsJailed()) - - // verify the validator cannot unjail itself - res, err := slashing.NewHandler(app.SlashingKeeper)(ctx, types.NewMsgUnjail(valAddr)) - require.Error(t, err) - require.Nil(t, res) - - // self-delegate to validator - tstaking.Delegate(valAcc, valAddr, amt) - - // verify the validator can now unjail itself - res, err = slashing.NewHandler(app.SlashingKeeper)(ctx, types.NewMsgUnjail(valAddr)) - require.NoError(t, err) - require.NotNil(t, res) -} - -func TestInvalidMsg(t *testing.T) { - k := keeper.Keeper{} - h := slashing.NewHandler(k) - - res, err := h(sdk.NewContext(nil, tmproto.Header{}, false, nil), testdata.NewTestMsg()) - require.Error(t, err) - require.Nil(t, res) - require.True(t, strings.Contains(err.Error(), "unrecognized slashing message type")) -} - -// Test a validator through uptime, downtime, revocation, -// unrevocation, starting height reset, and revocation again -func TestHandleAbsentValidator(t *testing.T) { - // initial setup - app := simapp.Setup(t, false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{Time: time.Unix(0, 0)}) - pks := simapp.CreateTestPubKeys(1) - simapp.AddTestAddrsFromPubKeys(app, ctx, pks, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) - app.SlashingKeeper.SetParams(ctx, testslashing.TestParams()) - - power := int64(100) - addr, val := sdk.ValAddress(pks[0].Address()), pks[0] - slh := slashing.NewHandler(app.SlashingKeeper) - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - amt := tstaking.CreateValidatorWithValPower(addr, val, power, true) - staking.EndBlocker(ctx, app.StakingKeeper) - - require.Equal( - t, app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(addr)), - sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.GetParams(ctx).BondDenom, InitTokens.Sub(amt))), - ) - require.Equal(t, amt, app.StakingKeeper.Validator(ctx, addr).GetBondedTokens()) - - // will exist since the validator has been bonded - info, found := app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) - require.True(t, found) - require.Equal(t, int64(0), info.StartHeight) - require.Equal(t, int64(0), info.IndexOffset) - require.Equal(t, int64(0), info.MissedBlocksCounter) - require.Equal(t, time.Unix(0, 0).UTC(), info.JailedUntil) - height := int64(0) - - // 1000 first blocks OK - for ; height < app.SlashingKeeper.SignedBlocksWindow(ctx); height++ { - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, true) - } - info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) - require.True(t, found) - require.Equal(t, int64(0), info.StartHeight) - require.Equal(t, int64(0), info.MissedBlocksCounter) - - // 500 blocks missed - for ; height < app.SlashingKeeper.SignedBlocksWindow(ctx)+(app.SlashingKeeper.SignedBlocksWindow(ctx)-app.SlashingKeeper.MinSignedPerWindow(ctx)); height++ { - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, false) - } - info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) - require.True(t, found) - require.Equal(t, int64(0), info.StartHeight) - require.Equal(t, app.SlashingKeeper.SignedBlocksWindow(ctx)-app.SlashingKeeper.MinSignedPerWindow(ctx), info.MissedBlocksCounter) - - // validator should be bonded still - validator, _ := app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(val)) - require.Equal(t, sdkstaking.Bonded, validator.GetStatus()) - - bondPool := app.StakingKeeper.GetBondedPool(ctx) - require.True(sdk.IntEq(t, amt, app.BankKeeper.GetBalance(ctx, bondPool.GetAddress(), app.StakingKeeper.BondDenom(ctx)).Amount)) - - // 501st block missed - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, false) - info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) - require.True(t, found) - require.Equal(t, int64(0), info.StartHeight) - // counter now reset to zero - require.Equal(t, int64(0), info.MissedBlocksCounter) - - // end block - staking.EndBlocker(ctx, app.StakingKeeper) - - // validator should have been jailed - validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(val)) - require.Equal(t, sdkstaking.Unbonding, validator.GetStatus()) - - slashAmt := amt.ToDec().Mul(app.SlashingKeeper.SlashFractionDowntime(ctx)).RoundInt() - - // validator should have been slashed - require.True(t, amt.Sub(slashAmt).Equal(validator.GetTokens())) - - // 502nd block *also* missed (since the LastCommit would have still included the just-unbonded validator) - height++ - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, false) - info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) - require.True(t, found) - require.Equal(t, int64(0), info.StartHeight) - require.Equal(t, int64(1), info.MissedBlocksCounter) - - // end block - staking.EndBlocker(ctx, app.StakingKeeper) - - // validator should not have been slashed any more, since it was already jailed - validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(val)) - require.True(t, amt.Sub(slashAmt).Equal(validator.GetTokens())) - - // unrevocation should fail prior to jail expiration - res, err := slh(ctx, types.NewMsgUnjail(addr)) - require.Error(t, err) - require.Nil(t, res) - - // unrevocation should succeed after jail expiration - ctx = ctx.WithBlockHeader(tmproto.Header{Time: time.Unix(1, 0).Add(app.SlashingKeeper.DowntimeJailDuration(ctx))}) - res, err = slh(ctx, types.NewMsgUnjail(addr)) - require.NoError(t, err) - require.NotNil(t, res) - - // end block - staking.EndBlocker(ctx, app.StakingKeeper) - - // validator should be rebonded now - validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(val)) - require.Equal(t, sdkstaking.Bonded, validator.GetStatus()) - - // validator should have been slashed - require.True(t, amt.Sub(slashAmt).Equal(app.BankKeeper.GetBalance(ctx, bondPool.GetAddress(), app.StakingKeeper.BondDenom(ctx)).Amount)) - - // Validator start height should not have been changed - info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) - require.True(t, found) - require.Equal(t, int64(0), info.StartHeight) - // we've missed 2 blocks more than the maximum, so the counter was reset to 0 at 1 block more and is now 1 - require.Equal(t, int64(1), info.MissedBlocksCounter) - - // validator should not be immediately jailed again - height++ - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, false) - validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(val)) - require.Equal(t, sdkstaking.Bonded, validator.GetStatus()) - - // 500 signed blocks - nextHeight := height + app.SlashingKeeper.MinSignedPerWindow(ctx) + 1 - for ; height < nextHeight; height++ { - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, false) - } - - // end block - staking.EndBlocker(ctx, app.StakingKeeper) - - // validator should be jailed again after 500 unsigned blocks - nextHeight = height + app.SlashingKeeper.MinSignedPerWindow(ctx) + 1 - for ; height <= nextHeight; height++ { - ctx = ctx.WithBlockHeight(height) - app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, false) - } - - // end block - staking.EndBlocker(ctx, app.StakingKeeper) - - validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(val)) - require.Equal(t, sdkstaking.Unbonding, validator.GetStatus()) -} diff --git a/x/slashing/keeper/hooks.go b/x/slashing/keeper/hooks.go index 3fee7afd..36363f7d 100644 --- a/x/slashing/keeper/hooks.go +++ b/x/slashing/keeper/hooks.go @@ -9,7 +9,7 @@ import ( "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" ) -func (k Keeper) AfterValidatorBonded(ctx sdk.Context, address sdk.ConsAddress, _ sdk.ValAddress) { +func (k Keeper) AfterValidatorBonded(ctx sdk.Context, address sdk.ConsAddress, _ sdk.ValAddress) error { // Update the signing info start height or create a new signing info _, found := k.GetValidatorSigningInfo(ctx, address) if !found { @@ -23,6 +23,8 @@ func (k Keeper) AfterValidatorBonded(ctx sdk.Context, address sdk.ConsAddress, _ ) k.SetValidatorSigningInfo(ctx, address, signingInfo) } + + return nil } // AfterValidatorCreated adds the address-pubkey relation when a validator is created. @@ -32,14 +34,14 @@ func (k Keeper) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) e if err != nil { return err } - k.AddPubkey(ctx, consPk) - return nil + return k.AddPubkey(ctx, consPk) } // AfterValidatorRemoved deletes the address-pubkey relation when a validator is removed, -func (k Keeper) AfterValidatorRemoved(ctx sdk.Context, address sdk.ConsAddress) { +func (k Keeper) AfterValidatorRemoved(ctx sdk.Context, address sdk.ConsAddress) error { k.deleteAddrPubkeyRelation(ctx, crypto.Address(address)) + return nil } // Hooks wrapper struct for slashing keeper @@ -55,28 +57,39 @@ func (k Keeper) Hooks() Hooks { } // Implements sdk.ValidatorHooks -func (h Hooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { - h.k.AfterValidatorBonded(ctx, consAddr, valAddr) +func (h Hooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { + return h.k.AfterValidatorBonded(ctx, consAddr, valAddr) } // Implements sdk.ValidatorHooks -func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, _ sdk.ValAddress) { - h.k.AfterValidatorRemoved(ctx, consAddr) +func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, _ sdk.ValAddress) error { + return h.k.AfterValidatorRemoved(ctx, consAddr) } // Implements sdk.ValidatorHooks -func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { - h.k.AfterValidatorCreated(ctx, valAddr) +func (h Hooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error { + return h.k.AfterValidatorCreated(ctx, valAddr) } // Implements sdk.ValidatorHooks - just addition to fulfill the staking hook interface -func (h Hooks) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) { +func (h Hooks) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) error { + return nil } -func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) {} -func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) {} -func (h Hooks) BeforeDelegationCreated(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} -func (h Hooks) BeforeDelegationSharesModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} -func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} -func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} -func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) {} +func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) error { + return nil +} +func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) error { return nil } +func (h Hooks) BeforeDelegationCreated(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { + return nil +} +func (h Hooks) BeforeDelegationSharesModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { + return nil +} +func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { + return nil +} +func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { + return nil +} +func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) error { return nil } diff --git a/x/slashing/keeper/keeper.go b/x/slashing/keeper/keeper.go index 9f1663a6..e69058e8 100644 --- a/x/slashing/keeper/keeper.go +++ b/x/slashing/keeper/keeper.go @@ -66,29 +66,28 @@ func (k Keeper) GetPubkey(ctx sdk.Context, a cryptotypes.Address) (cryptotypes.P // Slash attempts to slash a validator. The slash is delegated to the staking // module to make the necessary validator changes. func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, fraction sdk.Dec, power, distributionHeight int64) { + coinsBurned := k.sk.Slash(ctx, consAddr, distributionHeight, power, fraction) ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, sdk.NewAttribute(types.AttributeKeyAddress, consAddr.String()), sdk.NewAttribute(types.AttributeKeyPower, fmt.Sprintf("%d", power)), sdk.NewAttribute(types.AttributeKeyReason, types.AttributeValueDoubleSign), + sdk.NewAttribute(types.AttributeKeyBurnedCoins, coinsBurned.String()), ), ) - - k.sk.Slash(ctx, consAddr, distributionHeight, power, fraction) } // Jail attempts to jail a validator. The slash is delegated to the staking module // to make the necessary validator changes. func (k Keeper) Jail(ctx sdk.Context, consAddr sdk.ConsAddress) { + k.sk.Jail(ctx, consAddr) ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, sdk.NewAttribute(types.AttributeKeyJailed, consAddr.String()), ), ) - - k.sk.Jail(ctx, consAddr) } func (k Keeper) deleteAddrPubkeyRelation(ctx sdk.Context, addr cryptotypes.Address) { diff --git a/x/slashing/keeper/keeper_test.go b/x/slashing/keeper/keeper_test.go index f5b54be8..c5169c91 100644 --- a/x/slashing/keeper/keeper_test.go +++ b/x/slashing/keeper/keeper_test.go @@ -42,7 +42,9 @@ func TestUnJailNotBonded(t *testing.T) { amt := app.StakingKeeper.TokensFromConsensusPower(ctx, 50) msg := tstaking.CreateValidatorMsg(addr, val, amt) msg.MinSelfDelegation = amt - tstaking.Handle(msg, true) + res, err := tstaking.CreateValidatorWithMsg(sdk.WrapSDKContext(ctx), msg) + require.NoError(t, err) + require.NotNil(t, res) staking.EndBlocker(ctx, app.StakingKeeper) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) @@ -117,6 +119,8 @@ func TestHandleNewValidator(t *testing.T) { require.Equal(t, sdkstaking.Bonded, validator.GetStatus()) bondPool := app.StakingKeeper.GetBondedPool(ctx) expTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 100) + // adding genesis validator tokens + expTokens = expTokens.Add(app.StakingKeeper.TokensFromConsensusPower(ctx, 1)) require.True(t, expTokens.Equal(app.BankKeeper.GetBalance(ctx, bondPool.GetAddress(), app.StakingKeeper.BondDenom(ctx)).Amount)) } diff --git a/x/slashing/keeper/querier.go b/x/slashing/keeper/querier.go index 5a9e164b..3d4402aa 100644 --- a/x/slashing/keeper/querier.go +++ b/x/slashing/keeper/querier.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkslashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" ) @@ -50,7 +51,7 @@ func querySigningInfo(ctx sdk.Context, req abci.RequestQuery, k Keeper, legacyQu signingInfo, found := k.GetValidatorSigningInfo(ctx, sdk.ConsAddress(params.ConsAddress)) if !found { - return nil, sdkerrors.Wrap(types.ErrNoSigningInfoFound, params.ConsAddress) + return nil, sdkerrors.Wrap(sdkslashingtypes.ErrNoSigningInfoFound, params.ConsAddress) } res, err := codec.MarshalJSONIndent(legacyQuerierCdc, signingInfo) diff --git a/x/slashing/keeper/unjail.go b/x/slashing/keeper/unjail.go index 100b1b26..a512af58 100644 --- a/x/slashing/keeper/unjail.go +++ b/x/slashing/keeper/unjail.go @@ -3,7 +3,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" + sdkslashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" ) // Unjail calls the staking Unjail function to unjail a validator if the @@ -11,26 +11,26 @@ import ( func (k Keeper) Unjail(ctx sdk.Context, validatorAddr sdk.ValAddress) error { validator := k.sk.Validator(ctx, validatorAddr) if validator == nil { - return types.ErrNoValidatorForAddress + return sdkslashingtypes.ErrNoValidatorForAddress } // cannot be unjailed if no self-delegation exists selfDel := k.sk.Delegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) if selfDel == nil { - return types.ErrMissingSelfDelegation + return sdkslashingtypes.ErrMissingSelfDelegation } tokens := validator.TokensFromShares(selfDel.GetShares()).TruncateInt() minSelfBond := validator.GetMinSelfDelegation() if tokens.LT(minSelfBond) { return sdkerrors.Wrapf( - types.ErrSelfDelegationTooLowToUnjail, "%s less than %s", tokens, minSelfBond, + sdkslashingtypes.ErrSelfDelegationTooLowToUnjail, "%s less than %s", tokens, minSelfBond, ) } // cannot be unjailed if not jailed if !validator.IsJailed() { - return types.ErrValidatorNotJailed + return sdkslashingtypes.ErrValidatorNotJailed } consAddr, err := validator.GetConsAddr() @@ -49,12 +49,12 @@ func (k Keeper) Unjail(ctx sdk.Context, validatorAddr sdk.ValAddress) error { if found { // cannot be unjailed if tombstoned if info.Tombstoned { - return types.ErrValidatorJailed + return sdkslashingtypes.ErrValidatorJailed } // cannot be unjailed until out of jail if ctx.BlockHeader().Time.Before(info.JailedUntil) { - return types.ErrValidatorJailed + return sdkslashingtypes.ErrValidatorJailed } } diff --git a/x/slashing/migrations/v039/types.go b/x/slashing/migrations/v039/types.go new file mode 100644 index 00000000..34eed337 --- /dev/null +++ b/x/slashing/migrations/v039/types.go @@ -0,0 +1,79 @@ +package v039 + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +const ( + ModuleName = "slashing" +) + +// Default parameter namespace +const ( + DefaultParamspace = ModuleName + DefaultSignedBlocksWindow = int64(100) + DefaultDowntimeJailDuration = 60 * 10 * time.Second +) + +var ( + DefaultMinSignedPerWindow = sdk.NewDecWithPrec(5, 1) + DefaultSlashFractionDoubleSign = sdk.NewDec(1).Quo(sdk.NewDec(20)) + DefaultSlashFractionDowntime = sdk.NewDec(1).Quo(sdk.NewDec(100)) +) + +// Params - used for initializing default parameter for slashing at genesis +type Params struct { + SignedBlocksWindow int64 `json:"signed_blocks_window" yaml:"signed_blocks_window"` + MinSignedPerWindow sdk.Dec `json:"min_signed_per_window" yaml:"min_signed_per_window"` + DowntimeJailDuration time.Duration `json:"downtime_jail_duration" yaml:"downtime_jail_duration"` + SlashFractionDoubleSign sdk.Dec `json:"slash_fraction_double_sign" yaml:"slash_fraction_double_sign"` + SlashFractionDowntime sdk.Dec `json:"slash_fraction_downtime" yaml:"slash_fraction_downtime"` +} + +// NewParams creates a new Params object +func NewParams( + signedBlocksWindow int64, minSignedPerWindow sdk.Dec, downtimeJailDuration time.Duration, + slashFractionDoubleSign, slashFractionDowntime sdk.Dec, +) Params { + + return Params{ + SignedBlocksWindow: signedBlocksWindow, + MinSignedPerWindow: minSignedPerWindow, + DowntimeJailDuration: downtimeJailDuration, + SlashFractionDoubleSign: slashFractionDoubleSign, + SlashFractionDowntime: slashFractionDowntime, + } +} + +// DefaultParams defines the parameters for this module +func DefaultParams() Params { + return NewParams( + DefaultSignedBlocksWindow, DefaultMinSignedPerWindow, DefaultDowntimeJailDuration, + DefaultSlashFractionDoubleSign, DefaultSlashFractionDowntime, + ) +} + +// ValidatorSigningInfo defines the signing info for a validator +type ValidatorSigningInfo struct { + Address sdk.ConsAddress `json:"address" yaml:"address"` // validator consensus address + StartHeight int64 `json:"start_height" yaml:"start_height"` // height at which validator was first a candidate OR was unjailed + IndexOffset int64 `json:"index_offset" yaml:"index_offset"` // index offset into signed block bit array + JailedUntil time.Time `json:"jailed_until" yaml:"jailed_until"` // timestamp validator cannot be unjailed until + Tombstoned bool `json:"tombstoned" yaml:"tombstoned"` // whether or not a validator has been tombstoned (killed out of validator set) + MissedBlocksCounter int64 `json:"missed_blocks_counter" yaml:"missed_blocks_counter"` // missed blocks counter (to avoid scanning the array every time) +} + +// MissedBlock +type MissedBlock struct { + Index int64 `json:"index" yaml:"index"` + Missed bool `json:"missed" yaml:"missed"` +} + +// GenesisState - all slashing state that must be provided at genesis +type GenesisState struct { + Params Params `json:"params" yaml:"params"` + SigningInfos map[string]ValidatorSigningInfo `json:"signing_infos" yaml:"signing_infos"` + MissedBlocks map[string][]MissedBlock `json:"missed_blocks" yaml:"missed_blocks"` +} diff --git a/x/slashing/migrations/v040/keys.go b/x/slashing/migrations/v040/keys.go new file mode 100644 index 00000000..367ead65 --- /dev/null +++ b/x/slashing/migrations/v040/keys.go @@ -0,0 +1,69 @@ +// Package v040 is copy-pasted from: +// https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/slashing/types/keys.go +package v040 + +import ( + "encoding/binary" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/kv" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" +) + +const ( + // ModuleName is the name of the module + ModuleName = "slashing" + + // StoreKey is the store key string for slashing + StoreKey = ModuleName + + // RouterKey is the message route for slashing + RouterKey = ModuleName + + // QuerierRoute is the querier route for slashing + QuerierRoute = ModuleName +) + +// Keys for slashing store +// Items are stored with the following key: values +// +// - 0x01: ValidatorSigningInfo +// +// - 0x02: bool +// +// - 0x03: crypto.PubKey +var ( + ValidatorSigningInfoKeyPrefix = []byte{0x01} // Prefix for signing info + ValidatorMissedBlockBitArrayKeyPrefix = []byte{0x02} // Prefix for missed block bit array + AddrPubkeyRelationKeyPrefix = []byte{0x03} // Prefix for address-pubkey relation +) + +// ValidatorSigningInfoKey - stored by *Consensus* address (not operator address) +func ValidatorSigningInfoKey(v sdk.ConsAddress) []byte { + return append(ValidatorSigningInfoKeyPrefix, v.Bytes()...) +} + +// ValidatorSigningInfoAddress - extract the address from a validator signing info key +func ValidatorSigningInfoAddress(key []byte) (v sdk.ConsAddress) { + kv.AssertKeyAtLeastLength(key, 2) + addr := key[1:] + kv.AssertKeyLength(addr, v040auth.AddrLen) + return sdk.ConsAddress(addr) +} + +// ValidatorMissedBlockBitArrayPrefixKey - stored by *Consensus* address (not operator address) +func ValidatorMissedBlockBitArrayPrefixKey(v sdk.ConsAddress) []byte { + return append(ValidatorMissedBlockBitArrayKeyPrefix, v.Bytes()...) +} + +// ValidatorMissedBlockBitArrayKey - stored by *Consensus* address (not operator address) +func ValidatorMissedBlockBitArrayKey(v sdk.ConsAddress, i int64) []byte { + b := make([]byte, 8) + binary.LittleEndian.PutUint64(b, uint64(i)) + return append(ValidatorMissedBlockBitArrayPrefixKey(v), b...) +} + +// AddrPubkeyRelationKey gets pubkey relation key used to get the pubkey from the address +func AddrPubkeyRelationKey(address []byte) []byte { + return append(AddrPubkeyRelationKeyPrefix, address...) +} diff --git a/x/slashing/migrations/v040/migrate.go b/x/slashing/migrations/v040/migrate.go new file mode 100644 index 00000000..0dbd2274 --- /dev/null +++ b/x/slashing/migrations/v040/migrate.go @@ -0,0 +1,64 @@ +package v040 + +import ( + "sort" + + v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v039" + v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/types" +) + +// Migrate accepts exported x/slashing genesis state from v0.39 and migrates it +// to v0.40 x/slashing genesis state. The migration includes: +// +// - Chaning SigningInfos and MissedBlocks from map to array. +// - Convert addresses from bytes to bech32 strings. +// - Re-encode in v0.40 GenesisState. +func Migrate(oldGenState v039slashing.GenesisState) *v040slashing.GenesisState { + // Note that the two following `for` loop over a map's keys, so are not + // deterministic. + var newSigningInfos = make([]v040slashing.SigningInfo, 0, len(oldGenState.SigningInfos)) + for address, signingInfo := range oldGenState.SigningInfos { + newSigningInfos = append(newSigningInfos, v040slashing.SigningInfo{ + Address: address, + ValidatorSigningInfo: v040slashing.ValidatorSigningInfo{ + Address: signingInfo.Address.String(), + StartHeight: signingInfo.StartHeight, + IndexOffset: signingInfo.IndexOffset, + JailedUntil: signingInfo.JailedUntil, + Tombstoned: signingInfo.Tombstoned, + MissedBlocksCounter: signingInfo.MissedBlocksCounter, + }, + }) + } + var newValidatorMissedBlocks = make([]v040slashing.ValidatorMissedBlocks, 0, len(oldGenState.MissedBlocks)) + for address, validatorMissedBlocks := range oldGenState.MissedBlocks { + var newMissedBlocks = make([]v040slashing.MissedBlock, len(validatorMissedBlocks)) + for i, missedBlock := range validatorMissedBlocks { + newMissedBlocks[i] = v040slashing.MissedBlock{ + Index: missedBlock.Index, + Missed: missedBlock.Missed, + } + } + + newValidatorMissedBlocks = append(newValidatorMissedBlocks, v040slashing.ValidatorMissedBlocks{ + Address: address, + MissedBlocks: newMissedBlocks, + }) + } + + // We sort these two arrays by address, so that we get determinstic states. + sort.Slice(newSigningInfos, func(i, j int) bool { return newSigningInfos[i].Address < newSigningInfos[j].Address }) + sort.Slice(newValidatorMissedBlocks, func(i, j int) bool { return newValidatorMissedBlocks[i].Address < newValidatorMissedBlocks[j].Address }) + + return &v040slashing.GenesisState{ + Params: v040slashing.Params{ + SignedBlocksWindow: oldGenState.Params.SignedBlocksWindow, + MinSignedPerWindow: oldGenState.Params.MinSignedPerWindow, + DowntimeJailDuration: oldGenState.Params.DowntimeJailDuration, + SlashFractionDoubleSign: oldGenState.Params.SlashFractionDoubleSign, + SlashFractionDowntime: oldGenState.Params.SlashFractionDowntime, + }, + SigningInfos: newSigningInfos, + MissedBlocks: newValidatorMissedBlocks, + } +} diff --git a/x/slashing/migrations/v040/migrate_test.go b/x/slashing/migrations/v040/migrate_test.go new file mode 100644 index 00000000..2f2bc666 --- /dev/null +++ b/x/slashing/migrations/v040/migrate_test.go @@ -0,0 +1,140 @@ +package v040_test + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v039" + v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v040" +) + +func TestMigrate(t *testing.T) { + encodingConfig := simapp.MakeTestEncodingConfig() + clientCtx := client.Context{}. + WithInterfaceRegistry(encodingConfig.InterfaceRegistry). + WithTxConfig(encodingConfig.TxConfig). + WithLegacyAmino(encodingConfig.Amino). + WithCodec(encodingConfig.Codec) + + addr1, err := sdk.ConsAddressFromBech32("cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685") + require.NoError(t, err) + addr2, err := sdk.ConsAddressFromBech32("cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph") + require.NoError(t, err) + + gs := v039slashing.GenesisState{ + Params: v039slashing.DefaultParams(), + SigningInfos: map[string]v039slashing.ValidatorSigningInfo{ + "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph": { + Address: addr2, + IndexOffset: 615501, + MissedBlocksCounter: 1, + Tombstoned: false, + }, + "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685": { + Address: addr1, + IndexOffset: 2, + MissedBlocksCounter: 2, + Tombstoned: false, + }, + }, + MissedBlocks: map[string][]v039slashing.MissedBlock{ + "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph": { + { + Index: 2, + Missed: true, + }, + }, + "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685": { + { + Index: 3, + Missed: true, + }, + { + Index: 4, + Missed: true, + }, + }, + }, + } + + migrated := v040slashing.Migrate(gs) + // Check that in `signing_infos` and `missed_blocks`, the address + // cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685 + // should always come before the address + // cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph + // (in alphabetic order, basically). + expected := `{ + "missed_blocks": [ + { + "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", + "missed_blocks": [ + { + "index": "3", + "missed": true + }, + { + "index": "4", + "missed": true + } + ] + }, + { + "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", + "missed_blocks": [ + { + "index": "2", + "missed": true + } + ] + } + ], + "params": { + "downtime_jail_duration": "600s", + "min_signed_per_window": "0.500000000000000000", + "signed_blocks_window": "100", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" + }, + "signing_infos": [ + { + "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", + "validator_signing_info": { + "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", + "index_offset": "2", + "jailed_until": "0001-01-01T00:00:00Z", + "missed_blocks_counter": "2", + "start_height": "0", + "tombstoned": false + } + }, + { + "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", + "validator_signing_info": { + "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", + "index_offset": "615501", + "jailed_until": "0001-01-01T00:00:00Z", + "missed_blocks_counter": "1", + "start_height": "0", + "tombstoned": false + } + } + ] +}` + + bz, err := clientCtx.Codec.MarshalJSON(migrated) + require.NoError(t, err) + + // Indent the JSON bz correctly. + var jsonObj map[string]interface{} + err = json.Unmarshal(bz, &jsonObj) + require.NoError(t, err) + indentedBz, err := json.MarshalIndent(jsonObj, "", " ") + require.NoError(t, err) + + require.Equal(t, expected, string(indentedBz)) +} diff --git a/x/slashing/migrations/v043/store.go b/x/slashing/migrations/v043/store.go new file mode 100644 index 00000000..15da0982 --- /dev/null +++ b/x/slashing/migrations/v043/store.go @@ -0,0 +1,21 @@ +package v043 + +import ( + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + v043distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v043" + v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v040" +) + +// MigrateStore performs in-place store migrations from v0.40 to v0.43. The +// migration includes: +// +// - Change addresses to be length-prefixed. +func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey) error { + store := ctx.KVStore(storeKey) + v043distribution.MigratePrefixAddress(store, v040slashing.ValidatorSigningInfoKeyPrefix) + v043distribution.MigratePrefixAddressBytes(store, v040slashing.ValidatorMissedBlockBitArrayKeyPrefix) + v043distribution.MigratePrefixAddress(store, v040slashing.AddrPubkeyRelationKeyPrefix) + + return nil +} diff --git a/x/slashing/migrations/v043/store_test.go b/x/slashing/migrations/v043/store_test.go new file mode 100644 index 00000000..962e7af9 --- /dev/null +++ b/x/slashing/migrations/v043/store_test.go @@ -0,0 +1,68 @@ +package v043_test + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" + v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v040" + v043slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v043" + "github.com/cosmos/cosmos-sdk/x/slashing/types" +) + +func TestStoreMigration(t *testing.T) { + slashingKey := sdk.NewKVStoreKey("slashing") + ctx := testutil.DefaultContext(slashingKey, sdk.NewTransientStoreKey("transient_test")) + store := ctx.KVStore(slashingKey) + + _, _, addr1 := testdata.KeyTestPubAddr() + consAddr := sdk.ConsAddress(addr1) + // Use dummy value for all keys. + value := []byte("foo") + + testCases := []struct { + name string + oldKey []byte + newKey []byte + }{ + { + "ValidatorSigningInfoKey", + v040slashing.ValidatorSigningInfoKey(consAddr), + types.ValidatorSigningInfoKey(consAddr), + }, + { + "ValidatorMissedBlockBitArrayKey", + v040slashing.ValidatorMissedBlockBitArrayKey(consAddr, 2), + types.ValidatorMissedBlockBitArrayKey(consAddr, 2), + }, + { + "AddrPubkeyRelationKey", + v040slashing.AddrPubkeyRelationKey(consAddr), + types.AddrPubkeyRelationKey(consAddr), + }, + } + + // Set all the old keys to the store + for _, tc := range testCases { + store.Set(tc.oldKey, value) + } + + // Run migrations. + err := v043slashing.MigrateStore(ctx, slashingKey) + require.NoError(t, err) + + // Make sure the new keys are set and old keys are deleted. + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + if !bytes.Equal(tc.oldKey, tc.newKey) { + require.Nil(t, store.Get(tc.oldKey)) + } + require.Equal(t, value, store.Get(tc.newKey)) + }) + } +} diff --git a/x/slashing/module.go b/x/slashing/module.go index 312adbd9..16a811a8 100644 --- a/x/slashing/module.go +++ b/x/slashing/module.go @@ -6,11 +6,9 @@ import ( "fmt" "math/rand" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - abci "github.com/tendermint/tendermint/abci/types" "github.com/cosmos/cosmos-sdk/client" @@ -71,11 +69,15 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncod } // RegisterRESTRoutes registers the REST routes for the slashing module. +// Deprecated: RegisterRESTRoutes is deprecated. `x/slashing` legacy REST implementation +// has been removed from the SDK. func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) {} // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the slashig module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { - types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) + if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)); err != nil { + panic(err) + } } // GetTxCmd returns the root tx command for the slashing module. @@ -117,9 +119,9 @@ func (AppModule) Name() string { // RegisterInvariants registers the slashing module invariants. func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} -// Route returns the message routing key for the slashing module. +// Deprecated: Route returns the message routing key for the slashing module. func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) + return sdk.Route{} } // QuerierRoute returns the slashing module's querier route name. diff --git a/x/slashing/simulation/operations_test.go b/x/slashing/simulation/operations_test.go index 83f13aca..4d32852a 100644 --- a/x/slashing/simulation/operations_test.go +++ b/x/slashing/simulation/operations_test.go @@ -5,14 +5,21 @@ import ( "testing" "time" + "github.com/cosmos/cosmos-sdk/codec/legacy" + "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmtypes "github.com/tendermint/tendermint/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/bank/testutil" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" distrtypes "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -23,16 +30,14 @@ import ( // TestWeightedOperations tests the weights of the operations. func TestWeightedOperations(t *testing.T) { - app, ctx := createTestApp(t, false) + s := rand.NewSource(1) + r := rand.New(s) + app, ctx, accs := createTestApp(t, false, r, 3) ctx.WithChainID("test-chain") cdc := app.AppCodec() appParams := make(simtypes.AppParams) - s := rand.NewSource(1) - r := rand.New(s) - accs := simtypes.RandomAccounts(r, 3) - expected := []struct { weight int opMsgRoute string @@ -54,14 +59,15 @@ func TestWeightedOperations(t *testing.T) { // TestSimulateMsgUnjail tests the normal scenario of a valid message of type types.MsgUnjail. // Abonormal scenarios, where the message is created by an errors, are not tested here. func TestSimulateMsgUnjail(t *testing.T) { - app, ctx := createTestApp(t, false) + // setup 3 accounts + s := rand.NewSource(5) + r := rand.New(s) + app, ctx, accounts := createTestApp(t, false, r, 3) blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) - // setup 3 accounts - s := rand.NewSource(1) - r := rand.New(s) - accounts := getTestingAccounts(t, r, app, ctx, 3) + // remove genesis validator account + accounts = accounts[1:] // setup accounts[0] as validator0 validator0 := getTestingValidator0(t, app, ctx, accounts) @@ -95,39 +101,53 @@ func TestSimulateMsgUnjail(t *testing.T) { require.NoError(t, err) var msg types.MsgUnjail - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) require.True(t, operationMsg.OK) require.Equal(t, types.TypeMsgUnjail, msg.Type()) - require.Equal(t, "cosmosvaloper1tnh2q55v8wyygtt9srz5safamzdengsn9dsd7z", msg.ValidatorAddr) + require.Equal(t, "cosmosvaloper17s94pzwhsn4ah25tec27w70n65h5t2scgxzkv2", msg.ValidatorAddr) require.Len(t, futureOperations, 0) } // returns context and an app with updated mint keeper -func createTestApp(t *testing.T, isCheckTx bool) (*simapp.SimApp, sdk.Context) { - app := simapp.Setup(t, isCheckTx) +func createTestApp(t *testing.T, isCheckTx bool, r *rand.Rand, n int) (*simapp.SimApp, sdk.Context, []simtypes.Account) { + accounts := simtypes.RandomAccounts(r, n) + // create validator set with single validator + account := accounts[0] + tmPk, err := cryptocodec.ToTmPubKeyInterface(account.PubKey) + require.NoError(t, err) + validator := tmtypes.NewValidator(tmPk, 1) - ctx := app.BaseApp.NewContext(isCheckTx, tmproto.Header{}) - app.MintKeeper.SetParams(ctx, minttypes.DefaultParams()) - app.MintKeeper.SetMinter(ctx, minttypes.DefaultInitialMinter()) + valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) - return app, ctx -} + // generate genesis account + senderPrivKey := secp256k1.GenPrivKey() + acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) + balance := banktypes.Balance{ + Address: acc.GetAddress().String(), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100000000000000))), + } -func getTestingAccounts(t *testing.T, r *rand.Rand, app *simapp.SimApp, ctx sdk.Context, n int) []simtypes.Account { - accounts := simtypes.RandomAccounts(r, n) + app := simapp.SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, balance) + ctx := app.BaseApp.NewContext(isCheckTx, tmproto.Header{}) initAmt := app.StakingKeeper.TokensFromConsensusPower(ctx, 200) initCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initAmt)) + // remove genesis validator account + accs := accounts[1:] + // add coins to the accounts - for _, account := range accounts { + for _, account := range accs { acc := app.AccountKeeper.NewAccountWithAddress(ctx, account.Address) app.AccountKeeper.SetAccount(ctx, acc) require.NoError(t, testutil.FundAccount(app.BankKeeper, ctx, account.Address, initCoins)) } - return accounts + app.MintKeeper.SetParams(ctx, minttypes.DefaultParams()) + app.MintKeeper.SetMinter(ctx, minttypes.DefaultInitialMinter()) + + return app, ctx, accounts } func getTestingValidator0(t *testing.T, app *simapp.SimApp, ctx sdk.Context, accounts []simtypes.Account) stakingtypes.Validator { diff --git a/x/slashing/spec/02_state.md b/x/slashing/spec/02_state.md index b296105f..a0298b57 100644 --- a/x/slashing/spec/02_state.md +++ b/x/slashing/spec/02_state.md @@ -14,7 +14,7 @@ Proposers are incentivized to include precommits from all validators in the Tend by receiving additional fees proportional to the difference between the voting power included in the `LastCommitInfo` and +2/3 (see [fee distribution](x/distribution/spec/03_begin_block.md)). -``` +```go type LastCommitInfo struct { Round int32 Votes []VoteInfo @@ -27,8 +27,8 @@ number of blocks by being automatically jailed, potentially slashed, and unbonde Information about validator's liveness activity is tracked through `ValidatorSigningInfo`. It is indexed in the store as follows: -- ValidatorSigningInfo: `0x01 | ConsAddrLen (1 byte) | ConsAddress -> ProtocolBuffer(ValSigningInfo)` -- MissedBlocksBitArray: `0x02 | ConsAddrLen (1 byte) | ConsAddress | LittleEndianUint64(signArrayIndex) -> VarInt(didMiss)` (varint is a number encoding format) +* ValidatorSigningInfo: `0x01 | ConsAddrLen (1 byte) | ConsAddress -> ProtocolBuffer(ValSigningInfo)` +* MissedBlocksBitArray: `0x02 | ConsAddrLen (1 byte) | ConsAddress | LittleEndianUint64(signArrayIndex) -> VarInt(didMiss)` (varint is a number encoding format) The first mapping allows us to easily lookup the recent signing info for a validator based on the validator's consensus address. diff --git a/x/slashing/spec/03_messages.md b/x/slashing/spec/03_messages.md index d680b83c..87493157 100644 --- a/x/slashing/spec/03_messages.md +++ b/x/slashing/spec/03_messages.md @@ -22,7 +22,7 @@ message MsgUnjail { Below is a pseudocode of the `MsgSrv/Unjail` RPC: -``` +```go unjail(tx MsgUnjail) validator = getValidator(tx.ValidatorAddr) if validator == nil diff --git a/x/slashing/spec/05_hooks.md b/x/slashing/spec/05_hooks.md index c280d34e..d1234e58 100644 --- a/x/slashing/spec/05_hooks.md +++ b/x/slashing/spec/05_hooks.md @@ -12,16 +12,16 @@ The slashing module implements the `StakingHooks` defined in `x/staking` and are The following hooks impact the slashing state: -+ `AfterValidatorBonded` creates a `ValidatorSigningInfo` instance as described in the following section. -+ `AfterValidatorCreated` stores a validator's consensus key. -+ `AfterValidatorRemoved` removes a validator's consensus key. +* `AfterValidatorBonded` creates a `ValidatorSigningInfo` instance as described in the following section. +* `AfterValidatorCreated` stores a validator's consensus key. +* `AfterValidatorRemoved` removes a validator's consensus key. ## Validator Bonded Upon successful first-time bonding of a new validator, we create a new `ValidatorSigningInfo` structure for the now-bonded validator, which `StartHeight` of the current block. -``` +```go onValidatorBonded(address sdk.ValAddress) signingInfo, found = GetValidatorSigningInfo(address) diff --git a/x/slashing/spec/06_events.md b/x/slashing/spec/06_events.md index 8f259ae4..c7dbf572 100644 --- a/x/slashing/spec/06_events.md +++ b/x/slashing/spec/06_events.md @@ -2,17 +2,17 @@ order: 6 --> -# Tags +# Events -The slashing module emits the following events/tags: +The slashing module emits the following events: ## MsgServer ### MsgUnjail -| Type | Attribute Key | Attribute Value | -| ------- | ------------- | --------------- | -| message | module | slashing | +| Type | Attribute Key | Attribute Value | +| ------- | ------------- | ------------------ | +| message | module | slashing | | message | sender | {validatorAddress} | ## Keeper @@ -25,8 +25,9 @@ The slashing module emits the following events/tags: | slash | power | {validatorPower} | | slash | reason | {slashReason} | | slash | jailed [0] | {validatorConsensusAddress} | +| slash | burned coins | {sdk.Int} | -- [0] Only included if the validator is jailed. +* [0] Only included if the validator is jailed. | Type | Attribute Key | Attribute Value | | -------- | ------------- | --------------------------- | @@ -36,7 +37,7 @@ The slashing module emits the following events/tags: ### Slash -+ same as `"slash"` event from `HandleValidatorSignature`, but without the `jailed` attribute. +* same as `"slash"` event from `HandleValidatorSignature`, but without the `jailed` attribute. ### Jail diff --git a/x/slashing/spec/07_tombstone.md b/x/slashing/spec/07_tombstone.md index 216d1836..ab06c945 100644 --- a/x/slashing/spec/07_tombstone.md +++ b/x/slashing/spec/07_tombstone.md @@ -113,11 +113,11 @@ comparing potential future ones to find the max. Currently the only Tendermint ABCI fault is: -- Unjustified precommits (double signs) +* Unjustified precommits (double signs) It is currently planned to include the following fault in the near future: -- Signing a precommit when you're in unbonding phase (needed to make light client bisection safe) +* Signing a precommit when you're in unbonding phase (needed to make light client bisection safe) Given that these faults are both attributable byzantine faults, we will likely want to slash them equally, and thus we can enact the above change. diff --git a/x/slashing/spec/09_client.md b/x/slashing/spec/09_client.md new file mode 100644 index 00000000..11d82961 --- /dev/null +++ b/x/slashing/spec/09_client.md @@ -0,0 +1,294 @@ + + +# CLI + +A user can query and interact with the `slashing` module using the CLI. + +## Query + +The `query` commands allow users to query `slashing` state. + +```sh +simd query slashing --help +``` + +### params + +The `params` command allows users to query genesis parameters for the slashing module. + +```sh +simd query slashing params [flags] +``` + +Example: + +```sh +simd query slashing params +``` + +Example Output: + +```yml +downtime_jail_duration: 600s +min_signed_per_window: "0.500000000000000000" +signed_blocks_window: "100" +slash_fraction_double_sign: "0.050000000000000000" +slash_fraction_downtime: "0.010000000000000000" +``` + +### signing-info + +The `signing-info` command allows users to query signing-info of the validator using consensus public key. + +```sh +simd query slashing signing-infos [flags] +``` + +Example: + +```sh +simd query slashing signing-info '{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Auxs3865HpB/EfssYOzfqNhEJjzys6jD5B6tPgC8="}' + +``` + +Example Output: + +```yml +address: cosmosvalcons1nrqsld3aw6lh6t082frdqc84uwxn0t958c +index_offset: "2068" +jailed_until: "1970-01-01T00:00:00Z" +missed_blocks_counter: "0" +start_height: "0" +tombstoned: false +``` + +### signing-infos + +The `signing-infos` command allows users to query signing infos of all validators. + +```sh +simd query slashing signing-infos [flags] +``` + +Example: + +```sh +simd query slashing signing-infos +``` + +Example Output: + +```yml +info: +- address: cosmosvalcons1nrqsld3aw6lh6t082frdqc84uwxn0t958c + index_offset: "2075" + jailed_until: "1970-01-01T00:00:00Z" + missed_blocks_counter: "0" + start_height: "0" + tombstoned: false +pagination: + next_key: null + total: "0" +``` + +## Transactions + +The `tx` commands allow users to interact with the `slashing` module. + +```bash +simd tx slashing --help +``` + +### unjail + +The `unjail` command allows users to unjail a validator previously jailed for downtime. + +```bash + simd tx slashing unjail --from mykey [flags] +``` + +Example: + +```bash +simd tx slashing unjail --from mykey +``` + +## gRPC + +A user can query the `slashing` module using gRPC endpoints. + +### Params + +The `Params` endpoint allows users to query the parameters of slashing module. + +```sh +cosmos.slashing.v1beta1.Query/Params +``` + +Example: + +```sh +grpcurl -plaintext localhost:9090 cosmos.slashing.v1beta1.Query/Params +``` + +Example Output: + +```json +{ + "params": { + "signedBlocksWindow": "100", + "minSignedPerWindow": "NTAwMDAwMDAwMDAwMDAwMDAw", + "downtimeJailDuration": "600s", + "slashFractionDoubleSign": "NTAwMDAwMDAwMDAwMDAwMDA=", + "slashFractionDowntime": "MTAwMDAwMDAwMDAwMDAwMDA=" + } +} +``` + +### SigningInfo + +The SigningInfo queries the signing info of given cons address. + +```sh +cosmos.slashing.v1beta1.Query/SigningInfo +``` + +Example: + +```sh +grpcurl -plaintext -d '{"cons_address":"cosmosvalcons1nrqsld3aw6lh6t082frdqc84uwxn0t958c"}' localhost:9090 cosmos.slashing.v1beta1.Query/SigningInfo +``` + +Example Output: + +```json +{ + "valSigningInfo": { + "address": "cosmosvalcons1nrqsld3aw6lh6t082frdqc84uwxn0t958c", + "indexOffset": "3493", + "jailedUntil": "1970-01-01T00:00:00Z" + } +} +``` + +### SigningInfos + +The SigningInfos queries signing info of all validators. + +```sh +cosmos.slashing.v1beta1.Query/SigningInfos +``` + +Example: + +```sh +grpcurl -plaintext localhost:9090 cosmos.slashing.v1beta1.Query/SigningInfos +``` + +Example Output: + +```json +{ + "info": [ + { + "address": "cosmosvalcons1nrqslkwd3pz096lh6t082frdqc84uwxn0t958c", + "indexOffset": "2467", + "jailedUntil": "1970-01-01T00:00:00Z" + } + ], + "pagination": { + "total": "1" + } +} +``` + +## REST + +A user can query the `slashing` module using REST endpoints. + +### Params + +```sh +/cosmos/slashing/v1beta1/params +``` + +Example: + +```sh +curl "localhost:1317/cosmos/slashing/v1beta1/params" +``` + +Example Output: + +```json +{ + "params": { + "signed_blocks_window": "100", + "min_signed_per_window": "0.500000000000000000", + "downtime_jail_duration": "600s", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" +} +``` + +### signing_info + +```sh +/cosmos/slashing/v1beta1/signing_infos/%s +``` + +Example: + +```sh +curl "localhost:1317/cosmos/slashing/v1beta1/signing_infos/cosmosvalcons1nrqslkwd3pz096lh6t082frdqc84uwxn0t958c" +``` + +Example Output: + +```json +{ + "val_signing_info": { + "address": "cosmosvalcons1nrqslkwd3pz096lh6t082frdqc84uwxn0t958c", + "start_height": "0", + "index_offset": "4184", + "jailed_until": "1970-01-01T00:00:00Z", + "tombstoned": false, + "missed_blocks_counter": "0" + } +} +``` + +### signing_infos + +```sh +/cosmos/slashing/v1beta1/signing_infos +``` + +Example: + +```sh +curl "localhost:1317/cosmos/slashing/v1beta1/signing_infos +``` + +Example Output: + +```json +{ + "info": [ + { + "address": "cosmosvalcons1nrqslkwd3pz096lh6t082frdqc84uwxn0t958c", + "start_height": "0", + "index_offset": "4169", + "jailed_until": "1970-01-01T00:00:00Z", + "tombstoned": false, + "missed_blocks_counter": "0" + } + ], + "pagination": { + "next_key": null, + "total": "1" + } +} +``` diff --git a/x/slashing/spec/README.md b/x/slashing/spec/README.md index 22630656..d1988cb9 100644 --- a/x/slashing/spec/README.md +++ b/x/slashing/spec/README.md @@ -1,5 +1,5 @@ + +# Staking + +* [Staking](spec/README.md) - Proof-of-Stake layer for public blockchains. diff --git a/x/staking/client/cli/flags.go b/x/staking/client/cli/flags.go index 4eb6927d..bae3011f 100644 --- a/x/staking/client/cli/flags.go +++ b/x/staking/client/cli/flags.go @@ -16,6 +16,7 @@ const ( FlagSharesFraction = "shares-fraction" FlagMoniker = "moniker" + FlagEditMoniker = "new-moniker" FlagIdentity = "identity" FlagWebsite = "website" FlagSecurityContact = "security-contact" @@ -82,7 +83,7 @@ func FlagSetPublicKey() *flag.FlagSet { func flagSetDescriptionEdit() *flag.FlagSet { fs := flag.NewFlagSet("", flag.ContinueOnError) - fs.String(FlagMoniker, types.DoNotModifyDesc, "The validator's name") + fs.String(FlagEditMoniker, types.DoNotModifyDesc, "The validator's name") fs.String(FlagIdentity, types.DoNotModifyDesc, "The (optional) identity signature (ex. UPort or Keybase)") fs.String(FlagWebsite, types.DoNotModifyDesc, "The validator's (optional) website") fs.String(FlagSecurityContact, types.DoNotModifyDesc, "The validator's (optional) security contact email") diff --git a/x/staking/client/cli/tx.go b/x/staking/client/cli/tx.go index ecd48813..ffff4e15 100644 --- a/x/staking/client/cli/tx.go +++ b/x/staking/client/cli/tx.go @@ -102,7 +102,7 @@ func NewEditValidatorCmd() *cobra.Command { return err } valAddr := clientCtx.GetFromAddress() - moniker, _ := cmd.Flags().GetString(FlagMoniker) + moniker, _ := cmd.Flags().GetString(FlagEditMoniker) identity, _ := cmd.Flags().GetString(FlagIdentity) website, _ := cmd.Flags().GetString(FlagWebsite) security, _ := cmd.Flags().GetString(FlagSecurityContact) diff --git a/x/staking/client/testutil/cli_test.go b/x/staking/client/testutil/cli_test.go index 0a7a5cc2..f23e8884 100644 --- a/x/staking/client/testutil/cli_test.go +++ b/x/staking/client/testutil/cli_test.go @@ -1,3 +1,4 @@ +//go:build norace // +build norace package testutil diff --git a/x/staking/client/testutil/grpc.go b/x/staking/client/testutil/grpc.go new file mode 100644 index 00000000..78c39f85 --- /dev/null +++ b/x/staking/client/testutil/grpc.go @@ -0,0 +1,770 @@ +package testutil + +import ( + "fmt" + + "github.com/gogo/protobuf/proto" + + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/rest" + sdk "github.com/cosmos/cosmos-sdk/types" + grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" + "github.com/cosmos/cosmos-sdk/types/query" + "github.com/cosmos/cosmos-sdk/x/staking/client/cli" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +func (s *IntegrationTestSuite) TestGRPCQueryValidatorsHandler() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + }{ + { + "test query validators gRPC route with invalid status", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators?status=active", baseURL), + true, + }, + { + "test query validators gRPC route without status query param", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators", baseURL), + false, + }, + { + "test query validators gRPC route with valid status", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators?status=%s", baseURL, types.Bonded.String()), + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + var valRes types.QueryValidatorsResponse + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &valRes) + + if tc.error { + s.Require().Error(err) + s.Require().Nil(valRes.Validators) + s.Require().Equal(0, len(valRes.Validators)) + } else { + s.Require().NoError(err) + s.Require().NotNil(valRes.Validators) + s.Require().Equal(len(s.network.Validators), len(valRes.Validators)) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryValidator() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + }{ + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s", baseURL, "wrongValidatorAddress"), + true, + }, + { + "with no validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s", baseURL, ""), + true, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s", baseURL, val.ValAddress.String()), + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + var validator types.QueryValidatorResponse + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &validator) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NotNil(validator.Validator) + s.Require().Equal(s.network.Validators[0].ValAddress.String(), validator.Validator.OperatorAddress) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryValidatorDelegations() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + headers map[string]string + error bool + respType proto.Message + expectedResp proto.Message + }{ + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations", baseURL, "wrongValAddress"), + map[string]string{}, + true, + &types.QueryValidatorDelegationsResponse{}, + nil, + }, + { + "with no validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations", baseURL, ""), + map[string]string{}, + true, + &types.QueryValidatorDelegationsResponse{}, + nil, + }, + { + "valid request(height specific)", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations", baseURL, val.ValAddress.String()), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "1", + }, + false, + &types.QueryValidatorDelegationsResponse{}, + &types.QueryValidatorDelegationsResponse{ + DelegationResponses: types.DelegationResponses{ + types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), + }, + Pagination: &query.PageResponse{Total: 1}, + }, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) + s.Require().NoError(err) + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(tc.expectedResp.String(), tc.respType.String()) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryValidatorUnbondingDelegations() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + }{ + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/unbonding_delegations", baseURL, "wrongValAddress"), + true, + }, + { + "with no validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/unbonding_delegations", baseURL, ""), + true, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/unbonding_delegations", baseURL, val.ValAddress.String()), + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + var ubds types.QueryValidatorUnbondingDelegationsResponse + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubds) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Len(ubds.UnbondingResponses, 1) + s.Require().Equal(ubds.UnbondingResponses[0].ValidatorAddress, val.ValAddress.String()) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryDelegation() { + val := s.network.Validators[0] + val2 := s.network.Validators[1] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + respType proto.Message + expectedResp proto.Message + }{ + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, "wrongValAddress", val.Address.String()), + true, + &types.QueryDelegationResponse{}, + nil, + }, + { + "wrong account address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, val.ValAddress.String(), "wrongAccAddress"), + true, + &types.QueryDelegationResponse{}, + nil, + }, + { + "with no validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, "", val.Address.String()), + true, + &types.QueryDelegationResponse{}, + nil, + }, + { + "with no account address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, val.ValAddress.String(), ""), + true, + &types.QueryDelegationResponse{}, + nil, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s", baseURL, val2.ValAddress.String(), val.Address.String()), + false, + &types.QueryDelegationResponse{}, + &types.QueryDelegationResponse{ + DelegationResponse: &types.DelegationResponse{ + Delegation: types.Delegation{ + DelegatorAddress: val.Address.String(), + ValidatorAddress: val2.ValAddress.String(), + Shares: sdk.NewDec(10), + }, + Balance: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), + }, + }, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + s.T().Logf("%s", resp) + err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(tc.expectedResp.String(), tc.respType.String()) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryUnbondingDelegation() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + }{ + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, "wrongValAddress", val.Address.String()), + true, + }, + { + "wrong account address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, val.ValAddress.String(), "wrongAccAddress"), + true, + }, + { + "with no validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, "", val.Address.String()), + true, + }, + { + "with no account address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, val.ValAddress.String(), ""), + true, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/validators/%s/delegations/%s/unbonding_delegation", baseURL, val.ValAddress.String(), val.Address.String()), + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + var ubd types.QueryUnbondingDelegationResponse + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubd) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(ubd.Unbond.DelegatorAddress, val.Address.String()) + s.Require().Equal(ubd.Unbond.ValidatorAddress, val.ValAddress.String()) + s.Require().Len(ubd.Unbond.Entries, 1) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryDelegatorDelegations() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + // Create new account in the keyring for address without delegations. + k, _, err := val.ClientCtx.Keyring.NewMnemonic("test", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + s.Require().NoError(err) + newAddr, err := k.GetAddress() + s.Require().NoError(err) + + testCases := []struct { + name string + url string + headers map[string]string + error bool + respType proto.Message + expectedResp proto.Message + }{ + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", baseURL, "wrongValAddress"), + map[string]string{}, + true, + &types.QueryDelegatorDelegationsResponse{}, + nil, + }, + { + "with no validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", baseURL, ""), + map[string]string{}, + true, + &types.QueryDelegatorDelegationsResponse{}, + nil, + }, + { + "valid request (height specific)", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", baseURL, val.Address.String()), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "1", + }, + false, + &types.QueryDelegatorDelegationsResponse{}, + &types.QueryDelegatorDelegationsResponse{ + DelegationResponses: types.DelegationResponses{ + types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), + }, + Pagination: &query.PageResponse{Total: 1}, + }, + }, + { + "address without delegations", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", baseURL, newAddr.String()), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "1", + }, + false, + &types.QueryDelegatorDelegationsResponse{}, + &types.QueryDelegatorDelegationsResponse{ + DelegationResponses: types.DelegationResponses{}, + Pagination: &query.PageResponse{Total: 0}, + }, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) + s.Require().NoError(err) + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(tc.expectedResp.String(), tc.respType.String()) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryDelegatorUnbondingDelegations() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + ubdsLength int + }{ + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", baseURL, "wrongValAddress"), + true, + 0, + }, + { + "with no validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", baseURL, ""), + true, + 0, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", baseURL, val.Address.String()), + false, + 1, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + var ubds types.QueryDelegatorUnbondingDelegationsResponse + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubds) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Len(ubds.UnbondingResponses, tc.ubdsLength) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryRedelegations() { + val := s.network.Validators[0] + val2 := s.network.Validators[1] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + }{ + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations", baseURL, "wrongValAddress"), + true, + }, + { + "with no validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations", baseURL, ""), + true, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations", baseURL, val.Address.String()), + false, + }, + { + "valid request with src address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations?src_validator_addr=%s", baseURL, val.Address.String(), val.ValAddress.String()), + false, + }, + { + "valid request with dst address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations?dst_validator_addr=%s", baseURL, val.Address.String(), val.ValAddress.String()), + false, + }, + { + "valid request with dst address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/redelegations?src_validator_addr=%s&dst_validator_addr=%s", baseURL, val.Address.String(), val.ValAddress.String(), val2.ValAddress.String()), + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + var redelegations types.QueryRedelegationsResponse + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &redelegations) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + + s.Require().Len(redelegations.RedelegationResponses, 1) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryDelegatorValidators() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + }{ + { + "wrong delegator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators", baseURL, "wrongDelAddress"), + true, + }, + { + "with no delegator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators", baseURL, ""), + true, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators", baseURL, val.Address.String()), + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + var validators types.QueryDelegatorValidatorsResponse + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &validators) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Len(validators.Validators, len(s.network.Validators)) + s.Require().Equal(int(validators.Pagination.Total), len(s.network.Validators)) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryDelegatorValidator() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + }{ + { + "wrong delegator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, "wrongAccAddress", val.ValAddress.String()), + true, + }, + { + "wrong validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, val.Address.String(), "wrongValAddress"), + true, + }, + { + "with empty delegator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, "", val.ValAddress.String()), + true, + }, + { + "with empty validator address", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, val.Address.String(), ""), + true, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/validators/%s", baseURL, val.Address.String(), val.ValAddress.String()), + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + var validator types.QueryDelegatorValidatorResponse + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &validator) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NotNil(validator) + s.Require().Equal(validator.Validator.OperatorAddress, val.ValAddress.String()) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryHistoricalInfo() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + error bool + }{ + { + "wrong height", + fmt.Sprintf("%s/cosmos/staking/v1beta1/historical_info/%s", baseURL, "-1"), + true, + }, + { + "with no height", + fmt.Sprintf("%s/cosmos/staking/v1beta1/historical_info/%s", baseURL, ""), + true, + }, + { + "valid request", + fmt.Sprintf("%s/cosmos/staking/v1beta1/historical_info/%s", baseURL, "2"), + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + resp, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + var historicalInfo types.QueryHistoricalInfoResponse + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &historicalInfo) + + if tc.error { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NotNil(historicalInfo) + } + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryParams() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + respType proto.Message + expected proto.Message + }{ + { + "gRPC request params", + fmt.Sprintf("%s/cosmos/staking/v1beta1/params", baseURL), + &types.QueryParamsResponse{}, + &types.QueryParamsResponse{ + Params: types.DefaultParams(), + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := rest.GetRequest(tc.url) + s.Run(tc.name, func() { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected, tc.respType) + }) + } +} + +func (s *IntegrationTestSuite) TestGRPCQueryPool() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + testCases := []struct { + name string + url string + headers map[string]string + respType proto.Message + expected proto.Message + }{ + { + "gRPC request params", + fmt.Sprintf("%s/cosmos/staking/v1beta1/pool", baseURL), + map[string]string{ + grpctypes.GRPCBlockHeightHeader: "1", + }, + &types.QueryPoolResponse{}, + &types.QueryPoolResponse{ + Pool: types.Pool{ + NotBondedTokens: sdk.NewInt(0), + BondedTokens: cli.DefaultTokens.Mul(sdk.NewInt(2)), + }, + }, + }, + } + + for _, tc := range testCases { + tc := tc + resp, err := testutil.GetRequestWithHeaders(tc.url, tc.headers) + s.Run(tc.name, func() { + s.Require().NoError(err) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + }) + } +} diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index b859e075..8b1c4275 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -57,20 +57,24 @@ func (s *IntegrationTestSuite) SetupSuite() { val2 := s.network.Validators[1] // redelegate - _, err = MsgRedelegateExec( + out, err := MsgRedelegateExec( val.ClientCtx, val.Address, val.ValAddress, val2.ValAddress, unbond, - fmt.Sprintf("--%s=%d", flags.FlagGas, 202954), // 202954 is the required + fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), ) s.Require().NoError(err) + var txRes sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &txRes)) + s.Require().Equal(uint32(0), txRes.Code) _, err = s.network.WaitForHeight(1) s.Require().NoError(err) // unbonding _, err = MsgUnbondExec(val.ClientCtx, val.Address, val.ValAddress, unbond) s.Require().NoError(err) + _, err = s.network.WaitForHeight(1) s.Require().NoError(err) } @@ -881,12 +885,13 @@ func (s *IntegrationTestSuite) TestGetCmdQueryParams() { historical_entries: 10000 max_entries: 7 max_validators: 100 +min_commission_rate: "0.000000000000000000" unbonding_time: 1814400s`, }, { "with json output", []string{fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, - `{"unbonding_time":"1814400s","max_validators":100,"max_entries":7,"historical_entries":10000,"bond_denom":"stake"}`, + `{"unbonding_time":"1814400s","max_validators":100,"max_entries":7,"historical_entries":10000,"bond_denom":"stake","min_commission_rate":"0.000000000000000000"}`, }, } for _, tc := range testCases { @@ -1195,7 +1200,7 @@ func (s *IntegrationTestSuite) TestNewRedelegateCmd() { val2.ValAddress.String(), // dst-validator-addr sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), - fmt.Sprintf("--%s=%s", flags.FlagGas, "auto"), + fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), @@ -1544,7 +1549,6 @@ func (s *IntegrationTestSuite) TestBlockResults() { require := s.Require() val := s.network.Validators[0] - // Create new account in the keyring. // Create new account in the keyring. k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewDelegator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) require.NoError(err) @@ -1609,3 +1613,51 @@ func (s *IntegrationTestSuite) TestBlockResults() { s.network.WaitForNextBlock() } } + +// https://github.com/cosmos/cosmos-sdk/issues/10660 +func (s *IntegrationTestSuite) TestEditValidatorMoniker() { + val := s.network.Validators[0] + require := s.Require() + + txCmd := cli.NewEditValidatorCmd() + moniker := "testing" + _, err := clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", cli.FlagEditMoniker, moniker), + fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }) + require.NoError(err) + + queryCmd := cli.GetCmdQueryValidator() + res, err := clitestutil.ExecTestCLICmd( + val.ClientCtx, queryCmd, + []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, + ) + require.NoError(err) + var result types.Validator + require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) + require.Equal(result.GetMoniker(), moniker) + + _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }) + require.NoError(err) + + res, err = clitestutil.ExecTestCLICmd( + val.ClientCtx, queryCmd, + []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, + ) + require.NoError(err) + + require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) + require.Equal(result.GetMoniker(), moniker) +} diff --git a/x/staking/genesis.go b/x/staking/genesis.go index 8039e851..8b9147f1 100644 --- a/x/staking/genesis.go +++ b/x/staking/genesis.go @@ -45,7 +45,9 @@ func InitGenesis( // Call the creation hook if not exported if !data.Exported { - keeper.AfterValidatorCreated(ctx, validator.GetOperator()) + if err := keeper.AfterValidatorCreated(ctx, validator.GetOperator()); err != nil { + panic(err) + } } // update timeslice if necessary @@ -71,13 +73,18 @@ func InitGenesis( // Call the before-creation hook if not exported if !data.Exported { - keeper.BeforeDelegationCreated(ctx, delegatorAddress, delegation.GetValidatorAddr()) + if err := keeper.BeforeDelegationCreated(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + panic(err) + } } keeper.SetDelegation(ctx, delegation) + // Call the after-modification hook if not exported if !data.Exported { - keeper.AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()) + if err := keeper.AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + panic(err) + } } } @@ -106,15 +113,18 @@ func InitGenesis( if bondedPool == nil { panic(fmt.Sprintf("%s module account has not been set", types.BondedPoolName)) } - // TODO remove with genesis 2-phases refactor https://github.com/cosmos/cosmos-sdk/issues/2862 + + // TODO: remove with genesis 2-phases refactor https://github.com/cosmos/cosmos-sdk/issues/2862 bondedBalance := bankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) if bondedBalance.IsZero() { accountKeeper.SetModuleAccount(ctx, bondedPool) } + // if balance is different from bonded coins panic because genesis is most likely malformed if !bondedBalance.IsEqual(bondedCoins) { panic(fmt.Sprintf("bonded pool balance is different from bonded coins: %s <-> %s", bondedBalance, bondedCoins)) } + notBondedPool := keeper.GetNotBondedPool(ctx) if notBondedPool == nil { panic(fmt.Sprintf("%s module account has not been set", types.NotBondedPoolName)) @@ -124,10 +134,13 @@ func InitGenesis( if notBondedBalance.IsZero() { accountKeeper.SetModuleAccount(ctx, notBondedPool) } - // if balance is different from non bonded coins panic because genesis is most likely malformed + + // If balance is different from non bonded coins panic because genesis is most + // likely malformed. if !notBondedBalance.IsEqual(notBondedCoins) { panic(fmt.Sprintf("not bonded pool balance is different from not bonded coins: %s <-> %s", notBondedBalance, notBondedCoins)) } + // don't need to run Tendermint updates if we exported if data.Exported { for _, lv := range data.LastValidatorPowers { @@ -135,6 +148,7 @@ func InitGenesis( if err != nil { panic(err) } + keeper.SetLastValidatorPower(ctx, valAddr, lv.Power) validator, found := keeper.GetValidator(ctx, valAddr) @@ -148,6 +162,7 @@ func InitGenesis( } } else { var err error + res, err = keeper.ApplyAndReturnValidatorSetUpdates(ctx) if err != nil { log.Fatal(err) diff --git a/x/staking/genesis_test.go b/x/staking/genesis_test.go index 5042f0f4..ba59602e 100644 --- a/x/staking/genesis_test.go +++ b/x/staking/genesis_test.go @@ -35,6 +35,7 @@ func TestInitGenesis(t *testing.T) { params := app.StakingKeeper.GetParams(ctx) validators := app.StakingKeeper.GetAllValidators(ctx) + require.Len(t, validators, 1) var delegations []types.Delegation pk0, err := codectypes.NewAnyWithValue(PKs[0]) @@ -65,16 +66,20 @@ func TestInitGenesis(t *testing.T) { validators = append(validators, bondedVal1, bondedVal2) log.Printf("%#v", len(validators)) // mint coins in the bonded pool representing the validators coins + i2 := len(validators) - 1 // -1 to exclude genesis validator require.NoError(t, testutil.FundModuleAccount( app.BankKeeper, ctx, types.BondedPoolName, sdk.NewCoins( - sdk.NewCoin(params.BondDenom, valTokens.MulRaw((int64)(len(validators)))), + sdk.NewCoin(params.BondDenom, valTokens.MulRaw((int64)(i2))), ), ), ) + genesisDelegations := app.StakingKeeper.GetAllDelegations(ctx) + delegations = append(delegations, genesisDelegations...) + genesisState := types.NewGenesisState(params, validators, delegations) vals := staking.InitGenesis(ctx, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, genesisState) @@ -100,6 +105,8 @@ func TestInitGenesis(t *testing.T) { require.Equal(t, sdkstaking.Bonded, resVal.Status) abcivals := make([]abci.ValidatorUpdate, len(vals)) + + validators = validators[1:] // remove genesis validator for i, val := range validators { abcivals[i] = val.ABCIValidatorUpdate(app.StakingKeeper.PowerReduction(ctx)) } @@ -157,6 +164,7 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { require.True(t, size > 100) app, ctx, addrs := bootstrapGenesisTest(t, 200) + genesisValidators := app.StakingKeeper.GetAllValidators(ctx) params := app.StakingKeeper.GetParams(ctx) delegations := []types.Delegation{} @@ -180,6 +188,8 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { bondedPoolAmt = bondedPoolAmt.Add(tokens) } + validators = append(validators, genesisValidators...) + genesisState := types.NewGenesisState(params, validators, delegations) // mint coins in the bonded pool representing the validators coins @@ -199,6 +209,8 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { abcivals[i] = val.ABCIValidatorUpdate(app.StakingKeeper.PowerReduction(ctx)) } + // remove genesis validator + vals = vals[:100] require.Equal(t, abcivals, vals) } diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index 835ebe80..a3057df7 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -1,30 +1,15 @@ package staking_test import ( - "strings" "testing" - "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - tmtypes "github.com/tendermint/tendermint/types" - "github.com/golang/protobuf/proto" - - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/bank/testutil" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" - "github.com/iqlusioninc/liquidity-staking-module/x/staking" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) func bootstrapHandlerGenesisTest(t *testing.T, power int64, numAddrs int, accAmount sdk.Int) (*simapp.SimApp, sdk.Context, []sdk.AccAddress, []sdk.ValAddress) { @@ -43,1180 +28,6 @@ func bootstrapHandlerGenesisTest(t *testing.T, power int64, numAddrs int, accAmo return app, ctx, addrDels, addrVals } -func TestValidatorByPowerIndex(t *testing.T) { - initPower := int64(1000000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 10, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - validatorAddr, validatorAddr3 := valAddrs[0], valAddrs[1] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // create validator - initBond := tstaking.CreateValidatorWithValPower(validatorAddr, PKs[0], initPower, true) - - // must end-block - updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(updates)) - - // verify the self-delegation exists - bond, found := app.StakingKeeper.GetDelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) - require.True(t, found) - gotBond := bond.Shares.RoundInt() - require.Equal(t, initBond, gotBond) - - // verify that the by power index exists - validator, found := app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - power := types.GetValidatorsByPowerIndexKey(validator, app.StakingKeeper.PowerReduction(ctx)) - require.True(t, keeper.ValidatorByPowerIndexExists(ctx, app.StakingKeeper, power)) - - // create a second validator keep it bonded - tstaking.CreateValidatorWithValPower(validatorAddr3, PKs[2], initPower, true) - - // must end-block - updates, err = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(updates)) - - // slash and jail the first validator - consAddr0 := sdk.ConsAddress(PKs[0].Address()) - app.StakingKeeper.Slash(ctx, consAddr0, 0, initPower, sdk.NewDecWithPrec(5, 1)) - app.StakingKeeper.Jail(ctx, consAddr0) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - - validator, found = app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - require.Equal(t, sdkstaking.Unbonding, validator.Status) // ensure is unbonding - require.Equal(t, initBond.QuoRaw(2), validator.Tokens) // ensure tokens slashed - app.StakingKeeper.Unjail(ctx, consAddr0) - - // the old power record should have been deleted as the power changed - require.False(t, keeper.ValidatorByPowerIndexExists(ctx, app.StakingKeeper, power)) - - // but the new power record should have been created - validator, found = app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - power2 := types.GetValidatorsByPowerIndexKey(validator, app.StakingKeeper.PowerReduction(ctx)) - require.True(t, keeper.ValidatorByPowerIndexExists(ctx, app.StakingKeeper, power2)) - - // now the new record power index should be the same as the original record - power3 := types.GetValidatorsByPowerIndexKey(validator, app.StakingKeeper.PowerReduction(ctx)) - require.Equal(t, power2, power3) - - // unbond self-delegation - totalBond := validator.TokensFromShares(bond.GetShares()).TruncateInt() - res := tstaking.Undelegate(sdk.AccAddress(validatorAddr), validatorAddr, totalBond, true) - - var resData types.MsgUndelegateResponse - err = proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - ctx = ctx.WithBlockTime(resData.CompletionTime) - staking.EndBlocker(ctx, app.StakingKeeper) - staking.EndBlocker(ctx, app.StakingKeeper) - - // verify that by power key nolonger exists - _, found = app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.False(t, found) - require.False(t, keeper.ValidatorByPowerIndexExists(ctx, app.StakingKeeper, power3)) -} - -func TestDuplicatesMsgCreateValidator(t *testing.T) { - initPower := int64(1000000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 10, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - - addr1, addr2 := valAddrs[0], valAddrs[1] - pk1, pk2 := PKs[0], PKs[1] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - valTokens := tstaking.CreateValidatorWithValPower(addr1, pk1, 10, true) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - - validator := tstaking.CheckValidator(addr1, sdkstaking.Bonded, false) - assert.Equal(t, addr1.String(), validator.OperatorAddress) - consKey, err := validator.TmConsPublicKey() - require.NoError(t, err) - tmPk1, err := cryptocodec.ToTmProtoPublicKey(pk1) - require.NoError(t, err) - assert.Equal(t, tmPk1, consKey) - assert.Equal(t, valTokens, validator.BondedTokens()) - assert.Equal(t, valTokens.ToDec(), validator.DelegatorShares) - assert.Equal(t, types.Description{}, validator.Description) - - // two validators can't have the same operator address - tstaking.CreateValidator(addr1, pk2, valTokens, false) - - // two validators can't have the same pubkey - tstaking.CreateValidator(addr2, pk1, valTokens, false) - - // must have different pubkey and operator - tstaking.CreateValidator(addr2, pk2, valTokens, true) - - // must end-block - updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(updates)) - - validator = tstaking.CheckValidator(addr2, sdkstaking.Bonded, false) - assert.Equal(t, addr2.String(), validator.OperatorAddress) - consPk, err := validator.TmConsPublicKey() - require.NoError(t, err) - tmPk2, err := cryptocodec.ToTmProtoPublicKey(pk2) - require.NoError(t, err) - assert.Equal(t, tmPk2, consPk) - assert.True(sdk.IntEq(t, valTokens, validator.Tokens)) - assert.True(sdk.DecEq(t, valTokens.ToDec(), validator.DelegatorShares)) - assert.Equal(t, types.Description{}, validator.Description) -} - -func TestInvalidPubKeyTypeMsgCreateValidator(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 1, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - ctx = ctx.WithConsensusParams(&tmproto.ConsensusParams{ - Validator: &tmproto.ValidatorParams{PubKeyTypes: []string{tmtypes.ABCIPubKeyTypeEd25519}}, - }) - - addr := valAddrs[0] - invalidPk := secp256k1.GenPrivKey().PubKey() - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // invalid pukKey type should not be allowed - tstaking.CreateValidator(addr, invalidPk, sdk.NewInt(10), false) -} - -func TestBothPubKeyTypesMsgCreateValidator(t *testing.T) { - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, 1000, 2, sdk.NewInt(1000)) - ctx = ctx.WithConsensusParams(&tmproto.ConsensusParams{ - Validator: &tmproto.ValidatorParams{PubKeyTypes: []string{tmtypes.ABCIPubKeyTypeEd25519, tmtypes.ABCIPubKeyTypeSecp256k1}}, - }) - - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - testCases := []struct { - name string - addr sdk.ValAddress - pk cryptotypes.PubKey - }{ - { - "can create a validator with ed25519 pubkey", - valAddrs[0], - ed25519.GenPrivKey().PubKey(), - }, - { - "can create a validator with secp256k1 pubkey", - valAddrs[1], - secp256k1.GenPrivKey().PubKey(), - }, - } - for _, tc := range testCases { - t.Run(tc.name, func(*testing.T) { - tstaking.CreateValidator(tc.addr, tc.pk, sdk.NewInt(10), true) - }) - } -} - -func TestLegacyValidatorDelegations(t *testing.T) { - initPower := int64(1000) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - valAddr := valAddrs[0] - valConsPubKey, valConsAddr := PKs[0], sdk.ConsAddress(PKs[0].Address()) - delAddr := delAddrs[1] - - // create validator - bondAmount := tstaking.CreateValidatorWithValPower(valAddr, valConsPubKey, 10, true) - - // must end-block - updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(updates)) - - // verify the validator exists and has the correct attributes - validator := tstaking.CheckValidator(valAddr, sdkstaking.Bonded, false) - require.Equal(t, bondAmount, validator.DelegatorShares.RoundInt()) - require.Equal(t, bondAmount, validator.BondedTokens()) - - // delegate tokens to the validator - tstaking.Delegate(delAddr, valAddr, bondAmount) - - // verify validator bonded shares - validator = tstaking.CheckValidator(valAddr, sdkstaking.Bonded, false) - require.Equal(t, bondAmount.MulRaw(2), validator.DelegatorShares.RoundInt()) - require.Equal(t, bondAmount.MulRaw(2), validator.BondedTokens()) - - // unbond validator total self-delegations (which should jail the validator) - res := tstaking.Undelegate(sdk.AccAddress(valAddr), valAddr, bondAmount, true) - - var resData types.MsgUndelegateResponse - err = proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - ctx = ctx.WithBlockTime(resData.CompletionTime) - tstaking.Ctx = ctx - staking.EndBlocker(ctx, app.StakingKeeper) - - // verify the validator record still exists, is jailed, and has correct tokens - validator = tstaking.CheckValidator(valAddr, -1, true) - require.Equal(t, bondAmount, validator.Tokens) - - // verify delegation still exists - bond, found := app.StakingKeeper.GetDelegation(ctx, delAddr, valAddr) - require.True(t, found) - require.Equal(t, bondAmount, bond.Shares.RoundInt()) - require.Equal(t, bondAmount, validator.DelegatorShares.RoundInt()) - - // verify the validator can still self-delegate - tstaking.Delegate(sdk.AccAddress(valAddr), valAddr, bondAmount) - - // verify validator bonded shares - validator, found = app.StakingKeeper.GetValidator(ctx, valAddr) - require.True(t, found) - require.Equal(t, bondAmount.MulRaw(2), validator.DelegatorShares.RoundInt()) - require.Equal(t, bondAmount.MulRaw(2), validator.Tokens) - - // unjail the validator now that is has non-zero self-delegated shares - app.StakingKeeper.Unjail(ctx, valConsAddr) - - // verify the validator can now accept delegations - tstaking.Delegate(delAddr, valAddr, bondAmount) - - // verify validator bonded shares - validator, found = app.StakingKeeper.GetValidator(ctx, valAddr) - require.True(t, found) - require.Equal(t, bondAmount.MulRaw(3), validator.DelegatorShares.RoundInt()) - require.Equal(t, bondAmount.MulRaw(3), validator.Tokens) - - // verify new delegation - bond, found = app.StakingKeeper.GetDelegation(ctx, delAddr, valAddr) - require.True(t, found) - require.Equal(t, bondAmount.MulRaw(2), bond.Shares.RoundInt()) - require.Equal(t, bondAmount.MulRaw(3), validator.DelegatorShares.RoundInt()) -} - -func TestIncrementsMsgDelegate(t *testing.T) { - initPower := int64(1000) - initBond := sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - - params := app.StakingKeeper.GetParams(ctx) - validatorAddr, delegatorAddr := valAddrs[0], delAddrs[1] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // first create validator - bondAmount := tstaking.CreateValidatorWithValPower(validatorAddr, PKs[0], 10, true) - - // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - - validator := tstaking.CheckValidator(validatorAddr, sdkstaking.Bonded, false) - require.Equal(t, bondAmount, validator.DelegatorShares.RoundInt()) - require.Equal(t, bondAmount, validator.BondedTokens(), "validator: %v", validator) - - tstaking.CheckDelegator(delegatorAddr, validatorAddr, false) - - bond, found := app.StakingKeeper.GetDelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) - require.True(t, found) - require.Equal(t, bondAmount, bond.Shares.RoundInt()) - - bondedTokens := app.StakingKeeper.TotalBondedTokens(ctx) - require.Equal(t, bondAmount, bondedTokens) - - for i := int64(0); i < 5; i++ { - ctx = ctx.WithBlockHeight(i) - tstaking.Ctx = ctx - tstaking.Delegate(delegatorAddr, validatorAddr, bondAmount) - - //Check that the accounts and the bond account have the appropriate values - validator, found := app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - bond, found := app.StakingKeeper.GetDelegation(ctx, delegatorAddr, validatorAddr) - require.True(t, found) - - expBond := bondAmount.MulRaw(i + 1) - expDelegatorShares := bondAmount.MulRaw(i + 2) // (1 self delegation) - expDelegatorAcc := initBond.Sub(expBond) - - gotBond := bond.Shares.RoundInt() - gotDelegatorShares := validator.DelegatorShares.RoundInt() - gotDelegatorAcc := app.BankKeeper.GetBalance(ctx, delegatorAddr, params.BondDenom).Amount - - require.Equal(t, expBond, gotBond, - "i: %v\nexpBond: %v\ngotBond: %v\nvalidator: %v\nbond: %v\n", - i, expBond, gotBond, validator, bond) - require.Equal(t, expDelegatorShares, gotDelegatorShares, - "i: %v\nexpDelegatorShares: %v\ngotDelegatorShares: %v\nvalidator: %v\nbond: %v\n", - i, expDelegatorShares, gotDelegatorShares, validator, bond) - require.Equal(t, expDelegatorAcc, gotDelegatorAcc, - "i: %v\nexpDelegatorAcc: %v\ngotDelegatorAcc: %v\nvalidator: %v\nbond: %v\n", - i, expDelegatorAcc, gotDelegatorAcc, validator, bond) - } -} - -func TestEditValidatorDecreaseMinSelfDelegation(t *testing.T) { - initPower := int64(100) - initBond := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 1, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - - validatorAddr := valAddrs[0] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // create validator - msgCreateValidator := tstaking.CreateValidatorMsg(validatorAddr, PKs[0], initBond) - msgCreateValidator.MinSelfDelegation = sdk.NewInt(2) - tstaking.Handle(msgCreateValidator, true) - - // must end-block - updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(updates)) - - // verify the self-delegation exists - bond, found := app.StakingKeeper.GetDelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) - require.True(t, found) - gotBond := bond.Shares.RoundInt() - require.Equal(t, initBond, gotBond, - "initBond: %v\ngotBond: %v\nbond: %v\n", - initBond, gotBond, bond) - - newMinSelfDelegation := sdk.OneInt() - msgEditValidator := types.NewMsgEditValidator(validatorAddr, types.Description{}, nil, &newMinSelfDelegation) - tstaking.Handle(msgEditValidator, false) -} - -func TestEditValidatorIncreaseMinSelfDelegationBeyondCurrentBond(t *testing.T) { - initPower := int64(100) - initBond := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction) - - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - validatorAddr := valAddrs[0] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // create validator - msgCreateValidator := tstaking.CreateValidatorMsg(validatorAddr, PKs[0], initBond) - msgCreateValidator.MinSelfDelegation = sdk.NewInt(2) - tstaking.Handle(msgCreateValidator, true) - - // must end-block - updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(updates)) - - // verify the self-delegation exists - bond, found := app.StakingKeeper.GetDelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) - require.True(t, found) - gotBond := bond.Shares.RoundInt() - require.Equal(t, initBond, gotBond, - "initBond: %v\ngotBond: %v\nbond: %v\n", - initBond, gotBond, bond) - - newMinSelfDelegation := initBond.Add(sdk.OneInt()) - msgEditValidator := types.NewMsgEditValidator(validatorAddr, types.Description{}, nil, &newMinSelfDelegation) - tstaking.Handle(msgEditValidator, false) -} - -func TestIncrementsMsgUnbond(t *testing.T) { - initPower := int64(1000) - - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - params := app.StakingKeeper.GetParams(ctx) - denom := params.BondDenom - - // create validator, delegate - validatorAddr, delegatorAddr := valAddrs[0], delAddrs[1] - initBond := tstaking.CreateValidatorWithValPower(validatorAddr, PKs[0], initPower, true) - - // initial balance - amt1 := app.BankKeeper.GetBalance(ctx, delegatorAddr, denom).Amount - - tstaking.Delegate(delegatorAddr, validatorAddr, initBond) - - // balance should have been subtracted after delegation - amt2 := app.BankKeeper.GetBalance(ctx, delegatorAddr, denom).Amount - require.True(sdk.IntEq(t, amt1.Sub(initBond), amt2)) - - // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - - validator, found := app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - require.Equal(t, initBond.MulRaw(2), validator.DelegatorShares.RoundInt()) - require.Equal(t, initBond.MulRaw(2), validator.BondedTokens()) - - // just send the same msgUnbond multiple times - // TODO use decimals here - unbondAmt := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)) - msgUndelegate := types.NewMsgUndelegate(delegatorAddr, validatorAddr, unbondAmt) - numUnbonds := int64(5) - - for i := int64(0); i < numUnbonds; i++ { - res := tstaking.Handle(msgUndelegate, true) - - var resData types.MsgUndelegateResponse - err := proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - ctx = ctx.WithBlockTime(resData.CompletionTime) - tstaking.Ctx = ctx - staking.EndBlocker(ctx, app.StakingKeeper) - - // check that the accounts and the bond account have the appropriate values - validator, found = app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - bond, found := app.StakingKeeper.GetDelegation(ctx, delegatorAddr, validatorAddr) - require.True(t, found) - - expBond := initBond.Sub(unbondAmt.Amount.Mul(sdk.NewInt(i + 1))) - expDelegatorShares := initBond.MulRaw(2).Sub(unbondAmt.Amount.Mul(sdk.NewInt(i + 1))) - expDelegatorAcc := initBond.Sub(expBond) - - gotBond := bond.Shares.RoundInt() - gotDelegatorShares := validator.DelegatorShares.RoundInt() - gotDelegatorAcc := app.BankKeeper.GetBalance(ctx, delegatorAddr, params.BondDenom).Amount - - require.Equal(t, expBond, gotBond, - "i: %v\nexpBond: %v\ngotBond: %v\nvalidator: %v\nbond: %v\n", - i, expBond, gotBond, validator, bond) - require.Equal(t, expDelegatorShares, gotDelegatorShares, - "i: %v\nexpDelegatorShares: %v\ngotDelegatorShares: %v\nvalidator: %v\nbond: %v\n", - i, expDelegatorShares, gotDelegatorShares, validator, bond) - require.Equal(t, expDelegatorAcc, gotDelegatorAcc, - "i: %v\nexpDelegatorAcc: %v\ngotDelegatorAcc: %v\nvalidator: %v\nbond: %v\n", - i, expDelegatorAcc, gotDelegatorAcc, validator, bond) - } - - // these are more than we have bonded now - errorCases := []sdk.Int{ - //1<<64 - 1, // more than int64 power - //1<<63 + 1, // more than int64 power - app.StakingKeeper.TokensFromConsensusPower(ctx, 1<<63-1), - app.StakingKeeper.TokensFromConsensusPower(ctx, 1<<31), - initBond, - } - - for _, c := range errorCases { - tstaking.Undelegate(delegatorAddr, validatorAddr, c, false) - } - - // should be able to unbond remaining - leftBonded := initBond.Sub(unbondAmt.Amount.Mul(sdk.NewInt(numUnbonds))) - tstaking.Undelegate(delegatorAddr, validatorAddr, leftBonded, true) -} - -func TestMultipleMsgCreateValidator(t *testing.T) { - initPower := int64(1000) - initTokens := sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 3, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - - params := app.StakingKeeper.GetParams(ctx) - blockTime := time.Now().UTC() - ctx = ctx.WithBlockTime(blockTime) - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - validatorAddrs := []sdk.ValAddress{ - valAddrs[0], - valAddrs[1], - valAddrs[2], - } - delegatorAddrs := []sdk.AccAddress{ - delAddrs[0], - delAddrs[1], - delAddrs[2], - } - - // bond them all - amt := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - for i, validatorAddr := range validatorAddrs { - tstaking.CreateValidator(validatorAddr, PKs[i], amt, true) - // verify that the account is bonded - validators := app.StakingKeeper.GetValidators(ctx, 100) - require.Equal(t, (i + 1), len(validators)) - - val := validators[i] - balanceExpd := initTokens.Sub(amt) - balanceGot := app.BankKeeper.GetBalance(ctx, delegatorAddrs[i], params.BondDenom).Amount - - require.Equal(t, i+1, len(validators), "expected %d validators got %d, validators: %v", i+1, len(validators), validators) - require.Equal(t, amt, val.DelegatorShares.RoundInt(), "expected %d shares, got %d", amt, val.DelegatorShares) - require.Equal(t, balanceExpd, balanceGot, "expected account to have %d, got %d", balanceExpd, balanceGot) - } - - staking.EndBlocker(ctx, app.StakingKeeper) - - // unbond them all by removing delegation - for i, validatorAddr := range validatorAddrs { - _, found := app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - - res := tstaking.Undelegate(delegatorAddrs[i], validatorAddr, amt, true) - - var resData types.MsgUndelegateResponse - err := proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - // adds validator into unbonding queue - staking.EndBlocker(ctx, app.StakingKeeper) - - // removes validator from queue and set - staking.EndBlocker(ctx.WithBlockTime(blockTime.Add(params.UnbondingTime)), app.StakingKeeper) - - // Check that the validator is deleted from state - validators := app.StakingKeeper.GetValidators(ctx, 100) - require.Equal(t, len(validatorAddrs)-(i+1), len(validators), - "expected %d validators got %d", len(validatorAddrs)-(i+1), len(validators)) - - _, found = app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.False(t, found) - - gotBalance := app.BankKeeper.GetBalance(ctx, delegatorAddrs[i], params.BondDenom).Amount - require.Equal(t, initTokens, gotBalance, "expected account to have %d, got %d", initTokens, gotBalance) - } -} - -func TestMultipleMsgDelegate(t *testing.T) { - initPower := int64(1000) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 50, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - validatorAddr, delegatorAddrs := valAddrs[0], delAddrs[1:] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - var amount int64 = 10 - - // first make a validator - tstaking.CreateValidator(validatorAddr, PKs[0], sdk.NewInt(amount), true) - - // delegate multiple parties - for _, delegatorAddr := range delegatorAddrs { - tstaking.Delegate(delegatorAddr, validatorAddr, sdk.NewInt(10)) - tstaking.CheckDelegator(delegatorAddr, validatorAddr, true) - } - - // unbond them all - for _, delegatorAddr := range delegatorAddrs { - res := tstaking.Undelegate(delegatorAddr, validatorAddr, sdk.NewInt(amount), true) - - var resData types.MsgUndelegateResponse - err := proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - ctx = ctx.WithBlockTime(resData.CompletionTime) - staking.EndBlocker(ctx, app.StakingKeeper) - tstaking.Ctx = ctx - - // check that the account is unbonded - _, found := app.StakingKeeper.GetDelegation(ctx, delegatorAddr, validatorAddr) - require.False(t, found) - } -} - -func TestJailValidator(t *testing.T) { - initPower := int64(1000) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - validatorAddr, delegatorAddr := valAddrs[0], delAddrs[1] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - var amt int64 = 10 - - // create the validator and delegate - tstaking.CreateValidator(validatorAddr, PKs[0], sdk.NewInt(amt), true) - tstaking.Delegate(delegatorAddr, validatorAddr, sdk.NewInt(amt)) - - // unbond the validators bond portion - unamt := sdk.NewInt(amt) - res := tstaking.Undelegate(sdk.AccAddress(validatorAddr), validatorAddr, unamt, true) - - var resData types.MsgUndelegateResponse - err := proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - ctx = ctx.WithBlockTime(resData.CompletionTime) - staking.EndBlocker(ctx, app.StakingKeeper) - tstaking.Ctx = ctx - - tstaking.CheckValidator(validatorAddr, -1, true) - - // test that the delegator can still withdraw their bonds - tstaking.Undelegate(delegatorAddr, validatorAddr, unamt, true) - - err = proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - ctx = ctx.WithBlockTime(resData.CompletionTime) - staking.EndBlocker(ctx, app.StakingKeeper) - tstaking.Ctx = ctx - - // verify that the pubkey can now be reused - tstaking.CreateValidator(validatorAddr, PKs[0], sdk.NewInt(amt), true) -} - -func TestValidatorQueue(t *testing.T) { - initPower := int64(1000) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - validatorAddr, delegatorAddr := valAddrs[0], delAddrs[1] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // set the unbonding time - params := app.StakingKeeper.GetParams(ctx) - params.UnbondingTime = 7 * time.Second - app.StakingKeeper.SetParams(ctx, params) - - // create the validator and make a bond - amt := tstaking.CreateValidatorWithValPower(validatorAddr, PKs[0], 10, true) - tstaking.Delegate(delegatorAddr, validatorAddr, amt) - staking.EndBlocker(ctx, app.StakingKeeper) - - // unbond the all self-delegation to put validator in unbonding state - res := tstaking.Undelegate(sdk.AccAddress(validatorAddr), validatorAddr, amt, true) - - var resData types.MsgUndelegateResponse - err := proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - finishTime := resData.CompletionTime - - ctx = tstaking.TurnBlock(finishTime) - origHeader := ctx.BlockHeader() - - validator, found := app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - require.True(t, validator.IsUnbonding(), "%v", validator) - - // should still be unbonding at time 6 seconds later - ctx = tstaking.TurnBlock(origHeader.Time.Add(time.Second * 6)) - - validator, found = app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - require.True(t, validator.IsUnbonding(), "%v", validator) - - // should be in unbonded state at time 7 seconds later - ctx = tstaking.TurnBlock(origHeader.Time.Add(time.Second * 7)) - - validator, found = app.StakingKeeper.GetValidator(ctx, validatorAddr) - require.True(t, found) - require.True(t, validator.IsUnbonded(), "%v", validator) -} - -func TestUnbondingPeriod(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 1, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - validatorAddr := valAddrs[0] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // set the unbonding time - params := app.StakingKeeper.GetParams(ctx) - params.UnbondingTime = 7 * time.Second - app.StakingKeeper.SetParams(ctx, params) - - // create the validator - amt := tstaking.CreateValidatorWithValPower(validatorAddr, PKs[0], 10, true) - staking.EndBlocker(ctx, app.StakingKeeper) - - // begin unbonding - tstaking.Undelegate(sdk.AccAddress(validatorAddr), validatorAddr, amt, true) - - origHeader := ctx.BlockHeader() - - _, found := app.StakingKeeper.GetUnbondingDelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) - require.True(t, found, "should not have unbonded") - - // cannot complete unbonding at same time - staking.EndBlocker(ctx, app.StakingKeeper) - _, found = app.StakingKeeper.GetUnbondingDelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) - require.True(t, found, "should not have unbonded") - - // cannot complete unbonding at time 6 seconds later - ctx = tstaking.TurnBlock(origHeader.Time.Add(time.Second * 6)) - _, found = app.StakingKeeper.GetUnbondingDelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) - require.True(t, found, "should not have unbonded") - - // can complete unbonding at time 7 seconds later - ctx = tstaking.TurnBlock(origHeader.Time.Add(time.Second * 7)) - _, found = app.StakingKeeper.GetUnbondingDelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr) - require.False(t, found, "should have unbonded") -} - -func TestUnbondingFromUnbondingValidator(t *testing.T) { - initPower := int64(1000) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - validatorAddr, delegatorAddr := valAddrs[0], delAddrs[1] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // create the validator and delegate - tstaking.CreateValidator(validatorAddr, PKs[0], sdk.NewInt(10), true) - tstaking.Delegate(delegatorAddr, validatorAddr, sdk.NewInt(10)) - - // unbond the validators bond portion - unbondAmt := sdk.NewInt(10) - res := tstaking.Undelegate(sdk.AccAddress(validatorAddr), validatorAddr, unbondAmt, true) - - // change the ctx to Block Time one second before the validator would have unbonded - var resData types.MsgUndelegateResponse - err := proto.Unmarshal(res.Data, &resData) - require.NoError(t, err) - - ctx = ctx.WithBlockTime(resData.CompletionTime.Add(time.Second * -1)) - - // unbond the delegator from the validator - res = tstaking.Undelegate(delegatorAddr, validatorAddr, unbondAmt, true) - - ctx = tstaking.TurnBlockTimeDiff(app.StakingKeeper.UnbondingTime(ctx)) - tstaking.Ctx = ctx - - // Check to make sure that the unbonding delegation is no longer in state - // (meaning it was deleted in the above EndBlocker) - _, found := app.StakingKeeper.GetUnbondingDelegation(ctx, delegatorAddr, validatorAddr) - require.False(t, found, "should be removed from state") -} - -func TestRedelegationPeriod(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - validatorAddr, validatorAddr2 := valAddrs[0], valAddrs[1] - denom := app.StakingKeeper.GetParams(ctx).BondDenom - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // set the unbonding time - params := app.StakingKeeper.GetParams(ctx) - params.UnbondingTime = 7 * time.Second - app.StakingKeeper.SetParams(ctx, params) - // initial balance - amt1 := app.BankKeeper.GetBalance(ctx, sdk.AccAddress(validatorAddr), denom).Amount - - // create the validators - tstaking.CreateValidator(validatorAddr, PKs[0], sdk.NewInt(10), true) - - // balance should have been subtracted after creation - amt2 := app.BankKeeper.GetBalance(ctx, sdk.AccAddress(validatorAddr), denom).Amount - require.Equal(t, amt1.Sub(sdk.NewInt(10)), amt2, "expected coins to be subtracted") - - tstaking.CreateValidator(validatorAddr2, PKs[1], sdk.NewInt(10), true) - bal1 := app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(validatorAddr)) - - // begin redelegate - redAmt := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)) - msgBeginRedelegate := types.NewMsgBeginRedelegate(sdk.AccAddress(validatorAddr), validatorAddr, validatorAddr2, redAmt) - tstaking.Handle(msgBeginRedelegate, true) - - // origin account should not lose tokens as with a regular delegation - bal2 := app.BankKeeper.GetAllBalances(ctx, sdk.AccAddress(validatorAddr)) - require.Equal(t, bal1, bal2) - - origHeader := ctx.BlockHeader() - - // cannot complete redelegation at same time - staking.EndBlocker(ctx, app.StakingKeeper) - _, found := app.StakingKeeper.GetRedelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr, validatorAddr2) - require.True(t, found, "should not have unbonded") - - // cannot complete redelegation at time 6 seconds later - ctx = tstaking.TurnBlock(origHeader.Time.Add(time.Second * 6)) - _, found = app.StakingKeeper.GetRedelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr, validatorAddr2) - require.True(t, found, "should not have unbonded") - - // can complete redelegation at time 7 seconds later - ctx = tstaking.TurnBlock(origHeader.Time.Add(time.Second * 7)) - _, found = app.StakingKeeper.GetRedelegation(ctx, sdk.AccAddress(validatorAddr), validatorAddr, validatorAddr2) - require.False(t, found, "should have unbonded") -} - -func TestTransitiveRedelegation(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 3, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - - val1, val2, val3 := valAddrs[0], valAddrs[1], valAddrs[2] - blockTime := time.Now().UTC() - ctx = ctx.WithBlockTime(blockTime) - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // create the validators - tstaking.CreateValidator(val1, PKs[0], sdk.NewInt(10), true) - tstaking.CreateValidator(val2, PKs[1], sdk.NewInt(10), true) - tstaking.CreateValidator(val3, PKs[2], sdk.NewInt(10), true) - - // begin redelegate - redAmt := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)) - msgBeginRedelegate := types.NewMsgBeginRedelegate(sdk.AccAddress(val1), val1, val2, redAmt) - tstaking.Handle(msgBeginRedelegate, true) - - // cannot redelegation to next validator while first delegation exists - msgBeginRedelegate = types.NewMsgBeginRedelegate(sdk.AccAddress(val1), val2, val3, redAmt) - tstaking.Handle(msgBeginRedelegate, false) - - params := app.StakingKeeper.GetParams(ctx) - ctx = ctx.WithBlockTime(blockTime.Add(params.UnbondingTime)) - tstaking.Ctx = ctx - - // complete first redelegation - staking.EndBlocker(ctx, app.StakingKeeper) - - // now should be able to redelegate from the second validator to the third - tstaking.Handle(msgBeginRedelegate, true) -} - -func TestMultipleRedelegationAtSameTime(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - valAddr := valAddrs[0] - valAddr2 := valAddrs[1] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // set the unbonding time - params := app.StakingKeeper.GetParams(ctx) - params.UnbondingTime = 1 * time.Second - app.StakingKeeper.SetParams(ctx, params) - - // create the validators - valTokens := tstaking.CreateValidatorWithValPower(valAddr, PKs[0], 10, true) - tstaking.CreateValidator(valAddr2, PKs[1], valTokens, true) - - // end block to bond them - staking.EndBlocker(ctx, app.StakingKeeper) - - // begin a redelegate - selfDelAddr := sdk.AccAddress(valAddr) // (the validator is it's own delegator) - redAmt := sdk.NewCoin(sdk.DefaultBondDenom, valTokens.QuoRaw(2)) - msgBeginRedelegate := types.NewMsgBeginRedelegate(selfDelAddr, valAddr, valAddr2, redAmt) - tstaking.Handle(msgBeginRedelegate, true) - - // there should only be one entry in the redelegation object - rd, found := app.StakingKeeper.GetRedelegation(ctx, selfDelAddr, valAddr, valAddr2) - require.True(t, found) - require.Len(t, rd.Entries, 1) - - // start a second redelegation at this same time as the first - tstaking.Handle(msgBeginRedelegate, true) - - // now there should be two entries - rd, found = app.StakingKeeper.GetRedelegation(ctx, selfDelAddr, valAddr, valAddr2) - require.True(t, found) - require.Len(t, rd.Entries, 2) - - // move forward in time, should complete both redelegations - ctx = tstaking.TurnBlockTimeDiff(1 * time.Second) - rd, found = app.StakingKeeper.GetRedelegation(ctx, selfDelAddr, valAddr, valAddr2) - require.False(t, found) -} - -func TestMultipleRedelegationAtUniqueTimes(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 2, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - valAddr := valAddrs[0] - valAddr2 := valAddrs[1] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // set the unbonding time - params := app.StakingKeeper.GetParams(ctx) - params.UnbondingTime = 10 * time.Second - app.StakingKeeper.SetParams(ctx, params) - - // create the validators - valTokens := tstaking.CreateValidatorWithValPower(valAddr, PKs[0], 10, true) - tstaking.CreateValidator(valAddr2, PKs[1], valTokens, true) - - // end block to bond them - staking.EndBlocker(ctx, app.StakingKeeper) - - // begin a redelegate - selfDelAddr := sdk.AccAddress(valAddr) // (the validator is it's own delegator) - redAmt := sdk.NewCoin(sdk.DefaultBondDenom, valTokens.QuoRaw(2)) - msgBeginRedelegate := types.NewMsgBeginRedelegate(selfDelAddr, valAddr, valAddr2, redAmt) - tstaking.Handle(msgBeginRedelegate, true) - - // move forward in time and start a second redelegation - ctx = ctx.WithBlockTime(ctx.BlockHeader().Time.Add(5 * time.Second)) - tstaking.Ctx = ctx - tstaking.Handle(msgBeginRedelegate, true) - - // now there should be two entries - rd, found := app.StakingKeeper.GetRedelegation(ctx, selfDelAddr, valAddr, valAddr2) - require.True(t, found) - require.Len(t, rd.Entries, 2) - - // move forward in time, should complete the first redelegation, but not the second - ctx = tstaking.TurnBlockTimeDiff(5 * time.Second) - rd, found = app.StakingKeeper.GetRedelegation(ctx, selfDelAddr, valAddr, valAddr2) - require.True(t, found) - require.Len(t, rd.Entries, 1) - - // move forward in time, should complete the second redelegation - ctx = tstaking.TurnBlockTimeDiff(5 * time.Second) - rd, found = app.StakingKeeper.GetRedelegation(ctx, selfDelAddr, valAddr, valAddr2) - require.False(t, found) -} - -func TestMultipleUnbondingDelegationAtSameTime(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 1, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - valAddr := valAddrs[0] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // set the unbonding time - params := app.StakingKeeper.GetParams(ctx) - params.UnbondingTime = 1 * time.Second - app.StakingKeeper.SetParams(ctx, params) - - // create the validators - valTokens := tstaking.CreateValidatorWithValPower(valAddr, PKs[0], 10, true) - - // end block to bond - staking.EndBlocker(ctx, app.StakingKeeper) - - // begin an unbonding delegation - selfDelAddr := sdk.AccAddress(valAddr) // (the validator is it's own delegator) - tstaking.Undelegate(selfDelAddr, valAddr, valTokens.QuoRaw(2), true) - - // there should only be one entry in the ubd object - ubd, found := app.StakingKeeper.GetUnbondingDelegation(ctx, selfDelAddr, valAddr) - require.True(t, found) - require.Len(t, ubd.Entries, 1) - - // start a second ubd at this same time as the first - tstaking.Undelegate(selfDelAddr, valAddr, valTokens.QuoRaw(2), true) - - // now there should be two entries - ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, selfDelAddr, valAddr) - require.True(t, found) - require.Len(t, ubd.Entries, 2) - - // move forwaubd in time, should complete both ubds - ctx = tstaking.TurnBlockTimeDiff(1 * time.Second) - ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, selfDelAddr, valAddr) - require.False(t, found) -} - -func TestMultipleUnbondingDelegationAtUniqueTimes(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 1, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - valAddr := valAddrs[0] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // set the unbonding time - params := app.StakingKeeper.GetParams(ctx) - params.UnbondingTime = 10 * time.Second - app.StakingKeeper.SetParams(ctx, params) - - // create the validator - valTokens := tstaking.CreateValidatorWithValPower(valAddr, PKs[0], 10, true) - - // end block to bond - staking.EndBlocker(ctx, app.StakingKeeper) - - // begin an unbonding delegation - selfDelAddr := sdk.AccAddress(valAddr) // (the validator is it's own delegator) - tstaking.Undelegate(selfDelAddr, valAddr, valTokens.QuoRaw(2), true) - - // there should only be one entry in the ubd object - ubd, found := app.StakingKeeper.GetUnbondingDelegation(ctx, selfDelAddr, valAddr) - require.True(t, found) - require.Len(t, ubd.Entries, 1) - - // move forwaubd in time and start a second redelegation - ctx = ctx.WithBlockTime(ctx.BlockHeader().Time.Add(5 * time.Second)) - tstaking.Ctx = ctx - tstaking.Undelegate(selfDelAddr, valAddr, valTokens.QuoRaw(2), true) - - // now there should be two entries - ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, selfDelAddr, valAddr) - require.True(t, found) - require.Len(t, ubd.Entries, 2) - - // move forwaubd in time, should complete the first redelegation, but not the second - ctx = tstaking.TurnBlockTimeDiff(5 * time.Second) - ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, selfDelAddr, valAddr) - require.True(t, found) - require.Len(t, ubd.Entries, 1) - - // move forwaubd in time, should complete the second redelegation - ctx = tstaking.TurnBlockTimeDiff(5 * time.Second) - ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, selfDelAddr, valAddr) - require.False(t, found) -} - -func TestUnbondingWhenExcessValidators(t *testing.T) { - initPower := int64(1000) - app, ctx, _, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 3, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - val1 := valAddrs[0] - val2 := valAddrs[1] - val3 := valAddrs[2] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // set the unbonding time - params := app.StakingKeeper.GetParams(ctx) - params.MaxValidators = 2 - app.StakingKeeper.SetParams(ctx, params) - - // add three validators - tstaking.CreateValidatorWithValPower(val1, PKs[0], 50, true) - // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 1, len(app.StakingKeeper.GetLastValidators(ctx))) - - valTokens2 := tstaking.CreateValidatorWithValPower(val2, PKs[1], 30, true) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 2, len(app.StakingKeeper.GetLastValidators(ctx))) - - tstaking.CreateValidatorWithValPower(val3, PKs[2], 10, true) - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.Equal(t, 2, len(app.StakingKeeper.GetLastValidators(ctx))) - - // unbond the validator-2 - tstaking.Undelegate(sdk.AccAddress(val2), val2, valTokens2, true) - // apply TM updates - app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - - // because there are extra validators waiting to get in, the queued - // validator (aka. validator-1) should make it into the bonded group, thus - // the total number of validators should stay the same - vals := app.StakingKeeper.GetLastValidators(ctx) - require.Equal(t, 2, len(vals), "vals %v", vals) - tstaking.CheckValidator(val1, sdkstaking.Bonded, false) -} - -func TestBondUnbondRedelegateSlashTwice(t *testing.T) { - initPower := int64(1000) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 3, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - valA, valB, del := valAddrs[0], valAddrs[1], delAddrs[2] - consAddr0 := sdk.ConsAddress(PKs[0].Address()) - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - valTokens := tstaking.CreateValidatorWithValPower(valA, PKs[0], 10, true) - tstaking.CreateValidator(valB, PKs[1], valTokens, true) - - // delegate 10 stake - tstaking.Delegate(del, valA, valTokens) - - // apply Tendermint updates - updates, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.NoError(t, err) - require.Equal(t, 2, len(updates)) - - // a block passes - ctx = ctx.WithBlockHeight(1) - tstaking.Ctx = ctx - - // begin unbonding 4 stake - unbondAmt := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) - tstaking.Undelegate(del, valA, unbondAmt, true) - - // begin redelegate 6 stake - redAmt := sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, 6)) - msgBeginRedelegate := types.NewMsgBeginRedelegate(del, valA, valB, redAmt) - tstaking.Handle(msgBeginRedelegate, true) - - // destination delegation should have 6 shares - delegation, found := app.StakingKeeper.GetDelegation(ctx, del, valB) - require.True(t, found) - require.Equal(t, sdk.NewDecFromInt(redAmt.Amount), delegation.Shares) - - // must apply validator updates - updates, err = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) - require.NoError(t, err) - require.Equal(t, 2, len(updates)) - - // slash the validator by half - app.StakingKeeper.Slash(ctx, consAddr0, 0, 20, sdk.NewDecWithPrec(5, 1)) - - // unbonding delegation should have been slashed by half - ubd, found := app.StakingKeeper.GetUnbondingDelegation(ctx, del, valA) - require.True(t, found) - require.Len(t, ubd.Entries, 1) - require.Equal(t, unbondAmt.QuoRaw(2), ubd.Entries[0].Balance) - - // redelegation should have been slashed by half - redelegation, found := app.StakingKeeper.GetRedelegation(ctx, del, valA, valB) - require.True(t, found) - require.Len(t, redelegation.Entries, 1) - - // destination delegation should have been slashed by half - delegation, found = app.StakingKeeper.GetDelegation(ctx, del, valB) - require.True(t, found) - require.Equal(t, sdk.NewDecFromInt(redAmt.Amount.QuoRaw(2)), delegation.Shares) - - // validator power should have been reduced by half - validator, found := app.StakingKeeper.GetValidator(ctx, valA) - require.True(t, found) - require.Equal(t, valTokens.QuoRaw(2), validator.GetBondedTokens()) - - // slash the validator for an infraction committed after the unbonding and redelegation begin - ctx = ctx.WithBlockHeight(3) - app.StakingKeeper.Slash(ctx, consAddr0, 2, 10, sdk.NewDecWithPrec(5, 1)) - tstaking.Ctx = ctx - - // unbonding delegation should be unchanged - ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, del, valA) - require.True(t, found) - require.Len(t, ubd.Entries, 1) - require.Equal(t, unbondAmt.QuoRaw(2), ubd.Entries[0].Balance) - - // redelegation should be unchanged - redelegation, found = app.StakingKeeper.GetRedelegation(ctx, del, valA, valB) - require.True(t, found) - require.Len(t, redelegation.Entries, 1) - - // destination delegation should be unchanged - delegation, found = app.StakingKeeper.GetDelegation(ctx, del, valB) - require.True(t, found) - require.Equal(t, sdk.NewDecFromInt(redAmt.Amount.QuoRaw(2)), delegation.Shares) - - // end blocker - staking.EndBlocker(ctx, app.StakingKeeper) - - // validator power should have been reduced to zero - // validator should be in unbonding state - validator, _ = app.StakingKeeper.GetValidator(ctx, valA) - require.Equal(t, validator.GetStatus(), sdkstaking.Unbonding) -} - -func TestInvalidMsg(t *testing.T) { - k := keeper.Keeper{} - h := staking.NewHandler(k) - - res, err := h(sdk.NewContext(nil, tmproto.Header{}, false, nil), testdata.NewTestMsg()) - require.Error(t, err) - require.Nil(t, res) - require.True(t, strings.Contains(err.Error(), "unrecognized staking message type")) -} - -func TestInvalidCoinDenom(t *testing.T) { - initPower := int64(1000) - app, ctx, delAddrs, valAddrs := bootstrapHandlerGenesisTest(t, initPower, 3, sdk.TokensFromConsensusPower(initPower, sdk.DefaultPowerReduction)) - valA, valB, delAddr := valAddrs[0], valAddrs[1], delAddrs[2] - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 100) - invalidCoin := sdk.NewCoin("churros", valTokens) - validCoin := sdk.NewCoin(sdk.DefaultBondDenom, valTokens) - oneCoin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.OneInt()) - - commission := types.NewCommissionRates(sdk.OneDec(), sdk.OneDec(), sdk.ZeroDec()) - msgCreate, err := types.NewMsgCreateValidator(valA, PKs[0], invalidCoin, types.Description{}, commission, sdk.OneInt()) - require.NoError(t, err) - tstaking.Handle(msgCreate, false) - - msgCreate, err = types.NewMsgCreateValidator(valA, PKs[0], validCoin, types.Description{}, commission, sdk.OneInt()) - require.NoError(t, err) - tstaking.Handle(msgCreate, true) - - msgCreate, err = types.NewMsgCreateValidator(valB, PKs[1], validCoin, types.Description{}, commission, sdk.OneInt()) - require.NoError(t, err) - tstaking.Handle(msgCreate, true) - - msgDelegate := types.NewMsgDelegate(delAddr, valA, invalidCoin) - tstaking.Handle(msgDelegate, false) - - msgDelegate = types.NewMsgDelegate(delAddr, valA, validCoin) - tstaking.Handle(msgDelegate, true) - - msgUndelegate := types.NewMsgUndelegate(delAddr, valA, invalidCoin) - tstaking.Handle(msgUndelegate, false) - - msgUndelegate = types.NewMsgUndelegate(delAddr, valA, oneCoin) - tstaking.Handle(msgUndelegate, true) - - msgRedelegate := types.NewMsgBeginRedelegate(delAddr, valA, valB, invalidCoin) - tstaking.Handle(msgRedelegate, false) - - msgRedelegate = types.NewMsgBeginRedelegate(delAddr, valA, valB, oneCoin) - tstaking.Handle(msgRedelegate, true) -} - func TestTokenizeShares(t *testing.T) { initPower := int64(1000) diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index bdd08aa2..419546e9 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -102,15 +102,19 @@ func (k Keeper) SetDelegation(ctx sdk.Context, delegation types.Delegation) { } // remove a delegation -func (k Keeper) RemoveDelegation(ctx sdk.Context, delegation types.Delegation) { +func (k Keeper) RemoveDelegation(ctx sdk.Context, delegation types.Delegation) error { delegatorAddress, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) if err != nil { panic(err) } // TODO: Consider calling hooks outside of the store wrapper functions, it's unobvious. - k.BeforeDelegationRemoved(ctx, delegatorAddress, delegation.GetValidatorAddr()) + if err := k.BeforeDelegationRemoved(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + return err + } + store := ctx.KVStore(k.storeKey) store.Delete(types.GetDelegationKey(delegatorAddress, delegation.GetValidatorAddr())) + return nil } // return a given amount of all the delegator unbonding-delegations @@ -553,7 +557,7 @@ func (k Keeper) Delegate( // Validator loses all tokens due to slashing. In this case, // make all future delegations invalid. if validator.InvalidExRate() { - return sdk.ZeroDec(), types.ErrDelegatorShareExRateInvalid + return sdk.ZeroDec(), sdkstaking.ErrDelegatorShareExRateInvalid } // Get or create the delegation object @@ -564,9 +568,13 @@ func (k Keeper) Delegate( // call the appropriate hook if present if found { - k.BeforeDelegationSharesModified(ctx, delAddr, validator.GetOperator()) + err = k.BeforeDelegationSharesModified(ctx, delAddr, validator.GetOperator()) } else { - k.BeforeDelegationCreated(ctx, delAddr, validator.GetOperator()) + err = k.BeforeDelegationCreated(ctx, delAddr, validator.GetOperator()) + } + + if err != nil { + return sdk.ZeroDec(), err } delegatorAddress, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) @@ -622,7 +630,9 @@ func (k Keeper) Delegate( k.SetDelegation(ctx, delegation) // Call the after-modification hook - k.AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()) + if err := k.AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + return newShares, err + } return newShares, nil } @@ -634,21 +644,23 @@ func (k Keeper) Unbond( // check if a delegation object exists in the store delegation, found := k.GetDelegation(ctx, delAddr, valAddr) if !found { - return amount, types.ErrNoDelegatorForAddress + return amount, sdkstaking.ErrNoDelegatorForAddress } // call the before-delegation-modified hook - k.BeforeDelegationSharesModified(ctx, delAddr, valAddr) + if err := k.BeforeDelegationSharesModified(ctx, delAddr, valAddr); err != nil { + return amount, err + } // ensure that we have enough shares to remove if delegation.Shares.LT(shares) { - return amount, sdkerrors.Wrap(types.ErrNotEnoughDelegationShares, delegation.Shares.String()) + return amount, sdkerrors.Wrap(sdkstaking.ErrNotEnoughDelegationShares, delegation.Shares.String()) } // get validator validator, found := k.GetValidator(ctx, valAddr) if !found { - return amount, types.ErrNoValidatorFound + return amount, sdkstaking.ErrNoValidatorFound } // subtract shares from delegation @@ -669,19 +681,21 @@ func (k Keeper) Unbond( validator = k.mustGetValidator(ctx, validator.GetOperator()) } - // remove the delegation if delegation.Shares.IsZero() { - k.RemoveDelegation(ctx, delegation) + err = k.RemoveDelegation(ctx, delegation) } else { k.SetDelegation(ctx, delegation) // call the after delegation modification hook - k.AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()) + err = k.AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()) + } + + if err != nil { + return amount, err } // remove the shares and coins from the validator // NOTE that the amount is later (in keeper.Delegation) moved between staking module pools validator, amount = k.RemoveValidatorTokensAndShares(ctx, validator, shares) - if validator.DelegatorShares.IsZero() && validator.IsUnbonded() { // if not unbonded, we must instead remove validator in EndBlocker once it finishes its unbonding period k.RemoveValidator(ctx, validator.GetOperator()) @@ -728,11 +742,11 @@ func (k Keeper) Undelegate( ) (time.Time, error) { validator, found := k.GetValidator(ctx, valAddr) if !found { - return time.Time{}, types.ErrNoDelegatorForAddress + return time.Time{}, sdkstaking.ErrNoDelegatorForAddress } if k.HasMaxUnbondingDelegationEntries(ctx, delAddr, valAddr) { - return time.Time{}, types.ErrMaxUnbondingDelegationEntries + return time.Time{}, sdkstaking.ErrMaxUnbondingDelegationEntries } returnAmount, err := k.Unbond(ctx, delAddr, valAddr, sharesAmount) @@ -758,7 +772,7 @@ func (k Keeper) Undelegate( func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (sdk.Coins, error) { ubd, found := k.GetUnbondingDelegation(ctx, delAddr, valAddr) if !found { - return nil, types.ErrNoUnbondingDelegation + return nil, sdkstaking.ErrNoUnbondingDelegation } bondDenom := k.GetParams(ctx).BondDenom @@ -806,26 +820,26 @@ func (k Keeper) BeginRedelegation( ctx sdk.Context, delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress, sharesAmount sdk.Dec, ) (completionTime time.Time, err error) { if bytes.Equal(valSrcAddr, valDstAddr) { - return time.Time{}, types.ErrSelfRedelegation + return time.Time{}, sdkstaking.ErrSelfRedelegation } dstValidator, found := k.GetValidator(ctx, valDstAddr) if !found { - return time.Time{}, types.ErrBadRedelegationDst + return time.Time{}, sdkstaking.ErrBadRedelegationDst } srcValidator, found := k.GetValidator(ctx, valSrcAddr) if !found { - return time.Time{}, types.ErrBadRedelegationDst + return time.Time{}, sdkstaking.ErrBadRedelegationDst } // check if this is a transitive redelegation if k.HasReceivingRedelegation(ctx, delAddr, valSrcAddr) { - return time.Time{}, types.ErrTransitiveRedelegation + return time.Time{}, sdkstaking.ErrTransitiveRedelegation } if k.HasMaxRedelegationEntries(ctx, delAddr, valSrcAddr, valDstAddr) { - return time.Time{}, types.ErrMaxRedelegationEntries + return time.Time{}, sdkstaking.ErrMaxRedelegationEntries } returnAmount, err := k.Unbond(ctx, delAddr, valSrcAddr, sharesAmount) @@ -834,7 +848,7 @@ func (k Keeper) BeginRedelegation( } if returnAmount.IsZero() { - return time.Time{}, types.ErrTinyRedelegationAmount + return time.Time{}, sdkstaking.ErrTinyRedelegationAmount } sharesCreated, err := k.Delegate(ctx, delAddr, returnAmount, srcValidator.GetStatus(), dstValidator, false) @@ -866,7 +880,7 @@ func (k Keeper) CompleteRedelegation( ) (sdk.Coins, error) { red, found := k.GetRedelegation(ctx, delAddr, valSrcAddr, valDstAddr) if !found { - return nil, types.ErrNoRedelegation + return nil, sdkstaking.ErrNoRedelegation } bondDenom := k.GetParams(ctx).BondDenom @@ -904,12 +918,12 @@ func (k Keeper) ValidateUnbondAmount( ) (shares sdk.Dec, err error) { validator, found := k.GetValidator(ctx, valAddr) if !found { - return shares, types.ErrNoValidatorFound + return shares, sdkstaking.ErrNoValidatorFound } del, found := k.GetDelegation(ctx, delAddr, valAddr) if !found { - return shares, types.ErrNoDelegation + return shares, sdkstaking.ErrNoDelegation } shares, err = validator.SharesFromTokens(amt) diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 746febff..85bd443a 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -20,6 +20,15 @@ import ( func TestDelegation(t *testing.T) { _, app, ctx := createTestInput(t) + // remove genesis validator delegations + delegations := app.StakingKeeper.GetAllDelegations(ctx) + require.Len(t, delegations, 1) + + app.StakingKeeper.RemoveDelegation(ctx, types.Delegation{ + ValidatorAddress: delegations[0].ValidatorAddress, + DelegatorAddress: delegations[0].DelegatorAddress, + }) + addrDels := simapp.AddTestAddrsIncremental(app, ctx, 3, sdk.NewInt(10000)) valAddrs := simapp.ConvertAddrsToValAddrs(addrDels) diff --git a/x/staking/keeper/grpc_query.go b/x/staking/keeper/grpc_query.go index e14a183b..05f54bb3 100644 --- a/x/staking/keeper/grpc_query.go +++ b/x/staking/keeper/grpc_query.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -433,7 +434,7 @@ func (k Querier) DelegatorValidators(c context.Context, req *types.QueryDelegato validator, found := k.GetValidator(ctx, delegation.GetValidatorAddr()) if !found { - return types.ErrNoValidatorFound + return sdkstaking.ErrNoValidatorFound } validators = append(validators, validator) @@ -635,12 +636,12 @@ func (k Querier) TotalTokenizeSharedAssets(c context.Context, req *types.QueryTo validator, found := k.GetValidator(ctx, valAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } delegation, found := k.GetDelegation(ctx, moduleAcc, valAddr) if !found { - return nil, types.ErrNoDelegation + return nil, sdkstaking.ErrNoDelegation } tokens := validator.TokensFromShares(delegation.Shares) diff --git a/x/staking/keeper/grpc_query_test.go b/x/staking/keeper/grpc_query_test.go index 30759552..854a4942 100644 --- a/x/staking/keeper/grpc_query_test.go +++ b/x/staking/keeper/grpc_query_test.go @@ -33,7 +33,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryValidators() { }, true, - len(vals), + len(vals) + 1, // +1 validator from genesis state false, }, { @@ -42,7 +42,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryValidators() { req = &types.QueryValidatorsRequest{Status: ""} }, true, - len(vals), + len(vals) + 1, // +1 validator from genesis state false, }, { @@ -73,7 +73,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryValidators() { suite.NoError(err) suite.NotNil(valsResp) suite.Equal(tc.numVals, len(valsResp.Validators)) - suite.Equal(uint64(len(vals)), valsResp.Pagination.Total) + suite.Equal(uint64(len(vals))+1, valsResp.Pagination.Total) // +1 validator from genesis state if tc.hasNext { suite.NotNil(valsResp.Pagination.NextKey) diff --git a/x/staking/keeper/historical_info_test.go b/x/staking/keeper/historical_info_test.go index 43c7b01d..20386451 100644 --- a/x/staking/keeper/historical_info_test.go +++ b/x/staking/keeper/historical_info_test.go @@ -87,6 +87,10 @@ func TestTrackHistoricalInfo(t *testing.T) { require.True(t, found) require.Equal(t, hi5, recv) + // genesis validator + genesisVals := app.StakingKeeper.GetAllValidators(ctx) + require.Len(t, genesisVals, 1) + // Set bonded validators in keeper val1 := teststaking.NewValidator(t, addrVals[2], PKs[2]) val1.Status = sdkstaking.Bonded // when not bonded, consensus power is Zero @@ -99,8 +103,8 @@ func TestTrackHistoricalInfo(t *testing.T) { app.StakingKeeper.SetValidator(ctx, val2) app.StakingKeeper.SetLastValidatorPower(ctx, val2.GetOperator(), 80) - vals := []types.Validator{val1, val2} - IsValSetSorted(vals, app.StakingKeeper.PowerReduction(ctx)) + vals := []types.Validator{val1, genesisVals[0], val2} + require.True(t, IsValSetSorted(vals, app.StakingKeeper.PowerReduction(ctx))) // Set Header for BeginBlock context header := tmproto.Header{ @@ -131,6 +135,10 @@ func TestTrackHistoricalInfo(t *testing.T) { func TestGetAllHistoricalInfo(t *testing.T) { _, app, ctx := createTestInput(t) + // clear historical info + infos := app.StakingKeeper.GetAllHistoricalInfo(ctx) + require.Len(t, infos, 1) + app.StakingKeeper.DeleteHistoricalInfo(ctx, infos[0].Header.Height) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 50, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -154,6 +162,6 @@ func TestGetAllHistoricalInfo(t *testing.T) { app.StakingKeeper.SetHistoricalInfo(ctx, int64(10+i), &hi) } - infos := app.StakingKeeper.GetAllHistoricalInfo(ctx) + infos = app.StakingKeeper.GetAllHistoricalInfo(ctx) require.Equal(t, expHistInfos, infos) } diff --git a/x/staking/keeper/hooks.go b/x/staking/keeper/hooks.go index d9c8a3f0..bec5bfd3 100644 --- a/x/staking/keeper/hooks.go +++ b/x/staking/keeper/hooks.go @@ -9,77 +9,88 @@ import ( var _ types.StakingHooks = Keeper{} // AfterValidatorCreated - call hook if registered -func (k Keeper) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { +func (k Keeper) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.AfterValidatorCreated(ctx, valAddr) + return k.hooks.AfterValidatorCreated(ctx, valAddr) } + return nil } // BeforeValidatorModified - call hook if registered -func (k Keeper) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) { +func (k Keeper) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.BeforeValidatorModified(ctx, valAddr) + return k.hooks.BeforeValidatorModified(ctx, valAddr) } + return nil } // AfterValidatorRemoved - call hook if registered -func (k Keeper) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +func (k Keeper) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.AfterValidatorRemoved(ctx, consAddr, valAddr) + return k.hooks.AfterValidatorRemoved(ctx, consAddr, valAddr) } + return nil } -func (k Keeper) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) { +func (k Keeper) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) error { if k.hooks != nil { k.hooks.BeforeTokenizeShareRecordRemoved(ctx, recordId) } + return nil } // AfterValidatorBonded - call hook if registered -func (k Keeper) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +func (k Keeper) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.AfterValidatorBonded(ctx, consAddr, valAddr) + return k.hooks.AfterValidatorBonded(ctx, consAddr, valAddr) } + return nil } // AfterValidatorBeginUnbonding - call hook if registered -func (k Keeper) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +func (k Keeper) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr) + return k.hooks.AfterValidatorBeginUnbonding(ctx, consAddr, valAddr) } + return nil } // BeforeDelegationCreated - call hook if registered -func (k Keeper) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (k Keeper) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.BeforeDelegationCreated(ctx, delAddr, valAddr) + return k.hooks.BeforeDelegationCreated(ctx, delAddr, valAddr) } + return nil } // BeforeDelegationSharesModified - call hook if registered -func (k Keeper) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (k Keeper) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.BeforeDelegationSharesModified(ctx, delAddr, valAddr) + return k.hooks.BeforeDelegationSharesModified(ctx, delAddr, valAddr) } + return nil } // BeforeDelegationRemoved - call hook if registered -func (k Keeper) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (k Keeper) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { if k.hooks != nil { k.hooks.BeforeDelegationRemoved(ctx, delAddr, valAddr) } + return nil } // AfterDelegationModified - call hook if registered -func (k Keeper) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (k Keeper) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { if k.hooks != nil { - k.hooks.AfterDelegationModified(ctx, delAddr, valAddr) + return k.hooks.AfterDelegationModified(ctx, delAddr, valAddr) } + return nil } // BeforeValidatorSlashed - call hook if registered -func (k Keeper) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) { +func (k Keeper) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) error { if k.hooks != nil { - k.hooks.BeforeValidatorSlashed(ctx, valAddr, fraction) + return k.hooks.BeforeValidatorSlashed(ctx, valAddr, fraction) } + return nil } diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 19318e85..2b7f6fb7 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -40,9 +40,13 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa return nil, err } + if msg.Commission.Rate.LT(k.MinCommissionRate(ctx)) { + return nil, sdkerrors.Wrapf(sdkstaking.ErrCommissionLTMinRate, "cannot set validator commission to less than minimum rate of %s", k.MinCommissionRate(ctx)) + } + // check to see if the pubkey or sender has been registered before if _, found := k.GetValidator(ctx, valAddr); found { - return nil, types.ErrValidatorOwnerExists + return nil, sdkstaking.ErrValidatorOwnerExists } pk, ok := msg.Pubkey.GetCachedValue().(cryptotypes.PubKey) @@ -51,7 +55,7 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa } if _, found := k.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(pk)); found { - return nil, types.ErrValidatorPubKeyExists + return nil, sdkstaking.ErrValidatorPubKeyExists } bondDenom := k.BondDenom(ctx) @@ -69,7 +73,7 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa if cp != nil && cp.Validator != nil { if !tmstrings.StringInSlice(pk.Type(), cp.Validator.PubKeyTypes) { return nil, sdkerrors.Wrapf( - types.ErrValidatorPubKeyTypeNotSupported, + sdkstaking.ErrValidatorPubKeyTypeNotSupported, "got: %s, expected: %s", pk.Type(), cp.Validator.PubKeyTypes, ) } @@ -79,6 +83,7 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa if err != nil { return nil, err } + commission := types.NewCommissionWithTime( msg.Commission.Rate, msg.Commission.MaxRate, msg.Commission.MaxChangeRate, ctx.BlockHeader().Time, @@ -101,7 +106,9 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa k.SetNewValidatorByPowerIndex(ctx, validator) // call the after-creation hook - k.AfterValidatorCreated(ctx, validator.GetOperator()) + if err := k.AfterValidatorCreated(ctx, validator.GetOperator()); err != nil { + return nil, err + } // move coins from the msg.Address account to a (self-delegation) delegator account // the validator account and global shares are updated within here @@ -137,7 +144,7 @@ func (k msgServer) EditValidator(goCtx context.Context, msg *types.MsgEditValida // validator must already be registered validator, found := k.GetValidator(ctx, valAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } // replace all editable fields (clients should autofill existing values) @@ -155,18 +162,20 @@ func (k msgServer) EditValidator(goCtx context.Context, msg *types.MsgEditValida } // call the before-modification hook since we're about to update the commission - k.BeforeValidatorModified(ctx, valAddr) + if err := k.BeforeValidatorModified(ctx, valAddr); err != nil { + return nil, err + } validator.Commission = commission } if msg.MinSelfDelegation != nil { if !msg.MinSelfDelegation.GT(validator.MinSelfDelegation) { - return nil, types.ErrMinSelfDelegationDecreased + return nil, sdkstaking.ErrMinSelfDelegationDecreased } if msg.MinSelfDelegation.GT(validator.Tokens) { - return nil, types.ErrSelfDelegationBelowMinimum + return nil, sdkstaking.ErrSelfDelegationBelowMinimum } validator.MinSelfDelegation = (*msg.MinSelfDelegation) @@ -200,7 +209,7 @@ func (k msgServer) Delegate(goCtx context.Context, msg *types.MsgDelegate) (*typ validator, found := k.GetValidator(ctx, valAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } delegatorAddress, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) @@ -391,7 +400,7 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS } validator, found := k.GetValidator(ctx, valAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } _ = validator @@ -403,7 +412,7 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS delegation, found := k.GetDelegation(ctx, delegatorAddress, valAddr) if !found { - return nil, types.ErrNoDelegatorForAddress + return nil, sdkstaking.ErrNoDelegatorForAddress } if msg.Amount.Denom != k.BondDenom(ctx) { @@ -412,7 +421,7 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS delegationAmount := validator.Tokens.ToDec().Mul(delegation.GetShares()).Quo(validator.DelegatorShares) if msg.Amount.Amount.GT(sdk.Int(delegationAmount)) { - return nil, types.ErrNotEnoughDelegationShares + return nil, sdkstaking.ErrNotEnoughDelegationShares } acc := k.authKeeper.GetAccount(ctx, delegatorAddress) @@ -484,7 +493,7 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS validator, found = k.GetValidator(ctx, valAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } // delegate from module account @@ -523,7 +532,7 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken validator, found := k.GetValidator(ctx, valAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } // calculate the ratio between shares and redeem amount @@ -569,7 +578,7 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken validator, found = k.GetValidator(ctx, valAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } // convert the share tokens to delegated status diff --git a/x/staking/keeper/querier.go b/x/staking/keeper/querier.go index 9cf54bd0..e82bfc02 100644 --- a/x/staking/keeper/querier.go +++ b/x/staking/keeper/querier.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -107,7 +108,7 @@ func queryValidator(ctx sdk.Context, req abci.RequestQuery, k Keeper, legacyQuer validator, found := k.GetValidator(ctx, params.ValidatorAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } res, err := codec.MarshalJSONIndent(legacyQuerierCdc, validator) @@ -302,7 +303,7 @@ func queryDelegation(ctx sdk.Context, req abci.RequestQuery, k Keeper, legacyQue delegation, found := k.GetDelegation(ctx, delAddr, valAddr) if !found { - return nil, types.ErrNoDelegation + return nil, sdkstaking.ErrNoDelegation } delegationResp, err := DelegationToDelegationResponse(ctx, k, delegation) @@ -338,7 +339,7 @@ func queryUnbondingDelegation(ctx sdk.Context, req abci.RequestQuery, k Keeper, unbond, found := k.GetUnbondingDelegation(ctx, delAddr, valAddr) if !found { - return nil, types.ErrNoUnbondingDelegation + return nil, sdkstaking.ErrNoUnbondingDelegation } res, err := codec.MarshalJSONIndent(legacyQuerierCdc, unbond) @@ -363,7 +364,7 @@ func queryRedelegations(ctx sdk.Context, req abci.RequestQuery, k Keeper, legacy case !params.DelegatorAddr.Empty() && !params.SrcValidatorAddr.Empty() && !params.DstValidatorAddr.Empty(): redel, found := k.GetRedelegation(ctx, params.DelegatorAddr, params.SrcValidatorAddr, params.DstValidatorAddr) if !found { - return nil, types.ErrNoRedelegation + return nil, sdkstaking.ErrNoRedelegation } redels = []types.Redelegation{redel} @@ -400,7 +401,7 @@ func queryHistoricalInfo(ctx sdk.Context, req abci.RequestQuery, k Keeper, legac hi, found := k.GetHistoricalInfo(ctx, params.Height) if !found { - return nil, types.ErrNoHistoricalInfo + return nil, sdkstaking.ErrNoHistoricalInfo } res, err := codec.MarshalJSONIndent(legacyQuerierCdc, hi) @@ -449,7 +450,7 @@ func queryParameters(ctx sdk.Context, k Keeper, legacyQuerierCdc *codec.LegacyAm func DelegationToDelegationResponse(ctx sdk.Context, k Keeper, del types.Delegation) (types.DelegationResponse, error) { val, found := k.GetValidator(ctx, del.GetValidatorAddr()) if !found { - return types.DelegationResponse{}, types.ErrNoValidatorFound + return types.DelegationResponse{}, sdkstaking.ErrNoValidatorFound } delegatorAddress, err := sdk.AccAddressFromBech32(del.DelegatorAddress) @@ -503,7 +504,7 @@ func RedelegationsToRedelegationResponses( } val, found := k.GetValidator(ctx, valDstAddr) if !found { - return nil, types.ErrNoValidatorFound + return nil, sdkstaking.ErrNoValidatorFound } entryResponses := make([]types.RedelegationEntryResponse, len(redel.Entries)) diff --git a/x/staking/keeper/querier_test.go b/x/staking/keeper/querier_test.go index a66a6978..05f12b6c 100644 --- a/x/staking/keeper/querier_test.go +++ b/x/staking/keeper/querier_test.go @@ -144,9 +144,9 @@ func TestQueryValidators(t *testing.T) { addrs := simapp.AddTestAddrs(app, ctx, 500, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000)) // Create Validators - amts := []sdk.Int{sdk.NewInt(9), sdk.NewInt(8), sdk.NewInt(7)} - status := []sdkstaking.BondStatus{sdkstaking.Bonded, sdkstaking.Unbonded, sdkstaking.Unbonding} - var validators [3]types.Validator + amts := []sdk.Int{sdk.NewInt(8), sdk.NewInt(7)} + status := []sdkstaking.BondStatus{sdkstaking.Unbonded, sdkstaking.Unbonding} + var validators [2]types.Validator for i, amt := range amts { validators[i] = teststaking.NewValidator(t, sdk.ValAddress(addrs[i]), PKs[i]) validators[i], _ = validators[i].AddTokensFromDel(amt) @@ -155,7 +155,6 @@ func TestQueryValidators(t *testing.T) { app.StakingKeeper.SetValidator(ctx, validators[0]) app.StakingKeeper.SetValidator(ctx, validators[1]) - app.StakingKeeper.SetValidator(ctx, validators[2]) // Query Validators queriedValidators := app.StakingKeeper.GetValidators(ctx, params.MaxValidators) @@ -306,6 +305,9 @@ func TestQueryDelegation(t *testing.T) { require.Equal(t, sdk.NewCoin(sdk.DefaultBondDenom, delegation.Shares.TruncateInt()), delegationRes.Balance) // Query Delegator Delegations + bz, errRes = cdc.MarshalJSON(queryParams) + require.NoError(t, errRes) + query = abci.RequestQuery{ Path: "/custom/staking/delegatorDelegations", Data: bz, diff --git a/x/staking/keeper/query_utils.go b/x/staking/keeper/query_utils.go index 55b79f91..070505f9 100644 --- a/x/staking/keeper/query_utils.go +++ b/x/staking/keeper/query_utils.go @@ -2,6 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -23,7 +24,7 @@ func (k Keeper) GetDelegatorValidators( validator, found := k.GetValidator(ctx, delegation.GetValidatorAddr()) if !found { - panic(types.ErrNoValidatorFound) + panic(sdkstaking.ErrNoValidatorFound) } validators[i] = validator @@ -39,12 +40,12 @@ func (k Keeper) GetDelegatorValidator( ) (validator types.Validator, err error) { delegation, found := k.GetDelegation(ctx, delegatorAddr, validatorAddr) if !found { - return validator, types.ErrNoDelegation + return validator, sdkstaking.ErrNoDelegation } validator, found = k.GetValidator(ctx, delegation.GetValidatorAddr()) if !found { - panic(types.ErrNoValidatorFound) + panic(sdkstaking.ErrNoValidatorFound) } return validator, nil diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index a2a78ee6..cb0f9601 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -22,7 +22,7 @@ import ( // CONTRACT: // Infraction was committed at the current height or at a past height, // not at a height in the future -func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeight int64, power int64, slashFactor sdk.Dec) { +func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeight int64, power int64, slashFactor sdk.Dec) sdk.Int { logger := k.Logger(ctx) if slashFactor.IsNegative() { @@ -46,7 +46,7 @@ func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeigh "WARNING: ignored attempt to slash a nonexistent validator; we recommend you investigate immediately", "validator", consAddr.String(), ) - return + return sdk.NewInt(0) } // should not be slashing an unbonded validator @@ -141,6 +141,7 @@ func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeigh "slash_factor", slashFactor.String(), "burned", tokensToBurn, ) + return tokensToBurn } // jail a validator diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index 80fa6227..af8fb54d 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -606,3 +606,16 @@ func TestSlashBoth(t *testing.T) { // power not decreased, all stake was bonded since require.Equal(t, int64(10), validator.GetConsensusPower(app.StakingKeeper.PowerReduction(ctx))) } + +func TestSlashAmount(t *testing.T) { + app, ctx, _, _ := bootstrapSlashTest(t, 10) + consAddr := sdk.ConsAddress(PKs[0].Address()) + fraction := sdk.NewDecWithPrec(5, 1) + burnedCoins := app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction) + require.True(t, burnedCoins.GT(sdk.ZeroInt())) + + // test the case where the validator was not found, which should return no coins + _, addrVals := generateAddresses(app, ctx, 100) + noBurned := app.StakingKeeper.Slash(ctx, sdk.ConsAddress(addrVals[0]), ctx.BlockHeight(), 10, fraction) + require.True(t, sdk.NewInt(0).Equal(noBurned)) +} diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index f5804c1f..fd5aa5bf 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -138,6 +138,10 @@ func (k Keeper) UpdateValidatorCommission(ctx sdk.Context, return commission, err } + if newRate.LT(k.MinCommissionRate(ctx)) { + return commission, fmt.Errorf("cannot set validator commission to less than minimum rate of %s", k.MinCommissionRate(ctx)) + } + commission.Rate = newRate commission.UpdateTime = blockTime diff --git a/x/staking/keeper/validator_test.go b/x/staking/keeper/validator_test.go index 482b4115..d130568d 100644 --- a/x/staking/keeper/validator_test.go +++ b/x/staking/keeper/validator_test.go @@ -15,6 +15,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/bank/testutil" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/staking" "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" @@ -40,6 +41,17 @@ func bootstrapValidatorTest(t testing.TB, power int64, numAddrs int) (*simapp.Si require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), totalSupply)) + // unbond genesis validator delegations + delegations := app.StakingKeeper.GetAllDelegations(ctx) + require.Len(t, delegations, 1) + delegation := delegations[0] + + _, err := app.StakingKeeper.Undelegate(ctx, delegation.GetDelegatorAddr(), delegation.GetValidatorAddr(), delegation.Shares) + require.NoError(t, err) + + // end block to unbond genesis validator + staking.EndBlocker(ctx, app.StakingKeeper) + return app, ctx, addrDels, addrVals } @@ -98,14 +110,12 @@ func TestSetValidator(t *testing.T) { resVals = app.StakingKeeper.GetValidators(ctx, 1) require.Equal(t, 1, len(resVals)) - require.True(ValEq(t, validator, resVals[0])) resVals = app.StakingKeeper.GetValidators(ctx, 10) - require.Equal(t, 1, len(resVals)) - require.True(ValEq(t, validator, resVals[0])) + require.Equal(t, 2, len(resVals)) allVals := app.StakingKeeper.GetAllValidators(ctx) - require.Equal(t, 1, len(allVals)) + require.Equal(t, 2, len(allVals)) } func TestUpdateValidatorByPowerIndex(t *testing.T) { @@ -265,7 +275,7 @@ func TestValidatorBasics(t *testing.T) { require.Zero(t, len(resVals)) resVals = app.StakingKeeper.GetValidators(ctx, 2) - require.Zero(t, len(resVals)) + require.Len(t, resVals, 1) // set and retrieve a record validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], true) @@ -1043,6 +1053,11 @@ func TestUpdateValidatorCommission(t *testing.T) { app, ctx, _, addrVals := bootstrapValidatorTest(t, 1000, 20) ctx = ctx.WithBlockHeader(tmproto.Header{Time: time.Now().UTC()}) + // Set MinCommissionRate to 0.05 + params := app.StakingKeeper.GetParams(ctx) + params.MinCommissionRate = sdk.NewDecWithPrec(5, 2) + app.StakingKeeper.SetParams(ctx, params) + commission1 := types.NewCommissionWithTime( sdk.NewDecWithPrec(1, 1), sdk.NewDecWithPrec(3, 1), sdk.NewDecWithPrec(1, 1), time.Now().UTC().Add(time.Duration(-1)*time.Hour), @@ -1067,6 +1082,7 @@ func TestUpdateValidatorCommission(t *testing.T) { {val2, sdk.NewDecWithPrec(-1, 1), true}, {val2, sdk.NewDecWithPrec(4, 1), true}, {val2, sdk.NewDecWithPrec(3, 1), true}, + {val2, sdk.NewDecWithPrec(1, 2), true}, {val2, sdk.NewDecWithPrec(2, 1), false}, } diff --git a/x/staking/migrations/v034/types.go b/x/staking/migrations/v034/types.go new file mode 100644 index 00000000..868a6901 --- /dev/null +++ b/x/staking/migrations/v034/types.go @@ -0,0 +1,190 @@ +// Package v034 is used for legacy migration scripts. Actual migration scripts +// for v034 have been removed, but the v039->v042 migration script still +// references types from this file, so we're keeping it for now. +// DONTCOVER +package v034 + +import ( + "time" + + "github.com/cosmos/cosmos-sdk/codec/legacy" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" +) + +const ( + ModuleName = "staking" +) + +// staking constants +const ( + Unbonded BondStatus = 0x00 + Unbonding BondStatus = 0x01 + Bonded BondStatus = 0x02 + + BondStatusUnbonded = "Unbonded" + BondStatusUnbonding = "Unbonding" + BondStatusBonded = "Bonded" +) + +type ( + // BondStatus is the status of a validator + BondStatus byte + + Pool struct { + NotBondedTokens sdk.Int `json:"not_bonded_tokens"` + BondedTokens sdk.Int `json:"bonded_tokens"` + } + + Params struct { + UnbondingTime time.Duration `json:"unbonding_time"` + MaxValidators uint16 `json:"max_validators"` + MaxEntries uint16 `json:"max_entries"` + BondDenom string `json:"bond_denom"` + } + + LastValidatorPower struct { + Address sdk.ValAddress + Power int64 + } + + Description struct { + Moniker string `json:"moniker"` + Identity string `json:"identity"` + Website string `json:"website"` + Details string `json:"details"` + } + + Commission struct { + Rate sdk.Dec `json:"rate"` + MaxRate sdk.Dec `json:"max_rate"` + MaxChangeRate sdk.Dec `json:"max_change_rate"` + UpdateTime time.Time `json:"update_time"` + } + + bechValidator struct { + OperatorAddress sdk.ValAddress `json:"operator_address"` // the bech32 address of the validator's operator + ConsPubKey string `json:"consensus_pubkey"` // the bech32 consensus public key of the validator + Jailed bool `json:"jailed"` // has the validator been jailed from bonded status? + Status BondStatus `json:"status"` // validator status (bonded/unbonding/unbonded) + Tokens sdk.Int `json:"tokens"` // delegated tokens (incl. self-delegation) + DelegatorShares sdk.Dec `json:"delegator_shares"` // total shares issued to a validator's delegators + Description Description `json:"description"` // description terms for the validator + UnbondingHeight int64 `json:"unbonding_height"` // if unbonding, height at which this validator has begun unbonding + UnbondingCompletionTime time.Time `json:"unbonding_time"` // if unbonding, min time for the validator to complete unbonding + Commission Commission `json:"commission"` // commission parameters + MinSelfDelegation sdk.Int `json:"min_self_delegation"` // minimum self delegation + } + + Validator struct { + OperatorAddress sdk.ValAddress `json:"operator_address"` + ConsPubKey cryptotypes.PubKey `json:"consensus_pubkey"` + Jailed bool `json:"jailed"` + Status BondStatus `json:"status"` + Tokens sdk.Int `json:"tokens"` + DelegatorShares sdk.Dec `json:"delegator_shares"` + Description Description `json:"description"` + UnbondingHeight int64 `json:"unbonding_height"` + UnbondingCompletionTime time.Time `json:"unbonding_time"` + Commission Commission `json:"commission"` + MinSelfDelegation sdk.Int `json:"min_self_delegation"` + } + + Validators []Validator + + Delegation struct { + DelegatorAddress sdk.AccAddress `json:"delegator_address"` + ValidatorAddress sdk.ValAddress `json:"validator_address"` + Shares sdk.Dec `json:"shares"` + } + + Delegations []Delegation + + UnbondingDelegationEntry struct { + CreationHeight int64 `json:"creation_height"` + CompletionTime time.Time `json:"completion_time"` + InitialBalance sdk.Int `json:"initial_balance"` + Balance sdk.Int `json:"balance"` + } + + UnbondingDelegation struct { + DelegatorAddress sdk.AccAddress `json:"delegator_address"` + ValidatorAddress sdk.ValAddress `json:"validator_address"` + Entries []UnbondingDelegationEntry `json:"entries"` + } + + RedelegationEntry struct { + CreationHeight int64 `json:"creation_height"` + CompletionTime time.Time `json:"completion_time"` + InitialBalance sdk.Int `json:"initial_balance"` + SharesDst sdk.Dec `json:"shares_dst"` + } + + Redelegation struct { + DelegatorAddress sdk.AccAddress `json:"delegator_address"` + ValidatorSrcAddress sdk.ValAddress `json:"validator_src_address"` + ValidatorDstAddress sdk.ValAddress `json:"validator_dst_address"` + Entries []RedelegationEntry `json:"entries"` + } + + GenesisState struct { + Pool Pool `json:"pool"` + Params Params `json:"params"` + LastTotalPower sdk.Int `json:"last_total_power"` + LastValidatorPowers []LastValidatorPower `json:"last_validator_powers"` + Validators Validators `json:"validators"` + Delegations Delegations `json:"delegations"` + UnbondingDelegations []UnbondingDelegation `json:"unbonding_delegations"` + Redelegations []Redelegation `json:"redelegations"` + Exported bool `json:"exported"` + } +) + +func (v Validator) MarshalJSON() ([]byte, error) { + bechConsPubKey, err := legacybech32.MarshalPubKey(legacybech32.ConsPK, v.ConsPubKey) + if err != nil { + return nil, err + } + + return legacy.Cdc.MarshalJSON(bechValidator{ + OperatorAddress: v.OperatorAddress, + ConsPubKey: bechConsPubKey, + Jailed: v.Jailed, + Status: v.Status, + Tokens: v.Tokens, + DelegatorShares: v.DelegatorShares, + Description: v.Description, + UnbondingHeight: v.UnbondingHeight, + UnbondingCompletionTime: v.UnbondingCompletionTime, + MinSelfDelegation: v.MinSelfDelegation, + Commission: v.Commission, + }) +} + +// UnmarshalJSON unmarshals the validator from JSON using Bech32 +func (v *Validator) UnmarshalJSON(data []byte) error { + bv := &bechValidator{} + if err := legacy.Cdc.UnmarshalJSON(data, bv); err != nil { + return err + } + consPubKey, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, bv.ConsPubKey) + if err != nil { + return err + } + + *v = Validator{ + OperatorAddress: bv.OperatorAddress, + ConsPubKey: consPubKey, + Jailed: bv.Jailed, + Tokens: bv.Tokens, + Status: bv.Status, + DelegatorShares: bv.DelegatorShares, + Description: bv.Description, + UnbondingHeight: bv.UnbondingHeight, + UnbondingCompletionTime: bv.UnbondingCompletionTime, + Commission: bv.Commission, + MinSelfDelegation: bv.MinSelfDelegation, + } + return nil +} diff --git a/x/staking/migrations/v036/types.go b/x/staking/migrations/v036/types.go new file mode 100644 index 00000000..c954add0 --- /dev/null +++ b/x/staking/migrations/v036/types.go @@ -0,0 +1,137 @@ +// Package v036 is used for legacy migration scripts. Actual migration scripts +// for v036 have been removed, but the v039->v042 migration script still +// references types from this file, so we're keeping it for now. +// DONTCOVER +package v036 + +import ( + "time" + + "github.com/cosmos/cosmos-sdk/codec/legacy" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" +) + +const ( + ModuleName = "staking" +) + +type ( + Commission struct { + CommissionRates `json:"commission_rates" yaml:"commission_rates"` + UpdateTime time.Time `json:"update_time" yaml:"update_time"` + } + + CommissionRates struct { + Rate sdk.Dec `json:"rate" yaml:"rate"` + MaxRate sdk.Dec `json:"max_rate" yaml:"max_rate"` + MaxChangeRate sdk.Dec `json:"max_change_rate" yaml:"max_change_rate"` + } + + Validator struct { + OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` + ConsPubKey cryptotypes.PubKey `json:"consensus_pubkey" yaml:"consensus_pubkey"` + Jailed bool `json:"jailed" yaml:"jailed"` + Status v034staking.BondStatus `json:"status" yaml:"status"` + Tokens sdk.Int `json:"tokens" yaml:"tokens"` + DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` + Description v034staking.Description `json:"description" yaml:"description"` + UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` + UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` + Commission Commission `json:"commission" yaml:"commission"` + MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` + } + + bechValidator struct { + OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` + ConsPubKey string `json:"consensus_pubkey" yaml:"consensus_pubkey"` + Jailed bool `json:"jailed" yaml:"jailed"` + Status v034staking.BondStatus `json:"status" yaml:"status"` + Tokens sdk.Int `json:"tokens" yaml:"tokens"` + DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` + Description v034staking.Description `json:"description" yaml:"description"` + UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` + UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` + Commission Commission `json:"commission" yaml:"commission"` + MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` + } + + Validators []Validator + + GenesisState struct { + Params v034staking.Params `json:"params"` + LastTotalPower sdk.Int `json:"last_total_power"` + LastValidatorPowers []v034staking.LastValidatorPower `json:"last_validator_powers"` + Validators Validators `json:"validators"` + Delegations v034staking.Delegations `json:"delegations"` + UnbondingDelegations []v034staking.UnbondingDelegation `json:"unbonding_delegations"` + Redelegations []v034staking.Redelegation `json:"redelegations"` + Exported bool `json:"exported"` + } +) + +func NewGenesisState( + params v034staking.Params, lastTotalPower sdk.Int, lastValPowers []v034staking.LastValidatorPower, + validators Validators, delegations v034staking.Delegations, + ubds []v034staking.UnbondingDelegation, reds []v034staking.Redelegation, exported bool, +) GenesisState { + + return GenesisState{ + Params: params, + LastTotalPower: lastTotalPower, + LastValidatorPowers: lastValPowers, + Validators: validators, + Delegations: delegations, + UnbondingDelegations: ubds, + Redelegations: reds, + Exported: exported, + } +} + +func (v Validator) MarshalJSON() ([]byte, error) { + bechConsPubKey, err := legacybech32.MarshalPubKey(legacybech32.ConsPK, v.ConsPubKey) + if err != nil { + return nil, err + } + + return legacy.Cdc.MarshalJSON(bechValidator{ + OperatorAddress: v.OperatorAddress, + ConsPubKey: bechConsPubKey, + Jailed: v.Jailed, + Status: v.Status, + Tokens: v.Tokens, + DelegatorShares: v.DelegatorShares, + Description: v.Description, + UnbondingHeight: v.UnbondingHeight, + UnbondingCompletionTime: v.UnbondingCompletionTime, + MinSelfDelegation: v.MinSelfDelegation, + Commission: v.Commission, + }) +} + +func (v *Validator) UnmarshalJSON(data []byte) error { + bv := &bechValidator{} + if err := legacy.Cdc.UnmarshalJSON(data, bv); err != nil { + return err + } + consPubKey, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, bv.ConsPubKey) + if err != nil { + return err + } + *v = Validator{ + OperatorAddress: bv.OperatorAddress, + ConsPubKey: consPubKey, + Jailed: bv.Jailed, + Tokens: bv.Tokens, + Status: bv.Status, + DelegatorShares: bv.DelegatorShares, + Description: bv.Description, + UnbondingHeight: bv.UnbondingHeight, + UnbondingCompletionTime: bv.UnbondingCompletionTime, + Commission: bv.Commission, + MinSelfDelegation: bv.MinSelfDelegation, + } + return nil +} diff --git a/x/staking/migrations/v038/types.go b/x/staking/migrations/v038/types.go new file mode 100644 index 00000000..027b3e69 --- /dev/null +++ b/x/staking/migrations/v038/types.go @@ -0,0 +1,163 @@ +// Package v038 is used for legacy migration scripts. Actual migration scripts +// for v038 have been removed, but the v039->v042 migration script still +// references types from this file, so we're keeping it for now. +// DONTCOVER +package v038 + +import ( + "time" + + "github.com/cosmos/cosmos-sdk/codec/legacy" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" + v036staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v036" +) + +const ( + ModuleName = "staking" +) + +type ( + Description struct { + Moniker string `json:"moniker" yaml:"moniker"` + Identity string `json:"identity" yaml:"identity"` + Website string `json:"website" yaml:"website"` + SecurityContact string `json:"security_contact" yaml:"security_contact"` + Details string `json:"details" yaml:"details"` + } + + Validator struct { + OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` + ConsPubKey cryptotypes.PubKey `json:"consensus_pubkey" yaml:"consensus_pubkey"` + Jailed bool `json:"jailed" yaml:"jailed"` + Status v034staking.BondStatus `json:"status" yaml:"status"` + Tokens sdk.Int `json:"tokens" yaml:"tokens"` + DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` + Description Description `json:"description" yaml:"description"` + UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` + UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` + Commission v036staking.Commission `json:"commission" yaml:"commission"` + MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` + } + + bechValidator struct { + OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` + ConsPubKey string `json:"consensus_pubkey" yaml:"consensus_pubkey"` + Jailed bool `json:"jailed" yaml:"jailed"` + Status v034staking.BondStatus `json:"status" yaml:"status"` + Tokens sdk.Int `json:"tokens" yaml:"tokens"` + DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` + Description Description `json:"description" yaml:"description"` + UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` + UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` + Commission v036staking.Commission `json:"commission" yaml:"commission"` + MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` + } + + Validators []Validator + + Params struct { + UnbondingTime time.Duration `json:"unbonding_time" yaml:"unbonding_time"` // time duration of unbonding + MaxValidators uint16 `json:"max_validators" yaml:"max_validators"` // maximum number of validators (max uint16 = 65535) + MaxEntries uint16 `json:"max_entries" yaml:"max_entries"` // max entries for either unbonding delegation or redelegation (per pair/trio) + HistoricalEntries uint16 `json:"historical_entries" yaml:"historical_entries"` // number of historical entries to persist + BondDenom string `json:"bond_denom" yaml:"bond_denom"` // bondable coin denomination + } + + GenesisState struct { + Params Params `json:"params"` + LastTotalPower sdk.Int `json:"last_total_power"` + LastValidatorPowers []v034staking.LastValidatorPower `json:"last_validator_powers"` + Validators Validators `json:"validators"` + Delegations v034staking.Delegations `json:"delegations"` + UnbondingDelegations []v034staking.UnbondingDelegation `json:"unbonding_delegations"` + Redelegations []v034staking.Redelegation `json:"redelegations"` + Exported bool `json:"exported"` + } +) + +// NewDescription creates a new Description object +func NewDescription(moniker, identity, website, securityContact, details string) Description { + return Description{ + Moniker: moniker, + Identity: identity, + Website: website, + SecurityContact: securityContact, + Details: details, + } +} + +// NewGenesisState creates a new GenesisState object +func NewGenesisState( + params v034staking.Params, lastTotalPower sdk.Int, lastValPowers []v034staking.LastValidatorPower, + validators Validators, delegations v034staking.Delegations, + ubds []v034staking.UnbondingDelegation, reds []v034staking.Redelegation, exported bool, +) GenesisState { + + return GenesisState{ + Params: Params{ + UnbondingTime: params.UnbondingTime, + MaxValidators: params.MaxValidators, + MaxEntries: params.MaxEntries, + BondDenom: params.BondDenom, + HistoricalEntries: 0, + }, + LastTotalPower: lastTotalPower, + LastValidatorPowers: lastValPowers, + Validators: validators, + Delegations: delegations, + UnbondingDelegations: ubds, + Redelegations: reds, + Exported: exported, + } +} + +// MarshalJSON marshals the validator to JSON using Bech32 +func (v Validator) MarshalJSON() ([]byte, error) { + bechConsPubKey, err := legacybech32.MarshalPubKey(legacybech32.ConsPK, v.ConsPubKey) + if err != nil { + return nil, err + } + + return legacy.Cdc.MarshalJSON(bechValidator{ + OperatorAddress: v.OperatorAddress, + ConsPubKey: bechConsPubKey, + Jailed: v.Jailed, + Status: v.Status, + Tokens: v.Tokens, + DelegatorShares: v.DelegatorShares, + Description: v.Description, + UnbondingHeight: v.UnbondingHeight, + UnbondingCompletionTime: v.UnbondingCompletionTime, + MinSelfDelegation: v.MinSelfDelegation, + Commission: v.Commission, + }) +} + +// UnmarshalJSON unmarshals the validator from JSON using Bech32 +func (v *Validator) UnmarshalJSON(data []byte) error { + bv := &bechValidator{} + if err := legacy.Cdc.UnmarshalJSON(data, bv); err != nil { + return err + } + consPubKey, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, bv.ConsPubKey) + if err != nil { + return err + } + *v = Validator{ + OperatorAddress: bv.OperatorAddress, + ConsPubKey: consPubKey, + Jailed: bv.Jailed, + Tokens: bv.Tokens, + Status: bv.Status, + DelegatorShares: bv.DelegatorShares, + Description: bv.Description, + UnbondingHeight: bv.UnbondingHeight, + UnbondingCompletionTime: bv.UnbondingCompletionTime, + Commission: bv.Commission, + MinSelfDelegation: bv.MinSelfDelegation, + } + return nil +} diff --git a/x/staking/migrations/v040/genesis.pb.go b/x/staking/migrations/v040/genesis.pb.go new file mode 100644 index 00000000..af9e607d --- /dev/null +++ b/x/staking/migrations/v040/genesis.pb.go @@ -0,0 +1,944 @@ +// Package v040 is taken from: +// https://github.com/cosmos/cosmos-sdk/blob/v0.40.1/x/staking/types/genesis.pb.go +// by copy-pasted only the relevants parts for Genesis. +// nolint +package v040 + +import ( + fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the staking module's genesis state. +type GenesisState struct { + // params defines all the paramaters of related to deposit. + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + // last_total_power tracks the total amounts of bonded tokens recorded during + // the previous end block. + LastTotalPower github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=last_total_power,json=lastTotalPower,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"last_total_power" yaml:"last_total_power"` + // last_validator_powers is a special index that provides a historical list + // of the last-block's bonded validators. + LastValidatorPowers []LastValidatorPower `protobuf:"bytes,3,rep,name=last_validator_powers,json=lastValidatorPowers,proto3" json:"last_validator_powers" yaml:"last_validator_powers"` + // delegations defines the validator set at genesis. + Validators []Validator `protobuf:"bytes,4,rep,name=validators,proto3" json:"validators"` + // delegations defines the delegations active at genesis. + Delegations []Delegation `protobuf:"bytes,5,rep,name=delegations,proto3" json:"delegations"` + // unbonding_delegations defines the unbonding delegations active at genesis. + UnbondingDelegations []UnbondingDelegation `protobuf:"bytes,6,rep,name=unbonding_delegations,json=unbondingDelegations,proto3" json:"unbonding_delegations" yaml:"unbonding_delegations"` + // redelegations defines the redelegations active at genesis. + Redelegations []Redelegation `protobuf:"bytes,7,rep,name=redelegations,proto3" json:"redelegations"` + Exported bool `protobuf:"varint,8,opt,name=exported,proto3" json:"exported,omitempty"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_9b3dec8894f2831b, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.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 *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +func (m *GenesisState) GetLastValidatorPowers() []LastValidatorPower { + if m != nil { + return m.LastValidatorPowers + } + return nil +} + +func (m *GenesisState) GetValidators() []Validator { + if m != nil { + return m.Validators + } + return nil +} + +func (m *GenesisState) GetDelegations() []Delegation { + if m != nil { + return m.Delegations + } + return nil +} + +func (m *GenesisState) GetUnbondingDelegations() []UnbondingDelegation { + if m != nil { + return m.UnbondingDelegations + } + return nil +} + +func (m *GenesisState) GetRedelegations() []Redelegation { + if m != nil { + return m.Redelegations + } + return nil +} + +func (m *GenesisState) GetExported() bool { + if m != nil { + return m.Exported + } + return false +} + +// LastValidatorPower required for validator set update logic. +type LastValidatorPower struct { + // address is the address of the validator. + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + // power defines the power of the validator. + Power int64 `protobuf:"varint,2,opt,name=power,proto3" json:"power,omitempty"` +} + +func (m *LastValidatorPower) Reset() { *m = LastValidatorPower{} } +func (m *LastValidatorPower) String() string { return proto.CompactTextString(m) } +func (*LastValidatorPower) ProtoMessage() {} +func (*LastValidatorPower) Descriptor() ([]byte, []int) { + return fileDescriptor_9b3dec8894f2831b, []int{1} +} +func (m *LastValidatorPower) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LastValidatorPower) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LastValidatorPower.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 *LastValidatorPower) XXX_Merge(src proto.Message) { + xxx_messageInfo_LastValidatorPower.Merge(m, src) +} +func (m *LastValidatorPower) XXX_Size() int { + return m.Size() +} +func (m *LastValidatorPower) XXX_DiscardUnknown() { + xxx_messageInfo_LastValidatorPower.DiscardUnknown(m) +} + +var xxx_messageInfo_LastValidatorPower proto.InternalMessageInfo + +func init() { + // proto.RegisterType((*GenesisState)(nil), "cosmos.staking.v1beta1.GenesisState") + // proto.RegisterType((*LastValidatorPower)(nil), "cosmos.staking.v1beta1.LastValidatorPower") +} + +func init() { + // proto.RegisterFile("cosmos/staking/v1beta1/genesis.proto", fileDescriptor_9b3dec8894f2831b) +} + +var fileDescriptor_9b3dec8894f2831b = []byte{ + // 493 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0x3d, 0x6f, 0xd3, 0x40, + 0x18, 0xc7, 0x7d, 0xa4, 0x49, 0xc3, 0xa5, 0x20, 0x74, 0xa4, 0x60, 0x45, 0xc8, 0x0e, 0x56, 0x84, + 0x22, 0x5e, 0x6c, 0xb5, 0x6c, 0x15, 0x53, 0x84, 0xa8, 0x8a, 0x10, 0x8a, 0x8e, 0x97, 0x81, 0x25, + 0xba, 0xd4, 0x27, 0x63, 0xd5, 0xf1, 0x59, 0x7e, 0x2e, 0xa5, 0xdd, 0x11, 0x62, 0xe4, 0x23, 0xf4, + 0xe3, 0x74, 0xec, 0xc0, 0x80, 0x18, 0x2c, 0x94, 0x2c, 0xcc, 0xfd, 0x04, 0xc8, 0xe7, 0x17, 0x4c, + 0x52, 0x33, 0x25, 0x77, 0xfa, 0xfd, 0x7f, 0x7f, 0xfb, 0xfc, 0x1c, 0x1e, 0x1c, 0x0a, 0x98, 0x09, + 0x70, 0x40, 0xb2, 0x23, 0x3f, 0xf4, 0x9c, 0xe3, 0x9d, 0x29, 0x97, 0x6c, 0xc7, 0xf1, 0x78, 0xc8, + 0xc1, 0x07, 0x3b, 0x8a, 0x85, 0x14, 0xe4, 0x4e, 0x46, 0xd9, 0x39, 0x65, 0xe7, 0x54, 0xaf, 0xeb, + 0x09, 0x4f, 0x28, 0xc4, 0x49, 0xff, 0x65, 0x74, 0xaf, 0xce, 0x59, 0xa4, 0x15, 0x65, 0x7d, 0x6f, + 0xe2, 0xad, 0xfd, 0xac, 0xe5, 0x8d, 0x64, 0x92, 0x93, 0x67, 0xb8, 0x15, 0xb1, 0x98, 0xcd, 0x40, + 0x47, 0x7d, 0x34, 0xec, 0xec, 0x1a, 0xf6, 0xd5, 0xad, 0xf6, 0x58, 0x51, 0xa3, 0x8d, 0xf3, 0xc4, + 0xd4, 0x68, 0x9e, 0x21, 0x80, 0x6f, 0x05, 0x0c, 0xe4, 0x44, 0x0a, 0xc9, 0x82, 0x49, 0x24, 0x3e, + 0xf1, 0x58, 0xbf, 0xd6, 0x47, 0xc3, 0xad, 0xd1, 0x41, 0xca, 0xfd, 0x4c, 0xcc, 0x07, 0x9e, 0x2f, + 0x3f, 0xce, 0xa7, 0xf6, 0xa1, 0x98, 0x39, 0xf9, 0x13, 0x66, 0x3f, 0x4f, 0xc0, 0x3d, 0x72, 0xe4, + 0x69, 0xc4, 0xc1, 0x3e, 0x08, 0xe5, 0x65, 0x62, 0xde, 0x3d, 0x65, 0xb3, 0x60, 0xcf, 0x5a, 0xf5, + 0x59, 0xf4, 0x66, 0xba, 0xf5, 0x36, 0xdd, 0x19, 0xa7, 0x1b, 0xe4, 0x33, 0xc2, 0xdb, 0x8a, 0x3a, + 0x66, 0x81, 0xef, 0x32, 0x29, 0xe2, 0x8c, 0x04, 0xbd, 0xd1, 0x6f, 0x0c, 0x3b, 0xbb, 0x0f, 0xeb, + 0x5e, 0xe1, 0x15, 0x03, 0xf9, 0xbe, 0xc8, 0x28, 0xd7, 0x68, 0x90, 0x3e, 0xe6, 0x65, 0x62, 0xde, + 0xab, 0x94, 0xaf, 0x6a, 0x2d, 0x7a, 0x3b, 0x58, 0x4b, 0x02, 0xd9, 0xc7, 0xb8, 0x24, 0x41, 0xdf, + 0x50, 0xd5, 0xf7, 0xeb, 0xaa, 0xcb, 0x70, 0x7e, 0x80, 0x95, 0x28, 0x79, 0x89, 0x3b, 0x2e, 0x0f, + 0xb8, 0xc7, 0xa4, 0x2f, 0x42, 0xd0, 0x9b, 0xca, 0x64, 0xd5, 0x99, 0x9e, 0x97, 0x68, 0xae, 0xaa, + 0x86, 0xc9, 0x17, 0x84, 0xb7, 0xe7, 0xe1, 0x54, 0x84, 0xae, 0x1f, 0x7a, 0x93, 0xaa, 0xb6, 0xa5, + 0xb4, 0x8f, 0xea, 0xb4, 0xef, 0x8a, 0x50, 0xc5, 0xbf, 0x72, 0x38, 0x57, 0x7a, 0x2d, 0xda, 0x9d, + 0xaf, 0x47, 0x81, 0x8c, 0xf1, 0x8d, 0x98, 0x57, 0xfb, 0x37, 0x55, 0xff, 0xa0, 0xae, 0x9f, 0x56, + 0xe0, 0xfc, 0xc5, 0xfe, 0x15, 0x90, 0x1e, 0x6e, 0xf3, 0x93, 0x48, 0xc4, 0x92, 0xbb, 0x7a, 0xbb, + 0x8f, 0x86, 0x6d, 0x5a, 0xae, 0xad, 0xd7, 0x98, 0xac, 0x7f, 0x5c, 0xa2, 0xe3, 0x4d, 0xe6, 0xba, + 0x31, 0x87, 0x6c, 0xb8, 0xaf, 0xd3, 0x62, 0x49, 0xba, 0xb8, 0xf9, 0x77, 0x58, 0x1b, 0x34, 0x5b, + 0xec, 0xb5, 0xbf, 0x9e, 0x99, 0xda, 0xef, 0x33, 0x53, 0x1b, 0xbd, 0x38, 0x5f, 0x18, 0xe8, 0x62, + 0x61, 0xa0, 0x5f, 0x0b, 0x03, 0x7d, 0x5b, 0x1a, 0xda, 0xc5, 0xd2, 0xd0, 0x7e, 0x2c, 0x0d, 0xed, + 0xc3, 0xe3, 0xff, 0xce, 0xf3, 0x49, 0x79, 0xfd, 0xd4, 0x64, 0x4f, 0x5b, 0xea, 0xd6, 0x3d, 0xfd, + 0x13, 0x00, 0x00, 0xff, 0xff, 0xff, 0x85, 0xad, 0xc8, 0xf1, 0x03, 0x00, 0x00, +} + +func (m *GenesisState) 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 *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Exported { + i-- + if m.Exported { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if len(m.Redelegations) > 0 { + for iNdEx := len(m.Redelegations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Redelegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + } + if len(m.UnbondingDelegations) > 0 { + for iNdEx := len(m.UnbondingDelegations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.UnbondingDelegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if len(m.Delegations) > 0 { + for iNdEx := len(m.Delegations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Delegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + } + if len(m.Validators) > 0 { + for iNdEx := len(m.Validators) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Validators[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.LastValidatorPowers) > 0 { + for iNdEx := len(m.LastValidatorPowers) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.LastValidatorPowers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + { + size := m.LastTotalPower.Size() + i -= size + if _, err := m.LastTotalPower.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *LastValidatorPower) 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 *LastValidatorPower) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LastValidatorPower) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Power != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.Power)) + i-- + dAtA[i] = 0x10 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovGenesis(uint64(l)) + l = m.LastTotalPower.Size() + n += 1 + l + sovGenesis(uint64(l)) + if len(m.LastValidatorPowers) > 0 { + for _, e := range m.LastValidatorPowers { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.Validators) > 0 { + for _, e := range m.Validators { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.Delegations) > 0 { + for _, e := range m.Delegations { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.UnbondingDelegations) > 0 { + for _, e := range m.UnbondingDelegations { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if len(m.Redelegations) > 0 { + for _, e := range m.Redelegations { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if m.Exported { + n += 2 + } + return n +} + +func (m *LastValidatorPower) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + if m.Power != 0 { + n += 1 + sovGenesis(uint64(m.Power)) + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) 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 ErrIntOverflowGenesis + } + 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: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: 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 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 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastTotalPower", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastTotalPower.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastValidatorPowers", 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 + } + m.LastValidatorPowers = append(m.LastValidatorPowers, LastValidatorPower{}) + if err := m.LastValidatorPowers[len(m.LastValidatorPowers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validators", 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 + } + m.Validators = append(m.Validators, Validator{}) + if err := m.Validators[len(m.Validators)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Delegations", 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 + } + m.Delegations = append(m.Delegations, Delegation{}) + if err := m.Delegations[len(m.Delegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingDelegations", 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 + } + m.UnbondingDelegations = append(m.UnbondingDelegations, UnbondingDelegation{}) + if err := m.UnbondingDelegations[len(m.UnbondingDelegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Redelegations", 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 + } + m.Redelegations = append(m.Redelegations, Redelegation{}) + if err := m.Redelegations[len(m.Redelegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Exported", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Exported = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LastValidatorPower) 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 ErrIntOverflowGenesis + } + 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: LastValidatorPower: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LastValidatorPower: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + 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 ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Power", wireType) + } + m.Power = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Power |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(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, ErrIntOverflowGenesis + } + 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, ErrIntOverflowGenesis + } + 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, ErrIntOverflowGenesis + } + 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, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/staking/migrations/v040/keys.go b/x/staking/migrations/v040/keys.go new file mode 100644 index 00000000..27e2f9ea --- /dev/null +++ b/x/staking/migrations/v040/keys.go @@ -0,0 +1,326 @@ +// Package v040 is copy-pasted from: +// https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/staking/types/keys.go +package v040 + +import ( + "bytes" + "encoding/binary" + "fmt" + "strconv" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/kv" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +const ( + // ModuleName is the name of the staking module + ModuleName = "staking" + + // StoreKey is the string store representation + StoreKey = ModuleName + + // QuerierRoute is the querier route for the staking module + QuerierRoute = ModuleName + + // RouterKey is the msg router key for the staking module + RouterKey = ModuleName +) + +var ( + // Keys for store prefixes + // Last* values are constant during a block. + LastValidatorPowerKey = []byte{0x11} // prefix for each key to a validator index, for bonded validators + LastTotalPowerKey = []byte{0x12} // prefix for the total power + + ValidatorsKey = []byte{0x21} // prefix for each key to a validator + ValidatorsByConsAddrKey = []byte{0x22} // prefix for each key to a validator index, by pubkey + ValidatorsByPowerIndexKey = []byte{0x23} // prefix for each key to a validator index, sorted by power + + DelegationKey = []byte{0x31} // key for a delegation + UnbondingDelegationKey = []byte{0x32} // key for an unbonding-delegation + UnbondingDelegationByValIndexKey = []byte{0x33} // prefix for each key for an unbonding-delegation, by validator operator + RedelegationKey = []byte{0x34} // key for a redelegation + RedelegationByValSrcIndexKey = []byte{0x35} // prefix for each key for an redelegation, by source validator operator + RedelegationByValDstIndexKey = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator + + UnbondingQueueKey = []byte{0x41} // prefix for the timestamps in unbonding queue + RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue + ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue + + HistoricalInfoKey = []byte{0x50} // prefix for the historical info +) + +// gets the key for the validator with address +// VALUE: staking/Validator +func GetValidatorKey(operatorAddr sdk.ValAddress) []byte { + return append(ValidatorsKey, operatorAddr.Bytes()...) +} + +// gets the key for the validator with pubkey +// VALUE: validator operator address ([]byte) +func GetValidatorByConsAddrKey(addr sdk.ConsAddress) []byte { + return append(ValidatorsByConsAddrKey, addr.Bytes()...) +} + +// Get the validator operator address from LastValidatorPowerKey +func AddressFromLastValidatorPowerKey(key []byte) []byte { + kv.AssertKeyAtLeastLength(key, 2) + return key[1:] // remove prefix bytes +} + +// get the validator by power index. +// Power index is the key used in the power-store, and represents the relative +// power ranking of the validator. +// VALUE: validator operator address ([]byte) +func GetValidatorsByPowerIndexKey(validator types.Validator) []byte { + // NOTE the address doesn't need to be stored because counter bytes must always be different + // NOTE the larger values are of higher value + + consensusPower := sdk.TokensToConsensusPower(validator.Tokens, sdk.DefaultPowerReduction) + consensusPowerBytes := make([]byte, 8) + binary.BigEndian.PutUint64(consensusPowerBytes, uint64(consensusPower)) + + powerBytes := consensusPowerBytes + powerBytesLen := len(powerBytes) // 8 + + // key is of format prefix || powerbytes || addrBytes + key := make([]byte, 1+powerBytesLen+v040auth.AddrLen) + + key[0] = ValidatorsByPowerIndexKey[0] + copy(key[1:powerBytesLen+1], powerBytes) + addr, err := sdk.ValAddressFromBech32(validator.OperatorAddress) + if err != nil { + panic(err) + } + operAddrInvr := sdk.CopyBytes(addr) + + for i, b := range operAddrInvr { + operAddrInvr[i] = ^b + } + + copy(key[powerBytesLen+1:], operAddrInvr) + + return key +} + +// get the bonded validator index key for an operator address +func GetLastValidatorPowerKey(operator sdk.ValAddress) []byte { + return append(LastValidatorPowerKey, operator...) +} + +// parse the validators operator address from power rank key +func ParseValidatorPowerRankKey(key []byte) (operAddr []byte) { + powerBytesLen := 8 + kv.AssertKeyLength(key, 1+powerBytesLen+v040auth.AddrLen) + + operAddr = sdk.CopyBytes(key[powerBytesLen+1:]) + + for i, b := range operAddr { + operAddr[i] = ^b + } + + return operAddr +} + +// GetValidatorQueueKey returns the prefix key used for getting a set of unbonding +// validators whose unbonding completion occurs at the given time and height. +func GetValidatorQueueKey(timestamp time.Time, height int64) []byte { + heightBz := sdk.Uint64ToBigEndian(uint64(height)) + timeBz := sdk.FormatTimeBytes(timestamp) + timeBzL := len(timeBz) + prefixL := len(ValidatorQueueKey) + + bz := make([]byte, prefixL+8+timeBzL+8) + + // copy the prefix + copy(bz[:prefixL], ValidatorQueueKey) + + // copy the encoded time bytes length + copy(bz[prefixL:prefixL+8], sdk.Uint64ToBigEndian(uint64(timeBzL))) + + // copy the encoded time bytes + copy(bz[prefixL+8:prefixL+8+timeBzL], timeBz) + + // copy the encoded height + copy(bz[prefixL+8+timeBzL:], heightBz) + + return bz +} + +// ParseValidatorQueueKey returns the encoded time and height from a key created +// from GetValidatorQueueKey. +func ParseValidatorQueueKey(bz []byte) (time.Time, int64, error) { + prefixL := len(ValidatorQueueKey) + if prefix := bz[:prefixL]; !bytes.Equal(prefix, ValidatorQueueKey) { + return time.Time{}, 0, fmt.Errorf("invalid prefix; expected: %X, got: %X", ValidatorQueueKey, prefix) + } + + timeBzL := sdk.BigEndianToUint64(bz[prefixL : prefixL+8]) + ts, err := sdk.ParseTimeBytes(bz[prefixL+8 : prefixL+8+int(timeBzL)]) + if err != nil { + return time.Time{}, 0, err + } + + height := sdk.BigEndianToUint64(bz[prefixL+8+int(timeBzL):]) + + return ts, int64(height), nil +} + +// gets the key for delegator bond with validator +// VALUE: staking/Delegation +func GetDelegationKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { + return append(GetDelegationsKey(delAddr), valAddr.Bytes()...) +} + +// gets the prefix for a delegator for all validators +func GetDelegationsKey(delAddr sdk.AccAddress) []byte { + return append(DelegationKey, delAddr.Bytes()...) +} + +// gets the key for an unbonding delegation by delegator and validator addr +// VALUE: staking/UnbondingDelegation +func GetUBDKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { + return append( + GetUBDsKey(delAddr.Bytes()), + valAddr.Bytes()...) +} + +// gets the index-key for an unbonding delegation, stored by validator-index +// VALUE: none (key rearrangement used) +func GetUBDByValIndexKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { + return append(GetUBDsByValIndexKey(valAddr), delAddr.Bytes()...) +} + +// rearranges the ValIndexKey to get the UBDKey +func GetUBDKeyFromValIndexKey(indexKey []byte) []byte { + kv.AssertKeyAtLeastLength(indexKey, 2) + addrs := indexKey[1:] // remove prefix bytes + kv.AssertKeyLength(addrs, 2*v040auth.AddrLen) + + kv.AssertKeyAtLeastLength(addrs, v040auth.AddrLen+1) + valAddr := addrs[:v040auth.AddrLen] + delAddr := addrs[v040auth.AddrLen:] + + return GetUBDKey(delAddr, valAddr) +} + +// gets the prefix for all unbonding delegations from a delegator +func GetUBDsKey(delAddr sdk.AccAddress) []byte { + return append(UnbondingDelegationKey, delAddr.Bytes()...) +} + +// gets the prefix keyspace for the indexes of unbonding delegations for a validator +func GetUBDsByValIndexKey(valAddr sdk.ValAddress) []byte { + return append(UnbondingDelegationByValIndexKey, valAddr.Bytes()...) +} + +// gets the prefix for all unbonding delegations from a delegator +func GetUnbondingDelegationTimeKey(timestamp time.Time) []byte { + bz := sdk.FormatTimeBytes(timestamp) + return append(UnbondingQueueKey, bz...) +} + +// GetREDKey returns a key prefix for indexing a redelegation from a delegator +// and source validator to a destination validator. +func GetREDKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { + key := make([]byte, 1+v040auth.AddrLen*3) + + copy(key[0:v040auth.AddrLen+1], GetREDsKey(delAddr.Bytes())) + copy(key[v040auth.AddrLen+1:2*v040auth.AddrLen+1], valSrcAddr.Bytes()) + copy(key[2*v040auth.AddrLen+1:3*v040auth.AddrLen+1], valDstAddr.Bytes()) + + return key +} + +// gets the index-key for a redelegation, stored by source-validator-index +// VALUE: none (key rearrangement used) +func GetREDByValSrcIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { + REDSFromValsSrcKey := GetREDsFromValSrcIndexKey(valSrcAddr) + offset := len(REDSFromValsSrcKey) + + // key is of the form REDSFromValsSrcKey || delAddr || valDstAddr + key := make([]byte, len(REDSFromValsSrcKey)+2*v040auth.AddrLen) + copy(key[0:offset], REDSFromValsSrcKey) + copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) + copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valDstAddr.Bytes()) + + return key +} + +// gets the index-key for a redelegation, stored by destination-validator-index +// VALUE: none (key rearrangement used) +func GetREDByValDstIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { + REDSToValsDstKey := GetREDsToValDstIndexKey(valDstAddr) + offset := len(REDSToValsDstKey) + + // key is of the form REDSToValsDstKey || delAddr || valSrcAddr + key := make([]byte, len(REDSToValsDstKey)+2*v040auth.AddrLen) + copy(key[0:offset], REDSToValsDstKey) + copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) + copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valSrcAddr.Bytes()) + + return key +} + +// GetREDKeyFromValSrcIndexKey rearranges the ValSrcIndexKey to get the REDKey +func GetREDKeyFromValSrcIndexKey(indexKey []byte) []byte { + // note that first byte is prefix byte + kv.AssertKeyLength(indexKey, 3*v040auth.AddrLen+1) + + valSrcAddr := indexKey[1 : v040auth.AddrLen+1] + delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] + valDstAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] + + return GetREDKey(delAddr, valSrcAddr, valDstAddr) +} + +// GetREDKeyFromValDstIndexKey rearranges the ValDstIndexKey to get the REDKey +func GetREDKeyFromValDstIndexKey(indexKey []byte) []byte { + // note that first byte is prefix byte + kv.AssertKeyLength(indexKey, 3*v040auth.AddrLen+1) + + valDstAddr := indexKey[1 : v040auth.AddrLen+1] + delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] + valSrcAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] + + return GetREDKey(delAddr, valSrcAddr, valDstAddr) +} + +// GetRedelegationTimeKey returns a key prefix for indexing an unbonding +// redelegation based on a completion time. +func GetRedelegationTimeKey(timestamp time.Time) []byte { + bz := sdk.FormatTimeBytes(timestamp) + return append(RedelegationQueueKey, bz...) +} + +// GetREDsKey returns a key prefix for indexing a redelegation from a delegator +// address. +func GetREDsKey(delAddr sdk.AccAddress) []byte { + return append(RedelegationKey, delAddr.Bytes()...) +} + +// GetREDsFromValSrcIndexKey returns a key prefix for indexing a redelegation to +// a source validator. +func GetREDsFromValSrcIndexKey(valSrcAddr sdk.ValAddress) []byte { + return append(RedelegationByValSrcIndexKey, valSrcAddr.Bytes()...) +} + +// GetREDsToValDstIndexKey returns a key prefix for indexing a redelegation to a +// destination (target) validator. +func GetREDsToValDstIndexKey(valDstAddr sdk.ValAddress) []byte { + return append(RedelegationByValDstIndexKey, valDstAddr.Bytes()...) +} + +// GetREDsByDelToValDstIndexKey returns a key prefix for indexing a redelegation +// from an address to a source validator. +func GetREDsByDelToValDstIndexKey(delAddr sdk.AccAddress, valDstAddr sdk.ValAddress) []byte { + return append(GetREDsToValDstIndexKey(valDstAddr), delAddr.Bytes()...) +} + +// GetHistoricalInfoKey returns a key prefix for indexing HistoricalInfo objects. +func GetHistoricalInfoKey(height int64) []byte { + return append(HistoricalInfoKey, []byte(strconv.FormatInt(height, 10))...) +} diff --git a/x/staking/migrations/v040/migrate.go b/x/staking/migrations/v040/migrate.go new file mode 100644 index 00000000..6616e71a --- /dev/null +++ b/x/staking/migrations/v040/migrate.go @@ -0,0 +1,140 @@ +package v040 + +import ( + "fmt" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" + v038staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v038" +) + +func migrateBondStatus(oldStatus v034staking.BondStatus) BondStatus { + switch oldStatus { + case v034staking.Unbonded: + return Unbonded + + case v034staking.Unbonding: + return Unbonding + + case v034staking.Bonded: + return Bonded + + default: + panic(fmt.Errorf("invalid bond status %d", oldStatus)) + } +} + +// Migrate accepts exported v0.38 x/staking genesis state and migrates it to +// v0.40 x/staking genesis state. The migration includes: +// +// - Convert addresses from bytes to bech32 strings. +// - Update BondStatus staking constants. +// - Re-encode in v0.40 GenesisState. +func Migrate(stakingState v038staking.GenesisState) *GenesisState { + newLastValidatorPowers := make([]LastValidatorPower, len(stakingState.LastValidatorPowers)) + for i, oldLastValidatorPower := range stakingState.LastValidatorPowers { + newLastValidatorPowers[i] = LastValidatorPower{ + Address: oldLastValidatorPower.Address.String(), + Power: oldLastValidatorPower.Power, + } + } + + newValidators := make([]Validator, len(stakingState.Validators)) + for i, oldValidator := range stakingState.Validators { + pkAny, err := codectypes.NewAnyWithValue(oldValidator.ConsPubKey) + if err != nil { + panic(fmt.Sprintf("Can't pack validator consensus PK as Any: %s", err)) + } + newValidators[i] = Validator{ + OperatorAddress: oldValidator.OperatorAddress.String(), + ConsensusPubkey: pkAny, + Jailed: oldValidator.Jailed, + Status: migrateBondStatus(oldValidator.Status), + Tokens: oldValidator.Tokens, + DelegatorShares: oldValidator.DelegatorShares, + Description: Description{ + Moniker: oldValidator.Description.Moniker, + Identity: oldValidator.Description.Identity, + Website: oldValidator.Description.Website, + SecurityContact: oldValidator.Description.SecurityContact, + Details: oldValidator.Description.Details, + }, + UnbondingHeight: oldValidator.UnbondingHeight, + UnbondingTime: oldValidator.UnbondingCompletionTime, + Commission: Commission{ + CommissionRates: CommissionRates{ + Rate: oldValidator.Commission.Rate, + MaxRate: oldValidator.Commission.MaxRate, + MaxChangeRate: oldValidator.Commission.MaxChangeRate, + }, + UpdateTime: oldValidator.Commission.UpdateTime, + }, + MinSelfDelegation: oldValidator.MinSelfDelegation, + } + } + + newDelegations := make([]Delegation, len(stakingState.Delegations)) + for i, oldDelegation := range stakingState.Delegations { + newDelegations[i] = Delegation{ + DelegatorAddress: oldDelegation.DelegatorAddress.String(), + ValidatorAddress: oldDelegation.ValidatorAddress.String(), + Shares: oldDelegation.Shares, + } + } + + newUnbondingDelegations := make([]UnbondingDelegation, len(stakingState.UnbondingDelegations)) + for i, oldUnbondingDelegation := range stakingState.UnbondingDelegations { + newEntries := make([]UnbondingDelegationEntry, len(oldUnbondingDelegation.Entries)) + for j, oldEntry := range oldUnbondingDelegation.Entries { + newEntries[j] = UnbondingDelegationEntry{ + CreationHeight: oldEntry.CreationHeight, + CompletionTime: oldEntry.CompletionTime, + InitialBalance: oldEntry.InitialBalance, + Balance: oldEntry.Balance, + } + } + + newUnbondingDelegations[i] = UnbondingDelegation{ + DelegatorAddress: oldUnbondingDelegation.DelegatorAddress.String(), + ValidatorAddress: oldUnbondingDelegation.ValidatorAddress.String(), + Entries: newEntries, + } + } + + newRedelegations := make([]Redelegation, len(stakingState.Redelegations)) + for i, oldRedelegation := range stakingState.Redelegations { + newEntries := make([]RedelegationEntry, len(oldRedelegation.Entries)) + for j, oldEntry := range oldRedelegation.Entries { + newEntries[j] = RedelegationEntry{ + CreationHeight: oldEntry.CreationHeight, + CompletionTime: oldEntry.CompletionTime, + InitialBalance: oldEntry.InitialBalance, + SharesDst: oldEntry.SharesDst, + } + } + + newRedelegations[i] = Redelegation{ + DelegatorAddress: oldRedelegation.DelegatorAddress.String(), + ValidatorSrcAddress: oldRedelegation.ValidatorSrcAddress.String(), + ValidatorDstAddress: oldRedelegation.ValidatorDstAddress.String(), + Entries: newEntries, + } + } + + return &GenesisState{ + Params: Params{ + UnbondingTime: stakingState.Params.UnbondingTime, + MaxValidators: uint32(stakingState.Params.MaxValidators), + MaxEntries: uint32(stakingState.Params.MaxEntries), + HistoricalEntries: uint32(stakingState.Params.HistoricalEntries), + BondDenom: stakingState.Params.BondDenom, + }, + LastTotalPower: stakingState.LastTotalPower, + LastValidatorPowers: newLastValidatorPowers, + Validators: newValidators, + Delegations: newDelegations, + UnbondingDelegations: newUnbondingDelegations, + Redelegations: newRedelegations, + Exported: stakingState.Exported, + } +} diff --git a/x/staking/migrations/v040/migrate_test.go b/x/staking/migrations/v040/migrate_test.go new file mode 100644 index 00000000..6835c975 --- /dev/null +++ b/x/staking/migrations/v040/migrate_test.go @@ -0,0 +1,96 @@ +package v040_test + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + "github.com/cosmos/cosmos-sdk/simapp" + v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" + v038staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v038" + v040staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v040" +) + +func TestMigrate(t *testing.T) { + encodingConfig := simapp.MakeTestEncodingConfig() + clientCtx := client.Context{}. + WithInterfaceRegistry(encodingConfig.InterfaceRegistry). + WithTxConfig(encodingConfig.TxConfig). + WithLegacyAmino(encodingConfig.Amino). + WithCodec(encodingConfig.Codec) + + consPubKey := ed25519.GenPrivKeyFromSecret([]byte("val0")).PubKey() + stakingGenState := v038staking.GenesisState{ + Validators: v038staking.Validators{v038staking.Validator{ + ConsPubKey: consPubKey, + Status: v034staking.Unbonded, + }}, + } + + migrated := v040staking.Migrate(stakingGenState) + + bz, err := clientCtx.Codec.MarshalJSON(migrated) + require.NoError(t, err) + + // Indent the JSON bz correctly. + var jsonObj map[string]interface{} + err = json.Unmarshal(bz, &jsonObj) + require.NoError(t, err) + indentedBz, err := json.MarshalIndent(jsonObj, "", " ") + require.NoError(t, err) + + // Make sure about: + // - consensus_pubkey: should be an any + // - validator's status should be 1 (new unbonded) + expected := `{ + "delegations": [], + "exported": false, + "last_total_power": "0", + "last_validator_powers": [], + "params": { + "bond_denom": "", + "historical_entries": 0, + "max_entries": 0, + "max_validators": 0, + "unbonding_time": "0s" + }, + "redelegations": [], + "unbonding_delegations": [], + "validators": [ + { + "commission": { + "commission_rates": { + "max_change_rate": "0", + "max_rate": "0", + "rate": "0" + }, + "update_time": "0001-01-01T00:00:00Z" + }, + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "KTeVrjP7NJIufvgMJsQRxZjfFyD+Exda6O7x+oxIvmA=" + }, + "delegator_shares": "0", + "description": { + "details": "", + "identity": "", + "moniker": "", + "security_contact": "", + "website": "" + }, + "jailed": false, + "min_self_delegation": "0", + "operator_address": "", + "status": "BOND_STATUS_UNBONDED", + "tokens": "0", + "unbonding_height": "0", + "unbonding_time": "0001-01-01T00:00:00Z" + } + ] +}` + + require.Equal(t, expected, string(indentedBz)) +} diff --git a/x/staking/migrations/v040/staking.pb.go b/x/staking/migrations/v040/staking.pb.go new file mode 100644 index 00000000..3200520a --- /dev/null +++ b/x/staking/migrations/v040/staking.pb.go @@ -0,0 +1,6525 @@ +// Package v040 is taken from: +// https://github.com/cosmos/cosmos-sdk/blob/v0.40.1/x/staking/types/staking.pb.go +// nolint +package v040 + +import ( + bytes "bytes" + compress_gzip "compress/gzip" + fmt "fmt" + io "io" + io_ioutil "io/ioutil" + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" + time "time" + + types1 "github.com/cosmos/cosmos-sdk/codec/types" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types2 "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" + proto "github.com/gogo/protobuf/proto" + github_com_gogo_protobuf_protoc_gen_gogo_descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + _ "github.com/golang/protobuf/ptypes/duration" + _ "github.com/golang/protobuf/ptypes/timestamp" + _ "github.com/regen-network/cosmos-proto" + types "github.com/tendermint/tendermint/proto/tendermint/types" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf +var _ = time.Kitchen + +// 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 + +// BondStatus is the status of a validator. +type BondStatus int32 + +const ( + // UNSPECIFIED defines an invalid validator status. + Unspecified BondStatus = 0 + // UNBONDED defines a validator that is not bonded. + Unbonded BondStatus = 1 + // UNBONDING defines a validator that is unbonding. + Unbonding BondStatus = 2 + // BONDED defines a validator that is bonded. + Bonded BondStatus = 3 +) + +var BondStatus_name = map[int32]string{ + 0: "BOND_STATUS_UNSPECIFIED", + 1: "BOND_STATUS_UNBONDED", + 2: "BOND_STATUS_UNBONDING", + 3: "BOND_STATUS_BONDED", +} + +var BondStatus_value = map[string]int32{ + "BOND_STATUS_UNSPECIFIED": 0, + "BOND_STATUS_UNBONDED": 1, + "BOND_STATUS_UNBONDING": 2, + "BOND_STATUS_BONDED": 3, +} + +func (x BondStatus) String() string { + return proto.EnumName(BondStatus_name, int32(x)) +} + +func (BondStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{0} +} + +// HistoricalInfo contains header and validator information for a given block. +// It is stored as part of staking module's state, which persists the `n` most +// recent HistoricalInfo +// (`n` is set by the staking module's `historical_entries` parameter). +type HistoricalInfo struct { + Header types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header"` + Valset []Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset"` +} + +func (m *HistoricalInfo) Reset() { *m = HistoricalInfo{} } +func (m *HistoricalInfo) String() string { return proto.CompactTextString(m) } +func (*HistoricalInfo) ProtoMessage() {} +func (*HistoricalInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{0} +} +func (m *HistoricalInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *HistoricalInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_HistoricalInfo.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 *HistoricalInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_HistoricalInfo.Merge(m, src) +} +func (m *HistoricalInfo) XXX_Size() int { + return m.Size() +} +func (m *HistoricalInfo) XXX_DiscardUnknown() { + xxx_messageInfo_HistoricalInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_HistoricalInfo proto.InternalMessageInfo + +func (m *HistoricalInfo) GetHeader() types.Header { + if m != nil { + return m.Header + } + return types.Header{} +} + +func (m *HistoricalInfo) GetValset() []Validator { + if m != nil { + return m.Valset + } + return nil +} + +// CommissionRates defines the initial commission rates to be used for creating +// a validator. +type CommissionRates struct { + Rate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=rate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"rate"` + MaxRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=max_rate,json=maxRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_rate" yaml:"max_rate"` + MaxChangeRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=max_change_rate,json=maxChangeRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_change_rate" yaml:"max_change_rate"` +} + +func (m *CommissionRates) Reset() { *m = CommissionRates{} } +func (*CommissionRates) ProtoMessage() {} +func (*CommissionRates) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{1} +} +func (m *CommissionRates) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CommissionRates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CommissionRates.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 *CommissionRates) XXX_Merge(src proto.Message) { + xxx_messageInfo_CommissionRates.Merge(m, src) +} +func (m *CommissionRates) XXX_Size() int { + return m.Size() +} +func (m *CommissionRates) XXX_DiscardUnknown() { + xxx_messageInfo_CommissionRates.DiscardUnknown(m) +} + +var xxx_messageInfo_CommissionRates proto.InternalMessageInfo + +// Commission defines commission parameters for a given validator. +type Commission struct { + CommissionRates `protobuf:"bytes,1,opt,name=commission_rates,json=commissionRates,proto3,embedded=commission_rates" json:"commission_rates"` + UpdateTime time.Time `protobuf:"bytes,2,opt,name=update_time,json=updateTime,proto3,stdtime" json:"update_time" yaml:"update_time"` +} + +func (m *Commission) Reset() { *m = Commission{} } +func (*Commission) ProtoMessage() {} +func (*Commission) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{2} +} +func (m *Commission) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Commission) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Commission.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 *Commission) XXX_Merge(src proto.Message) { + xxx_messageInfo_Commission.Merge(m, src) +} +func (m *Commission) XXX_Size() int { + return m.Size() +} +func (m *Commission) XXX_DiscardUnknown() { + xxx_messageInfo_Commission.DiscardUnknown(m) +} + +var xxx_messageInfo_Commission proto.InternalMessageInfo + +func (m *Commission) GetUpdateTime() time.Time { + if m != nil { + return m.UpdateTime + } + return time.Time{} +} + +// Description defines a validator description. +type Description struct { + Moniker string `protobuf:"bytes,1,opt,name=moniker,proto3" json:"moniker,omitempty"` + Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + Website string `protobuf:"bytes,3,opt,name=website,proto3" json:"website,omitempty"` + SecurityContact string `protobuf:"bytes,4,opt,name=security_contact,json=securityContact,proto3" json:"security_contact,omitempty" yaml:"security_contact"` + Details string `protobuf:"bytes,5,opt,name=details,proto3" json:"details,omitempty"` +} + +func (m *Description) Reset() { *m = Description{} } +func (*Description) ProtoMessage() {} +func (*Description) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{3} +} +func (m *Description) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Description) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Description.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 *Description) XXX_Merge(src proto.Message) { + xxx_messageInfo_Description.Merge(m, src) +} +func (m *Description) XXX_Size() int { + return m.Size() +} +func (m *Description) XXX_DiscardUnknown() { + xxx_messageInfo_Description.DiscardUnknown(m) +} + +var xxx_messageInfo_Description proto.InternalMessageInfo + +func (m *Description) GetMoniker() string { + if m != nil { + return m.Moniker + } + return "" +} + +func (m *Description) GetIdentity() string { + if m != nil { + return m.Identity + } + return "" +} + +func (m *Description) GetWebsite() string { + if m != nil { + return m.Website + } + return "" +} + +func (m *Description) GetSecurityContact() string { + if m != nil { + return m.SecurityContact + } + return "" +} + +func (m *Description) GetDetails() string { + if m != nil { + return m.Details + } + return "" +} + +// Validator defines a validator, together with the total amount of the +// Validator's bond shares and their exchange rate to coins. Slashing results in +// a decrease in the exchange rate, allowing correct calculation of future +// undelegations without iterating over delegators. When coins are delegated to +// this validator, the validator is credited with a delegation whose number of +// bond shares is based on the amount of coins delegated divided by the current +// exchange rate. Voting power can be calculated as total bonded shares +// multiplied by exchange rate. +type Validator struct { + OperatorAddress string `protobuf:"bytes,1,opt,name=operator_address,json=operatorAddress,proto3" json:"operator_address,omitempty" yaml:"operator_address"` + ConsensusPubkey *types1.Any `protobuf:"bytes,2,opt,name=consensus_pubkey,json=consensusPubkey,proto3" json:"consensus_pubkey,omitempty" yaml:"consensus_pubkey"` + Jailed bool `protobuf:"varint,3,opt,name=jailed,proto3" json:"jailed,omitempty"` + Status BondStatus `protobuf:"varint,4,opt,name=status,proto3,enum=cosmos.staking.v1beta1.BondStatus" json:"status,omitempty"` + Tokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=tokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"tokens"` + DelegatorShares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=delegator_shares,json=delegatorShares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"delegator_shares" yaml:"delegator_shares"` + Description Description `protobuf:"bytes,7,opt,name=description,proto3" json:"description"` + UnbondingHeight int64 `protobuf:"varint,8,opt,name=unbonding_height,json=unbondingHeight,proto3" json:"unbonding_height,omitempty" yaml:"unbonding_height"` + UnbondingTime time.Time `protobuf:"bytes,9,opt,name=unbonding_time,json=unbondingTime,proto3,stdtime" json:"unbonding_time" yaml:"unbonding_time"` + Commission Commission `protobuf:"bytes,10,opt,name=commission,proto3" json:"commission"` + MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation" yaml:"min_self_delegation"` +} + +func (m *Validator) Reset() { *m = Validator{} } +func (*Validator) ProtoMessage() {} +func (*Validator) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{4} +} +func (m *Validator) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Validator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Validator.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 *Validator) XXX_Merge(src proto.Message) { + xxx_messageInfo_Validator.Merge(m, src) +} +func (m *Validator) XXX_Size() int { + return m.Size() +} +func (m *Validator) XXX_DiscardUnknown() { + xxx_messageInfo_Validator.DiscardUnknown(m) +} + +var xxx_messageInfo_Validator proto.InternalMessageInfo + +// ValAddresses defines a repeated set of validator addresses. +type ValAddresses struct { + Addresses []string `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` +} + +func (m *ValAddresses) Reset() { *m = ValAddresses{} } +func (*ValAddresses) ProtoMessage() {} +func (*ValAddresses) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{5} +} +func (m *ValAddresses) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValAddresses) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ValAddresses.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 *ValAddresses) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValAddresses.Merge(m, src) +} +func (m *ValAddresses) XXX_Size() int { + return m.Size() +} +func (m *ValAddresses) XXX_DiscardUnknown() { + xxx_messageInfo_ValAddresses.DiscardUnknown(m) +} + +var xxx_messageInfo_ValAddresses proto.InternalMessageInfo + +func (m *ValAddresses) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +// DVPair is struct that just has a delegator-validator pair with no other data. +// It is intended to be used as a marshalable pointer. For example, a DVPair can +// be used to construct the key to getting an UnbondingDelegation from state. +type DVPair struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` +} + +func (m *DVPair) Reset() { *m = DVPair{} } +func (*DVPair) ProtoMessage() {} +func (*DVPair) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{6} +} +func (m *DVPair) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DVPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DVPair.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 *DVPair) XXX_Merge(src proto.Message) { + xxx_messageInfo_DVPair.Merge(m, src) +} +func (m *DVPair) XXX_Size() int { + return m.Size() +} +func (m *DVPair) XXX_DiscardUnknown() { + xxx_messageInfo_DVPair.DiscardUnknown(m) +} + +var xxx_messageInfo_DVPair proto.InternalMessageInfo + +// DVPairs defines an array of DVPair objects. +type DVPairs struct { + Pairs []DVPair `protobuf:"bytes,1,rep,name=pairs,proto3" json:"pairs"` +} + +func (m *DVPairs) Reset() { *m = DVPairs{} } +func (m *DVPairs) String() string { return proto.CompactTextString(m) } +func (*DVPairs) ProtoMessage() {} +func (*DVPairs) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{7} +} +func (m *DVPairs) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DVPairs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DVPairs.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 *DVPairs) XXX_Merge(src proto.Message) { + xxx_messageInfo_DVPairs.Merge(m, src) +} +func (m *DVPairs) XXX_Size() int { + return m.Size() +} +func (m *DVPairs) XXX_DiscardUnknown() { + xxx_messageInfo_DVPairs.DiscardUnknown(m) +} + +var xxx_messageInfo_DVPairs proto.InternalMessageInfo + +func (m *DVPairs) GetPairs() []DVPair { + if m != nil { + return m.Pairs + } + return nil +} + +// DVVTriplet is struct that just has a delegator-validator-validator triplet +// with no other data. It is intended to be used as a marshalable pointer. For +// example, a DVVTriplet can be used to construct the key to getting a +// Redelegation from state. +type DVVTriplet struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorSrcAddress string `protobuf:"bytes,2,opt,name=validator_src_address,json=validatorSrcAddress,proto3" json:"validator_src_address,omitempty" yaml:"validator_src_address"` + ValidatorDstAddress string `protobuf:"bytes,3,opt,name=validator_dst_address,json=validatorDstAddress,proto3" json:"validator_dst_address,omitempty" yaml:"validator_dst_address"` +} + +func (m *DVVTriplet) Reset() { *m = DVVTriplet{} } +func (*DVVTriplet) ProtoMessage() {} +func (*DVVTriplet) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{8} +} +func (m *DVVTriplet) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DVVTriplet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DVVTriplet.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 *DVVTriplet) XXX_Merge(src proto.Message) { + xxx_messageInfo_DVVTriplet.Merge(m, src) +} +func (m *DVVTriplet) XXX_Size() int { + return m.Size() +} +func (m *DVVTriplet) XXX_DiscardUnknown() { + xxx_messageInfo_DVVTriplet.DiscardUnknown(m) +} + +var xxx_messageInfo_DVVTriplet proto.InternalMessageInfo + +// DVVTriplets defines an array of DVVTriplet objects. +type DVVTriplets struct { + Triplets []DVVTriplet `protobuf:"bytes,1,rep,name=triplets,proto3" json:"triplets"` +} + +func (m *DVVTriplets) Reset() { *m = DVVTriplets{} } +func (m *DVVTriplets) String() string { return proto.CompactTextString(m) } +func (*DVVTriplets) ProtoMessage() {} +func (*DVVTriplets) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{9} +} +func (m *DVVTriplets) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DVVTriplets) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DVVTriplets.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 *DVVTriplets) XXX_Merge(src proto.Message) { + xxx_messageInfo_DVVTriplets.Merge(m, src) +} +func (m *DVVTriplets) XXX_Size() int { + return m.Size() +} +func (m *DVVTriplets) XXX_DiscardUnknown() { + xxx_messageInfo_DVVTriplets.DiscardUnknown(m) +} + +var xxx_messageInfo_DVVTriplets proto.InternalMessageInfo + +func (m *DVVTriplets) GetTriplets() []DVVTriplet { + if m != nil { + return m.Triplets + } + return nil +} + +// Delegation represents the bond with tokens held by an account. It is +// owned by one delegator, and is associated with the voting power of one +// validator. +type Delegation struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` + Shares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=shares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares"` +} + +func (m *Delegation) Reset() { *m = Delegation{} } +func (*Delegation) ProtoMessage() {} +func (*Delegation) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{10} +} +func (m *Delegation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Delegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Delegation.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 *Delegation) XXX_Merge(src proto.Message) { + xxx_messageInfo_Delegation.Merge(m, src) +} +func (m *Delegation) XXX_Size() int { + return m.Size() +} +func (m *Delegation) XXX_DiscardUnknown() { + xxx_messageInfo_Delegation.DiscardUnknown(m) +} + +var xxx_messageInfo_Delegation proto.InternalMessageInfo + +// UnbondingDelegation stores all of a single delegator's unbonding bonds +// for a single validator in an time-ordered list. +type UnbondingDelegation struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` + Entries []UnbondingDelegationEntry `protobuf:"bytes,3,rep,name=entries,proto3" json:"entries"` +} + +func (m *UnbondingDelegation) Reset() { *m = UnbondingDelegation{} } +func (*UnbondingDelegation) ProtoMessage() {} +func (*UnbondingDelegation) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{11} +} +func (m *UnbondingDelegation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UnbondingDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UnbondingDelegation.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 *UnbondingDelegation) XXX_Merge(src proto.Message) { + xxx_messageInfo_UnbondingDelegation.Merge(m, src) +} +func (m *UnbondingDelegation) XXX_Size() int { + return m.Size() +} +func (m *UnbondingDelegation) XXX_DiscardUnknown() { + xxx_messageInfo_UnbondingDelegation.DiscardUnknown(m) +} + +var xxx_messageInfo_UnbondingDelegation proto.InternalMessageInfo + +// UnbondingDelegationEntry defines an unbonding object with relevant metadata. +type UnbondingDelegationEntry struct { + CreationHeight int64 `protobuf:"varint,1,opt,name=creation_height,json=creationHeight,proto3" json:"creation_height,omitempty" yaml:"creation_height"` + CompletionTime time.Time `protobuf:"bytes,2,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time" yaml:"completion_time"` + InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` + Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` +} + +func (m *UnbondingDelegationEntry) Reset() { *m = UnbondingDelegationEntry{} } +func (*UnbondingDelegationEntry) ProtoMessage() {} +func (*UnbondingDelegationEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{12} +} +func (m *UnbondingDelegationEntry) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UnbondingDelegationEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UnbondingDelegationEntry.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 *UnbondingDelegationEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_UnbondingDelegationEntry.Merge(m, src) +} +func (m *UnbondingDelegationEntry) XXX_Size() int { + return m.Size() +} +func (m *UnbondingDelegationEntry) XXX_DiscardUnknown() { + xxx_messageInfo_UnbondingDelegationEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_UnbondingDelegationEntry proto.InternalMessageInfo + +func (m *UnbondingDelegationEntry) GetCreationHeight() int64 { + if m != nil { + return m.CreationHeight + } + return 0 +} + +func (m *UnbondingDelegationEntry) GetCompletionTime() time.Time { + if m != nil { + return m.CompletionTime + } + return time.Time{} +} + +// RedelegationEntry defines a redelegation object with relevant metadata. +type RedelegationEntry struct { + CreationHeight int64 `protobuf:"varint,1,opt,name=creation_height,json=creationHeight,proto3" json:"creation_height,omitempty" yaml:"creation_height"` + CompletionTime time.Time `protobuf:"bytes,2,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time" yaml:"completion_time"` + InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` + SharesDst github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares_dst"` +} + +func (m *RedelegationEntry) Reset() { *m = RedelegationEntry{} } +func (*RedelegationEntry) ProtoMessage() {} +func (*RedelegationEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{13} +} +func (m *RedelegationEntry) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RedelegationEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RedelegationEntry.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 *RedelegationEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_RedelegationEntry.Merge(m, src) +} +func (m *RedelegationEntry) XXX_Size() int { + return m.Size() +} +func (m *RedelegationEntry) XXX_DiscardUnknown() { + xxx_messageInfo_RedelegationEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_RedelegationEntry proto.InternalMessageInfo + +func (m *RedelegationEntry) GetCreationHeight() int64 { + if m != nil { + return m.CreationHeight + } + return 0 +} + +func (m *RedelegationEntry) GetCompletionTime() time.Time { + if m != nil { + return m.CompletionTime + } + return time.Time{} +} + +// Redelegation contains the list of a particular delegator's redelegating bonds +// from a particular source validator to a particular destination validator. +type Redelegation struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorSrcAddress string `protobuf:"bytes,2,opt,name=validator_src_address,json=validatorSrcAddress,proto3" json:"validator_src_address,omitempty" yaml:"validator_src_address"` + ValidatorDstAddress string `protobuf:"bytes,3,opt,name=validator_dst_address,json=validatorDstAddress,proto3" json:"validator_dst_address,omitempty" yaml:"validator_dst_address"` + Entries []RedelegationEntry `protobuf:"bytes,4,rep,name=entries,proto3" json:"entries"` +} + +func (m *Redelegation) Reset() { *m = Redelegation{} } +func (*Redelegation) ProtoMessage() {} +func (*Redelegation) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{14} +} +func (m *Redelegation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Redelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Redelegation.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 *Redelegation) XXX_Merge(src proto.Message) { + xxx_messageInfo_Redelegation.Merge(m, src) +} +func (m *Redelegation) XXX_Size() int { + return m.Size() +} +func (m *Redelegation) XXX_DiscardUnknown() { + xxx_messageInfo_Redelegation.DiscardUnknown(m) +} + +var xxx_messageInfo_Redelegation proto.InternalMessageInfo + +// Params defines the parameters for the staking module. +type Params struct { + UnbondingTime time.Duration `protobuf:"bytes,1,opt,name=unbonding_time,json=unbondingTime,proto3,stdduration" json:"unbonding_time" yaml:"unbonding_time"` + MaxValidators uint32 `protobuf:"varint,2,opt,name=max_validators,json=maxValidators,proto3" json:"max_validators,omitempty" yaml:"max_validators"` + MaxEntries uint32 `protobuf:"varint,3,opt,name=max_entries,json=maxEntries,proto3" json:"max_entries,omitempty" yaml:"max_entries"` + HistoricalEntries uint32 `protobuf:"varint,4,opt,name=historical_entries,json=historicalEntries,proto3" json:"historical_entries,omitempty" yaml:"historical_entries"` + BondDenom string `protobuf:"bytes,5,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty" yaml:"bond_denom"` +} + +func (m *Params) Reset() { *m = Params{} } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{15} +} +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) GetUnbondingTime() time.Duration { + if m != nil { + return m.UnbondingTime + } + return 0 +} + +func (m *Params) GetMaxValidators() uint32 { + if m != nil { + return m.MaxValidators + } + return 0 +} + +func (m *Params) GetMaxEntries() uint32 { + if m != nil { + return m.MaxEntries + } + return 0 +} + +func (m *Params) GetHistoricalEntries() uint32 { + if m != nil { + return m.HistoricalEntries + } + return 0 +} + +func (m *Params) GetBondDenom() string { + if m != nil { + return m.BondDenom + } + return "" +} + +// DelegationResponse is equivalent to Delegation except that it contains a +// balance in addition to shares which is more suitable for client responses. +type DelegationResponse struct { + Delegation Delegation `protobuf:"bytes,1,opt,name=delegation,proto3" json:"delegation"` + Balance types2.Coin `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance"` +} + +func (m *DelegationResponse) Reset() { *m = DelegationResponse{} } +func (*DelegationResponse) ProtoMessage() {} +func (*DelegationResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{16} +} +func (m *DelegationResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DelegationResponse.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 *DelegationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DelegationResponse.Merge(m, src) +} +func (m *DelegationResponse) XXX_Size() int { + return m.Size() +} +func (m *DelegationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_DelegationResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_DelegationResponse proto.InternalMessageInfo + +func (m *DelegationResponse) GetDelegation() Delegation { + if m != nil { + return m.Delegation + } + return Delegation{} +} + +func (m *DelegationResponse) GetBalance() types2.Coin { + if m != nil { + return m.Balance + } + return types2.Coin{} +} + +// RedelegationEntryResponse is equivalent to a RedelegationEntry except that it +// contains a balance in addition to shares which is more suitable for client +// responses. +type RedelegationEntryResponse struct { + RedelegationEntry RedelegationEntry `protobuf:"bytes,1,opt,name=redelegation_entry,json=redelegationEntry,proto3" json:"redelegation_entry"` + Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` +} + +func (m *RedelegationEntryResponse) Reset() { *m = RedelegationEntryResponse{} } +func (m *RedelegationEntryResponse) String() string { return proto.CompactTextString(m) } +func (*RedelegationEntryResponse) ProtoMessage() {} +func (*RedelegationEntryResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{17} +} +func (m *RedelegationEntryResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RedelegationEntryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RedelegationEntryResponse.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 *RedelegationEntryResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RedelegationEntryResponse.Merge(m, src) +} +func (m *RedelegationEntryResponse) XXX_Size() int { + return m.Size() +} +func (m *RedelegationEntryResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RedelegationEntryResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RedelegationEntryResponse proto.InternalMessageInfo + +func (m *RedelegationEntryResponse) GetRedelegationEntry() RedelegationEntry { + if m != nil { + return m.RedelegationEntry + } + return RedelegationEntry{} +} + +// RedelegationResponse is equivalent to a Redelegation except that its entries +// contain a balance in addition to shares which is more suitable for client +// responses. +type RedelegationResponse struct { + Redelegation Redelegation `protobuf:"bytes,1,opt,name=redelegation,proto3" json:"redelegation"` + Entries []RedelegationEntryResponse `protobuf:"bytes,2,rep,name=entries,proto3" json:"entries"` +} + +func (m *RedelegationResponse) Reset() { *m = RedelegationResponse{} } +func (m *RedelegationResponse) String() string { return proto.CompactTextString(m) } +func (*RedelegationResponse) ProtoMessage() {} +func (*RedelegationResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{18} +} +func (m *RedelegationResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RedelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RedelegationResponse.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 *RedelegationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RedelegationResponse.Merge(m, src) +} +func (m *RedelegationResponse) XXX_Size() int { + return m.Size() +} +func (m *RedelegationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RedelegationResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RedelegationResponse proto.InternalMessageInfo + +func (m *RedelegationResponse) GetRedelegation() Redelegation { + if m != nil { + return m.Redelegation + } + return Redelegation{} +} + +func (m *RedelegationResponse) GetEntries() []RedelegationEntryResponse { + if m != nil { + return m.Entries + } + return nil +} + +// Pool is used for tracking bonded and not-bonded token supply of the bond +// denomination. +type Pool struct { + NotBondedTokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=not_bonded_tokens,json=notBondedTokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"not_bonded_tokens"` + BondedTokens github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=bonded_tokens,json=bondedTokens,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"bonded_tokens" yaml:"bonded_tokens"` +} + +func (m *Pool) Reset() { *m = Pool{} } +func (m *Pool) String() string { return proto.CompactTextString(m) } +func (*Pool) ProtoMessage() {} +func (*Pool) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{19} +} +func (m *Pool) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Pool.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 *Pool) XXX_Merge(src proto.Message) { + xxx_messageInfo_Pool.Merge(m, src) +} +func (m *Pool) XXX_Size() int { + return m.Size() +} +func (m *Pool) XXX_DiscardUnknown() { + xxx_messageInfo_Pool.DiscardUnknown(m) +} + +var xxx_messageInfo_Pool proto.InternalMessageInfo + +func init() { + // proto.RegisterEnum("cosmos.staking.v1beta1.BondStatus", BondStatus_name, BondStatus_value) + // proto.RegisterType((*HistoricalInfo)(nil), "cosmos.staking.v1beta1.HistoricalInfo") + // proto.RegisterType((*CommissionRates)(nil), "cosmos.staking.v1beta1.CommissionRates") + // proto.RegisterType((*Commission)(nil), "cosmos.staking.v1beta1.Commission") + // proto.RegisterType((*Description)(nil), "cosmos.staking.v1beta1.Description") + // proto.RegisterType((*Validator)(nil), "cosmos.staking.v1beta1.Validator") + // proto.RegisterType((*ValAddresses)(nil), "cosmos.staking.v1beta1.ValAddresses") + // proto.RegisterType((*DVPair)(nil), "cosmos.staking.v1beta1.DVPair") + // proto.RegisterType((*DVPairs)(nil), "cosmos.staking.v1beta1.DVPairs") + // proto.RegisterType((*DVVTriplet)(nil), "cosmos.staking.v1beta1.DVVTriplet") + // proto.RegisterType((*DVVTriplets)(nil), "cosmos.staking.v1beta1.DVVTriplets") + // proto.RegisterType((*Delegation)(nil), "cosmos.staking.v1beta1.Delegation") + // proto.RegisterType((*UnbondingDelegation)(nil), "cosmos.staking.v1beta1.UnbondingDelegation") + // proto.RegisterType((*UnbondingDelegationEntry)(nil), "cosmos.staking.v1beta1.UnbondingDelegationEntry") + // proto.RegisterType((*RedelegationEntry)(nil), "cosmos.staking.v1beta1.RedelegationEntry") + // proto.RegisterType((*Redelegation)(nil), "cosmos.staking.v1beta1.Redelegation") + // proto.RegisterType((*Params)(nil), "cosmos.staking.v1beta1.Params") + // proto.RegisterType((*DelegationResponse)(nil), "cosmos.staking.v1beta1.DelegationResponse") + // proto.RegisterType((*RedelegationEntryResponse)(nil), "cosmos.staking.v1beta1.RedelegationEntryResponse") + // proto.RegisterType((*RedelegationResponse)(nil), "cosmos.staking.v1beta1.RedelegationResponse") + // proto.RegisterType((*Pool)(nil), "cosmos.staking.v1beta1.Pool") +} + +func init() { + proto.RegisterFile("cosmos/staking/v1beta1/staking.proto", fileDescriptor_64c30c6cf92913c9) +} + +var fileDescriptor_64c30c6cf92913c9 = []byte{ + // 1796 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, + 0x15, 0x76, 0x3b, 0x5e, 0xc7, 0x7e, 0x4e, 0xe2, 0xa4, 0x26, 0x33, 0xeb, 0x98, 0xc1, 0xed, 0x6d, + 0x56, 0x4b, 0x40, 0xbb, 0x0e, 0x93, 0x45, 0x8b, 0xc8, 0x05, 0xc6, 0x71, 0x86, 0x58, 0xbb, 0x0c, + 0xa1, 0x93, 0x09, 0x12, 0xac, 0xb0, 0xca, 0xdd, 0x15, 0xa7, 0x89, 0xbb, 0xdb, 0x74, 0x95, 0x87, + 0x58, 0xda, 0x03, 0xc7, 0x65, 0x10, 0x62, 0xb9, 0xed, 0x65, 0xa4, 0x91, 0xf6, 0xba, 0x12, 0x17, + 0xc4, 0x95, 0xeb, 0x02, 0x97, 0xe1, 0x86, 0x10, 0x32, 0x68, 0xe6, 0x82, 0x38, 0x21, 0x1f, 0x10, + 0x37, 0x50, 0xfd, 0xf4, 0x4f, 0xda, 0xf1, 0xcc, 0x78, 0xb4, 0x87, 0x91, 0xd8, 0x4b, 0xe2, 0x7a, + 0xf5, 0xde, 0xf7, 0xea, 0xfd, 0xd6, 0xab, 0x86, 0x57, 0x2d, 0x9f, 0xba, 0x3e, 0xdd, 0xa2, 0x0c, + 0x9f, 0x39, 0x5e, 0x6f, 0xeb, 0xee, 0x8d, 0x2e, 0x61, 0xf8, 0x46, 0xb8, 0x6e, 0x0c, 0x02, 0x9f, + 0xf9, 0xe8, 0x9a, 0xe4, 0x6a, 0x84, 0x54, 0xc5, 0x55, 0x5d, 0xef, 0xf9, 0x3d, 0x5f, 0xb0, 0x6c, + 0xf1, 0x5f, 0x92, 0xbb, 0xba, 0xd1, 0xf3, 0xfd, 0x5e, 0x9f, 0x6c, 0x89, 0x55, 0x77, 0x78, 0xb2, + 0x85, 0xbd, 0x91, 0xda, 0xaa, 0xa5, 0xb7, 0xec, 0x61, 0x80, 0x99, 0xe3, 0x7b, 0x6a, 0x5f, 0x4f, + 0xef, 0x33, 0xc7, 0x25, 0x94, 0x61, 0x77, 0x10, 0x62, 0xcb, 0x93, 0x74, 0xa4, 0x52, 0x75, 0x2c, + 0x85, 0xad, 0x4c, 0xe9, 0x62, 0x4a, 0x22, 0x3b, 0x2c, 0xdf, 0x09, 0xb1, 0xaf, 0x33, 0xe2, 0xd9, + 0x24, 0x70, 0x1d, 0x8f, 0x6d, 0xb1, 0xd1, 0x80, 0x50, 0xf9, 0x57, 0xee, 0x1a, 0x3f, 0xd3, 0x60, + 0x65, 0xdf, 0xa1, 0xcc, 0x0f, 0x1c, 0x0b, 0xf7, 0xdb, 0xde, 0x89, 0x8f, 0xde, 0x82, 0xfc, 0x29, + 0xc1, 0x36, 0x09, 0x2a, 0x5a, 0x5d, 0xdb, 0x2c, 0x6d, 0x57, 0x1a, 0x31, 0x42, 0x43, 0xca, 0xee, + 0x8b, 0xfd, 0x66, 0xee, 0x93, 0xb1, 0x9e, 0x31, 0x15, 0x37, 0xfa, 0x06, 0xe4, 0xef, 0xe2, 0x3e, + 0x25, 0xac, 0x92, 0xad, 0x2f, 0x6c, 0x96, 0xb6, 0x5f, 0x69, 0x5c, 0xee, 0xbe, 0xc6, 0x31, 0xee, + 0x3b, 0x36, 0x66, 0x7e, 0x04, 0x20, 0xc5, 0x8c, 0x5f, 0x67, 0xa1, 0xbc, 0xeb, 0xbb, 0xae, 0x43, + 0xa9, 0xe3, 0x7b, 0x26, 0x66, 0x84, 0xa2, 0x26, 0xe4, 0x02, 0xcc, 0x88, 0x38, 0x4a, 0xb1, 0xd9, + 0xe0, 0xfc, 0x7f, 0x19, 0xeb, 0xaf, 0xf5, 0x1c, 0x76, 0x3a, 0xec, 0x36, 0x2c, 0xdf, 0x55, 0xce, + 0x50, 0xff, 0xde, 0xa0, 0xf6, 0x99, 0xb2, 0xaf, 0x45, 0x2c, 0x53, 0xc8, 0xa2, 0x77, 0xa1, 0xe0, + 0xe2, 0xf3, 0x8e, 0xc0, 0xc9, 0x0a, 0x9c, 0x9b, 0xf3, 0xe1, 0x4c, 0xc6, 0x7a, 0x79, 0x84, 0xdd, + 0xfe, 0x8e, 0x11, 0xe2, 0x18, 0xe6, 0xa2, 0x8b, 0xcf, 0xf9, 0x11, 0xd1, 0x00, 0xca, 0x9c, 0x6a, + 0x9d, 0x62, 0xaf, 0x47, 0xa4, 0x92, 0x05, 0xa1, 0x64, 0x7f, 0x6e, 0x25, 0xd7, 0x62, 0x25, 0x09, + 0x38, 0xc3, 0x5c, 0x76, 0xf1, 0xf9, 0xae, 0x20, 0x70, 0x8d, 0x3b, 0x85, 0x0f, 0x1f, 0xe8, 0x99, + 0x7f, 0x3c, 0xd0, 0x35, 0xe3, 0x4f, 0x1a, 0x40, 0xec, 0x31, 0xf4, 0x2e, 0xac, 0x5a, 0xd1, 0x4a, + 0xc8, 0x52, 0x15, 0xc3, 0x2f, 0xce, 0x8a, 0x45, 0xca, 0xdf, 0xcd, 0x02, 0x3f, 0xf4, 0xc3, 0xb1, + 0xae, 0x99, 0x65, 0x2b, 0x15, 0x8a, 0x1f, 0x40, 0x69, 0x38, 0xb0, 0x31, 0x23, 0x1d, 0x9e, 0x9d, + 0xc2, 0x93, 0xa5, 0xed, 0x6a, 0x43, 0xa6, 0x6e, 0x23, 0x4c, 0xdd, 0xc6, 0x51, 0x98, 0xba, 0xcd, + 0x1a, 0xc7, 0x9a, 0x8c, 0x75, 0x24, 0xcd, 0x4a, 0x08, 0x1b, 0x1f, 0xfc, 0x4d, 0xd7, 0x4c, 0x90, + 0x14, 0x2e, 0x90, 0xb0, 0xe9, 0xf7, 0x1a, 0x94, 0x5a, 0x84, 0x5a, 0x81, 0x33, 0xe0, 0x15, 0x82, + 0x2a, 0xb0, 0xe8, 0xfa, 0x9e, 0x73, 0xa6, 0xf2, 0xb1, 0x68, 0x86, 0x4b, 0x54, 0x85, 0x82, 0x63, + 0x13, 0x8f, 0x39, 0x6c, 0x24, 0xe3, 0x6a, 0x46, 0x6b, 0x2e, 0xf5, 0x13, 0xd2, 0xa5, 0x4e, 0x18, + 0x0d, 0x33, 0x5c, 0xa2, 0x5b, 0xb0, 0x4a, 0x89, 0x35, 0x0c, 0x1c, 0x36, 0xea, 0x58, 0xbe, 0xc7, + 0xb0, 0xc5, 0x2a, 0x39, 0x11, 0xb0, 0xcf, 0x4d, 0xc6, 0xfa, 0xcb, 0xf2, 0xac, 0x69, 0x0e, 0xc3, + 0x2c, 0x87, 0xa4, 0x5d, 0x49, 0xe1, 0x1a, 0x6c, 0xc2, 0xb0, 0xd3, 0xa7, 0x95, 0x97, 0xa4, 0x06, + 0xb5, 0x4c, 0xd8, 0xf2, 0xf1, 0x22, 0x14, 0xa3, 0x6c, 0xe7, 0x9a, 0xfd, 0x01, 0x09, 0xf8, 0xef, + 0x0e, 0xb6, 0xed, 0x80, 0x50, 0xaa, 0xf2, 0x3a, 0xa1, 0x39, 0xcd, 0x61, 0x98, 0xe5, 0x90, 0x74, + 0x53, 0x52, 0x10, 0xe3, 0x61, 0xf6, 0x28, 0xf1, 0xe8, 0x90, 0x76, 0x06, 0xc3, 0xee, 0x19, 0x19, + 0xa9, 0x68, 0xac, 0x4f, 0x45, 0xe3, 0xa6, 0x37, 0x6a, 0xbe, 0x19, 0xa3, 0xa7, 0xe5, 0x8c, 0x3f, + 0xfc, 0xe6, 0x8d, 0x75, 0x95, 0x1a, 0x56, 0x30, 0x1a, 0x30, 0xbf, 0x71, 0x30, 0xec, 0xbe, 0x4d, + 0x46, 0x3c, 0xfc, 0x8a, 0xf5, 0x40, 0x70, 0xa2, 0x6b, 0x90, 0xff, 0x11, 0x76, 0xfa, 0xc4, 0x16, + 0x0e, 0x2d, 0x98, 0x6a, 0x85, 0x76, 0x20, 0x4f, 0x19, 0x66, 0x43, 0x2a, 0xbc, 0xb8, 0xb2, 0x6d, + 0xcc, 0x4a, 0xb5, 0xa6, 0xef, 0xd9, 0x87, 0x82, 0xd3, 0x54, 0x12, 0xe8, 0x16, 0xe4, 0x99, 0x7f, + 0x46, 0x3c, 0xe5, 0xc2, 0xb9, 0xea, 0xbb, 0xed, 0x31, 0x53, 0x49, 0x73, 0x8f, 0xd8, 0xa4, 0x4f, + 0x7a, 0xc2, 0x71, 0xf4, 0x14, 0x07, 0x84, 0x56, 0xf2, 0x02, 0xb1, 0x3d, 0x77, 0x11, 0x2a, 0x4f, + 0xa5, 0xf1, 0x0c, 0xb3, 0x1c, 0x91, 0x0e, 0x05, 0x05, 0xbd, 0x0d, 0x25, 0x3b, 0x4e, 0xd4, 0xca, + 0xa2, 0x08, 0xc1, 0x17, 0x66, 0x99, 0x9f, 0xc8, 0x69, 0xd5, 0xf7, 0x92, 0xd2, 0x3c, 0x39, 0x86, + 0x5e, 0xd7, 0xf7, 0x6c, 0xc7, 0xeb, 0x75, 0x4e, 0x89, 0xd3, 0x3b, 0x65, 0x95, 0x42, 0x5d, 0xdb, + 0x5c, 0x48, 0x26, 0x47, 0x9a, 0xc3, 0x30, 0xcb, 0x11, 0x69, 0x5f, 0x50, 0x90, 0x0d, 0x2b, 0x31, + 0x97, 0x28, 0xd4, 0xe2, 0x53, 0x0b, 0xf5, 0x15, 0x55, 0xa8, 0x57, 0xd3, 0x5a, 0xe2, 0x5a, 0x5d, + 0x8e, 0x88, 0x5c, 0x0c, 0xed, 0x03, 0xc4, 0xed, 0xa1, 0x02, 0x42, 0x83, 0xf1, 0xf4, 0x1e, 0xa3, + 0x0c, 0x4f, 0xc8, 0xa2, 0xf7, 0xe0, 0x8a, 0xeb, 0x78, 0x1d, 0x4a, 0xfa, 0x27, 0x1d, 0xe5, 0x60, + 0x0e, 0x59, 0x12, 0xd1, 0x7b, 0x67, 0xbe, 0x7c, 0x98, 0x8c, 0xf5, 0xaa, 0x6a, 0xa1, 0xd3, 0x90, + 0x86, 0xb9, 0xe6, 0x3a, 0xde, 0x21, 0xe9, 0x9f, 0xb4, 0x22, 0xda, 0xce, 0xd2, 0xfb, 0x0f, 0xf4, + 0x8c, 0x2a, 0xd7, 0x8c, 0xf1, 0x16, 0x2c, 0x1d, 0xe3, 0xbe, 0x2a, 0x33, 0x42, 0xd1, 0x75, 0x28, + 0xe2, 0x70, 0x51, 0xd1, 0xea, 0x0b, 0x9b, 0x45, 0x33, 0x26, 0xc8, 0x32, 0xff, 0xe9, 0x5f, 0xeb, + 0x9a, 0xf1, 0xb1, 0x06, 0xf9, 0xd6, 0xf1, 0x01, 0x76, 0x02, 0xd4, 0x86, 0xb5, 0x38, 0x73, 0x2e, + 0x16, 0xf9, 0xf5, 0xc9, 0x58, 0xaf, 0xa4, 0x93, 0x2b, 0xaa, 0xf2, 0x38, 0x81, 0xc3, 0x32, 0x6f, + 0xc3, 0xda, 0xdd, 0xb0, 0x77, 0x44, 0x50, 0xd9, 0x34, 0xd4, 0x14, 0x8b, 0x61, 0xae, 0x46, 0x34, + 0x05, 0x95, 0x32, 0x73, 0x0f, 0x16, 0xe5, 0x69, 0x29, 0xda, 0x81, 0x97, 0x06, 0xfc, 0x87, 0xb0, + 0xae, 0xb4, 0x5d, 0x9b, 0x99, 0xbc, 0x82, 0x5f, 0x85, 0x4f, 0x8a, 0x18, 0xbf, 0xca, 0x02, 0xb4, + 0x8e, 0x8f, 0x8f, 0x02, 0x67, 0xd0, 0x27, 0xec, 0xd3, 0xb4, 0xfc, 0x08, 0xae, 0xc6, 0x66, 0xd1, + 0xc0, 0x4a, 0x59, 0x5f, 0x9f, 0x8c, 0xf5, 0xeb, 0x69, 0xeb, 0x13, 0x6c, 0x86, 0x79, 0x25, 0xa2, + 0x1f, 0x06, 0xd6, 0xa5, 0xa8, 0x36, 0x65, 0x11, 0xea, 0xc2, 0x6c, 0xd4, 0x04, 0x5b, 0x12, 0xb5, + 0x45, 0xd9, 0xe5, 0xae, 0x3d, 0x84, 0x52, 0xec, 0x12, 0x8a, 0x5a, 0x50, 0x60, 0xea, 0xb7, 0xf2, + 0xb0, 0x31, 0xdb, 0xc3, 0xa1, 0x98, 0xf2, 0x72, 0x24, 0x69, 0xfc, 0x47, 0x03, 0x88, 0x73, 0xf6, + 0xc5, 0x4c, 0x31, 0xde, 0xca, 0x55, 0xe3, 0x5d, 0x78, 0xae, 0x51, 0x4d, 0x49, 0xa7, 0xfc, 0xf9, + 0xf3, 0x2c, 0x5c, 0xb9, 0x13, 0x76, 0x9e, 0x17, 0xde, 0x07, 0x07, 0xb0, 0x48, 0x3c, 0x16, 0x38, + 0xc2, 0x09, 0x3c, 0xda, 0x5f, 0x99, 0x15, 0xed, 0x4b, 0x6c, 0xda, 0xf3, 0x58, 0x30, 0x52, 0xb1, + 0x0f, 0x61, 0x52, 0xde, 0xf8, 0xe5, 0x02, 0x54, 0x66, 0x49, 0xa2, 0x5d, 0x28, 0x5b, 0x01, 0x11, + 0x84, 0xf0, 0xfe, 0xd0, 0xc4, 0xfd, 0x51, 0x8d, 0x27, 0xcb, 0x14, 0x83, 0x61, 0xae, 0x84, 0x14, + 0x75, 0x7b, 0xf4, 0x80, 0x8f, 0x7d, 0x3c, 0xed, 0x38, 0xd7, 0x33, 0xce, 0x79, 0x86, 0xba, 0x3e, + 0x42, 0x25, 0x17, 0x01, 0xe4, 0xfd, 0xb1, 0x12, 0x53, 0xc5, 0x05, 0xf2, 0x63, 0x28, 0x3b, 0x9e, + 0xc3, 0x1c, 0xdc, 0xef, 0x74, 0x71, 0x1f, 0x7b, 0xd6, 0xf3, 0x4c, 0xcd, 0xb2, 0xe5, 0x2b, 0xb5, + 0x29, 0x38, 0xc3, 0x5c, 0x51, 0x94, 0xa6, 0x24, 0xa0, 0x7d, 0x58, 0x0c, 0x55, 0xe5, 0x9e, 0x6b, + 0xda, 0x08, 0xc5, 0x13, 0x03, 0xde, 0x2f, 0x16, 0x60, 0xcd, 0x24, 0xf6, 0x67, 0xa1, 0x98, 0x2f, + 0x14, 0xdf, 0x06, 0x90, 0xe5, 0xce, 0x1b, 0xec, 0x73, 0x44, 0x83, 0x37, 0x8c, 0xa2, 0x44, 0x68, + 0x51, 0x96, 0x88, 0xc7, 0x38, 0x0b, 0x4b, 0xc9, 0x78, 0xfc, 0x9f, 0xde, 0x4a, 0xa8, 0x1d, 0x77, + 0xa2, 0x9c, 0xe8, 0x44, 0x5f, 0x9a, 0xd5, 0x89, 0xa6, 0xb2, 0xf7, 0xc9, 0x2d, 0xe8, 0xdf, 0x59, + 0xc8, 0x1f, 0xe0, 0x00, 0xbb, 0x14, 0x59, 0x53, 0x93, 0xa6, 0x7c, 0x6b, 0x6e, 0x4c, 0xe5, 0x67, + 0x4b, 0x7d, 0xed, 0x78, 0xca, 0xa0, 0xf9, 0xe1, 0x25, 0x83, 0xe6, 0x37, 0x61, 0x85, 0x3f, 0x87, + 0x23, 0x1b, 0xa5, 0xb7, 0x97, 0x9b, 0x1b, 0x31, 0xca, 0xc5, 0x7d, 0xf9, 0x5a, 0x8e, 0x1e, 0x5d, + 0x14, 0x7d, 0x0d, 0x4a, 0x9c, 0x23, 0x6e, 0xcc, 0x5c, 0xfc, 0x5a, 0xfc, 0x2c, 0x4d, 0x6c, 0x1a, + 0x26, 0xb8, 0xf8, 0x7c, 0x4f, 0x2e, 0xd0, 0x3b, 0x80, 0x4e, 0xa3, 0x2f, 0x23, 0x9d, 0xd8, 0x9d, + 0x5c, 0xfe, 0xf3, 0x93, 0xb1, 0xbe, 0x21, 0xe5, 0xa7, 0x79, 0x0c, 0x73, 0x2d, 0x26, 0x86, 0x68, + 0x5f, 0x05, 0xe0, 0x76, 0x75, 0x6c, 0xe2, 0xf9, 0xae, 0x7a, 0xee, 0x5c, 0x9d, 0x8c, 0xf5, 0x35, + 0x89, 0x12, 0xef, 0x19, 0x66, 0x91, 0x2f, 0x5a, 0xfc, 0x77, 0x22, 0xb3, 0x3f, 0xd2, 0x00, 0xc5, + 0x2d, 0xdf, 0x24, 0x74, 0xc0, 0xdf, 0x67, 0x7c, 0x10, 0x4f, 0x4c, 0xcd, 0xda, 0x93, 0x07, 0xf1, + 0x58, 0x3e, 0x1c, 0xc4, 0x13, 0x95, 0xf2, 0xf5, 0xb8, 0x3d, 0x66, 0x55, 0x1c, 0x15, 0x4c, 0x17, + 0x53, 0x92, 0x18, 0xe6, 0x9d, 0x50, 0x7a, 0xaa, 0x1f, 0x66, 0x8c, 0x3f, 0x6a, 0xb0, 0x31, 0x95, + 0x51, 0xd1, 0x61, 0x7f, 0x08, 0x28, 0x48, 0x6c, 0x0a, 0x7f, 0x8d, 0xd4, 0xa1, 0xe7, 0x4e, 0xd0, + 0xb5, 0x60, 0xaa, 0xef, 0x7e, 0x7a, 0x1d, 0x3e, 0x27, 0x7c, 0xfe, 0x3b, 0x0d, 0xd6, 0x93, 0xea, + 0x23, 0x43, 0x6e, 0xc3, 0x52, 0x52, 0xbb, 0x32, 0xe1, 0xd5, 0x67, 0x31, 0x41, 0x9d, 0xfe, 0x82, + 0x3c, 0xfa, 0x6e, 0x5c, 0xae, 0xf2, 0xdb, 0xd9, 0x8d, 0x67, 0xf6, 0x46, 0x78, 0xa6, 0x74, 0xd9, + 0xe6, 0x44, 0x3c, 0xfe, 0xab, 0x41, 0xee, 0xc0, 0xf7, 0xfb, 0xc8, 0x87, 0x35, 0xcf, 0x67, 0x1d, + 0x9e, 0x59, 0xc4, 0xee, 0xa8, 0x47, 0xb7, 0xec, 0x83, 0xbb, 0xf3, 0x39, 0xe9, 0x9f, 0x63, 0x7d, + 0x1a, 0xca, 0x2c, 0x7b, 0x3e, 0x6b, 0x0a, 0xca, 0x91, 0x7c, 0x92, 0xbf, 0x07, 0xcb, 0x17, 0x95, + 0xc9, 0x2e, 0xf9, 0xbd, 0xb9, 0x95, 0x5d, 0x84, 0x99, 0x8c, 0xf5, 0xf5, 0xb8, 0x62, 0x22, 0xb2, + 0x61, 0x2e, 0x75, 0x13, 0xda, 0x77, 0x0a, 0x3c, 0x7e, 0xff, 0x7a, 0xa0, 0x6b, 0x5f, 0xfe, 0xad, + 0x06, 0x10, 0x7f, 0x79, 0x40, 0xaf, 0xc3, 0xcb, 0xcd, 0xef, 0xdc, 0x6e, 0x75, 0x0e, 0x8f, 0x6e, + 0x1e, 0xdd, 0x39, 0xec, 0xdc, 0xb9, 0x7d, 0x78, 0xb0, 0xb7, 0xdb, 0xbe, 0xd5, 0xde, 0x6b, 0xad, + 0x66, 0xaa, 0xe5, 0x7b, 0xf7, 0xeb, 0xa5, 0x3b, 0x1e, 0x1d, 0x10, 0xcb, 0x39, 0x71, 0x88, 0x8d, + 0x5e, 0x83, 0xf5, 0x8b, 0xdc, 0x7c, 0xb5, 0xd7, 0x5a, 0xd5, 0xaa, 0x4b, 0xf7, 0xee, 0xd7, 0x0b, + 0x72, 0x16, 0x23, 0x36, 0xda, 0x84, 0xab, 0xd3, 0x7c, 0xed, 0xdb, 0xdf, 0x5a, 0xcd, 0x56, 0x97, + 0xef, 0xdd, 0xaf, 0x17, 0xa3, 0xa1, 0x0d, 0x19, 0x80, 0x92, 0x9c, 0x0a, 0x6f, 0xa1, 0x0a, 0xf7, + 0xee, 0xd7, 0xf3, 0xd2, 0x81, 0xd5, 0xdc, 0xfb, 0x1f, 0xd5, 0x32, 0xcd, 0x5b, 0x9f, 0x3c, 0xaa, + 0x69, 0x0f, 0x1f, 0xd5, 0xb4, 0xbf, 0x3f, 0xaa, 0x69, 0x1f, 0x3c, 0xae, 0x65, 0x1e, 0x3e, 0xae, + 0x65, 0xfe, 0xfc, 0xb8, 0x96, 0xf9, 0xfe, 0xeb, 0x4f, 0xf4, 0xdd, 0x79, 0xf4, 0x51, 0x5b, 0x78, + 0xb1, 0x9b, 0x17, 0x6d, 0xf8, 0xcd, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xc2, 0x48, 0x4c, 0x86, + 0xf3, 0x16, 0x00, 0x00, +} + +func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { + return StakingDescription() +} +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 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xd7, + 0x71, 0xd8, 0xcd, 0xee, 0x02, 0xd8, 0x6d, 0x2c, 0x80, 0xc5, 0x03, 0xee, 0x6e, 0x6f, 0x79, 0x04, + 0xc0, 0xe1, 0xd7, 0xf1, 0x48, 0x02, 0xe4, 0x91, 0x77, 0x24, 0xf7, 0x24, 0xd2, 0x58, 0x60, 0x0f, + 0x07, 0x1e, 0xbe, 0x38, 0x00, 0x8e, 0xd4, 0x87, 0xb3, 0x35, 0x98, 0x7d, 0x58, 0x0c, 0xb1, 0x3b, + 0x33, 0x9c, 0x99, 0xbd, 0x3b, 0x50, 0x52, 0x15, 0x2d, 0x29, 0x8a, 0x44, 0xc7, 0x91, 0x14, 0xb9, + 0x1c, 0x89, 0xd6, 0x29, 0x92, 0xe5, 0x44, 0x8e, 0xac, 0xc4, 0x1f, 0x52, 0x94, 0x38, 0x49, 0x55, + 0xa4, 0x24, 0x8e, 0x25, 0xa5, 0xe2, 0x92, 0x2a, 0xae, 0xc4, 0x71, 0x25, 0x67, 0x87, 0x52, 0x39, + 0x8c, 0xa2, 0xc4, 0xf2, 0x59, 0x4e, 0x9c, 0x52, 0xa5, 0x92, 0x7a, 0x5f, 0xf3, 0xb5, 0x1f, 0xb3, + 0x0b, 0xdd, 0x49, 0x72, 0x9c, 0x5f, 0xd8, 0xd7, 0xaf, 0xbb, 0x5f, 0xbf, 0x7e, 0xfd, 0xba, 0xfb, + 0x7d, 0x0d, 0xe0, 0x9f, 0x9f, 0x87, 0x99, 0x9a, 0x69, 0xd6, 0xea, 0x78, 0xce, 0xb2, 0x4d, 0xd7, + 0xdc, 0x69, 0xee, 0xce, 0x55, 0xb1, 0xa3, 0xd9, 0xba, 0xe5, 0x9a, 0xf6, 0x2c, 0x85, 0xa1, 0x31, + 0x86, 0x31, 0x2b, 0x30, 0xe4, 0x55, 0x18, 0xbf, 0xa0, 0xd7, 0xf1, 0xa2, 0x87, 0xb8, 0x89, 0x5d, + 0xf4, 0x24, 0xa4, 0x76, 0xf5, 0x3a, 0xce, 0x4b, 0x33, 0xc9, 0x53, 0xc3, 0x67, 0xee, 0x99, 0x8d, + 0x10, 0xcd, 0x86, 0x29, 0x36, 0x08, 0x58, 0xa1, 0x14, 0xf2, 0xb7, 0x52, 0x30, 0xd1, 0xa6, 0x16, + 0x21, 0x48, 0x19, 0x6a, 0x83, 0x70, 0x94, 0x4e, 0x65, 0x14, 0xfa, 0x1b, 0xe5, 0x61, 0xc8, 0x52, + 0xb5, 0x7d, 0xb5, 0x86, 0xf3, 0x09, 0x0a, 0x16, 0x45, 0x34, 0x05, 0x50, 0xc5, 0x16, 0x36, 0xaa, + 0xd8, 0xd0, 0x0e, 0xf2, 0xc9, 0x99, 0xe4, 0xa9, 0x8c, 0x12, 0x80, 0xa0, 0x07, 0x61, 0xdc, 0x6a, + 0xee, 0xd4, 0x75, 0xad, 0x12, 0x40, 0x83, 0x99, 0xe4, 0xa9, 0x01, 0x25, 0xc7, 0x2a, 0x16, 0x7d, + 0xe4, 0xfb, 0x61, 0xec, 0x2a, 0x56, 0xf7, 0x83, 0xa8, 0xc3, 0x14, 0x75, 0x94, 0x80, 0x03, 0x88, + 0x0b, 0x90, 0x6d, 0x60, 0xc7, 0x51, 0x6b, 0xb8, 0xe2, 0x1e, 0x58, 0x38, 0x9f, 0xa2, 0xbd, 0x9f, + 0x69, 0xe9, 0x7d, 0xb4, 0xe7, 0xc3, 0x9c, 0x6a, 0xeb, 0xc0, 0xc2, 0x68, 0x1e, 0x32, 0xd8, 0x68, + 0x36, 0x18, 0x87, 0x81, 0x0e, 0xfa, 0x2b, 0x1b, 0xcd, 0x46, 0x94, 0x4b, 0x9a, 0x90, 0x71, 0x16, + 0x43, 0x0e, 0xb6, 0xaf, 0xe8, 0x1a, 0xce, 0x0f, 0x52, 0x06, 0xf7, 0xb7, 0x30, 0xd8, 0x64, 0xf5, + 0x51, 0x1e, 0x82, 0x0e, 0x2d, 0x40, 0x06, 0x5f, 0x73, 0xb1, 0xe1, 0xe8, 0xa6, 0x91, 0x1f, 0xa2, + 0x4c, 0xee, 0x6d, 0x33, 0x8a, 0xb8, 0x5e, 0x8d, 0xb2, 0xf0, 0xe9, 0xd0, 0x39, 0x18, 0x32, 0x2d, + 0x57, 0x37, 0x0d, 0x27, 0x9f, 0x9e, 0x91, 0x4e, 0x0d, 0x9f, 0x39, 0xd9, 0xd6, 0x10, 0xd6, 0x19, + 0x8e, 0x22, 0x90, 0xd1, 0x32, 0xe4, 0x1c, 0xb3, 0x69, 0x6b, 0xb8, 0xa2, 0x99, 0x55, 0x5c, 0xd1, + 0x8d, 0x5d, 0x33, 0x9f, 0xa1, 0x0c, 0xa6, 0x5b, 0x3b, 0x42, 0x11, 0x17, 0xcc, 0x2a, 0x5e, 0x36, + 0x76, 0x4d, 0x65, 0xd4, 0x09, 0x95, 0xd1, 0x31, 0x18, 0x74, 0x0e, 0x0c, 0x57, 0xbd, 0x96, 0xcf, + 0x52, 0x0b, 0xe1, 0x25, 0xf9, 0x37, 0x06, 0x61, 0xac, 0x17, 0x13, 0x3b, 0x0f, 0x03, 0xbb, 0xa4, + 0x97, 0xf9, 0x44, 0x3f, 0x3a, 0x60, 0x34, 0x61, 0x25, 0x0e, 0x1e, 0x52, 0x89, 0xf3, 0x30, 0x6c, + 0x60, 0xc7, 0xc5, 0x55, 0x66, 0x11, 0xc9, 0x1e, 0x6d, 0x0a, 0x18, 0x51, 0xab, 0x49, 0xa5, 0x0e, + 0x65, 0x52, 0x2f, 0xc0, 0x98, 0x27, 0x52, 0xc5, 0x56, 0x8d, 0x9a, 0xb0, 0xcd, 0xb9, 0x38, 0x49, + 0x66, 0xcb, 0x82, 0x4e, 0x21, 0x64, 0xca, 0x28, 0x0e, 0x95, 0xd1, 0x22, 0x80, 0x69, 0x60, 0x73, + 0xb7, 0x52, 0xc5, 0x5a, 0x3d, 0x9f, 0xee, 0xa0, 0xa5, 0x75, 0x82, 0xd2, 0xa2, 0x25, 0x93, 0x41, + 0xb5, 0x3a, 0x7a, 0xca, 0x37, 0xb5, 0xa1, 0x0e, 0x96, 0xb2, 0xca, 0x26, 0x59, 0x8b, 0xb5, 0x6d, + 0xc3, 0xa8, 0x8d, 0x89, 0xdd, 0xe3, 0x2a, 0xef, 0x59, 0x86, 0x0a, 0x31, 0x1b, 0xdb, 0x33, 0x85, + 0x93, 0xb1, 0x8e, 0x8d, 0xd8, 0xc1, 0x22, 0xba, 0x1b, 0x3c, 0x40, 0x85, 0x9a, 0x15, 0x50, 0x2f, + 0x94, 0x15, 0xc0, 0x35, 0xb5, 0x81, 0x0b, 0x2f, 0xc3, 0x68, 0x58, 0x3d, 0x68, 0x12, 0x06, 0x1c, + 0x57, 0xb5, 0x5d, 0x6a, 0x85, 0x03, 0x0a, 0x2b, 0xa0, 0x1c, 0x24, 0xb1, 0x51, 0xa5, 0x5e, 0x6e, + 0x40, 0x21, 0x3f, 0xd1, 0x4f, 0xf8, 0x1d, 0x4e, 0xd2, 0x0e, 0xdf, 0xd7, 0x3a, 0xa2, 0x21, 0xce, + 0xd1, 0x7e, 0x17, 0x9e, 0x80, 0x91, 0x50, 0x07, 0x7a, 0x6d, 0x5a, 0x7e, 0x27, 0x1c, 0x6d, 0xcb, + 0x1a, 0xbd, 0x00, 0x93, 0x4d, 0x43, 0x37, 0x5c, 0x6c, 0x5b, 0x36, 0x26, 0x16, 0xcb, 0x9a, 0xca, + 0xff, 0xe7, 0xa1, 0x0e, 0x36, 0xb7, 0x1d, 0xc4, 0x66, 0x5c, 0x94, 0x89, 0x66, 0x2b, 0xf0, 0x74, + 0x26, 0xfd, 0xc6, 0x50, 0xee, 0x95, 0x57, 0x5e, 0x79, 0x25, 0x21, 0x7f, 0x79, 0x10, 0x26, 0xdb, + 0xcd, 0x99, 0xb6, 0xd3, 0xf7, 0x18, 0x0c, 0x1a, 0xcd, 0xc6, 0x0e, 0xb6, 0xa9, 0x92, 0x06, 0x14, + 0x5e, 0x42, 0xf3, 0x30, 0x50, 0x57, 0x77, 0x70, 0x3d, 0x9f, 0x9a, 0x91, 0x4e, 0x8d, 0x9e, 0x79, + 0xb0, 0xa7, 0x59, 0x39, 0xbb, 0x42, 0x48, 0x14, 0x46, 0x89, 0x9e, 0x86, 0x14, 0x77, 0xd1, 0x84, + 0xc3, 0xe9, 0xde, 0x38, 0x90, 0xb9, 0xa4, 0x50, 0x3a, 0x74, 0x07, 0x64, 0xc8, 0x5f, 0x66, 0x1b, + 0x83, 0x54, 0xe6, 0x34, 0x01, 0x10, 0xbb, 0x40, 0x05, 0x48, 0xd3, 0x69, 0x52, 0xc5, 0x22, 0xb4, + 0x79, 0x65, 0x62, 0x58, 0x55, 0xbc, 0xab, 0x36, 0xeb, 0x6e, 0xe5, 0x8a, 0x5a, 0x6f, 0x62, 0x6a, + 0xf0, 0x19, 0x25, 0xcb, 0x81, 0x97, 0x09, 0x0c, 0x4d, 0xc3, 0x30, 0x9b, 0x55, 0xba, 0x51, 0xc5, + 0xd7, 0xa8, 0xf7, 0x1c, 0x50, 0xd8, 0x44, 0x5b, 0x26, 0x10, 0xd2, 0xfc, 0x8b, 0x8e, 0x69, 0x08, + 0xd3, 0xa4, 0x4d, 0x10, 0x00, 0x6d, 0xfe, 0x89, 0xa8, 0xe3, 0xbe, 0xb3, 0x7d, 0xf7, 0x5a, 0xe6, + 0xd2, 0xfd, 0x30, 0x46, 0x31, 0x1e, 0xe3, 0x43, 0xaf, 0xd6, 0xf3, 0xe3, 0x33, 0xd2, 0xa9, 0xb4, + 0x32, 0xca, 0xc0, 0xeb, 0x1c, 0x2a, 0x7f, 0x31, 0x01, 0x29, 0xea, 0x58, 0xc6, 0x60, 0x78, 0xeb, + 0x2d, 0x1b, 0xe5, 0xca, 0xe2, 0xfa, 0x76, 0x69, 0xa5, 0x9c, 0x93, 0xd0, 0x28, 0x00, 0x05, 0x5c, + 0x58, 0x59, 0x9f, 0xdf, 0xca, 0x25, 0xbc, 0xf2, 0xf2, 0xda, 0xd6, 0xb9, 0xc7, 0x73, 0x49, 0x8f, + 0x60, 0x9b, 0x01, 0x52, 0x41, 0x84, 0xc7, 0xce, 0xe4, 0x06, 0x50, 0x0e, 0xb2, 0x8c, 0xc1, 0xf2, + 0x0b, 0xe5, 0xc5, 0x73, 0x8f, 0xe7, 0x06, 0xc3, 0x90, 0xc7, 0xce, 0xe4, 0x86, 0xd0, 0x08, 0x64, + 0x28, 0xa4, 0xb4, 0xbe, 0xbe, 0x92, 0x4b, 0x7b, 0x3c, 0x37, 0xb7, 0x94, 0xe5, 0xb5, 0xa5, 0x5c, + 0xc6, 0xe3, 0xb9, 0xa4, 0xac, 0x6f, 0x6f, 0xe4, 0xc0, 0xe3, 0xb0, 0x5a, 0xde, 0xdc, 0x9c, 0x5f, + 0x2a, 0xe7, 0x86, 0x3d, 0x8c, 0xd2, 0x5b, 0xb6, 0xca, 0x9b, 0xb9, 0x6c, 0x48, 0xac, 0xc7, 0xce, + 0xe4, 0x46, 0xbc, 0x26, 0xca, 0x6b, 0xdb, 0xab, 0xb9, 0x51, 0x34, 0x0e, 0x23, 0xac, 0x09, 0x21, + 0xc4, 0x58, 0x04, 0x74, 0xee, 0xf1, 0x5c, 0xce, 0x17, 0x84, 0x71, 0x19, 0x0f, 0x01, 0xce, 0x3d, + 0x9e, 0x43, 0xf2, 0x02, 0x0c, 0x50, 0x33, 0x44, 0x08, 0x46, 0x57, 0xe6, 0x4b, 0xe5, 0x95, 0xca, + 0xfa, 0xc6, 0xd6, 0xf2, 0xfa, 0xda, 0xfc, 0x4a, 0x4e, 0xf2, 0x61, 0x4a, 0xf9, 0xb9, 0xed, 0x65, + 0xa5, 0xbc, 0x98, 0x4b, 0x04, 0x61, 0x1b, 0xe5, 0xf9, 0xad, 0xf2, 0x62, 0x2e, 0x29, 0x6b, 0x30, + 0xd9, 0xce, 0xa1, 0xb6, 0x9d, 0x42, 0x01, 0x5b, 0x48, 0x74, 0xb0, 0x05, 0xca, 0x2b, 0x6a, 0x0b, + 0xf2, 0x37, 0x13, 0x30, 0xd1, 0x26, 0xa8, 0xb4, 0x6d, 0xe4, 0x19, 0x18, 0x60, 0xb6, 0xcc, 0xc2, + 0xec, 0x03, 0x6d, 0xa3, 0x13, 0xb5, 0xec, 0x96, 0x50, 0x4b, 0xe9, 0x82, 0xa9, 0x46, 0xb2, 0x43, + 0xaa, 0x41, 0x58, 0xb4, 0x18, 0xec, 0x4f, 0xb6, 0x38, 0x7f, 0x16, 0x1f, 0xcf, 0xf5, 0x12, 0x1f, + 0x29, 0xac, 0xbf, 0x20, 0x30, 0xd0, 0x26, 0x08, 0x9c, 0x87, 0xf1, 0x16, 0x46, 0x3d, 0x3b, 0xe3, + 0xf7, 0x48, 0x90, 0xef, 0xa4, 0x9c, 0x18, 0x97, 0x98, 0x08, 0xb9, 0xc4, 0xf3, 0x51, 0x0d, 0xde, + 0xd5, 0x79, 0x10, 0x5a, 0xc6, 0xfa, 0x33, 0x12, 0x1c, 0x6b, 0x9f, 0x52, 0xb6, 0x95, 0xe1, 0x69, + 0x18, 0x6c, 0x60, 0x77, 0xcf, 0x14, 0x69, 0xd5, 0x7d, 0x6d, 0x82, 0x35, 0xa9, 0x8e, 0x0e, 0x36, + 0xa7, 0x0a, 0x46, 0xfb, 0x64, 0xa7, 0xbc, 0x90, 0x49, 0xd3, 0x22, 0xe9, 0x07, 0x12, 0x70, 0xb4, + 0x2d, 0xf3, 0xb6, 0x82, 0xde, 0x09, 0xa0, 0x1b, 0x56, 0xd3, 0x65, 0xa9, 0x13, 0xf3, 0xc4, 0x19, + 0x0a, 0xa1, 0xce, 0x8b, 0x78, 0xd9, 0xa6, 0xeb, 0xd5, 0x27, 0x69, 0x3d, 0x30, 0x10, 0x45, 0x78, + 0xd2, 0x17, 0x34, 0x45, 0x05, 0x9d, 0xea, 0xd0, 0xd3, 0x16, 0xc3, 0x7c, 0x04, 0x72, 0x5a, 0x5d, + 0xc7, 0x86, 0x5b, 0x71, 0x5c, 0x1b, 0xab, 0x0d, 0xdd, 0xa8, 0xd1, 0x50, 0x93, 0x2e, 0x0e, 0xec, + 0xaa, 0x75, 0x07, 0x2b, 0x63, 0xac, 0x7a, 0x53, 0xd4, 0x12, 0x0a, 0x6a, 0x40, 0x76, 0x80, 0x62, + 0x30, 0x44, 0xc1, 0xaa, 0x3d, 0x0a, 0xf9, 0xc3, 0x19, 0x18, 0x0e, 0x24, 0xe0, 0xe8, 0x2e, 0xc8, + 0xbe, 0xa8, 0x5e, 0x51, 0x2b, 0x62, 0x51, 0xc5, 0x34, 0x31, 0x4c, 0x60, 0x1b, 0x7c, 0x61, 0xf5, + 0x08, 0x4c, 0x52, 0x14, 0xb3, 0xe9, 0x62, 0xbb, 0xa2, 0xd5, 0x55, 0xc7, 0xa1, 0x4a, 0x4b, 0x53, + 0x54, 0x44, 0xea, 0xd6, 0x49, 0xd5, 0x82, 0xa8, 0x41, 0x67, 0x61, 0x82, 0x52, 0x34, 0x9a, 0x75, + 0x57, 0xb7, 0xea, 0xb8, 0x42, 0x96, 0x79, 0x0e, 0x0d, 0x39, 0x9e, 0x64, 0xe3, 0x04, 0x63, 0x95, + 0x23, 0x10, 0x89, 0x1c, 0xb4, 0x08, 0x77, 0x52, 0xb2, 0x1a, 0x36, 0xb0, 0xad, 0xba, 0xb8, 0x82, + 0x5f, 0x6a, 0xaa, 0x75, 0xa7, 0xa2, 0x1a, 0xd5, 0xca, 0x9e, 0xea, 0xec, 0xe5, 0x27, 0x09, 0x83, + 0x52, 0x22, 0x2f, 0x29, 0x27, 0x08, 0xe2, 0x12, 0xc7, 0x2b, 0x53, 0xb4, 0x79, 0xa3, 0x7a, 0x51, + 0x75, 0xf6, 0x50, 0x11, 0x8e, 0x51, 0x2e, 0x8e, 0x6b, 0xeb, 0x46, 0xad, 0xa2, 0xed, 0x61, 0x6d, + 0xbf, 0xd2, 0x74, 0x77, 0x9f, 0xcc, 0xdf, 0x11, 0x6c, 0x9f, 0x4a, 0xb8, 0x49, 0x71, 0x16, 0x08, + 0xca, 0xb6, 0xbb, 0xfb, 0x24, 0xda, 0x84, 0x2c, 0x19, 0x8c, 0x86, 0xfe, 0x32, 0xae, 0xec, 0x9a, + 0x36, 0x8d, 0xa1, 0xa3, 0x6d, 0x5c, 0x53, 0x40, 0x83, 0xb3, 0xeb, 0x9c, 0x60, 0xd5, 0xac, 0xe2, + 0xe2, 0xc0, 0xe6, 0x46, 0xb9, 0xbc, 0xa8, 0x0c, 0x0b, 0x2e, 0x17, 0x4c, 0x9b, 0x18, 0x54, 0xcd, + 0xf4, 0x14, 0x3c, 0xcc, 0x0c, 0xaa, 0x66, 0x0a, 0xf5, 0x9e, 0x85, 0x09, 0x4d, 0x63, 0x7d, 0xd6, + 0xb5, 0x0a, 0x5f, 0x8c, 0x39, 0xf9, 0x5c, 0x48, 0x59, 0x9a, 0xb6, 0xc4, 0x10, 0xb8, 0x8d, 0x3b, + 0xe8, 0x29, 0x38, 0xea, 0x2b, 0x2b, 0x48, 0x38, 0xde, 0xd2, 0xcb, 0x28, 0xe9, 0x59, 0x98, 0xb0, + 0x0e, 0x5a, 0x09, 0x51, 0xa8, 0x45, 0xeb, 0x20, 0x4a, 0xf6, 0x04, 0x4c, 0x5a, 0x7b, 0x56, 0x2b, + 0xdd, 0xe9, 0x20, 0x1d, 0xb2, 0xf6, 0xac, 0x28, 0xe1, 0xbd, 0x74, 0x65, 0x6e, 0x63, 0x4d, 0x75, + 0x71, 0x35, 0x7f, 0x3c, 0x88, 0x1e, 0xa8, 0x40, 0xb3, 0x90, 0xd3, 0xb4, 0x0a, 0x36, 0xd4, 0x9d, + 0x3a, 0xae, 0xa8, 0x36, 0x36, 0x54, 0x27, 0x3f, 0x4d, 0x91, 0x53, 0xae, 0xdd, 0xc4, 0xca, 0xa8, + 0xa6, 0x95, 0x69, 0xe5, 0x3c, 0xad, 0x43, 0xa7, 0x61, 0xdc, 0xdc, 0x79, 0x51, 0x63, 0x16, 0x59, + 0xb1, 0x6c, 0xbc, 0xab, 0x5f, 0xcb, 0xdf, 0x43, 0xd5, 0x3b, 0x46, 0x2a, 0xa8, 0x3d, 0x6e, 0x50, + 0x30, 0x7a, 0x00, 0x72, 0x9a, 0xb3, 0xa7, 0xda, 0x16, 0x75, 0xc9, 0x8e, 0xa5, 0x6a, 0x38, 0x7f, + 0x2f, 0x43, 0x65, 0xf0, 0x35, 0x01, 0x26, 0x33, 0xc2, 0xb9, 0xaa, 0xef, 0xba, 0x82, 0xe3, 0xfd, + 0x6c, 0x46, 0x50, 0x18, 0xe7, 0x76, 0x0a, 0x72, 0x44, 0x13, 0xa1, 0x86, 0x4f, 0x51, 0xb4, 0x51, + 0x6b, 0xcf, 0x0a, 0xb6, 0x7b, 0x37, 0x8c, 0x10, 0x4c, 0xbf, 0xd1, 0x07, 0x58, 0xe2, 0x66, 0xed, + 0x05, 0x5a, 0x7c, 0x1c, 0x8e, 0x11, 0xa4, 0x06, 0x76, 0xd5, 0xaa, 0xea, 0xaa, 0x01, 0xec, 0x87, + 0x28, 0x36, 0x51, 0xfb, 0x2a, 0xaf, 0x0c, 0xc9, 0x69, 0x37, 0x77, 0x0e, 0x3c, 0xc3, 0x7a, 0x98, + 0xc9, 0x49, 0x60, 0xc2, 0xb4, 0x6e, 0x5b, 0x72, 0x2e, 0x17, 0x21, 0x1b, 0xb4, 0x7b, 0x94, 0x01, + 0x66, 0xf9, 0x39, 0x89, 0x24, 0x41, 0x0b, 0xeb, 0x8b, 0x24, 0x7d, 0x79, 0x6b, 0x39, 0x97, 0x20, + 0x69, 0xd4, 0xca, 0xf2, 0x56, 0xb9, 0xa2, 0x6c, 0xaf, 0x6d, 0x2d, 0xaf, 0x96, 0x73, 0xc9, 0x40, + 0x62, 0xff, 0x6c, 0x2a, 0x7d, 0x5f, 0xee, 0x7e, 0xf9, 0x1b, 0x09, 0x18, 0x0d, 0xaf, 0xd4, 0xd0, + 0x9b, 0xe0, 0xb8, 0xd8, 0x56, 0x71, 0xb0, 0x5b, 0xb9, 0xaa, 0xdb, 0x74, 0x42, 0x36, 0x54, 0x16, + 0x1c, 0x3d, 0xfb, 0x99, 0xe4, 0x58, 0x9b, 0xd8, 0x7d, 0x5e, 0xb7, 0xc9, 0x74, 0x6b, 0xa8, 0x2e, + 0x5a, 0x81, 0x69, 0xc3, 0xac, 0x38, 0xae, 0x6a, 0x54, 0x55, 0xbb, 0x5a, 0xf1, 0x37, 0xb4, 0x2a, + 0xaa, 0xa6, 0x61, 0xc7, 0x31, 0x59, 0x20, 0xf4, 0xb8, 0x9c, 0x34, 0xcc, 0x4d, 0x8e, 0xec, 0x47, + 0x88, 0x79, 0x8e, 0x1a, 0x31, 0xdf, 0x64, 0x27, 0xf3, 0xbd, 0x03, 0x32, 0x0d, 0xd5, 0xaa, 0x60, + 0xc3, 0xb5, 0x0f, 0x68, 0x7e, 0x9e, 0x56, 0xd2, 0x0d, 0xd5, 0x2a, 0x93, 0xf2, 0x0f, 0x65, 0x99, + 0xf4, 0x6c, 0x2a, 0x9d, 0xce, 0x65, 0x9e, 0x4d, 0xa5, 0x33, 0x39, 0x90, 0x5f, 0x4f, 0x42, 0x36, + 0x98, 0xaf, 0x93, 0xe5, 0x8f, 0x46, 0x23, 0x96, 0x44, 0x7d, 0xda, 0xdd, 0x5d, 0xb3, 0xfb, 0xd9, + 0x05, 0x12, 0xca, 0x8a, 0x83, 0x2c, 0x39, 0x56, 0x18, 0x25, 0x49, 0x23, 0x88, 0xb1, 0x61, 0x96, + 0x8c, 0xa4, 0x15, 0x5e, 0x42, 0x4b, 0x30, 0xf8, 0xa2, 0x43, 0x79, 0x0f, 0x52, 0xde, 0xf7, 0x74, + 0xe7, 0xfd, 0xec, 0x26, 0x65, 0x9e, 0x79, 0x76, 0xb3, 0xb2, 0xb6, 0xae, 0xac, 0xce, 0xaf, 0x28, + 0x9c, 0x1c, 0x9d, 0x80, 0x54, 0x5d, 0x7d, 0xf9, 0x20, 0x1c, 0xf4, 0x28, 0xa8, 0xd7, 0x41, 0x38, + 0x01, 0xa9, 0xab, 0x58, 0xdd, 0x0f, 0x87, 0x1a, 0x0a, 0xba, 0x8d, 0x93, 0x61, 0x0e, 0x06, 0xa8, + 0xbe, 0x10, 0x00, 0xd7, 0x58, 0xee, 0x08, 0x4a, 0x43, 0x6a, 0x61, 0x5d, 0x21, 0x13, 0x22, 0x07, + 0x59, 0x06, 0xad, 0x6c, 0x2c, 0x97, 0x17, 0xca, 0xb9, 0x84, 0x7c, 0x16, 0x06, 0x99, 0x12, 0xc8, + 0x64, 0xf1, 0xd4, 0x90, 0x3b, 0xc2, 0x8b, 0x9c, 0x87, 0x24, 0x6a, 0xb7, 0x57, 0x4b, 0x65, 0x25, + 0x97, 0x08, 0x0f, 0x75, 0x2a, 0x37, 0x20, 0x3b, 0x90, 0x0d, 0xe6, 0xe1, 0x3f, 0x9c, 0xc5, 0xf8, + 0x97, 0x24, 0x18, 0x0e, 0xe4, 0xd5, 0x24, 0x21, 0x52, 0xeb, 0x75, 0xf3, 0x6a, 0x45, 0xad, 0xeb, + 0xaa, 0xc3, 0x4d, 0x03, 0x28, 0x68, 0x9e, 0x40, 0x7a, 0x1d, 0xba, 0x1f, 0xd2, 0x14, 0x19, 0xc8, + 0x0d, 0xca, 0x9f, 0x90, 0x20, 0x17, 0x4d, 0x6c, 0x23, 0x62, 0x4a, 0x3f, 0x4a, 0x31, 0xe5, 0x8f, + 0x4b, 0x30, 0x1a, 0xce, 0x66, 0x23, 0xe2, 0xdd, 0xf5, 0x23, 0x15, 0xef, 0x0f, 0x12, 0x30, 0x12, + 0xca, 0x61, 0x7b, 0x95, 0xee, 0x25, 0x18, 0xd7, 0xab, 0xb8, 0x61, 0x99, 0x2e, 0x36, 0xb4, 0x83, + 0x4a, 0x1d, 0x5f, 0xc1, 0xf5, 0xbc, 0x4c, 0x9d, 0xc6, 0x5c, 0xf7, 0x2c, 0x79, 0x76, 0xd9, 0xa7, + 0x5b, 0x21, 0x64, 0xc5, 0x89, 0xe5, 0xc5, 0xf2, 0xea, 0xc6, 0xfa, 0x56, 0x79, 0x6d, 0xe1, 0x2d, + 0x95, 0xed, 0xb5, 0x4b, 0x6b, 0xeb, 0xcf, 0xaf, 0x29, 0x39, 0x3d, 0x82, 0x76, 0x1b, 0xa7, 0xfd, + 0x06, 0xe4, 0xa2, 0x42, 0xa1, 0xe3, 0xd0, 0x4e, 0xac, 0xdc, 0x11, 0x34, 0x01, 0x63, 0x6b, 0xeb, + 0x95, 0xcd, 0xe5, 0xc5, 0x72, 0xa5, 0x7c, 0xe1, 0x42, 0x79, 0x61, 0x6b, 0x93, 0xed, 0x7b, 0x78, + 0xd8, 0x5b, 0xa1, 0x09, 0x2e, 0xbf, 0x96, 0x84, 0x89, 0x36, 0x92, 0xa0, 0x79, 0xbe, 0x62, 0x61, + 0x8b, 0xa8, 0x87, 0x7b, 0x91, 0x7e, 0x96, 0xe4, 0x0c, 0x1b, 0xaa, 0xed, 0xf2, 0x05, 0xce, 0x03, + 0x40, 0xb4, 0x64, 0xb8, 0xfa, 0xae, 0x8e, 0x6d, 0xbe, 0x9f, 0xc4, 0x96, 0x31, 0x63, 0x3e, 0x9c, + 0x6d, 0x29, 0x3d, 0x04, 0xc8, 0x32, 0x1d, 0xdd, 0xd5, 0xaf, 0xe0, 0x8a, 0x6e, 0x88, 0xcd, 0x27, + 0xb2, 0xac, 0x49, 0x29, 0x39, 0x51, 0xb3, 0x6c, 0xb8, 0x1e, 0xb6, 0x81, 0x6b, 0x6a, 0x04, 0x9b, + 0x38, 0xf3, 0xa4, 0x92, 0x13, 0x35, 0x1e, 0xf6, 0x5d, 0x90, 0xad, 0x9a, 0x4d, 0x92, 0xeb, 0x31, + 0x3c, 0x12, 0x3b, 0x24, 0x65, 0x98, 0xc1, 0x3c, 0x14, 0x9e, 0xc5, 0xfb, 0xbb, 0x5e, 0x59, 0x65, + 0x98, 0xc1, 0x18, 0xca, 0xfd, 0x30, 0xa6, 0xd6, 0x6a, 0x36, 0x61, 0x2e, 0x18, 0xb1, 0x75, 0xc9, + 0xa8, 0x07, 0xa6, 0x88, 0x85, 0x67, 0x21, 0x2d, 0xf4, 0x40, 0x42, 0x35, 0xd1, 0x44, 0xc5, 0x62, + 0x8b, 0xed, 0xc4, 0xa9, 0x8c, 0x92, 0x36, 0x44, 0xe5, 0x5d, 0x90, 0xd5, 0x9d, 0x8a, 0xbf, 0x89, + 0x9f, 0x98, 0x49, 0x9c, 0x4a, 0x2b, 0xc3, 0xba, 0xe3, 0x6d, 0x80, 0xca, 0x9f, 0x49, 0xc0, 0x68, + 0xf8, 0x10, 0x02, 0x2d, 0x42, 0xba, 0x6e, 0x6a, 0x2a, 0x35, 0x2d, 0x76, 0x02, 0x76, 0x2a, 0xe6, + 0xdc, 0x62, 0x76, 0x85, 0xe3, 0x2b, 0x1e, 0x65, 0xe1, 0xb7, 0x25, 0x48, 0x0b, 0x30, 0x3a, 0x06, + 0x29, 0x4b, 0x75, 0xf7, 0x28, 0xbb, 0x81, 0x52, 0x22, 0x27, 0x29, 0xb4, 0x4c, 0xe0, 0x8e, 0xa5, + 0x1a, 0xd4, 0x04, 0x38, 0x9c, 0x94, 0xc9, 0xb8, 0xd6, 0xb1, 0x5a, 0xa5, 0x8b, 0x1e, 0xb3, 0xd1, + 0xc0, 0x86, 0xeb, 0x88, 0x71, 0xe5, 0xf0, 0x05, 0x0e, 0x46, 0x0f, 0xc2, 0xb8, 0x6b, 0xab, 0x7a, + 0x3d, 0x84, 0x9b, 0xa2, 0xb8, 0x39, 0x51, 0xe1, 0x21, 0x17, 0xe1, 0x84, 0xe0, 0x5b, 0xc5, 0xae, + 0xaa, 0xed, 0xe1, 0xaa, 0x4f, 0x34, 0x48, 0x37, 0x37, 0x8e, 0x73, 0x84, 0x45, 0x5e, 0x2f, 0x68, + 0xe5, 0x6f, 0x48, 0x30, 0x2e, 0x96, 0x69, 0x55, 0x4f, 0x59, 0xab, 0x00, 0xaa, 0x61, 0x98, 0x6e, + 0x50, 0x5d, 0xad, 0xa6, 0xdc, 0x42, 0x37, 0x3b, 0xef, 0x11, 0x29, 0x01, 0x06, 0x85, 0x06, 0x80, + 0x5f, 0xd3, 0x51, 0x6d, 0xd3, 0x30, 0xcc, 0x4f, 0x98, 0xe8, 0x31, 0x25, 0x5b, 0xd8, 0x03, 0x03, + 0x91, 0xf5, 0x1c, 0x9a, 0x84, 0x81, 0x1d, 0x5c, 0xd3, 0x0d, 0xbe, 0x6f, 0xcc, 0x0a, 0x62, 0xfb, + 0x25, 0xe5, 0x6d, 0xbf, 0x94, 0x3e, 0x28, 0xc1, 0x84, 0x66, 0x36, 0xa2, 0xf2, 0x96, 0x72, 0x91, + 0xdd, 0x05, 0xe7, 0xa2, 0xf4, 0xd6, 0xa7, 0x6b, 0xba, 0xbb, 0xd7, 0xdc, 0x99, 0xd5, 0xcc, 0xc6, + 0x5c, 0xcd, 0xac, 0xab, 0x46, 0xcd, 0x3f, 0x67, 0xa5, 0x3f, 0xb4, 0x87, 0x6b, 0xd8, 0x78, 0xb8, + 0x66, 0x06, 0x4e, 0x5d, 0xcf, 0xfb, 0x3f, 0xff, 0x4c, 0x92, 0x7e, 0x21, 0x91, 0x5c, 0xda, 0x28, + 0x7d, 0x36, 0x51, 0x58, 0x62, 0xcd, 0x6d, 0x08, 0xf5, 0x28, 0x78, 0xb7, 0x8e, 0x35, 0xd2, 0x65, + 0xf8, 0xf6, 0x83, 0x30, 0x59, 0x33, 0x6b, 0x26, 0xe5, 0x38, 0x47, 0x7e, 0xf1, 0x93, 0xdb, 0x8c, + 0x07, 0x2d, 0xc4, 0x1e, 0xf3, 0x16, 0xd7, 0x60, 0x82, 0x23, 0x57, 0xe8, 0xd1, 0x11, 0x5b, 0xd8, + 0xa0, 0xae, 0xbb, 0x6a, 0xf9, 0x5f, 0xfb, 0x16, 0x0d, 0xe8, 0xca, 0x38, 0x27, 0x25, 0x75, 0x6c, + 0xed, 0x53, 0x54, 0xe0, 0x68, 0x88, 0x1f, 0x9b, 0xb6, 0xd8, 0x8e, 0xe1, 0xf8, 0x9b, 0x9c, 0xe3, + 0x44, 0x80, 0xe3, 0x26, 0x27, 0x2d, 0x2e, 0xc0, 0x48, 0x3f, 0xbc, 0xfe, 0x25, 0xe7, 0x95, 0xc5, + 0x41, 0x26, 0x4b, 0x30, 0x46, 0x99, 0x68, 0x4d, 0xc7, 0x35, 0x1b, 0xd4, 0x27, 0x76, 0x67, 0xf3, + 0x5b, 0xdf, 0x62, 0xf3, 0x68, 0x94, 0x90, 0x2d, 0x78, 0x54, 0xc5, 0x22, 0xd0, 0xd3, 0xb2, 0x2a, + 0xd6, 0xea, 0x31, 0x1c, 0xbe, 0xc2, 0x05, 0xf1, 0xf0, 0x8b, 0x97, 0x61, 0x92, 0xfc, 0xa6, 0x2e, + 0x2b, 0x28, 0x49, 0xfc, 0x16, 0x5c, 0xfe, 0x1b, 0xef, 0x61, 0x53, 0x75, 0xc2, 0x63, 0x10, 0x90, + 0x29, 0x30, 0x8a, 0x35, 0xec, 0xba, 0xd8, 0x76, 0x2a, 0x6a, 0xbd, 0x9d, 0x78, 0x81, 0x3d, 0x8c, + 0xfc, 0xc7, 0xbe, 0x13, 0x1e, 0xc5, 0x25, 0x46, 0x39, 0x5f, 0xaf, 0x17, 0xb7, 0xe1, 0x78, 0x1b, + 0xab, 0xe8, 0x81, 0xe7, 0x6b, 0x9c, 0xe7, 0x64, 0x8b, 0x65, 0x10, 0xb6, 0x1b, 0x20, 0xe0, 0xde, + 0x58, 0xf6, 0xc0, 0xf3, 0xe7, 0x39, 0x4f, 0xc4, 0x69, 0xc5, 0x90, 0x12, 0x8e, 0xcf, 0xc2, 0xf8, + 0x15, 0x6c, 0xef, 0x98, 0x0e, 0xdf, 0x37, 0xea, 0x81, 0xdd, 0xc7, 0x39, 0xbb, 0x31, 0x4e, 0x48, + 0x37, 0x92, 0x08, 0xaf, 0xa7, 0x20, 0xbd, 0xab, 0x6a, 0xb8, 0x07, 0x16, 0xd7, 0x39, 0x8b, 0x21, + 0x82, 0x4f, 0x48, 0xe7, 0x21, 0x5b, 0x33, 0x79, 0xd4, 0x8a, 0x27, 0xff, 0x04, 0x27, 0x1f, 0x16, + 0x34, 0x9c, 0x85, 0x65, 0x5a, 0xcd, 0x3a, 0x09, 0x69, 0xf1, 0x2c, 0xfe, 0xa6, 0x60, 0x21, 0x68, + 0x38, 0x8b, 0x3e, 0xd4, 0xfa, 0x49, 0xc1, 0xc2, 0x09, 0xe8, 0xf3, 0x19, 0x18, 0x36, 0x8d, 0xfa, + 0x81, 0x69, 0xf4, 0x22, 0xc4, 0xa7, 0x38, 0x07, 0xe0, 0x24, 0x84, 0xc1, 0x79, 0xc8, 0xf4, 0x3a, + 0x10, 0x7f, 0xeb, 0x3b, 0x62, 0x7a, 0x88, 0x11, 0x58, 0x82, 0x31, 0xe1, 0xa0, 0x74, 0xd3, 0xe8, + 0x81, 0xc5, 0xdf, 0xe6, 0x2c, 0x46, 0x03, 0x64, 0xbc, 0x1b, 0x2e, 0x76, 0xdc, 0x1a, 0xee, 0x85, + 0xc9, 0x67, 0x44, 0x37, 0x38, 0x09, 0x57, 0xe5, 0x0e, 0x36, 0xb4, 0xbd, 0xde, 0x38, 0xfc, 0x92, + 0x50, 0xa5, 0xa0, 0x21, 0x2c, 0x16, 0x60, 0xa4, 0xa1, 0xda, 0xce, 0x9e, 0x5a, 0xef, 0x69, 0x38, + 0xfe, 0x0e, 0xe7, 0x91, 0xf5, 0x88, 0xb8, 0x46, 0x9a, 0x46, 0x3f, 0x6c, 0x3e, 0x2b, 0x34, 0x12, + 0x20, 0xe3, 0x53, 0xcf, 0x71, 0xe9, 0x26, 0x5b, 0x3f, 0xdc, 0x7e, 0x59, 0x4c, 0x3d, 0x46, 0xbb, + 0x1a, 0xe4, 0x78, 0x1e, 0x32, 0x8e, 0xfe, 0x72, 0x4f, 0x6c, 0x3e, 0x27, 0x46, 0x9a, 0x12, 0x10, + 0xe2, 0xb7, 0xc0, 0x89, 0xb6, 0x61, 0xa2, 0x07, 0x66, 0x7f, 0x97, 0x33, 0x3b, 0xd6, 0x26, 0x54, + 0x70, 0x97, 0xd0, 0x2f, 0xcb, 0xbf, 0x27, 0x5c, 0x02, 0x8e, 0xf0, 0xda, 0x20, 0xeb, 0x08, 0x47, + 0xdd, 0xed, 0x4f, 0x6b, 0xbf, 0x22, 0xb4, 0xc6, 0x68, 0x43, 0x5a, 0xdb, 0x82, 0x63, 0x9c, 0x63, + 0x7f, 0xe3, 0xfa, 0xab, 0xc2, 0xb1, 0x32, 0xea, 0xed, 0xf0, 0xe8, 0xbe, 0x0d, 0x0a, 0x9e, 0x3a, + 0x45, 0xc2, 0xea, 0x54, 0x1a, 0xaa, 0xd5, 0x03, 0xe7, 0x5f, 0xe3, 0x9c, 0x85, 0xc7, 0xf7, 0x32, + 0x5e, 0x67, 0x55, 0xb5, 0x08, 0xf3, 0x17, 0x20, 0x2f, 0x98, 0x37, 0x0d, 0x1b, 0x6b, 0x66, 0xcd, + 0xd0, 0x5f, 0xc6, 0xd5, 0x1e, 0x58, 0xff, 0x7a, 0x64, 0xa8, 0xb6, 0x03, 0xe4, 0x84, 0xf3, 0x32, + 0xe4, 0xbc, 0x5c, 0xa5, 0xa2, 0x37, 0x2c, 0xd3, 0x76, 0x63, 0x38, 0x7e, 0x5e, 0x8c, 0x94, 0x47, + 0xb7, 0x4c, 0xc9, 0x8a, 0x65, 0x60, 0x27, 0xcf, 0xbd, 0x9a, 0xe4, 0x17, 0x38, 0xa3, 0x11, 0x9f, + 0x8a, 0x3b, 0x0e, 0xcd, 0x6c, 0x58, 0xaa, 0xdd, 0x8b, 0xff, 0xfb, 0xfb, 0xc2, 0x71, 0x70, 0x12, + 0xee, 0x38, 0xdc, 0x03, 0x0b, 0x93, 0x68, 0xdf, 0x03, 0x87, 0x2f, 0x0a, 0xc7, 0x21, 0x68, 0x38, + 0x0b, 0x91, 0x30, 0xf4, 0xc0, 0xe2, 0x1f, 0x08, 0x16, 0x82, 0x86, 0xb0, 0x78, 0xce, 0x0f, 0xb4, + 0x36, 0xae, 0xe9, 0x8e, 0x6b, 0xb3, 0x34, 0xb9, 0x3b, 0xab, 0x7f, 0xf8, 0x9d, 0x70, 0x12, 0xa6, + 0x04, 0x48, 0x89, 0x27, 0xe2, 0xdb, 0xae, 0x74, 0x15, 0x15, 0x2f, 0xd8, 0x6f, 0x08, 0x4f, 0x14, + 0x20, 0x23, 0xb2, 0x05, 0x32, 0x44, 0xa2, 0x76, 0x8d, 0xac, 0x1d, 0x7a, 0x60, 0xf7, 0x8f, 0x22, + 0xc2, 0x6d, 0x0a, 0x5a, 0xc2, 0x33, 0x90, 0xff, 0x34, 0x8d, 0x7d, 0x7c, 0xd0, 0x93, 0x75, 0xfe, + 0xe3, 0x48, 0xfe, 0xb3, 0xcd, 0x28, 0x99, 0x0f, 0x19, 0x8b, 0xe4, 0x53, 0x28, 0xee, 0x9e, 0x51, + 0xfe, 0xa7, 0xbe, 0xc7, 0xfb, 0x1b, 0x4e, 0xa7, 0x8a, 0x2b, 0xc4, 0xc8, 0xc3, 0x49, 0x4f, 0x3c, + 0xb3, 0xf7, 0x7c, 0xcf, 0xb3, 0xf3, 0x50, 0xce, 0x53, 0xbc, 0x00, 0x23, 0xa1, 0x84, 0x27, 0x9e, + 0xd5, 0x7b, 0x39, 0xab, 0x6c, 0x30, 0xdf, 0x29, 0x9e, 0x85, 0x14, 0x49, 0x5e, 0xe2, 0xc9, 0xff, + 0x32, 0x27, 0xa7, 0xe8, 0xc5, 0x37, 0x43, 0x5a, 0x24, 0x2d, 0xf1, 0xa4, 0xef, 0xe3, 0xa4, 0x1e, + 0x09, 0x21, 0x17, 0x09, 0x4b, 0x3c, 0xf9, 0x5f, 0x11, 0xe4, 0x82, 0x84, 0x90, 0xf7, 0xae, 0xc2, + 0x2f, 0xfd, 0x74, 0x8a, 0x07, 0x1d, 0xa1, 0xbb, 0xf3, 0x30, 0xc4, 0x33, 0x95, 0x78, 0xea, 0x0f, + 0xf0, 0xc6, 0x05, 0x45, 0xf1, 0x09, 0x18, 0xe8, 0x51, 0xe1, 0x3f, 0xc3, 0x49, 0x19, 0x7e, 0x71, + 0x01, 0x86, 0x03, 0xd9, 0x49, 0x3c, 0xf9, 0x5f, 0xe3, 0xe4, 0x41, 0x2a, 0x22, 0x3a, 0xcf, 0x4e, + 0xe2, 0x19, 0x7c, 0x50, 0x88, 0xce, 0x29, 0x88, 0xda, 0x44, 0x62, 0x12, 0x4f, 0xfd, 0x21, 0xa1, + 0x75, 0x41, 0x52, 0x7c, 0x06, 0x32, 0x5e, 0xb0, 0x89, 0xa7, 0xff, 0x30, 0xa7, 0xf7, 0x69, 0x88, + 0x06, 0x02, 0xc1, 0x2e, 0x9e, 0xc5, 0x5f, 0x17, 0x1a, 0x08, 0x50, 0x91, 0x69, 0x14, 0x4d, 0x60, + 0xe2, 0x39, 0x7d, 0x44, 0x4c, 0xa3, 0x48, 0xfe, 0x42, 0x46, 0x93, 0xfa, 0xfc, 0x78, 0x16, 0x3f, + 0x2b, 0x46, 0x93, 0xe2, 0x13, 0x31, 0xa2, 0x19, 0x41, 0x3c, 0x8f, 0xbf, 0x21, 0xc4, 0x88, 0x24, + 0x04, 0xc5, 0x0d, 0x40, 0xad, 0xd9, 0x40, 0x3c, 0xbf, 0x8f, 0x72, 0x7e, 0xe3, 0x2d, 0xc9, 0x40, + 0xf1, 0x79, 0x38, 0xd6, 0x3e, 0x13, 0x88, 0xe7, 0xfa, 0xb1, 0xef, 0x45, 0xd6, 0x6e, 0xc1, 0x44, + 0xa0, 0xb8, 0xe5, 0x87, 0x94, 0x60, 0x16, 0x10, 0xcf, 0xf6, 0xb5, 0xef, 0x85, 0x1d, 0x77, 0x30, + 0x09, 0x28, 0xce, 0x03, 0xf8, 0x01, 0x38, 0x9e, 0xd7, 0xc7, 0x39, 0xaf, 0x00, 0x11, 0x99, 0x1a, + 0x3c, 0xfe, 0xc6, 0xd3, 0x5f, 0x17, 0x53, 0x83, 0x53, 0x90, 0xa9, 0x21, 0x42, 0x6f, 0x3c, 0xf5, + 0x27, 0xc4, 0xd4, 0x10, 0x24, 0xc4, 0xb2, 0x03, 0xd1, 0x2d, 0x9e, 0xc3, 0xa7, 0x84, 0x65, 0x07, + 0xa8, 0x8a, 0x6b, 0x30, 0xde, 0x12, 0x10, 0xe3, 0x59, 0xfd, 0x02, 0x67, 0x95, 0x8b, 0xc6, 0xc3, + 0x60, 0xf0, 0xe2, 0xc1, 0x30, 0x9e, 0xdb, 0xa7, 0x23, 0xc1, 0x8b, 0xc7, 0xc2, 0xe2, 0x79, 0x48, + 0x1b, 0xcd, 0x7a, 0x9d, 0x4c, 0x1e, 0xd4, 0xfd, 0x6e, 0x60, 0xfe, 0xbf, 0x7c, 0x9f, 0x6b, 0x47, + 0x10, 0x14, 0xcf, 0xc2, 0x00, 0x6e, 0xec, 0xe0, 0x6a, 0x1c, 0xe5, 0xb7, 0xbf, 0x2f, 0x1c, 0x26, + 0xc1, 0x2e, 0x3e, 0x03, 0xc0, 0xb6, 0x46, 0xe8, 0xf1, 0x60, 0x0c, 0xed, 0x7f, 0xfd, 0x3e, 0xbf, + 0x8c, 0xe3, 0x93, 0xf8, 0x0c, 0xd8, 0xd5, 0x9e, 0xee, 0x0c, 0xbe, 0x13, 0x66, 0x40, 0x47, 0xe4, + 0x29, 0x18, 0x7a, 0xd1, 0x31, 0x0d, 0x57, 0xad, 0xc5, 0x51, 0xff, 0x37, 0x4e, 0x2d, 0xf0, 0x89, + 0xc2, 0x1a, 0xa6, 0x8d, 0x5d, 0xb5, 0xe6, 0xc4, 0xd1, 0xfe, 0x77, 0x4e, 0xeb, 0x11, 0x10, 0x62, + 0x4d, 0x75, 0xdc, 0x5e, 0xfa, 0xfd, 0x47, 0x82, 0x58, 0x10, 0x10, 0xa1, 0xc9, 0xef, 0x7d, 0x7c, + 0x10, 0x47, 0xfb, 0x5d, 0x21, 0x34, 0xc7, 0x2f, 0xbe, 0x19, 0x32, 0xe4, 0x27, 0xbb, 0x61, 0x17, + 0x43, 0xfc, 0xc7, 0x9c, 0xd8, 0xa7, 0x20, 0x2d, 0x3b, 0x6e, 0xd5, 0xd5, 0xe3, 0x95, 0x7d, 0x93, + 0x8f, 0xb4, 0xc0, 0x2f, 0xce, 0xc3, 0xb0, 0xe3, 0x56, 0xab, 0x4d, 0x9e, 0x9f, 0xc6, 0x90, 0xff, + 0xc9, 0xf7, 0xbd, 0x2d, 0x0b, 0x8f, 0x86, 0x8c, 0xf6, 0xd5, 0x7d, 0xd7, 0x32, 0xe9, 0x11, 0x48, + 0x1c, 0x87, 0xef, 0x71, 0x0e, 0x01, 0x92, 0xe2, 0x02, 0x64, 0x49, 0x5f, 0x6c, 0x6c, 0x61, 0x7a, + 0x5e, 0x15, 0xc3, 0xe2, 0x4f, 0xb9, 0x02, 0x42, 0x44, 0xa5, 0x9f, 0xfc, 0xca, 0xeb, 0x53, 0xd2, + 0xd7, 0x5f, 0x9f, 0x92, 0xfe, 0xe0, 0xf5, 0x29, 0xe9, 0x43, 0xdf, 0x9c, 0x3a, 0xf2, 0xf5, 0x6f, + 0x4e, 0x1d, 0xf9, 0xdd, 0x6f, 0x4e, 0x1d, 0x69, 0xbf, 0x6d, 0x0c, 0x4b, 0xe6, 0x92, 0xc9, 0x36, + 0x8c, 0xdf, 0x2a, 0x87, 0xb6, 0x8b, 0x6b, 0xa6, 0xbf, 0x5b, 0xeb, 0x2d, 0x72, 0xe0, 0x4f, 0x25, + 0xb2, 0x60, 0x0e, 0xef, 0xe5, 0xaa, 0xc6, 0x41, 0x87, 0xb7, 0x3a, 0x85, 0xb6, 0x1b, 0xc3, 0xf2, + 0x9b, 0x20, 0x39, 0x6f, 0x1c, 0xa0, 0x13, 0xcc, 0xe7, 0x55, 0x9a, 0x76, 0x9d, 0xdf, 0xfc, 0x1a, + 0x22, 0xe5, 0x6d, 0xbb, 0x8e, 0x26, 0xfd, 0xeb, 0x99, 0xd2, 0xa9, 0x2c, 0xbf, 0x73, 0x59, 0x4c, + 0x7d, 0xf7, 0x53, 0xd3, 0x47, 0x4a, 0xfb, 0xd1, 0x1e, 0x7e, 0x29, 0xb6, 0x97, 0xe9, 0x79, 0xe3, + 0x80, 0x76, 0x72, 0x43, 0x7a, 0xeb, 0x00, 0x69, 0xc3, 0x11, 0x1b, 0xdb, 0x53, 0xd1, 0x8d, 0xed, + 0xe7, 0x71, 0xbd, 0x7e, 0xc9, 0x30, 0xaf, 0x1a, 0x5b, 0x04, 0x6d, 0x67, 0x90, 0x5d, 0x23, 0x86, + 0xbf, 0x9a, 0x80, 0xa9, 0x96, 0x3d, 0x6c, 0x3e, 0xf2, 0x9d, 0x1e, 0x2a, 0x15, 0x21, 0xbd, 0x28, + 0x0c, 0x2a, 0x0f, 0x43, 0x0e, 0xd6, 0x4c, 0xa3, 0xea, 0xd0, 0xae, 0x26, 0x15, 0x51, 0x24, 0x5d, + 0x35, 0x54, 0xc3, 0x74, 0xf8, 0xed, 0x48, 0x56, 0x28, 0xfd, 0xac, 0xd4, 0xdf, 0x38, 0x8e, 0x88, + 0x96, 0x44, 0x37, 0x4f, 0x77, 0xdb, 0xfb, 0xa7, 0x2a, 0xf0, 0xe4, 0x0f, 0xec, 0xf3, 0xf7, 0xaa, + 0x8e, 0x0f, 0x25, 0x60, 0x3a, 0xaa, 0x0e, 0x32, 0x8f, 0x1c, 0x57, 0x6d, 0x58, 0x9d, 0xf4, 0x71, + 0x1e, 0x32, 0x5b, 0x02, 0xa7, 0x6f, 0x85, 0xfc, 0x5c, 0x9f, 0x0a, 0x19, 0xf5, 0x9a, 0x12, 0x1a, + 0x79, 0x30, 0x5e, 0x23, 0x5e, 0x17, 0x0e, 0xa1, 0x92, 0x77, 0x27, 0xe1, 0x84, 0x66, 0x3a, 0x0d, + 0xd3, 0xa9, 0x30, 0x83, 0x67, 0x05, 0xae, 0x8c, 0x6c, 0xb0, 0xaa, 0x87, 0xe3, 0x90, 0x8b, 0x30, + 0x4a, 0x9d, 0x02, 0xdd, 0x08, 0xa6, 0x7e, 0x38, 0x36, 0x74, 0x7e, 0xf5, 0xdf, 0x0e, 0xd0, 0x49, + 0x34, 0xe2, 0x11, 0xd2, 0x9b, 0x2e, 0x5b, 0x30, 0xa9, 0x37, 0xac, 0x3a, 0xa6, 0x47, 0x62, 0x15, + 0xaf, 0x2e, 0x9e, 0xdf, 0xd7, 0x38, 0xbf, 0x09, 0x9f, 0x7c, 0x59, 0x50, 0x17, 0x57, 0x60, 0x5c, + 0xd5, 0x34, 0x6c, 0x85, 0x58, 0xc6, 0x38, 0x2c, 0x21, 0x60, 0x8e, 0x53, 0x7a, 0xdc, 0x4a, 0xcf, + 0x74, 0x1a, 0xdb, 0xb7, 0xde, 0x1b, 0x18, 0x34, 0x1b, 0xd7, 0xb0, 0xf1, 0xb0, 0x81, 0xdd, 0xab, + 0xa6, 0xbd, 0xcf, 0xd5, 0xfb, 0x30, 0x6b, 0x4a, 0x0c, 0xc2, 0x7b, 0x93, 0x30, 0xc5, 0x2a, 0xe6, + 0x76, 0x54, 0x07, 0xcf, 0x5d, 0x79, 0x74, 0x07, 0xbb, 0xea, 0xa3, 0x73, 0x9a, 0xa9, 0x8b, 0x69, + 0x3a, 0xc1, 0xc7, 0x85, 0xd4, 0xcf, 0xf2, 0xfa, 0x0e, 0x7e, 0x6a, 0x09, 0x52, 0x0b, 0xa6, 0x6e, + 0x10, 0x8b, 0xac, 0x62, 0xc3, 0x6c, 0x70, 0x2f, 0xc5, 0x0a, 0xe8, 0x6e, 0x18, 0x54, 0x1b, 0x66, + 0xd3, 0x70, 0xd9, 0x69, 0x5e, 0x69, 0xf8, 0x2b, 0x37, 0xa6, 0x8f, 0xfc, 0xde, 0x8d, 0xe9, 0xe4, + 0xb2, 0xe1, 0x2a, 0xbc, 0xaa, 0x98, 0x7a, 0xe3, 0x93, 0xd3, 0x92, 0xfc, 0x2c, 0x0c, 0x2d, 0x62, + 0xed, 0x30, 0xbc, 0x16, 0xb1, 0x16, 0xe1, 0xf5, 0x00, 0xa4, 0x97, 0x0d, 0x97, 0xdd, 0x20, 0xbe, + 0x13, 0x92, 0xba, 0xc1, 0x2e, 0xa5, 0x45, 0xda, 0x27, 0x70, 0x82, 0xba, 0x88, 0x35, 0x0f, 0xb5, + 0x8a, 0xb5, 0x28, 0x2a, 0x61, 0x4f, 0xe0, 0xa5, 0xc5, 0xdf, 0xfd, 0x4f, 0x53, 0x47, 0x5e, 0x79, + 0x7d, 0xea, 0x48, 0xc7, 0x91, 0x08, 0x46, 0x07, 0xae, 0x62, 0x3e, 0x04, 0x4e, 0x75, 0x7f, 0xce, + 0x0d, 0xcd, 0x85, 0xcf, 0xa6, 0xe0, 0x4e, 0xfa, 0x78, 0xc4, 0x6e, 0xe8, 0x86, 0x3b, 0xa7, 0xd9, + 0x07, 0x96, 0x4b, 0xc3, 0x89, 0xb9, 0xcb, 0x47, 0x61, 0xdc, 0xaf, 0x9e, 0x65, 0xd5, 0x1d, 0xc6, + 0x60, 0x17, 0x06, 0x36, 0x08, 0x1d, 0x51, 0x9c, 0x6b, 0xba, 0x6a, 0x9d, 0xbb, 0x0b, 0x56, 0x20, + 0x50, 0xf6, 0xe0, 0x24, 0xc1, 0xa0, 0xba, 0x78, 0x6b, 0x52, 0xc7, 0xea, 0x2e, 0xbb, 0xb7, 0x9b, + 0xa4, 0x21, 0x24, 0x4d, 0x00, 0xf4, 0x8a, 0xee, 0x24, 0x0c, 0xa8, 0x4d, 0x76, 0xe4, 0x9c, 0x24, + 0xb1, 0x85, 0x16, 0xe4, 0x4b, 0x30, 0xc4, 0x8f, 0xb9, 0x50, 0x0e, 0x92, 0xfb, 0xf8, 0x80, 0xb6, + 0x93, 0x55, 0xc8, 0x4f, 0x34, 0x0b, 0x03, 0x54, 0x78, 0xfe, 0x20, 0x21, 0x3f, 0xdb, 0x22, 0xfd, + 0x2c, 0x15, 0x52, 0x61, 0x68, 0xf2, 0xb3, 0x90, 0x5e, 0x34, 0x1b, 0xba, 0x61, 0x86, 0xb9, 0x65, + 0x18, 0x37, 0x2a, 0xb3, 0xd5, 0xe4, 0x63, 0xad, 0xb0, 0x02, 0x3a, 0x06, 0x83, 0xec, 0x1e, 0x37, + 0x3f, 0x36, 0xe7, 0x25, 0x79, 0x01, 0x86, 0x28, 0xef, 0x75, 0x0b, 0x21, 0xfe, 0x02, 0x88, 0x5f, + 0x18, 0xa7, 0x6e, 0x81, 0xb3, 0x4f, 0xf8, 0xc2, 0x22, 0x48, 0x55, 0x55, 0x57, 0xe5, 0xfd, 0xa6, + 0xbf, 0xe5, 0xa7, 0x21, 0xcd, 0x99, 0x38, 0xe8, 0x0c, 0x24, 0x4d, 0xcb, 0xe1, 0x07, 0xdf, 0x85, + 0x4e, 0x5d, 0x59, 0xb7, 0x4a, 0x29, 0x62, 0x25, 0x0a, 0x41, 0x2e, 0x29, 0x1d, 0xcd, 0xe2, 0xc9, + 0x80, 0x59, 0x04, 0x86, 0x3c, 0xf0, 0x93, 0x0d, 0x69, 0x8b, 0x39, 0x78, 0xc6, 0xf2, 0xa9, 0x04, + 0x4c, 0x05, 0x6a, 0xaf, 0x60, 0x9b, 0xac, 0xf5, 0x98, 0x45, 0x71, 0x6b, 0x41, 0x01, 0x21, 0x79, + 0x7d, 0x07, 0x73, 0x79, 0x33, 0x24, 0xe7, 0x2d, 0x0b, 0x15, 0x20, 0xcd, 0x0e, 0xb8, 0x4d, 0x66, + 0x2f, 0x29, 0xc5, 0x2b, 0x93, 0x3a, 0xc7, 0xdc, 0x75, 0xaf, 0xaa, 0xb6, 0xf7, 0xd4, 0x49, 0x94, + 0xe5, 0xa7, 0x20, 0xb3, 0x60, 0x1a, 0x0e, 0x36, 0x9c, 0x26, 0x0d, 0x44, 0x3b, 0x75, 0x53, 0xdb, + 0xe7, 0x1c, 0x58, 0x81, 0x28, 0x5c, 0xb5, 0x2c, 0x4a, 0x99, 0x52, 0xc8, 0x4f, 0x36, 0x2f, 0x4b, + 0x9b, 0x1d, 0x55, 0xf4, 0x54, 0xff, 0x2a, 0xe2, 0x9d, 0xf4, 0x74, 0xf4, 0xbf, 0x25, 0x38, 0xd9, + 0x3a, 0xa1, 0xf6, 0xf1, 0x81, 0xd3, 0xef, 0x7c, 0x7a, 0x01, 0x32, 0x1b, 0xf4, 0xbd, 0xf1, 0x25, + 0x7c, 0x80, 0x0a, 0x30, 0x84, 0xab, 0x67, 0xce, 0x9e, 0x7d, 0xf4, 0x29, 0x66, 0xed, 0x17, 0x8f, + 0x28, 0x02, 0x80, 0xa6, 0x20, 0xe3, 0x60, 0xcd, 0x3a, 0x73, 0xf6, 0xdc, 0xfe, 0xa3, 0xcc, 0xbc, + 0x2e, 0x1e, 0x51, 0x7c, 0x50, 0x31, 0x4d, 0x7a, 0xfd, 0xc6, 0xa7, 0xa6, 0xa5, 0xd2, 0x00, 0x24, + 0x9d, 0x66, 0xe3, 0xb6, 0xda, 0xc8, 0x6b, 0x03, 0x30, 0x13, 0xa4, 0xa4, 0xd1, 0xfa, 0x8a, 0x5a, + 0xd7, 0xab, 0xaa, 0xff, 0x52, 0x3c, 0x17, 0xd0, 0x01, 0xc5, 0x68, 0xaf, 0x82, 0x42, 0x57, 0x4d, + 0xca, 0xbf, 0x2e, 0x41, 0xf6, 0xb2, 0xe0, 0xbc, 0x89, 0x5d, 0x74, 0x1e, 0xc0, 0x6b, 0x49, 0x4c, + 0x9b, 0x3b, 0x66, 0xa3, 0x6d, 0xcd, 0x7a, 0x34, 0x4a, 0x00, 0x1d, 0x3d, 0x41, 0x0d, 0xd1, 0x32, + 0x1d, 0xfe, 0xfc, 0x25, 0x86, 0xd4, 0x43, 0x46, 0x0f, 0x01, 0xa2, 0x1e, 0xae, 0x72, 0xc5, 0x74, + 0x75, 0xa3, 0x56, 0xb1, 0xcc, 0xab, 0xfc, 0x51, 0x61, 0x52, 0xc9, 0xd1, 0x9a, 0xcb, 0xb4, 0x62, + 0x83, 0xc0, 0x89, 0xd0, 0x19, 0x8f, 0x0b, 0xc9, 0xad, 0xd4, 0x6a, 0xd5, 0xc6, 0x8e, 0xc3, 0x9d, + 0x98, 0x28, 0xa2, 0xf3, 0x30, 0x64, 0x35, 0x77, 0x2a, 0xc2, 0x63, 0x0c, 0x9f, 0x39, 0xd9, 0x6e, + 0xfe, 0x0b, 0xfb, 0xe0, 0x1e, 0x60, 0xd0, 0x6a, 0xee, 0x10, 0x6b, 0xb9, 0x0b, 0xb2, 0x6d, 0x84, + 0x19, 0xbe, 0xe2, 0xcb, 0x41, 0x9f, 0xb9, 0xf3, 0x1e, 0x54, 0x2c, 0x5b, 0x37, 0x6d, 0xdd, 0x3d, + 0xa0, 0xb7, 0x57, 0x92, 0x4a, 0x4e, 0x54, 0x6c, 0x70, 0xb8, 0xbc, 0x0f, 0x63, 0x9b, 0x34, 0xb7, + 0xf0, 0x25, 0x3f, 0xeb, 0xcb, 0x27, 0xc5, 0xcb, 0xd7, 0x51, 0xb2, 0x44, 0x8b, 0x64, 0xa5, 0xe7, + 0x3a, 0x5a, 0xe7, 0x13, 0xfd, 0x5b, 0x67, 0x38, 0xda, 0xfd, 0xd1, 0x89, 0xd0, 0xe4, 0xe4, 0xa9, + 0x64, 0xc0, 0x7d, 0xf5, 0x6a, 0x98, 0x71, 0x29, 0x75, 0xa1, 0x7b, 0x50, 0x2d, 0xc4, 0xb8, 0xd1, + 0x42, 0xec, 0x14, 0x92, 0x9f, 0x82, 0x91, 0x0d, 0xd5, 0x76, 0x37, 0xb1, 0x7b, 0x11, 0xab, 0x55, + 0x6c, 0x87, 0xa3, 0xee, 0x88, 0x88, 0xba, 0x08, 0x52, 0x34, 0xb4, 0xb2, 0xa8, 0x43, 0x7f, 0xcb, + 0x7b, 0x90, 0xa2, 0x37, 0xd8, 0xbc, 0x88, 0xcc, 0x29, 0x58, 0x44, 0x26, 0xbe, 0xf4, 0xc0, 0xc5, + 0x8e, 0x58, 0xd0, 0xd1, 0x02, 0x7a, 0x5c, 0xc4, 0xd5, 0x64, 0xf7, 0xb8, 0xca, 0x0d, 0x91, 0x47, + 0xd7, 0x3a, 0x0c, 0x95, 0x88, 0x2b, 0x5e, 0x5e, 0xf4, 0x04, 0x91, 0x7c, 0x41, 0xd0, 0x2a, 0x8c, + 0x59, 0xaa, 0xed, 0xd2, 0xab, 0xfb, 0x7b, 0xb4, 0x17, 0xdc, 0xd6, 0xa7, 0x5b, 0x67, 0x5e, 0xa8, + 0xb3, 0xbc, 0x95, 0x11, 0x2b, 0x08, 0x94, 0xff, 0x30, 0x05, 0x83, 0x5c, 0x19, 0x6f, 0x86, 0x21, + 0xae, 0x56, 0x6e, 0x9d, 0x77, 0xce, 0xb6, 0x06, 0xa6, 0x59, 0x2f, 0x80, 0x70, 0x7e, 0x82, 0x06, + 0xdd, 0x07, 0x69, 0x6d, 0x4f, 0xd5, 0x8d, 0x8a, 0x5e, 0x15, 0x69, 0xde, 0xeb, 0x37, 0xa6, 0x87, + 0x16, 0x08, 0x6c, 0x79, 0x51, 0x19, 0xa2, 0x95, 0xcb, 0x55, 0x92, 0x09, 0xec, 0x61, 0xbd, 0xb6, + 0xe7, 0xf2, 0x19, 0xc6, 0x4b, 0xe8, 0x49, 0x48, 0x11, 0x83, 0xe0, 0x0f, 0xbb, 0x0a, 0x2d, 0xc9, + 0xb6, 0xb7, 0xe2, 0x29, 0xa5, 0x49, 0xc3, 0x1f, 0xfa, 0xfd, 0x69, 0x49, 0xa1, 0x14, 0x68, 0x01, + 0x46, 0xea, 0xaa, 0xe3, 0x56, 0x68, 0x04, 0x23, 0xcd, 0x0f, 0x50, 0x16, 0x27, 0x5a, 0x15, 0xc2, + 0x15, 0xcb, 0x45, 0x1f, 0x26, 0x54, 0x0c, 0x54, 0x45, 0xa7, 0x20, 0x47, 0x99, 0x68, 0x66, 0xa3, + 0xa1, 0xbb, 0x2c, 0xb7, 0x1a, 0xa4, 0x7a, 0x1f, 0x25, 0xf0, 0x05, 0x0a, 0xa6, 0x19, 0xd6, 0x1d, + 0x90, 0xa1, 0x4f, 0x49, 0x28, 0x0a, 0xbb, 0x36, 0x99, 0x26, 0x00, 0x5a, 0x79, 0x3f, 0x8c, 0xf9, + 0xfe, 0x91, 0xa1, 0xa4, 0x19, 0x17, 0x1f, 0x4c, 0x11, 0x1f, 0x81, 0x49, 0x03, 0x5f, 0xa3, 0x17, + 0x39, 0x43, 0xd8, 0x19, 0x8a, 0x8d, 0x48, 0xdd, 0xe5, 0x30, 0xc5, 0xbd, 0x30, 0xaa, 0x09, 0xe5, + 0x33, 0x5c, 0xa0, 0xb8, 0x23, 0x1e, 0x94, 0xa2, 0x9d, 0x80, 0xb4, 0x6a, 0x59, 0x0c, 0x61, 0x98, + 0xfb, 0x47, 0xcb, 0xa2, 0x55, 0xa7, 0x61, 0x9c, 0xf6, 0xd1, 0xc6, 0x4e, 0xb3, 0xee, 0x72, 0x26, + 0x59, 0x8a, 0x33, 0x46, 0x2a, 0x14, 0x06, 0xa7, 0xb8, 0x77, 0xc3, 0x08, 0xbe, 0xa2, 0x57, 0xb1, + 0xa1, 0x61, 0x86, 0x37, 0x42, 0xf1, 0xb2, 0x02, 0x48, 0x91, 0x1e, 0x00, 0xcf, 0xef, 0x55, 0x84, + 0x4f, 0x1e, 0x65, 0xfc, 0x04, 0x7c, 0x9e, 0x81, 0xe5, 0x3c, 0xa4, 0x16, 0x55, 0x57, 0x25, 0x09, + 0x86, 0x7b, 0x8d, 0x05, 0x9a, 0xac, 0x42, 0x7e, 0xca, 0x6f, 0x24, 0x20, 0x75, 0xd9, 0x74, 0x31, + 0x7a, 0x2c, 0x90, 0x00, 0x8e, 0xb6, 0xb3, 0xe7, 0x4d, 0xbd, 0x66, 0xe0, 0xea, 0xaa, 0x53, 0x0b, + 0xbc, 0xfb, 0xf6, 0xcd, 0x29, 0x11, 0x32, 0xa7, 0x49, 0x18, 0xb0, 0xcd, 0xa6, 0x51, 0x15, 0x37, + 0x0e, 0x69, 0x01, 0x95, 0x21, 0xed, 0x59, 0x49, 0x2a, 0xce, 0x4a, 0xc6, 0x88, 0x95, 0x10, 0x1b, + 0xe6, 0x00, 0x65, 0x68, 0x87, 0x1b, 0x4b, 0x09, 0x32, 0x9e, 0xf3, 0xe2, 0xd6, 0xd6, 0x9b, 0xc1, + 0xfa, 0x64, 0x24, 0x98, 0x78, 0x63, 0xef, 0x29, 0x8f, 0x59, 0x5c, 0xce, 0xab, 0xe0, 0xda, 0x0b, + 0x99, 0x15, 0x7f, 0x83, 0x3e, 0x44, 0xfb, 0xe5, 0x9b, 0x15, 0x7b, 0x87, 0x7e, 0x12, 0x32, 0x8e, + 0x5e, 0x33, 0x54, 0xb7, 0x69, 0x63, 0x6e, 0x79, 0x3e, 0x40, 0xfe, 0x92, 0x04, 0x83, 0xcc, 0x92, + 0x03, 0x7a, 0x93, 0xda, 0xeb, 0x2d, 0xd1, 0x49, 0x6f, 0xc9, 0xc3, 0xeb, 0x6d, 0x1e, 0xc0, 0x13, + 0xc6, 0xe1, 0x4f, 0x83, 0xdb, 0x64, 0x0c, 0x4c, 0xc4, 0x4d, 0xbd, 0xc6, 0x27, 0x6a, 0x80, 0x48, + 0xfe, 0x8f, 0x12, 0x49, 0x62, 0x79, 0x3d, 0x9a, 0x87, 0x11, 0x21, 0x57, 0x65, 0xb7, 0xae, 0xd6, + 0xb8, 0xed, 0xdc, 0xd9, 0x51, 0xb8, 0x0b, 0x75, 0xb5, 0xa6, 0x0c, 0x73, 0x79, 0x48, 0xa1, 0xfd, + 0x38, 0x24, 0x3a, 0x8c, 0x43, 0x68, 0xe0, 0x93, 0x87, 0x1b, 0xf8, 0xd0, 0x10, 0xa5, 0xa2, 0x43, + 0xf4, 0xf9, 0x04, 0x5d, 0xcc, 0x58, 0xa6, 0xa3, 0xd6, 0x7f, 0x18, 0x33, 0xe2, 0x0e, 0xc8, 0x58, + 0x66, 0xbd, 0xc2, 0x6a, 0xd8, 0x4d, 0xdc, 0xb4, 0x65, 0xd6, 0x95, 0x96, 0x61, 0x1f, 0xb8, 0x45, + 0xd3, 0x65, 0xf0, 0x16, 0x68, 0x6d, 0x28, 0xaa, 0x35, 0x1b, 0xb2, 0x4c, 0x15, 0x3c, 0x96, 0x3d, + 0x42, 0x74, 0x40, 0x83, 0xa3, 0xd4, 0x1a, 0x7b, 0x99, 0xd8, 0x0c, 0x53, 0xe1, 0x78, 0x84, 0x82, + 0xb9, 0xfe, 0x76, 0xab, 0xe0, 0xa0, 0x59, 0x2a, 0x1c, 0x4f, 0xfe, 0x39, 0x09, 0x60, 0x85, 0x68, + 0x96, 0xf6, 0x97, 0x44, 0x21, 0x87, 0x8a, 0x50, 0x09, 0xb5, 0x3c, 0xd5, 0x69, 0xd0, 0x78, 0xfb, + 0x59, 0x27, 0x28, 0xf7, 0x02, 0x8c, 0xf8, 0xc6, 0xe8, 0x60, 0x21, 0xcc, 0x54, 0x97, 0xac, 0x7a, + 0x13, 0xbb, 0x4a, 0xf6, 0x4a, 0xa0, 0x24, 0xff, 0x33, 0x09, 0x32, 0x54, 0xa6, 0x55, 0xec, 0xaa, + 0xa1, 0x31, 0x94, 0x0e, 0x3f, 0x86, 0x77, 0x02, 0x30, 0x36, 0x8e, 0xfe, 0x32, 0xe6, 0x96, 0x95, + 0xa1, 0x90, 0x4d, 0xfd, 0x65, 0x8c, 0xce, 0x79, 0x0a, 0x4f, 0x76, 0x57, 0xb8, 0xc8, 0xba, 0xb9, + 0xda, 0x8f, 0xc3, 0x10, 0xfd, 0x94, 0xce, 0x35, 0x87, 0x27, 0xd2, 0x83, 0x46, 0xb3, 0xb1, 0x75, + 0xcd, 0x91, 0x5f, 0x84, 0xa1, 0xad, 0x6b, 0x6c, 0x6f, 0xe4, 0x0e, 0xc8, 0xd8, 0xa6, 0xc9, 0x63, + 0x32, 0xcb, 0x85, 0xd2, 0x04, 0x40, 0x43, 0x90, 0xd8, 0x0f, 0x48, 0xf8, 0xfb, 0x01, 0xfe, 0x86, + 0x46, 0xb2, 0xa7, 0x0d, 0x8d, 0xd3, 0xff, 0x4e, 0x82, 0xe1, 0x80, 0x7f, 0x40, 0x8f, 0xc2, 0xd1, + 0xd2, 0xca, 0xfa, 0xc2, 0xa5, 0xca, 0xf2, 0x62, 0xe5, 0xc2, 0xca, 0xfc, 0x92, 0xff, 0xd6, 0xa4, + 0x70, 0xec, 0xd5, 0xeb, 0x33, 0x28, 0x80, 0xbb, 0x6d, 0xec, 0x1b, 0xe6, 0x55, 0x03, 0xcd, 0xc1, + 0x64, 0x98, 0x64, 0xbe, 0xb4, 0x59, 0x5e, 0xdb, 0xca, 0x49, 0x85, 0xa3, 0xaf, 0x5e, 0x9f, 0x19, + 0x0f, 0x50, 0xcc, 0xef, 0x38, 0xd8, 0x70, 0x5b, 0x09, 0x16, 0xd6, 0x57, 0x57, 0x97, 0xb7, 0x72, + 0x89, 0x16, 0x02, 0xee, 0xb0, 0x1f, 0x80, 0xf1, 0x30, 0xc1, 0xda, 0xf2, 0x4a, 0x2e, 0x59, 0x40, + 0xaf, 0x5e, 0x9f, 0x19, 0x0d, 0x60, 0xaf, 0xe9, 0xf5, 0x42, 0xfa, 0xfd, 0x9f, 0x9e, 0x3a, 0xf2, + 0x4b, 0xbf, 0x38, 0x25, 0x91, 0x9e, 0x8d, 0x84, 0x7c, 0x04, 0x7a, 0x08, 0x8e, 0x6f, 0x2e, 0x2f, + 0xad, 0x95, 0x17, 0x2b, 0xab, 0x9b, 0x4b, 0x15, 0xf6, 0x8d, 0x0d, 0xaf, 0x77, 0x63, 0xaf, 0x5e, + 0x9f, 0x19, 0xe6, 0x5d, 0xea, 0x84, 0xbd, 0xa1, 0x94, 0x2f, 0xaf, 0x6f, 0x95, 0x73, 0x12, 0xc3, + 0xde, 0xb0, 0xf1, 0x15, 0xd3, 0x65, 0xdf, 0xda, 0x7a, 0x04, 0x4e, 0xb4, 0xc1, 0xf6, 0x3a, 0x36, + 0xfe, 0xea, 0xf5, 0x99, 0x91, 0x0d, 0x1b, 0xb3, 0xf9, 0x43, 0x29, 0x66, 0x21, 0xdf, 0x4a, 0xb1, + 0xbe, 0xb1, 0xbe, 0x39, 0xbf, 0x92, 0x9b, 0x29, 0xe4, 0x5e, 0xbd, 0x3e, 0x93, 0x15, 0xce, 0x90, + 0xe0, 0xfb, 0x3d, 0xbb, 0x9d, 0x2b, 0x9e, 0x3f, 0x79, 0x18, 0xee, 0xe1, 0x7b, 0x80, 0x8e, 0xab, + 0xee, 0xeb, 0x46, 0xcd, 0xdb, 0x69, 0xe5, 0x65, 0xbe, 0xf2, 0x39, 0xc6, 0x37, 0x5b, 0x05, 0xb4, + 0xeb, 0x7e, 0x6b, 0xa1, 0xf3, 0xc9, 0x52, 0x21, 0xe6, 0xf0, 0x25, 0x7e, 0xe9, 0xd4, 0x79, 0x6f, + 0xbe, 0x10, 0xb3, 0x63, 0x5c, 0xe8, 0xba, 0xb8, 0x93, 0x3f, 0x20, 0xc1, 0xe8, 0x45, 0xdd, 0x71, + 0x4d, 0x5b, 0xd7, 0xd4, 0x3a, 0x7d, 0x61, 0x72, 0xae, 0x57, 0xdf, 0x1a, 0x99, 0xea, 0xcf, 0xc0, + 0xe0, 0x15, 0xb5, 0xce, 0x9c, 0x5a, 0x92, 0x7e, 0x10, 0xa3, 0xbd, 0xfa, 0x7c, 0xd7, 0x26, 0x18, + 0x30, 0x32, 0xf9, 0x57, 0x12, 0x30, 0x46, 0x27, 0x83, 0xc3, 0x3e, 0x95, 0x44, 0xd6, 0x58, 0x25, + 0x48, 0xd9, 0xaa, 0xcb, 0x37, 0x0d, 0x4b, 0xb3, 0x7c, 0xe7, 0xf7, 0xbe, 0xf8, 0xdd, 0xdc, 0xd9, + 0x45, 0xac, 0x29, 0x94, 0x16, 0xbd, 0x1d, 0xd2, 0x0d, 0xf5, 0x5a, 0x85, 0xf2, 0x61, 0x2b, 0x97, + 0xf9, 0xfe, 0xf8, 0xdc, 0xbc, 0x31, 0x3d, 0x76, 0xa0, 0x36, 0xea, 0x45, 0x59, 0xf0, 0x91, 0x95, + 0xa1, 0x86, 0x7a, 0x8d, 0x88, 0x88, 0x2c, 0x18, 0x23, 0x50, 0x6d, 0x4f, 0x35, 0x6a, 0x98, 0x35, + 0x42, 0xb7, 0x40, 0x4b, 0x17, 0xfb, 0x6e, 0xe4, 0x98, 0xdf, 0x48, 0x80, 0x9d, 0xac, 0x8c, 0x34, + 0xd4, 0x6b, 0x0b, 0x14, 0x40, 0x5a, 0x2c, 0xa6, 0x3f, 0xfa, 0xc9, 0xe9, 0x23, 0x74, 0x37, 0xfd, + 0x1b, 0x12, 0x80, 0xaf, 0x31, 0xf4, 0x76, 0xc8, 0x69, 0x5e, 0x89, 0xd2, 0x3a, 0x7c, 0x0c, 0xef, + 0xef, 0x34, 0x16, 0x11, 0x7d, 0xb3, 0xd8, 0xfc, 0xf5, 0x1b, 0xd3, 0x92, 0x32, 0xa6, 0x45, 0x86, + 0xe2, 0x6d, 0x30, 0xdc, 0xb4, 0xaa, 0xaa, 0x8b, 0x2b, 0x74, 0x1d, 0x97, 0x88, 0x8d, 0xf3, 0x53, + 0x84, 0xd7, 0xcd, 0x1b, 0xd3, 0x88, 0x75, 0x2b, 0x40, 0x2c, 0xd3, 0xe8, 0x0f, 0x0c, 0x42, 0x08, + 0x02, 0x7d, 0xfa, 0xaa, 0x04, 0xc3, 0x8b, 0x81, 0x9b, 0x5e, 0x79, 0x18, 0x6a, 0x98, 0x86, 0xbe, + 0xcf, 0xed, 0x31, 0xa3, 0x88, 0x22, 0x2a, 0x40, 0x9a, 0x3d, 0xba, 0x73, 0x0f, 0xc4, 0x56, 0xa8, + 0x28, 0x13, 0xaa, 0xab, 0x78, 0xc7, 0xd1, 0xc5, 0x68, 0x28, 0xa2, 0x88, 0x2e, 0x40, 0xce, 0xc1, + 0x5a, 0xd3, 0xd6, 0xdd, 0x83, 0x8a, 0x66, 0x1a, 0xae, 0xaa, 0xb9, 0xec, 0xf9, 0x56, 0xe9, 0x8e, + 0x9b, 0x37, 0xa6, 0x8f, 0x33, 0x59, 0xa3, 0x18, 0xb2, 0x32, 0x26, 0x40, 0x0b, 0x0c, 0x42, 0x5a, + 0xa8, 0x62, 0x57, 0xd5, 0xeb, 0x4e, 0x9e, 0x1d, 0x0c, 0x89, 0x62, 0xa0, 0x2f, 0x9f, 0x1b, 0x0a, + 0x6e, 0x6c, 0x5d, 0x80, 0x9c, 0x69, 0x61, 0x3b, 0x94, 0x88, 0x4a, 0xd1, 0x96, 0xa3, 0x18, 0xb2, + 0x32, 0x26, 0x40, 0x22, 0x49, 0x75, 0xc9, 0x30, 0x8b, 0x85, 0xa2, 0xd5, 0xdc, 0xf1, 0xf7, 0xc3, + 0x26, 0x5b, 0x46, 0x63, 0xde, 0x38, 0x28, 0x3d, 0xe6, 0x73, 0x8f, 0xd2, 0xc9, 0x5f, 0xfb, 0xc2, + 0xc3, 0x93, 0xdc, 0x34, 0xfc, 0xfd, 0xa9, 0x4b, 0xf8, 0x80, 0x0c, 0x3f, 0x47, 0xdd, 0xa0, 0x98, + 0x24, 0xed, 0x7c, 0x51, 0xd5, 0xeb, 0xe2, 0x19, 0xb2, 0xc2, 0x4b, 0xa8, 0x08, 0x83, 0x8e, 0xab, + 0xba, 0x4d, 0x87, 0x7f, 0x1c, 0x4c, 0xee, 0x64, 0x6a, 0x25, 0xd3, 0xa8, 0x6e, 0x52, 0x4c, 0x85, + 0x53, 0xa0, 0x0b, 0x30, 0xe8, 0x9a, 0xfb, 0xd8, 0xe0, 0x2a, 0xec, 0x6b, 0x7e, 0xd3, 0x73, 0x2a, + 0x46, 0x4d, 0x34, 0x52, 0xc5, 0x75, 0x5c, 0x63, 0x69, 0xd5, 0x9e, 0x4a, 0x56, 0x1f, 0xf4, 0x1b, + 0x61, 0xa5, 0xe5, 0xbe, 0x27, 0x21, 0xd7, 0x54, 0x94, 0x9f, 0xac, 0x8c, 0x79, 0xa0, 0x4d, 0x0a, + 0x41, 0x97, 0x42, 0x57, 0x12, 0xf9, 0x87, 0xf4, 0xee, 0xee, 0xd4, 0xfd, 0x80, 0x4d, 0x8b, 0xfd, + 0x89, 0xe0, 0x85, 0xc6, 0x0b, 0x90, 0x6b, 0x1a, 0x3b, 0xa6, 0x41, 0xdf, 0x0a, 0xf2, 0xfc, 0x9e, + 0xac, 0xef, 0x92, 0x41, 0xe3, 0x88, 0x62, 0xc8, 0xca, 0x98, 0x07, 0xba, 0xc8, 0x56, 0x01, 0x55, + 0x18, 0xf5, 0xb1, 0xe8, 0x44, 0xcd, 0xc4, 0x4e, 0xd4, 0xbb, 0xf8, 0x44, 0x3d, 0x1a, 0x6d, 0xc5, + 0x9f, 0xab, 0x23, 0x1e, 0x90, 0x90, 0xa1, 0x8b, 0x00, 0xbe, 0x7b, 0xa0, 0xfb, 0x14, 0xc3, 0x9d, + 0x07, 0xde, 0xf7, 0x31, 0x62, 0xbd, 0xe7, 0xd3, 0xa2, 0x77, 0xc2, 0x44, 0x43, 0x37, 0x2a, 0x0e, + 0xae, 0xef, 0x56, 0xb8, 0x82, 0x09, 0x4b, 0xfa, 0xa9, 0x97, 0xd2, 0x4a, 0x7f, 0xf6, 0x70, 0xf3, + 0xc6, 0x74, 0x81, 0xbb, 0xd0, 0x56, 0x96, 0xb2, 0x32, 0xde, 0xd0, 0x8d, 0x4d, 0x5c, 0xdf, 0x5d, + 0xf4, 0x60, 0xc5, 0xec, 0xfb, 0x3f, 0x39, 0x7d, 0x84, 0x4f, 0xd7, 0x23, 0xf2, 0x39, 0xba, 0x77, + 0xce, 0xa7, 0x19, 0x76, 0xc8, 0x9a, 0x44, 0x15, 0x05, 0xba, 0xa3, 0x91, 0x51, 0x7c, 0x00, 0x9b, + 0xe6, 0xaf, 0xfc, 0x87, 0x19, 0x49, 0xfe, 0x9c, 0x04, 0x83, 0x8b, 0x97, 0x37, 0x54, 0xdd, 0x46, + 0xcb, 0x30, 0xee, 0x5b, 0x4e, 0x78, 0x92, 0x9f, 0xbc, 0x79, 0x63, 0x3a, 0x1f, 0x35, 0x2e, 0x6f, + 0x96, 0xfb, 0x06, 0x2c, 0xa6, 0xf9, 0x72, 0xa7, 0x85, 0x6b, 0x88, 0x55, 0x0b, 0x8a, 0xdc, 0xba, + 0xac, 0x8d, 0x74, 0xb3, 0x0c, 0x43, 0x4c, 0x5a, 0x07, 0x15, 0x61, 0xc0, 0x22, 0x3f, 0xf8, 0xc1, + 0xc0, 0x54, 0x47, 0xe3, 0xa5, 0xf8, 0xde, 0x46, 0x26, 0x21, 0x91, 0x3f, 0x9c, 0x00, 0x58, 0xbc, + 0x7c, 0x79, 0xcb, 0xd6, 0xad, 0x3a, 0x76, 0x6f, 0x65, 0xcf, 0xb7, 0xe0, 0x68, 0x60, 0x95, 0x64, + 0x6b, 0x91, 0xde, 0xcf, 0xdc, 0xbc, 0x31, 0x7d, 0x32, 0xda, 0xfb, 0x00, 0x9a, 0xac, 0x4c, 0xf8, + 0xeb, 0x25, 0x5b, 0x6b, 0xcb, 0xb5, 0xea, 0xb8, 0x1e, 0xd7, 0x64, 0x67, 0xae, 0x01, 0xb4, 0x20, + 0xd7, 0x45, 0xc7, 0x6d, 0xaf, 0xda, 0x4d, 0x18, 0xf6, 0x55, 0xe2, 0xa0, 0x45, 0x48, 0xbb, 0xfc, + 0x37, 0xd7, 0xb0, 0xdc, 0x59, 0xc3, 0x82, 0x8c, 0x6b, 0xd9, 0xa3, 0x94, 0xff, 0x4c, 0x02, 0xf0, + 0x6d, 0xf6, 0xc7, 0xd3, 0xc4, 0x88, 0x2b, 0xe7, 0x8e, 0x37, 0x79, 0xa8, 0x54, 0x8d, 0x53, 0x47, + 0xf4, 0xf9, 0xd3, 0x09, 0x98, 0xd8, 0x16, 0x9e, 0xe7, 0xc7, 0x5e, 0x07, 0x1b, 0x30, 0x84, 0x0d, + 0xd7, 0xd6, 0xa9, 0x12, 0xc8, 0x68, 0x3f, 0xd2, 0x69, 0xb4, 0xdb, 0xf4, 0x89, 0x7e, 0xec, 0x46, + 0x6c, 0xba, 0x73, 0x36, 0x11, 0x6d, 0x7c, 0x30, 0x09, 0xf9, 0x4e, 0x94, 0x68, 0x01, 0xc6, 0x34, + 0x1b, 0x53, 0x40, 0x25, 0xb8, 0xf3, 0x57, 0x2a, 0xf8, 0x99, 0x65, 0x04, 0x41, 0x56, 0x46, 0x05, + 0x84, 0x47, 0x8f, 0x1a, 0x90, 0xb4, 0x8f, 0x98, 0x1d, 0xc1, 0xea, 0x31, 0xcf, 0x93, 0x79, 0xf8, + 0x10, 0x8d, 0x84, 0x19, 0xb0, 0xf8, 0x31, 0xea, 0x43, 0x69, 0x00, 0x79, 0x09, 0xc6, 0x74, 0x43, + 0x77, 0x75, 0xb5, 0x5e, 0xd9, 0x51, 0xeb, 0xaa, 0xa1, 0x1d, 0x26, 0x6b, 0x66, 0x2e, 0x9f, 0x37, + 0x1b, 0x61, 0x27, 0x2b, 0xa3, 0x1c, 0x52, 0x62, 0x00, 0x74, 0x11, 0x86, 0x44, 0x53, 0xa9, 0x43, + 0x65, 0x1b, 0x82, 0x3c, 0x90, 0xe0, 0xfd, 0x4c, 0x12, 0xc6, 0x15, 0x5c, 0xfd, 0xff, 0x43, 0xd1, + 0xdf, 0x50, 0xac, 0x02, 0xb0, 0xe9, 0x4e, 0x1c, 0xec, 0x21, 0x46, 0x83, 0x38, 0x8c, 0x0c, 0xe3, + 0xb0, 0xe8, 0xb8, 0x81, 0xf1, 0xb8, 0x91, 0x80, 0x6c, 0x70, 0x3c, 0xfe, 0x82, 0x46, 0x25, 0xb4, + 0xec, 0x7b, 0xa2, 0x14, 0xff, 0x44, 0x68, 0x07, 0x4f, 0xd4, 0x62, 0xbd, 0xdd, 0x5d, 0xd0, 0xff, + 0x48, 0xc0, 0xe0, 0x86, 0x6a, 0xab, 0x0d, 0x07, 0x69, 0x2d, 0x99, 0xa6, 0xd8, 0x7e, 0x6c, 0xf9, + 0x10, 0x34, 0xdf, 0xed, 0x88, 0x49, 0x34, 0x3f, 0xda, 0x26, 0xd1, 0xfc, 0x09, 0x18, 0x25, 0xcb, + 0xe1, 0xc0, 0x15, 0x06, 0xa2, 0xed, 0x91, 0xd2, 0x09, 0x9f, 0x4b, 0xb8, 0x9e, 0xad, 0x96, 0x2f, + 0x07, 0xef, 0x30, 0x0c, 0x13, 0x0c, 0xdf, 0x31, 0x13, 0xf2, 0x63, 0xfe, 0xb2, 0x34, 0x50, 0x29, + 0x2b, 0xd0, 0x50, 0xaf, 0x95, 0x59, 0x01, 0xad, 0x00, 0xda, 0xf3, 0x76, 0x46, 0x2a, 0xbe, 0x3a, + 0x09, 0xfd, 0x9d, 0x37, 0x6f, 0x4c, 0x9f, 0x60, 0xf4, 0xad, 0x38, 0xb2, 0x32, 0xee, 0x03, 0x05, + 0xb7, 0xc7, 0x01, 0x48, 0xbf, 0x2a, 0xec, 0xfa, 0x1c, 0x5b, 0xee, 0x1c, 0xbd, 0x79, 0x63, 0x7a, + 0x9c, 0x71, 0xf1, 0xeb, 0x64, 0x25, 0x43, 0x0a, 0x8b, 0xe4, 0x77, 0xc0, 0xb2, 0x3f, 0x2d, 0x01, + 0xf2, 0x5d, 0xbe, 0x82, 0x1d, 0x8b, 0xac, 0xcf, 0x48, 0x22, 0x1e, 0xc8, 0x9a, 0xa5, 0xee, 0x89, + 0xb8, 0x4f, 0x2f, 0x12, 0xf1, 0xc0, 0x4c, 0x79, 0xca, 0x77, 0x8f, 0x09, 0x3e, 0x8e, 0x6d, 0xee, + 0x1a, 0xce, 0x2e, 0x98, 0xba, 0xa0, 0x6e, 0xf1, 0x87, 0x47, 0xe4, 0x7f, 0x25, 0xc1, 0x89, 0x16, + 0x8b, 0xf2, 0x84, 0xfd, 0x4b, 0x80, 0xec, 0x40, 0x25, 0xff, 0xde, 0x1b, 0x13, 0xba, 0x6f, 0x03, + 0x1d, 0xb7, 0x5b, 0xfc, 0xee, 0xad, 0xf3, 0xf0, 0xec, 0xb2, 0xe2, 0x3f, 0x95, 0x60, 0x32, 0xd8, + 0xbc, 0xd7, 0x91, 0x35, 0xc8, 0x06, 0x5b, 0xe7, 0x5d, 0xb8, 0xa7, 0x97, 0x2e, 0x70, 0xe9, 0x43, + 0xf4, 0xe8, 0x39, 0x7f, 0xba, 0xb2, 0xbd, 0xb3, 0x47, 0x7b, 0xd6, 0x86, 0x90, 0x29, 0x3a, 0x6d, + 0x53, 0x74, 0x3c, 0xfe, 0x8f, 0x04, 0xa9, 0x0d, 0xd3, 0xac, 0x23, 0x13, 0xc6, 0x0d, 0xd3, 0xad, + 0x10, 0xcb, 0xc2, 0xd5, 0x0a, 0x5f, 0x74, 0x33, 0x3f, 0xb8, 0xd0, 0x9f, 0x92, 0xbe, 0x7d, 0x63, + 0xba, 0x95, 0x95, 0x32, 0x66, 0x98, 0x6e, 0x89, 0x42, 0xb6, 0xd8, 0x92, 0xfc, 0x9d, 0x30, 0x12, + 0x6e, 0x8c, 0x79, 0xc9, 0xe7, 0xfb, 0x6e, 0x2c, 0xcc, 0xe6, 0xe6, 0x8d, 0xe9, 0x49, 0x7f, 0xc6, + 0x78, 0x60, 0x59, 0xc9, 0xee, 0x04, 0x5a, 0x67, 0xd7, 0xbb, 0xbe, 0xfb, 0xc9, 0x69, 0xe9, 0xf4, + 0x17, 0x25, 0x00, 0x7f, 0xe7, 0x01, 0x3d, 0x04, 0xc7, 0x4b, 0xeb, 0x6b, 0x8b, 0x95, 0xcd, 0xad, + 0xf9, 0xad, 0xed, 0xcd, 0xca, 0xf6, 0xda, 0xe6, 0x46, 0x79, 0x61, 0xf9, 0xc2, 0x72, 0x79, 0xd1, + 0xdf, 0x1e, 0x77, 0x2c, 0xac, 0xe9, 0xbb, 0x3a, 0xae, 0xa2, 0xfb, 0x60, 0x32, 0x8c, 0x4d, 0x4a, + 0xe5, 0xc5, 0x9c, 0x54, 0xc8, 0xbe, 0x7a, 0x7d, 0x26, 0xcd, 0x72, 0x31, 0x5c, 0x45, 0xa7, 0xe0, + 0x68, 0x2b, 0xde, 0xf2, 0xda, 0x52, 0x2e, 0x51, 0x18, 0x79, 0xf5, 0xfa, 0x4c, 0xc6, 0x4b, 0xda, + 0x90, 0x0c, 0x28, 0x88, 0xc9, 0xf9, 0x25, 0x0b, 0xf0, 0xea, 0xf5, 0x99, 0x41, 0xa6, 0xc0, 0x42, + 0xea, 0xfd, 0x9f, 0x9e, 0x3a, 0x52, 0xba, 0xd0, 0x71, 0x03, 0xfc, 0xa1, 0xae, 0xba, 0xbb, 0xe6, + 0x6d, 0x6a, 0x87, 0x77, 0xbd, 0xff, 0x78, 0xa8, 0xe3, 0xae, 0x77, 0x0d, 0x1b, 0xd8, 0xd1, 0x9d, + 0x43, 0xed, 0x7a, 0xf7, 0xb4, 0x93, 0x2e, 0xff, 0xce, 0x00, 0x64, 0x97, 0x58, 0x2b, 0x64, 0x20, + 0x30, 0x7a, 0x13, 0x0c, 0x5a, 0x34, 0x8c, 0x78, 0xc7, 0x68, 0x1d, 0x0c, 0x9e, 0x05, 0x1b, 0xef, + 0x2e, 0x17, 0x0b, 0x3d, 0x0e, 0xbf, 0xcc, 0xc1, 0xee, 0x98, 0xf9, 0xb7, 0xa6, 0xb2, 0x7d, 0xed, + 0xf7, 0xb0, 0x9c, 0x85, 0x6f, 0xad, 0x44, 0xf9, 0xc9, 0xec, 0x5e, 0xc8, 0x16, 0x81, 0xb0, 0xdb, + 0x61, 0xef, 0x95, 0xe0, 0x28, 0xc5, 0xf2, 0x03, 0x31, 0xc5, 0x14, 0xc9, 0xfe, 0xe9, 0x4e, 0x5d, + 0x58, 0x51, 0x1d, 0xff, 0xae, 0x07, 0xbb, 0xcf, 0x75, 0x0f, 0x0f, 0x84, 0x27, 0x03, 0x8d, 0x47, + 0xd9, 0xca, 0xca, 0x44, 0xbd, 0x85, 0xd2, 0x41, 0x4b, 0xa1, 0x0b, 0x7d, 0xa9, 0xfe, 0xb6, 0xda, + 0x83, 0x97, 0xfb, 0x9e, 0x85, 0x61, 0xdf, 0x97, 0x38, 0xfc, 0xff, 0x53, 0xf4, 0x1e, 0x3b, 0x82, + 0xc4, 0xe8, 0x7d, 0x12, 0x1c, 0xf5, 0xa3, 0x79, 0x90, 0x2d, 0xfb, 0x3f, 0x1e, 0x0f, 0xf6, 0xb1, + 0x10, 0x8a, 0x2a, 0xa7, 0x2d, 0x5f, 0x59, 0x99, 0x6c, 0xb6, 0x92, 0x92, 0x25, 0xd8, 0x48, 0xd0, + 0xb3, 0x3a, 0x79, 0xf1, 0xa9, 0xba, 0xde, 0x5d, 0x73, 0x98, 0x01, 0xfb, 0xdf, 0x02, 0x96, 0x69, + 0xbb, 0xb8, 0x4a, 0x37, 0xe4, 0xd2, 0x8a, 0x57, 0x96, 0xd7, 0x00, 0xb5, 0x0e, 0x6e, 0xf4, 0x02, + 0x63, 0xc6, 0xbf, 0xc0, 0x38, 0x09, 0x03, 0xc1, 0x2b, 0x7e, 0xac, 0x50, 0x4c, 0xbf, 0x9f, 0x87, + 0xcf, 0x5b, 0x3e, 0xe7, 0xff, 0x45, 0x02, 0x4e, 0x07, 0x8f, 0x87, 0x5e, 0x6a, 0x62, 0xfb, 0xc0, + 0x9b, 0xa2, 0x96, 0x5a, 0xd3, 0x8d, 0xe0, 0x1b, 0xa0, 0x13, 0xc1, 0x80, 0x4f, 0x71, 0x85, 0x9e, + 0x64, 0x03, 0x86, 0x37, 0xd4, 0x1a, 0x56, 0xf0, 0x4b, 0x4d, 0xec, 0xb8, 0x6d, 0x2e, 0x99, 0x1f, + 0x83, 0x41, 0x73, 0x77, 0x57, 0x1c, 0x69, 0xa7, 0x14, 0x5e, 0x22, 0x5d, 0xae, 0xeb, 0x0d, 0x9d, + 0xdd, 0x06, 0x4b, 0x29, 0xac, 0x80, 0xa6, 0x61, 0x58, 0x33, 0x9b, 0x06, 0x9f, 0x71, 0xf9, 0x94, + 0xf8, 0x00, 0x44, 0xd3, 0x60, 0x33, 0x4e, 0x7e, 0x06, 0xb2, 0xac, 0x3d, 0x1e, 0x71, 0x4f, 0x40, + 0x9a, 0x5e, 0xa7, 0xf2, 0x5b, 0x1d, 0x22, 0xe5, 0x4b, 0xec, 0x42, 0x3a, 0xe3, 0xc2, 0x1a, 0x66, + 0x85, 0x52, 0xa9, 0xa3, 0x2a, 0x4f, 0xc5, 0xbb, 0x06, 0xa6, 0x28, 0x4f, 0x8d, 0xbf, 0x39, 0x00, + 0x47, 0xf9, 0x09, 0x9d, 0x6a, 0xe9, 0x73, 0x7b, 0xae, 0x2b, 0x5e, 0x09, 0x01, 0x4f, 0x75, 0x55, + 0x4b, 0x97, 0x0f, 0x20, 0x75, 0xd1, 0x75, 0x2d, 0x74, 0x1a, 0x06, 0xec, 0x66, 0x1d, 0x8b, 0x1d, + 0x1f, 0x6f, 0x4f, 0x5e, 0xb5, 0xf4, 0x59, 0x82, 0xa0, 0x34, 0xeb, 0x58, 0x61, 0x28, 0xa8, 0x0c, + 0xd3, 0xbb, 0xcd, 0x7a, 0xfd, 0xa0, 0x52, 0xc5, 0xf4, 0x7f, 0xf7, 0x78, 0x5f, 0xbf, 0xc7, 0xd7, + 0x2c, 0x55, 0x7c, 0x43, 0x8f, 0xe8, 0xe6, 0x24, 0x45, 0x5b, 0xa4, 0x58, 0xe2, 0xcb, 0xf7, 0x65, + 0x81, 0x23, 0xff, 0x5e, 0x02, 0xd2, 0x82, 0x35, 0xbd, 0x21, 0x8e, 0xeb, 0x58, 0x73, 0x4d, 0x71, + 0x62, 0xe2, 0x95, 0x11, 0x82, 0x64, 0x8d, 0x0f, 0x51, 0xe6, 0xe2, 0x11, 0x85, 0x14, 0x08, 0xcc, + 0xbb, 0xb7, 0x4f, 0x60, 0x56, 0x93, 0x8c, 0x5a, 0xca, 0x32, 0xc5, 0xd2, 0xec, 0xe2, 0x11, 0x85, + 0x96, 0x50, 0x1e, 0x06, 0xc9, 0xcc, 0x70, 0xd9, 0x87, 0x09, 0x09, 0x9c, 0x97, 0xd1, 0x31, 0x18, + 0xb0, 0x54, 0x57, 0x63, 0x57, 0xea, 0x48, 0x05, 0x2b, 0xa2, 0x27, 0x60, 0x90, 0x3d, 0x08, 0x8d, + 0xfe, 0x63, 0x0c, 0xa2, 0x0c, 0xf6, 0xe5, 0x2d, 0x22, 0xf7, 0x86, 0xea, 0xba, 0xd8, 0x36, 0x08, + 0x43, 0x86, 0x8e, 0x10, 0xa4, 0x76, 0xcc, 0xea, 0x01, 0xff, 0x67, 0x1d, 0xf4, 0x37, 0xff, 0xef, + 0x00, 0xd4, 0x1e, 0x2a, 0xb4, 0x92, 0xfd, 0x8f, 0xa2, 0xac, 0x00, 0x96, 0x08, 0x52, 0x19, 0x26, + 0xd4, 0x6a, 0x55, 0x67, 0xff, 0x37, 0xa3, 0xb2, 0xa3, 0x53, 0x0f, 0xe1, 0xd0, 0xff, 0x40, 0xd5, + 0x69, 0x2c, 0x90, 0x4f, 0x50, 0xe2, 0xf8, 0xa5, 0x0c, 0x0c, 0x59, 0x4c, 0x28, 0xf9, 0x3c, 0x8c, + 0xb7, 0x48, 0x4a, 0xe4, 0xdb, 0xd7, 0x8d, 0xaa, 0x78, 0xcc, 0x40, 0x7e, 0x13, 0x18, 0xfd, 0x7a, + 0x1e, 0x3b, 0x8b, 0xa2, 0xbf, 0x4b, 0xef, 0xee, 0xfc, 0xf0, 0x6b, 0x34, 0xf0, 0xf0, 0x4b, 0xb5, + 0xf4, 0x52, 0x86, 0xf2, 0xe7, 0xcf, 0xbd, 0xe6, 0x79, 0x05, 0x7b, 0xea, 0x35, 0x6b, 0xda, 0x35, + 0x12, 0xa5, 0x45, 0xf4, 0x25, 0x55, 0xaa, 0xa5, 0x3b, 0xd4, 0x1c, 0xfd, 0xaf, 0xf9, 0x39, 0xe7, + 0x03, 0xbf, 0xe9, 0x23, 0xb0, 0xd4, 0xd2, 0xfc, 0xc6, 0xb2, 0x67, 0xc7, 0x5f, 0x4e, 0xc0, 0xc9, + 0x80, 0x1d, 0x07, 0x90, 0x5b, 0xcd, 0xb9, 0xd0, 0xde, 0xe2, 0x7b, 0x78, 0xfc, 0x75, 0x09, 0x52, + 0x04, 0x1f, 0xc5, 0x7c, 0xbb, 0x3f, 0xff, 0xab, 0x5f, 0xfb, 0x27, 0x72, 0xf8, 0xd4, 0x2a, 0x34, + 0x2a, 0x94, 0x49, 0xe9, 0x7d, 0xbd, 0xeb, 0x2f, 0xe7, 0x7f, 0xc8, 0xd0, 0xb9, 0x75, 0x6a, 0x8c, + 0xea, 0xf0, 0x5b, 0x67, 0x41, 0xee, 0x90, 0xf2, 0x30, 0x8f, 0xd9, 0x3d, 0x89, 0xea, 0xc3, 0x1d, + 0x77, 0xba, 0xff, 0xdf, 0x6d, 0x04, 0x7b, 0x4c, 0xc7, 0xae, 0xc1, 0xb1, 0xe7, 0x48, 0xdb, 0xfe, + 0x32, 0x59, 0x38, 0xf6, 0x63, 0xde, 0x69, 0x9e, 0xc4, 0xff, 0x01, 0x98, 0x38, 0xa9, 0x03, 0x5f, + 0x3e, 0xbe, 0x40, 0xbc, 0x6f, 0xb6, 0x63, 0xbc, 0x98, 0x0d, 0x04, 0x0b, 0x25, 0x40, 0x29, 0xff, + 0xb2, 0x04, 0xc7, 0x5b, 0x9a, 0xe6, 0x3e, 0x7e, 0xa9, 0xcd, 0x53, 0x85, 0x43, 0x65, 0x36, 0x4b, + 0x6d, 0x84, 0xbd, 0x3f, 0x56, 0x58, 0x26, 0x45, 0x48, 0xda, 0xa7, 0xe1, 0x68, 0x58, 0x58, 0xa1, + 0xa6, 0x7b, 0x61, 0x34, 0xbc, 0x23, 0xcc, 0xd5, 0x35, 0x12, 0xda, 0x13, 0x96, 0x2b, 0x51, 0x3d, + 0x7b, 0x7d, 0x2d, 0x43, 0xc6, 0x43, 0xe5, 0x29, 0x70, 0xcf, 0x5d, 0xf5, 0x29, 0xe5, 0x0f, 0x4b, + 0x30, 0x13, 0x6e, 0x21, 0x90, 0x0c, 0xf5, 0x27, 0xec, 0x2d, 0x1b, 0xe2, 0x37, 0x24, 0xb8, 0xab, + 0x8b, 0x4c, 0x5c, 0x01, 0x2f, 0xc3, 0x64, 0x60, 0x27, 0x40, 0xb8, 0x70, 0x31, 0xec, 0xa7, 0xe3, + 0xd3, 0x50, 0x6f, 0xe1, 0x7b, 0x07, 0x51, 0xca, 0x67, 0x7f, 0x7f, 0x7a, 0xa2, 0xb5, 0xce, 0x51, + 0x26, 0x5a, 0x57, 0xef, 0xb7, 0xd0, 0x3e, 0x5e, 0x93, 0xe0, 0x81, 0x70, 0x57, 0xdb, 0xe4, 0xb3, + 0x3f, 0xaa, 0x71, 0xf8, 0xf7, 0x12, 0x9c, 0xee, 0x45, 0x38, 0x3e, 0x20, 0x3b, 0x30, 0xe1, 0x67, + 0xda, 0xd1, 0xf1, 0xe8, 0x2b, 0x7f, 0x67, 0x56, 0x8a, 0x3c, 0x6e, 0xb7, 0x41, 0xf1, 0x16, 0x9f, + 0x58, 0xc1, 0x21, 0xf7, 0x94, 0x1c, 0xde, 0xcd, 0x15, 0x4a, 0x0e, 0xed, 0xe7, 0xb6, 0x19, 0x8b, + 0x44, 0x9b, 0xb1, 0xf0, 0x53, 0x73, 0xf9, 0x0a, 0xf7, 0x5b, 0x6d, 0xf6, 0xe0, 0xde, 0x06, 0x13, + 0x6d, 0x4c, 0x99, 0xcf, 0xea, 0x3e, 0x2c, 0x59, 0x41, 0xad, 0xc6, 0x2a, 0x1f, 0xc0, 0x34, 0x6d, + 0xb7, 0x8d, 0xa2, 0x6f, 0x77, 0x97, 0x1b, 0xdc, 0xb7, 0xb4, 0x6d, 0x9a, 0xf7, 0x7d, 0x19, 0x06, + 0xd9, 0x38, 0xf3, 0xee, 0x1e, 0xc2, 0x50, 0x38, 0x03, 0xf9, 0xe7, 0x85, 0x2f, 0x5b, 0x14, 0x62, + 0xb7, 0x9f, 0x43, 0xbd, 0xf4, 0xf5, 0x16, 0xcd, 0xa1, 0x80, 0x32, 0xbe, 0x21, 0xbc, 0x5a, 0x7b, + 0xe9, 0xb8, 0x3a, 0xb4, 0x5b, 0xe6, 0xd5, 0x98, 0x6e, 0x6e, 0xaf, 0xfb, 0xfa, 0x45, 0xe1, 0xbe, + 0xbc, 0x3e, 0xc5, 0xb8, 0xaf, 0x1f, 0x8d, 0xea, 0x3d, 0x47, 0x16, 0x23, 0xe6, 0x9f, 0x47, 0x47, + 0xf6, 0x5d, 0x09, 0x4e, 0xd0, 0xbe, 0x05, 0x37, 0x22, 0xfa, 0x55, 0xf9, 0x43, 0x80, 0x1c, 0x5b, + 0xab, 0xb4, 0x9d, 0xdd, 0x39, 0xc7, 0xd6, 0x2e, 0x87, 0xe2, 0xcb, 0x43, 0x80, 0xaa, 0xa1, 0xed, + 0x26, 0x8a, 0xcd, 0x6e, 0xc9, 0xe5, 0xaa, 0x81, 0xdd, 0x8c, 0x36, 0xc3, 0x99, 0xba, 0x05, 0xc3, + 0xf9, 0x75, 0x09, 0x0a, 0xed, 0xba, 0xcc, 0x87, 0x4f, 0x87, 0x63, 0xa1, 0x43, 0x82, 0xe8, 0x08, + 0x3e, 0xd4, 0xcb, 0x56, 0x4e, 0x64, 0x1a, 0x1d, 0xb5, 0xf1, 0xed, 0xce, 0x03, 0xa6, 0xc3, 0x16, + 0xda, 0x9a, 0x59, 0xff, 0xc8, 0xa6, 0xcf, 0x17, 0x5a, 0xfc, 0xea, 0x9f, 0x8b, 0xdc, 0xfb, 0x1a, + 0x4c, 0x75, 0x90, 0xfa, 0x76, 0xc7, 0xbd, 0xbd, 0x8e, 0x83, 0x79, 0xab, 0xd3, 0xf7, 0xc7, 0xf9, + 0x4c, 0x08, 0xdf, 0xc0, 0x0e, 0xac, 0xc5, 0xda, 0x3d, 0xe1, 0x92, 0xdf, 0x02, 0x77, 0xb4, 0xa5, + 0xe2, 0xb2, 0x15, 0x21, 0xb5, 0xa7, 0x3b, 0x2e, 0x17, 0xeb, 0xbe, 0x4e, 0x62, 0x45, 0xa8, 0x29, + 0x8d, 0x8c, 0x20, 0x47, 0x59, 0x6f, 0x98, 0x66, 0x9d, 0x8b, 0x21, 0x5f, 0x82, 0xf1, 0x00, 0x8c, + 0x37, 0x72, 0x0e, 0x52, 0x96, 0xc9, 0x3f, 0x4f, 0x30, 0x7c, 0xe6, 0x64, 0xc7, 0xdd, 0x7b, 0xd3, + 0xac, 0xf3, 0x6e, 0x53, 0x7c, 0x79, 0x12, 0x10, 0x63, 0x46, 0x37, 0xf2, 0x45, 0x13, 0x9b, 0x30, + 0x11, 0x82, 0xf2, 0x46, 0x7e, 0xa0, 0x43, 0x82, 0x33, 0xdf, 0x3e, 0x0a, 0x03, 0x94, 0x2b, 0xfa, + 0x98, 0x04, 0x10, 0x38, 0x11, 0x9e, 0xed, 0xc4, 0xa6, 0xfd, 0x9a, 0xb8, 0x30, 0xd7, 0x33, 0x3e, + 0xcf, 0xd9, 0x4e, 0xbf, 0xfb, 0xdf, 0x7c, 0xeb, 0x23, 0x89, 0x7b, 0x90, 0x3c, 0xd7, 0x61, 0x35, + 0x1e, 0x98, 0x2f, 0x9f, 0x09, 0xbd, 0x7d, 0x7f, 0xb8, 0xb7, 0xa6, 0x84, 0x64, 0xb3, 0xbd, 0xa2, + 0x73, 0xc1, 0xce, 0x53, 0xc1, 0xce, 0xa2, 0xc7, 0xe2, 0x05, 0x9b, 0x7b, 0x47, 0x78, 0xd2, 0xbc, + 0x0b, 0xfd, 0x8e, 0x04, 0x93, 0xed, 0x96, 0x74, 0xe8, 0xc9, 0xde, 0xa4, 0x68, 0x4d, 0x29, 0x0a, + 0x4f, 0x1d, 0x82, 0x92, 0x77, 0x65, 0x89, 0x76, 0x65, 0x1e, 0x3d, 0x73, 0x88, 0xae, 0xcc, 0x05, + 0xf7, 0xf7, 0xff, 0x97, 0x04, 0x77, 0x76, 0x5d, 0x21, 0xa1, 0xf9, 0xde, 0xa4, 0xec, 0x92, 0x3b, + 0x15, 0x4a, 0x3f, 0x08, 0x0b, 0xde, 0xe3, 0xe7, 0x68, 0x8f, 0x2f, 0xa1, 0xe5, 0xc3, 0xf4, 0xb8, + 0xed, 0x21, 0x0a, 0xfa, 0xad, 0xf0, 0xcd, 0xc2, 0xee, 0xe6, 0xd4, 0xb2, 0xf0, 0x88, 0x99, 0x18, + 0xad, 0x49, 0xad, 0xfc, 0x02, 0xed, 0x82, 0x82, 0x36, 0x7e, 0xc0, 0x41, 0x9b, 0x7b, 0x47, 0xd8, + 0xf1, 0xbf, 0x0b, 0xfd, 0x4f, 0xa9, 0xfd, 0x45, 0xc1, 0x27, 0xba, 0x8a, 0xd8, 0x79, 0x51, 0x55, + 0x78, 0xb2, 0x7f, 0x42, 0xde, 0xc9, 0x06, 0xed, 0x64, 0x0d, 0xe1, 0x5b, 0xdd, 0xc9, 0xb6, 0x83, + 0x88, 0xbe, 0x2a, 0xc1, 0x64, 0xbb, 0x35, 0x49, 0xcc, 0xb4, 0xec, 0xb2, 0xc8, 0x8a, 0x99, 0x96, + 0xdd, 0x16, 0x40, 0xf2, 0x9b, 0x68, 0xe7, 0xcf, 0xa1, 0xc7, 0x3b, 0x75, 0xbe, 0xeb, 0x28, 0x92, + 0xb9, 0xd8, 0x35, 0xc9, 0x8f, 0x99, 0x8b, 0xbd, 0xac, 0x63, 0x62, 0xe6, 0x62, 0x4f, 0x6b, 0x8c, + 0xf8, 0xb9, 0xe8, 0xf5, 0xac, 0xc7, 0x61, 0x74, 0xd0, 0x97, 0x25, 0x18, 0x09, 0x65, 0xc4, 0xe8, + 0xd1, 0xae, 0x82, 0xb6, 0x5b, 0x30, 0x14, 0xce, 0xf4, 0x43, 0xc2, 0xfb, 0xb2, 0x4c, 0xfb, 0xb2, + 0x80, 0xe6, 0x0f, 0xd3, 0x97, 0xf0, 0x59, 0xe9, 0xd7, 0x25, 0x98, 0x68, 0x93, 0x65, 0xc6, 0xcc, + 0xc2, 0xce, 0x49, 0x73, 0xe1, 0xc9, 0xfe, 0x09, 0x79, 0xaf, 0x2e, 0xd0, 0x5e, 0xfd, 0x04, 0x7a, + 0xfa, 0x30, 0xbd, 0x0a, 0xc4, 0xe7, 0x1b, 0xfe, 0xbd, 0xab, 0x40, 0x3b, 0xe8, 0x5c, 0x9f, 0x82, + 0x89, 0x0e, 0x3d, 0xd1, 0x37, 0x1d, 0xef, 0xcf, 0xf3, 0xb4, 0x3f, 0xcf, 0xa1, 0xf5, 0x1f, 0xac, + 0x3f, 0xad, 0x61, 0xfd, 0xf3, 0xad, 0x2f, 0x00, 0xbb, 0x5b, 0x51, 0xdb, 0x64, 0xb5, 0xf0, 0x58, + 0x5f, 0x34, 0xbc, 0x53, 0x4f, 0xd2, 0x4e, 0x9d, 0x41, 0x8f, 0x74, 0xea, 0x54, 0xe0, 0x72, 0x9d, + 0x6e, 0xec, 0x9a, 0x73, 0xef, 0x60, 0x29, 0xf0, 0xbb, 0xd0, 0x4f, 0x89, 0x8b, 0x4d, 0xa7, 0xba, + 0xb6, 0x1b, 0xc8, 0x63, 0x0b, 0x0f, 0xf4, 0x80, 0xc9, 0xe5, 0xba, 0x87, 0xca, 0x35, 0x85, 0x4e, + 0x76, 0x92, 0x8b, 0xe4, 0xb2, 0xe8, 0x03, 0x92, 0x77, 0x17, 0xf2, 0x74, 0x77, 0xde, 0xc1, 0x64, + 0xb7, 0xf0, 0x60, 0x4f, 0xb8, 0x5c, 0x92, 0xfb, 0xa8, 0x24, 0x33, 0x68, 0xaa, 0xa3, 0x24, 0x2c, + 0xf5, 0xbd, 0xd5, 0x37, 0x07, 0x5e, 0x3d, 0x0e, 0xd3, 0x1d, 0x5a, 0x74, 0xaf, 0xc5, 0x9c, 0x71, + 0x75, 0x79, 0x08, 0x1b, 0xfb, 0xd0, 0xb5, 0xc3, 0xd3, 0xda, 0xc3, 0x3f, 0x7f, 0xed, 0xed, 0x40, + 0xec, 0x5f, 0xa7, 0x00, 0xad, 0x3a, 0xb5, 0x05, 0x1b, 0xb3, 0x7f, 0x7a, 0xc7, 0x67, 0x79, 0xe4, + 0x85, 0x97, 0xf4, 0x03, 0xbd, 0xf0, 0x5a, 0x0d, 0xbd, 0x99, 0x4a, 0xf4, 0xf7, 0x2e, 0xb3, 0xe7, + 0x87, 0x53, 0xc9, 0x1f, 0xca, 0xc3, 0xa9, 0xf6, 0xf7, 0xaa, 0x53, 0xb7, 0xee, 0x01, 0xc6, 0xc0, + 0x61, 0x1f, 0xa1, 0xf0, 0xf7, 0x90, 0x83, 0x5d, 0xde, 0x43, 0xe6, 0x3b, 0x3e, 0x7a, 0xe4, 0xd4, + 0xe8, 0xac, 0xf8, 0x80, 0xef, 0x50, 0x6f, 0x37, 0x61, 0xf9, 0x17, 0x7e, 0xfd, 0x2d, 0x84, 0x93, + 0x50, 0x68, 0x35, 0x27, 0x6f, 0x52, 0x7f, 0x24, 0x09, 0xb9, 0x55, 0xa7, 0x56, 0xae, 0xea, 0xee, + 0x6d, 0xb2, 0xb5, 0x67, 0x3a, 0x3f, 0x6a, 0x41, 0x37, 0x6f, 0x4c, 0x8f, 0x32, 0x9d, 0x76, 0xd1, + 0x64, 0x03, 0xc6, 0x22, 0x4f, 0x89, 0xb9, 0x65, 0x2d, 0x1e, 0xe6, 0x45, 0x73, 0x84, 0x95, 0x4c, + 0xdf, 0x20, 0x04, 0xec, 0x1b, 0x5d, 0x6b, 0x6f, 0xcc, 0xcc, 0xa0, 0x2e, 0xde, 0xce, 0x17, 0x80, + 0xfe, 0x98, 0x15, 0x20, 0x1f, 0x1d, 0x14, 0x6f, 0xc4, 0xfe, 0x50, 0x82, 0xe1, 0x55, 0x47, 0xa4, + 0x82, 0xf8, 0xc7, 0xf4, 0xfd, 0xd1, 0x13, 0xde, 0x77, 0x58, 0x93, 0xbd, 0xd9, 0xad, 0xf8, 0x36, + 0xab, 0xaf, 0x84, 0xa3, 0x30, 0x11, 0xe8, 0xa7, 0xd7, 0xff, 0xdf, 0x4e, 0x50, 0xff, 0x58, 0xc2, + 0x35, 0xdd, 0xf0, 0xb2, 0x48, 0xfc, 0x17, 0xf5, 0x75, 0x85, 0xaf, 0xe7, 0xd4, 0x61, 0xf5, 0xbc, + 0x4f, 0x1d, 0x44, 0x44, 0x9f, 0xde, 0xc6, 0xd7, 0x6a, 0xeb, 0xdb, 0x1f, 0xa9, 0x8f, 0xcf, 0xea, + 0x44, 0x5e, 0xf8, 0xc8, 0x6f, 0x48, 0x30, 0xb2, 0xea, 0xd4, 0xb6, 0x8d, 0xea, 0xff, 0xf3, 0xf6, + 0xbb, 0x0b, 0x47, 0x43, 0x3d, 0xbd, 0x4d, 0x2a, 0x3d, 0xf3, 0x5a, 0x0a, 0x92, 0xab, 0x4e, 0x0d, + 0xbd, 0x04, 0x63, 0xd1, 0xa4, 0xa1, 0x63, 0x2e, 0xd8, 0x1a, 0x11, 0x3a, 0xaf, 0xd7, 0x3a, 0x47, + 0x0f, 0xb4, 0x0f, 0x23, 0xe1, 0xc8, 0x71, 0xaa, 0x0b, 0x93, 0x10, 0x66, 0xe1, 0x91, 0x5e, 0x31, + 0xbd, 0xc6, 0xde, 0x0e, 0x69, 0xcf, 0xe9, 0xdd, 0xdd, 0x85, 0x5a, 0x20, 0x75, 0xce, 0x6e, 0xdb, + 0xb8, 0x15, 0xa2, 0xbd, 0xa8, 0x4b, 0xe9, 0xa6, 0xbd, 0x08, 0x6e, 0x57, 0xed, 0x75, 0x9a, 0x5a, + 0x3b, 0x00, 0x81, 0x79, 0x70, 0x6f, 0x17, 0x0e, 0x3e, 0x5a, 0xe1, 0xe1, 0x9e, 0xd0, 0xbc, 0x43, + 0xa7, 0x5b, 0x9c, 0x8c, 0xff, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd5, 0xca, 0x34, 0x9e, 0x6a, + 0x94, 0x00, 0x00, + } + r := bytes.NewReader(gzipped) + gzipr, err := compress_gzip.NewReader(r) + if err != nil { + panic(err) + } + ungzipped, err := io_ioutil.ReadAll(gzipr) + if err != nil { + panic(err) + } + if err := github_com_gogo_protobuf_proto.Unmarshal(ungzipped, d); err != nil { + panic(err) + } + return d +} +func (this *CommissionRates) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*CommissionRates) + if !ok { + that2, ok := that.(CommissionRates) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.Rate.Equal(that1.Rate) { + return false + } + if !this.MaxRate.Equal(that1.MaxRate) { + return false + } + if !this.MaxChangeRate.Equal(that1.MaxChangeRate) { + return false + } + return true +} +func (this *Commission) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Commission) + if !ok { + that2, ok := that.(Commission) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.CommissionRates.Equal(&that1.CommissionRates) { + return false + } + if !this.UpdateTime.Equal(that1.UpdateTime) { + return false + } + return true +} +func (this *Description) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Description) + if !ok { + that2, ok := that.(Description) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Moniker != that1.Moniker { + return false + } + if this.Identity != that1.Identity { + return false + } + if this.Website != that1.Website { + return false + } + if this.SecurityContact != that1.SecurityContact { + return false + } + if this.Details != that1.Details { + return false + } + return true +} +func (this *UnbondingDelegationEntry) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*UnbondingDelegationEntry) + if !ok { + that2, ok := that.(UnbondingDelegationEntry) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.CreationHeight != that1.CreationHeight { + return false + } + if !this.CompletionTime.Equal(that1.CompletionTime) { + return false + } + if !this.InitialBalance.Equal(that1.InitialBalance) { + return false + } + if !this.Balance.Equal(that1.Balance) { + return false + } + return true +} +func (this *RedelegationEntry) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*RedelegationEntry) + if !ok { + that2, ok := that.(RedelegationEntry) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.CreationHeight != that1.CreationHeight { + return false + } + if !this.CompletionTime.Equal(that1.CompletionTime) { + return false + } + if !this.InitialBalance.Equal(that1.InitialBalance) { + return false + } + if !this.SharesDst.Equal(that1.SharesDst) { + return false + } + return true +} +func (this *Params) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Params) + if !ok { + that2, ok := that.(Params) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.UnbondingTime != that1.UnbondingTime { + return false + } + if this.MaxValidators != that1.MaxValidators { + return false + } + if this.MaxEntries != that1.MaxEntries { + return false + } + if this.HistoricalEntries != that1.HistoricalEntries { + return false + } + if this.BondDenom != that1.BondDenom { + return false + } + return true +} +func (this *RedelegationEntryResponse) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*RedelegationEntryResponse) + if !ok { + that2, ok := that.(RedelegationEntryResponse) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.RedelegationEntry.Equal(&that1.RedelegationEntry) { + return false + } + if !this.Balance.Equal(that1.Balance) { + return false + } + return true +} +func (this *Pool) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Pool) + if !ok { + that2, ok := that.(Pool) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if !this.NotBondedTokens.Equal(that1.NotBondedTokens) { + return false + } + if !this.BondedTokens.Equal(that1.BondedTokens) { + return false + } + return true +} +func (m *HistoricalInfo) 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 *HistoricalInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *HistoricalInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Valset) > 0 { + for iNdEx := len(m.Valset) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Valset[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *CommissionRates) 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 *CommissionRates) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommissionRates) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.MaxChangeRate.Size() + i -= size + if _, err := m.MaxChangeRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size := m.MaxRate.Size() + i -= size + if _, err := m.MaxRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size := m.Rate.Size() + i -= size + if _, err := m.Rate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Commission) 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 *Commission) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Commission) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UpdateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UpdateTime):]) + if err2 != nil { + return 0, err2 + } + i -= n2 + i = encodeVarintStaking(dAtA, i, uint64(n2)) + i-- + dAtA[i] = 0x12 + { + size, err := m.CommissionRates.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Description) 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 *Description) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Description) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Details) > 0 { + i -= len(m.Details) + copy(dAtA[i:], m.Details) + i = encodeVarintStaking(dAtA, i, uint64(len(m.Details))) + i-- + dAtA[i] = 0x2a + } + if len(m.SecurityContact) > 0 { + i -= len(m.SecurityContact) + copy(dAtA[i:], m.SecurityContact) + i = encodeVarintStaking(dAtA, i, uint64(len(m.SecurityContact))) + i-- + dAtA[i] = 0x22 + } + if len(m.Website) > 0 { + i -= len(m.Website) + copy(dAtA[i:], m.Website) + i = encodeVarintStaking(dAtA, i, uint64(len(m.Website))) + i-- + dAtA[i] = 0x1a + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintStaking(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x12 + } + if len(m.Moniker) > 0 { + i -= len(m.Moniker) + copy(dAtA[i:], m.Moniker) + i = encodeVarintStaking(dAtA, i, uint64(len(m.Moniker))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Validator) 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 *Validator) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.MinSelfDelegation.Size() + i -= size + if _, err := m.MinSelfDelegation.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + { + size, err := m.Commission.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + n5, err5 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime):]) + if err5 != nil { + return 0, err5 + } + i -= n5 + i = encodeVarintStaking(dAtA, i, uint64(n5)) + i-- + dAtA[i] = 0x4a + if m.UnbondingHeight != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingHeight)) + i-- + dAtA[i] = 0x40 + } + { + size, err := m.Description.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + { + size := m.DelegatorShares.Size() + i -= size + if _, err := m.DelegatorShares.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + { + size := m.Tokens.Size() + i -= size + if _, err := m.Tokens.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + if m.Status != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x20 + } + if m.Jailed { + i-- + if m.Jailed { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.ConsensusPubkey != nil { + { + size, err := m.ConsensusPubkey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.OperatorAddress) > 0 { + i -= len(m.OperatorAddress) + copy(dAtA[i:], m.OperatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.OperatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ValAddresses) 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 *ValAddresses) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValAddresses) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for iNdEx := len(m.Addresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Addresses[iNdEx]) + copy(dAtA[i:], m.Addresses[iNdEx]) + i = encodeVarintStaking(dAtA, i, uint64(len(m.Addresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DVPair) 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 *DVPair) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DVPair) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ValidatorAddress) > 0 { + i -= len(m.ValidatorAddress) + copy(dAtA[i:], m.ValidatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *DVPairs) 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 *DVPairs) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DVPairs) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Pairs) > 0 { + for iNdEx := len(m.Pairs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Pairs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DVVTriplet) 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 *DVVTriplet) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DVVTriplet) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ValidatorDstAddress) > 0 { + i -= len(m.ValidatorDstAddress) + copy(dAtA[i:], m.ValidatorDstAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorDstAddress))) + i-- + dAtA[i] = 0x1a + } + if len(m.ValidatorSrcAddress) > 0 { + i -= len(m.ValidatorSrcAddress) + copy(dAtA[i:], m.ValidatorSrcAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorSrcAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *DVVTriplets) 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 *DVVTriplets) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DVVTriplets) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Triplets) > 0 { + for iNdEx := len(m.Triplets) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Triplets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Delegation) 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 *Delegation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Delegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.Shares.Size() + i -= size + if _, err := m.Shares.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.ValidatorAddress) > 0 { + i -= len(m.ValidatorAddress) + copy(dAtA[i:], m.ValidatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *UnbondingDelegation) 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 *UnbondingDelegation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UnbondingDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Entries) > 0 { + for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.ValidatorAddress) > 0 { + i -= len(m.ValidatorAddress) + copy(dAtA[i:], m.ValidatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *UnbondingDelegationEntry) 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 *UnbondingDelegationEntry) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.Balance.Size() + i -= size + if _, err := m.Balance.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size := m.InitialBalance.Size() + i -= size + if _, err := m.InitialBalance.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + if err8 != nil { + return 0, err8 + } + i -= n8 + i = encodeVarintStaking(dAtA, i, uint64(n8)) + i-- + dAtA[i] = 0x12 + if m.CreationHeight != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.CreationHeight)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *RedelegationEntry) 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 *RedelegationEntry) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.SharesDst.Size() + i -= size + if _, err := m.SharesDst.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size := m.InitialBalance.Size() + i -= size + if _, err := m.InitialBalance.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + if err9 != nil { + return 0, err9 + } + i -= n9 + i = encodeVarintStaking(dAtA, i, uint64(n9)) + i-- + dAtA[i] = 0x12 + if m.CreationHeight != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.CreationHeight)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Redelegation) 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 *Redelegation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Redelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Entries) > 0 { + for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.ValidatorDstAddress) > 0 { + i -= len(m.ValidatorDstAddress) + copy(dAtA[i:], m.ValidatorDstAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorDstAddress))) + i-- + dAtA[i] = 0x1a + } + if len(m.ValidatorSrcAddress) > 0 { + i -= len(m.ValidatorSrcAddress) + copy(dAtA[i:], m.ValidatorSrcAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ValidatorSrcAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintStaking(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + 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.BondDenom) > 0 { + i -= len(m.BondDenom) + copy(dAtA[i:], m.BondDenom) + i = encodeVarintStaking(dAtA, i, uint64(len(m.BondDenom))) + i-- + dAtA[i] = 0x2a + } + if m.HistoricalEntries != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.HistoricalEntries)) + i-- + dAtA[i] = 0x20 + } + if m.MaxEntries != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.MaxEntries)) + i-- + dAtA[i] = 0x18 + } + if m.MaxValidators != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.MaxValidators)) + i-- + dAtA[i] = 0x10 + } + n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) + if err10 != nil { + return 0, err10 + } + i -= n10 + i = encodeVarintStaking(dAtA, i, uint64(n10)) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DelegationResponse) 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 *DelegationResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DelegationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Balance.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Delegation.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *RedelegationEntryResponse) 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 *RedelegationEntryResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RedelegationEntryResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.Balance.Size() + i -= size + if _, err := m.Balance.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.RedelegationEntry.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *RedelegationResponse) 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 *RedelegationResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RedelegationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Entries) > 0 { + for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.Redelegation.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Pool) 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 *Pool) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.BondedTokens.Size() + i -= size + if _, err := m.BondedTokens.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size := m.NotBondedTokens.Size() + i -= size + if _, err := m.NotBondedTokens.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintStaking(dAtA []byte, offset int, v uint64) int { + offset -= sovStaking(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *HistoricalInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Header.Size() + n += 1 + l + sovStaking(uint64(l)) + if len(m.Valset) > 0 { + for _, e := range m.Valset { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + +func (m *CommissionRates) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Rate.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.MaxRate.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.MaxChangeRate.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *Commission) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.CommissionRates.Size() + n += 1 + l + sovStaking(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.UpdateTime) + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *Description) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Moniker) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.Website) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.SecurityContact) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.Details) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + return n +} + +func (m *Validator) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OperatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + if m.ConsensusPubkey != nil { + l = m.ConsensusPubkey.Size() + n += 1 + l + sovStaking(uint64(l)) + } + if m.Jailed { + n += 2 + } + if m.Status != 0 { + n += 1 + sovStaking(uint64(m.Status)) + } + l = m.Tokens.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.DelegatorShares.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.Description.Size() + n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingHeight != 0 { + n += 1 + sovStaking(uint64(m.UnbondingHeight)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime) + n += 1 + l + sovStaking(uint64(l)) + l = m.Commission.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.MinSelfDelegation.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *ValAddresses) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + +func (m *DVPair) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ValidatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + return n +} + +func (m *DVPairs) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Pairs) > 0 { + for _, e := range m.Pairs { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + +func (m *DVVTriplet) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ValidatorSrcAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ValidatorDstAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + return n +} + +func (m *DVVTriplets) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Triplets) > 0 { + for _, e := range m.Triplets { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + +func (m *Delegation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ValidatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = m.Shares.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *UnbondingDelegation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ValidatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + if len(m.Entries) > 0 { + for _, e := range m.Entries { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + +func (m *UnbondingDelegationEntry) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CreationHeight != 0 { + n += 1 + sovStaking(uint64(m.CreationHeight)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) + n += 1 + l + sovStaking(uint64(l)) + l = m.InitialBalance.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.Balance.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *RedelegationEntry) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CreationHeight != 0 { + n += 1 + sovStaking(uint64(m.CreationHeight)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime) + n += 1 + l + sovStaking(uint64(l)) + l = m.InitialBalance.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.SharesDst.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *Redelegation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ValidatorSrcAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ValidatorDstAddress) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + if len(m.Entries) > 0 { + for _, e := range m.Entries { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + +func (m *Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime) + n += 1 + l + sovStaking(uint64(l)) + if m.MaxValidators != 0 { + n += 1 + sovStaking(uint64(m.MaxValidators)) + } + if m.MaxEntries != 0 { + n += 1 + sovStaking(uint64(m.MaxEntries)) + } + if m.HistoricalEntries != 0 { + n += 1 + sovStaking(uint64(m.HistoricalEntries)) + } + l = len(m.BondDenom) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + return n +} + +func (m *DelegationResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Delegation.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.Balance.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *RedelegationEntryResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.RedelegationEntry.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.Balance.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func (m *RedelegationResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Redelegation.Size() + n += 1 + l + sovStaking(uint64(l)) + if len(m.Entries) > 0 { + for _, e := range m.Entries { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + +func (m *Pool) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.NotBondedTokens.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.BondedTokens.Size() + n += 1 + l + sovStaking(uint64(l)) + return n +} + +func sovStaking(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozStaking(x uint64) (n int) { + return sovStaking(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *ValAddresses) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValAddresses{`, + `Addresses:` + fmt.Sprintf("%v", this.Addresses) + `,`, + `}`, + }, "") + return s +} +func valueToStringStaking(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *HistoricalInfo) 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 ErrIntOverflowStaking + } + 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: HistoricalInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HistoricalInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + 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 ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Valset", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Valset = append(m.Valset, Validator{}) + if err := m.Valset[len(m.Valset)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CommissionRates) 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 ErrIntOverflowStaking + } + 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: CommissionRates: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CommissionRates: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Rate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MaxRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxChangeRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MaxChangeRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Commission) 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 ErrIntOverflowStaking + } + 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: Commission: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Commission: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CommissionRates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.CommissionRates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdateTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.UpdateTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Description) 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 ErrIntOverflowStaking + } + 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: Description: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Description: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Moniker", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Moniker = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Website", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Website = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecurityContact", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SecurityContact = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Details = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Validator) 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 ErrIntOverflowStaking + } + 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: Validator: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Validator: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OperatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OperatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusPubkey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsensusPubkey == nil { + m.ConsensusPubkey = &types1.Any{} + } + if err := m.ConsensusPubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Jailed", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Jailed = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= BondStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tokens", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Tokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorShares", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DelegatorShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Description.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingHeight", wireType) + } + m.UnbondingHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Commission", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Commission.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValAddresses) 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 ErrIntOverflowStaking + } + 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: ValAddresses: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValAddresses: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DVPair) 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 ErrIntOverflowStaking + } + 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: DVPair: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DVPair: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DVPairs) 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 ErrIntOverflowStaking + } + 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: DVPairs: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DVPairs: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pairs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pairs = append(m.Pairs, DVPair{}) + if err := m.Pairs[len(m.Pairs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DVVTriplet) 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 ErrIntOverflowStaking + } + 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: DVVTriplet: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DVVTriplet: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSrcAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorSrcAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorDstAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorDstAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DVVTriplets) 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 ErrIntOverflowStaking + } + 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: DVVTriplets: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DVVTriplets: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Triplets", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Triplets = append(m.Triplets, DVVTriplet{}) + if err := m.Triplets[len(m.Triplets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Delegation) 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 ErrIntOverflowStaking + } + 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: Delegation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Delegation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shares", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Shares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UnbondingDelegation) 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 ErrIntOverflowStaking + } + 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: UnbondingDelegation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UnbondingDelegation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entries = append(m.Entries, UnbondingDelegationEntry{}) + if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UnbondingDelegationEntry) 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 ErrIntOverflowStaking + } + 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: UnbondingDelegationEntry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UnbondingDelegationEntry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreationHeight", wireType) + } + m.CreationHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CreationHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InitialBalance", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.InitialBalance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RedelegationEntry) 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 ErrIntOverflowStaking + } + 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: RedelegationEntry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RedelegationEntry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreationHeight", wireType) + } + m.CreationHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CreationHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InitialBalance", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.InitialBalance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SharesDst", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SharesDst.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Redelegation) 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 ErrIntOverflowStaking + } + 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: Redelegation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Redelegation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSrcAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorSrcAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorDstAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorDstAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entries = append(m.Entries, RedelegationEntry{}) + if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + 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 ErrIntOverflowStaking + } + 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 UnbondingTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.UnbondingTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxValidators", wireType) + } + m.MaxValidators = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxValidators |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxEntries", wireType) + } + m.MaxEntries = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxEntries |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HistoricalEntries", wireType) + } + m.HistoricalEntries = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HistoricalEntries |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BondDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BondDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DelegationResponse) 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 ErrIntOverflowStaking + } + 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: DelegationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DelegationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Delegation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Delegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RedelegationEntryResponse) 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 ErrIntOverflowStaking + } + 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: RedelegationEntryResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RedelegationEntryResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RedelegationEntry", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RedelegationEntry.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Balance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RedelegationResponse) 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 ErrIntOverflowStaking + } + 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: RedelegationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RedelegationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Redelegation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Redelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entries = append(m.Entries, RedelegationEntryResponse{}) + if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Pool) 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 ErrIntOverflowStaking + } + 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: Pool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Pool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NotBondedTokens", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.NotBondedTokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BondedTokens", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.BondedTokens.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipStaking(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, ErrIntOverflowStaking + } + 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, ErrIntOverflowStaking + } + 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, ErrIntOverflowStaking + } + 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, ErrInvalidLengthStaking + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupStaking + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthStaking + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthStaking = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowStaking = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupStaking = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/staking/migrations/v040/types.go b/x/staking/migrations/v040/types.go new file mode 100644 index 00000000..ba3be48c --- /dev/null +++ b/x/staking/migrations/v040/types.go @@ -0,0 +1,205 @@ +package v040 + +import ( + "fmt" + "strings" + "time" + + "sigs.k8s.io/yaml" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// Staking params default values +const ( + // DefaultUnbondingTime reflects three weeks in seconds as the default + // unbonding time. + // TODO: Justify our choice of default here. + DefaultUnbondingTime time.Duration = time.Hour * 24 * 7 * 3 + + // Default maximum number of bonded validators + DefaultMaxValidators uint32 = 100 + + // Default maximum entries in a UBD/RED pair + DefaultMaxEntries uint32 = 7 + + // DefaultHistorical entries is 10000. Apps that don't use IBC can ignore this + // value by not adding the staking module to the application module manager's + // SetOrderBeginBlockers. + DefaultHistoricalEntries uint32 = 10000 +) + +// NewParams creates a new Params instance +func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historicalEntries uint32, bondDenom string) Params { + return Params{ + UnbondingTime: unbondingTime, + MaxValidators: maxValidators, + MaxEntries: maxEntries, + HistoricalEntries: historicalEntries, + BondDenom: bondDenom, + } +} + +// String returns a human readable string representation of the parameters. +func (p Params) String() string { + out, _ := yaml.Marshal(p) + return string(out) +} + +func DefaultParams() Params { + return NewParams( + DefaultUnbondingTime, + DefaultMaxValidators, + DefaultMaxEntries, + DefaultHistoricalEntries, + sdk.DefaultBondDenom, + ) +} + +// String implements the Stringer interface for a Commission object. +func (c Commission) String() string { + out, _ := yaml.Marshal(c) + return string(out) +} + +// String implements the Stringer interface for a CommissionRates object. +func (cr CommissionRates) String() string { + out, _ := yaml.Marshal(cr) + return string(out) +} + +// String implements the Stringer interface for a DVPair object. +func (dv DVPair) String() string { + out, _ := yaml.Marshal(dv) + return string(out) +} + +// String implements the Stringer interface for a DVVTriplet object. +func (dvv DVVTriplet) String() string { + out, _ := yaml.Marshal(dvv) + return string(out) +} + +// String returns a human readable string representation of a Delegation. +func (d Delegation) String() string { + out, _ := yaml.Marshal(d) + return string(out) +} + +// Delegations is a collection of delegations +type Delegations []Delegation + +func (d Delegations) String() (out string) { + for _, del := range d { + out += del.String() + "\n" + } + + return strings.TrimSpace(out) +} + +// String implements the stringer interface for a UnbondingDelegationEntry. +func (e UnbondingDelegationEntry) String() string { + out, _ := yaml.Marshal(e) + return string(out) +} + +// String returns a human readable string representation of an UnbondingDelegation. +func (ubd UnbondingDelegation) String() string { + out := fmt.Sprintf(`Unbonding Delegations between: + Delegator: %s + Validator: %s + Entries:`, ubd.DelegatorAddress, ubd.ValidatorAddress) + for i, entry := range ubd.Entries { + out += fmt.Sprintf(` Unbonding Delegation %d: + Creation Height: %v + Min time to unbond (unix): %v + Expected balance: %s`, i, entry.CreationHeight, + entry.CompletionTime, entry.Balance) + } + + return out +} + +// UnbondingDelegations is a collection of UnbondingDelegation +type UnbondingDelegations []UnbondingDelegation + +func (ubds UnbondingDelegations) String() (out string) { + for _, u := range ubds { + out += u.String() + "\n" + } + + return strings.TrimSpace(out) +} + +// String implements the Stringer interface for a RedelegationEntry object. +func (e RedelegationEntry) String() string { + out, _ := yaml.Marshal(e) + return string(out) +} + +// String returns a human readable string representation of a Redelegation. +func (red Redelegation) String() string { + out := fmt.Sprintf(`Redelegations between: + Delegator: %s + Source Validator: %s + Destination Validator: %s + Entries: +`, + red.DelegatorAddress, red.ValidatorSrcAddress, red.ValidatorDstAddress, + ) + + for i, entry := range red.Entries { + out += fmt.Sprintf(` Redelegation Entry #%d: + Creation height: %v + Min time to unbond (unix): %v + Dest Shares: %s +`, + i, entry.CreationHeight, entry.CompletionTime, entry.SharesDst, + ) + } + + return strings.TrimRight(out, "\n") +} + +// Redelegations are a collection of Redelegation +type Redelegations []Redelegation + +func (d Redelegations) String() (out string) { + for _, red := range d { + out += red.String() + "\n" + } + + return strings.TrimSpace(out) +} + +// String implements the Stringer interface for DelegationResponse. +func (d DelegationResponse) String() string { + return fmt.Sprintf("%s\n Balance: %s", d.Delegation.String(), d.Balance) +} + +// String implements the Stringer interface for a Validator object. +func (v Validator) String() string { + out, _ := yaml.Marshal(v) + return string(out) +} + +func (v Validator) TokensFromShares(shares sdk.Dec) sdk.Dec { + return (shares.MulInt(v.Tokens)).Quo(v.DelegatorShares) +} + +// Validators is a collection of Validator +type Validators []Validator + +func (v Validators) String() (out string) { + for _, val := range v { + out += val.String() + "\n" + } + + return strings.TrimSpace(out) +} + +// String implements the Stringer interface for a Description object. +func (d Description) String() string { + out, _ := yaml.Marshal(d) + return string(out) +} diff --git a/x/staking/migrations/v043/store.go b/x/staking/migrations/v043/store.go new file mode 100644 index 00000000..2ebcbb86 --- /dev/null +++ b/x/staking/migrations/v043/store.go @@ -0,0 +1,79 @@ +package v043 + +import ( + "github.com/cosmos/cosmos-sdk/store/prefix" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" + v043distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v043" + v040staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v040" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// migratePrefixAddressAddressAddress is a helper function that migrates all keys of format: +// prefix_bytes | address_1_bytes | address_2_bytes | address_3_bytes +// into format: +// prefix_bytes | address_1_len (1 byte) | address_1_bytes | address_2_len (1 byte) | address_2_bytes | address_3_len (1 byte) | address_3_bytes +func migratePrefixAddressAddressAddress(store sdk.KVStore, prefixBz []byte) { + oldStore := prefix.NewStore(store, prefixBz) + + oldStoreIter := oldStore.Iterator(nil, nil) + defer oldStoreIter.Close() + + for ; oldStoreIter.Valid(); oldStoreIter.Next() { + addr1 := oldStoreIter.Key()[:v040auth.AddrLen] + addr2 := oldStoreIter.Key()[v040auth.AddrLen : 2*v040auth.AddrLen] + addr3 := oldStoreIter.Key()[2*v040auth.AddrLen:] + newStoreKey := append(append(append( + prefixBz, + address.MustLengthPrefix(addr1)...), address.MustLengthPrefix(addr2)...), address.MustLengthPrefix(addr3)..., + ) + + // Set new key on store. Values don't change. + store.Set(newStoreKey, oldStoreIter.Value()) + oldStore.Delete(oldStoreIter.Key()) + } +} + +const powerBytesLen = 8 + +func migrateValidatorsByPowerIndexKey(store sdk.KVStore) { + oldStore := prefix.NewStore(store, v040staking.ValidatorsByPowerIndexKey) + + oldStoreIter := oldStore.Iterator(nil, nil) + defer oldStoreIter.Close() + + for ; oldStoreIter.Valid(); oldStoreIter.Next() { + powerBytes := oldStoreIter.Key()[:powerBytesLen] + valAddr := oldStoreIter.Key()[powerBytesLen:] + newStoreKey := append(append(types.ValidatorsByPowerIndexKey, powerBytes...), address.MustLengthPrefix(valAddr)...) + + // Set new key on store. Values don't change. + store.Set(newStoreKey, oldStoreIter.Value()) + oldStore.Delete(oldStoreIter.Key()) + } +} + +// MigrateStore performs in-place store migrations from v0.40 to v0.43. The +// migration includes: +// +// - Setting the Power Reduction param in the paramstore +func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey) error { + store := ctx.KVStore(storeKey) + + v043distribution.MigratePrefixAddress(store, v040staking.LastValidatorPowerKey) + + v043distribution.MigratePrefixAddress(store, v040staking.ValidatorsKey) + v043distribution.MigratePrefixAddress(store, v040staking.ValidatorsByConsAddrKey) + migrateValidatorsByPowerIndexKey(store) + + v043distribution.MigratePrefixAddressAddress(store, v040staking.DelegationKey) + v043distribution.MigratePrefixAddressAddress(store, v040staking.UnbondingDelegationKey) + v043distribution.MigratePrefixAddressAddress(store, v040staking.UnbondingDelegationByValIndexKey) + migratePrefixAddressAddressAddress(store, v040staking.RedelegationKey) + migratePrefixAddressAddressAddress(store, v040staking.RedelegationByValSrcIndexKey) + migratePrefixAddressAddressAddress(store, v040staking.RedelegationByValDstIndexKey) + + return nil +} diff --git a/x/staking/migrations/v043/store_test.go b/x/staking/migrations/v043/store_test.go new file mode 100644 index 00000000..756590a5 --- /dev/null +++ b/x/staking/migrations/v043/store_test.go @@ -0,0 +1,138 @@ +package v043_test + +import ( + "bytes" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" + v040staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v040" + v043staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v043" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +func TestStoreMigration(t *testing.T) { + stakingKey := sdk.NewKVStoreKey("staking") + tStakingKey := sdk.NewTransientStoreKey("transient_test") + ctx := testutil.DefaultContext(stakingKey, tStakingKey) + store := ctx.KVStore(stakingKey) + + _, pk1, addr1 := testdata.KeyTestPubAddr() + valAddr1 := sdk.ValAddress(addr1) + val := teststaking.NewValidator(t, valAddr1, pk1) + _, pk1, addr2 := testdata.KeyTestPubAddr() + valAddr2 := sdk.ValAddress(addr2) + _, _, addr3 := testdata.KeyTestPubAddr() + consAddr := sdk.ConsAddress(addr3.String()) + _, _, addr4 := testdata.KeyTestPubAddr() + now := time.Now() + // Use dummy value for all keys. + value := []byte("foo") + + testCases := []struct { + name string + oldKey []byte + newKey []byte + }{ + { + "LastValidatorPowerKey", + v040staking.GetLastValidatorPowerKey(valAddr1), + types.GetLastValidatorPowerKey(valAddr1), + }, + { + "LastTotalPowerKey", + v040staking.LastTotalPowerKey, + types.LastTotalPowerKey, + }, + { + "ValidatorsKey", + v040staking.GetValidatorKey(valAddr1), + types.GetValidatorKey(valAddr1), + }, + { + "ValidatorsByConsAddrKey", + v040staking.GetValidatorByConsAddrKey(consAddr), + types.GetValidatorByConsAddrKey(consAddr), + }, + { + "ValidatorsByPowerIndexKey", + v040staking.GetValidatorsByPowerIndexKey(val), + types.GetValidatorsByPowerIndexKey(val, sdk.DefaultPowerReduction), + }, + { + "DelegationKey", + v040staking.GetDelegationKey(addr4, valAddr1), + types.GetDelegationKey(addr4, valAddr1), + }, + { + "UnbondingDelegationKey", + v040staking.GetUBDKey(addr4, valAddr1), + types.GetUBDKey(addr4, valAddr1), + }, + { + "UnbondingDelegationByValIndexKey", + v040staking.GetUBDByValIndexKey(addr4, valAddr1), + types.GetUBDByValIndexKey(addr4, valAddr1), + }, + { + "RedelegationKey", + v040staking.GetREDKey(addr4, valAddr1, valAddr2), + types.GetREDKey(addr4, valAddr1, valAddr2), + }, + { + "RedelegationByValSrcIndexKey", + v040staking.GetREDByValSrcIndexKey(addr4, valAddr1, valAddr2), + types.GetREDByValSrcIndexKey(addr4, valAddr1, valAddr2), + }, + { + "RedelegationByValDstIndexKey", + v040staking.GetREDByValDstIndexKey(addr4, valAddr1, valAddr2), + types.GetREDByValDstIndexKey(addr4, valAddr1, valAddr2), + }, + { + "UnbondingQueueKey", + v040staking.GetUnbondingDelegationTimeKey(now), + types.GetUnbondingDelegationTimeKey(now), + }, + { + "RedelegationQueueKey", + v040staking.GetRedelegationTimeKey(now), + types.GetRedelegationTimeKey(now), + }, + { + "ValidatorQueueKey", + v040staking.GetValidatorQueueKey(now, 4), + types.GetValidatorQueueKey(now, 4), + }, + { + "HistoricalInfoKey", + v040staking.GetHistoricalInfoKey(4), + types.GetHistoricalInfoKey(4), + }, + } + + // Set all the old keys to the store + for _, tc := range testCases { + store.Set(tc.oldKey, value) + } + + // Run migrations. + err := v043staking.MigrateStore(ctx, stakingKey) + require.NoError(t, err) + + // Make sure the new keys are set and old keys are deleted. + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + if !bytes.Equal(tc.oldKey, tc.newKey) { + require.Nil(t, store.Get(tc.oldKey)) + } + require.Equal(t, value, store.Get(tc.newKey)) + }) + } +} diff --git a/x/staking/migrations/v046/store.go b/x/staking/migrations/v046/store.go new file mode 100644 index 00000000..20825ec2 --- /dev/null +++ b/x/staking/migrations/v046/store.go @@ -0,0 +1,24 @@ +package v046 + +import ( + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// MigrateStore performs in-place store migrations from v0.43/v0.44 to v0.45. +// The migration includes: +// +// - Setting the MinCommissionRate param in the paramstore +func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.BinaryCodec, paramstore paramtypes.Subspace) error { + migrateParamsStore(ctx, paramstore) + + return nil +} + +func migrateParamsStore(ctx sdk.Context, paramstore paramtypes.Subspace) { + paramstore.WithKeyTable(types.ParamKeyTable()) + paramstore.Set(ctx, types.KeyMinCommissionRate, types.DefaultMinCommissionRate) +} diff --git a/x/staking/migrations/v046/store_test.go b/x/staking/migrations/v046/store_test.go new file mode 100644 index 00000000..6ac24a9e --- /dev/null +++ b/x/staking/migrations/v046/store_test.go @@ -0,0 +1,32 @@ +package v046_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + v046staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v046" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +func TestStoreMigration(t *testing.T) { + encCfg := simapp.MakeTestEncodingConfig() + stakingKey := sdk.NewKVStoreKey("staking") + tStakingKey := sdk.NewTransientStoreKey("transient_test") + ctx := testutil.DefaultContext(stakingKey, tStakingKey) + paramstore := paramtypes.NewSubspace(encCfg.Codec, encCfg.Amino, stakingKey, tStakingKey, "staking") + + // Check no params + require.False(t, paramstore.Has(ctx, types.KeyMinCommissionRate)) + + // Run migrations. + err := v046staking.MigrateStore(ctx, stakingKey, encCfg.Codec, paramstore) + require.NoError(t, err) + + // Make sure the new params are set. + require.True(t, paramstore.Has(ctx, types.KeyMinCommissionRate)) +} diff --git a/x/staking/module.go b/x/staking/module.go index 55984b3b..3bdeba6e 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -6,9 +6,8 @@ import ( "fmt" "math/rand" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" abci "github.com/tendermint/tendermint/abci/types" @@ -24,6 +23,10 @@ import ( "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) +const ( + consensusVersion uint64 = 3 +) + var ( _ module.AppModule = AppModule{} _ module.AppModuleBasic = AppModuleBasic{} @@ -69,12 +72,15 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncod } // RegisterRESTRoutes registers the REST routes for the staking module. -func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) { -} +// Deprecated: RegisterRESTRoutes is deprecated. `x/staking` legacy REST implementation +// has been removed from the SDK. +func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) {} // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the staking module. func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { - types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)) + if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)); err != nil { + panic(err) + } } // GetTxCmd returns the root tx command for the staking module. @@ -116,9 +122,9 @@ func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { keeper.RegisterInvariants(ir, am.keeper) } -// Route returns the message routing key for the staking module. +// Deprecated: Route returns the message routing key for the staking module. func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, NewHandler(am.keeper)) + return sdk.Route{} } // QuerierRoute returns the staking module's querier route name. @@ -139,6 +145,7 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { m := keeper.NewMigrator(am.keeper) cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) + cfg.RegisterMigration(types.ModuleName, 2, m.Migrate2to3) } // InitGenesis performs genesis initialization for the staking module. It returns @@ -159,7 +166,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements AppModule/ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } +func (AppModule) ConsensusVersion() uint64 { return consensusVersion } // BeginBlock returns the begin blocker for the staking module. func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { diff --git a/x/staking/module_test.go b/x/staking/module_test.go index 0ab9628a..3e102039 100644 --- a/x/staking/module_test.go +++ b/x/staking/module_test.go @@ -5,7 +5,10 @@ import ( "github.com/stretchr/testify/require" abcitypes "github.com/tendermint/tendermint/abci/types" + tmjson "github.com/tendermint/tendermint/libs/json" + "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + dbm "github.com/tendermint/tm-db" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" @@ -13,16 +16,22 @@ import ( ) func TestItCreatesModuleAccountOnInitBlock(t *testing.T) { - app := simapp.Setup(t, false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + db := dbm.NewMemDB() + encCdc := simapp.MakeTestEncodingConfig() + app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, encCdc, simapp.EmptyAppOptions{}) + + genesisState := simapp.GenesisStateWithSingleValidator(t, app) + stateBytes, err := tmjson.Marshal(genesisState) + require.NoError(t, err) app.InitChain( abcitypes.RequestInitChain{ - AppStateBytes: []byte("{}"), + AppStateBytes: stateBytes, ChainId: "test-chain-id", }, ) + ctx := app.BaseApp.NewContext(false, tmproto.Header{}) acc := app.AccountKeeper.GetAccount(ctx, authtypes.NewModuleAddress(types.BondedPoolName)) require.NotNil(t, acc) diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index 60252596..61536e97 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -143,7 +143,7 @@ func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k k // ensure the validator doesn't exist already _, found := k.GetValidator(ctx, address) if found { - return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCreateValidator, "unable to find validator"), nil, nil + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCreateValidator, "validator already exists"), nil, nil } denom := k.GetParams(ctx).BondDenom diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index e8958f82..179bca59 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -1,18 +1,26 @@ package simulation_test import ( + "math/big" "math/rand" "testing" "time" + "github.com/cosmos/cosmos-sdk/codec/legacy" + + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/bank/testutil" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" distrtypes "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -23,8 +31,9 @@ import ( // TestWeightedOperations tests the weights of the operations. func TestWeightedOperations(t *testing.T) { - - app, ctx := createTestApp(t, false) + s := rand.NewSource(1) + r := rand.New(s) + app, ctx, accs := createTestApp(t, false, r, 3) ctx.WithChainID("test-chain") @@ -35,10 +44,6 @@ func TestWeightedOperations(t *testing.T) { app.BankKeeper, app.StakingKeeper, ) - s := rand.NewSource(1) - r := rand.New(s) - accs := simtypes.RandomAccounts(r, 3) - expected := []struct { weight int opMsgRoute string @@ -67,12 +72,9 @@ func TestWeightedOperations(t *testing.T) { // TestSimulateMsgCreateValidator tests the normal scenario of a valid message of type TypeMsgCreateValidator. // Abonormal scenarios, where the message are created by an errors are not tested here. func TestSimulateMsgCreateValidator(t *testing.T) { - app, ctx := createTestApp(t, false) - - // setup 3 accounts s := rand.NewSource(1) r := rand.New(s) - accounts := getTestingAccounts(t, r, app, ctx, 3) + app, ctx, accounts := createTestApp(t, false, r, 3) // begin a new block app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash}}) @@ -83,7 +85,7 @@ func TestSimulateMsgCreateValidator(t *testing.T) { require.NoError(t, err) var msg types.MsgCreateValidator - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) require.True(t, operationMsg.OK) require.Equal(t, "0.080000000000000000", msg.Commission.MaxChangeRate.String()) @@ -99,14 +101,14 @@ func TestSimulateMsgCreateValidator(t *testing.T) { // TestSimulateMsgEditValidator tests the normal scenario of a valid message of type TypeMsgEditValidator. // Abonormal scenarios, where the message is created by an errors are not tested here. func TestSimulateMsgEditValidator(t *testing.T) { - app, ctx := createTestApp(t, false) + s := rand.NewSource(1) + r := rand.New(s) + app, ctx, accounts := createTestApp(t, false, r, 3) blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) - // setup 3 accounts - s := rand.NewSource(1) - r := rand.New(s) - accounts := getTestingAccounts(t, r, app, ctx, 3) + // remove genesis validator account + accounts = accounts[1:] // setup accounts[0] as validator _ = getTestingValidator0(t, app, ctx, accounts) @@ -120,7 +122,7 @@ func TestSimulateMsgEditValidator(t *testing.T) { require.NoError(t, err) var msg types.MsgEditValidator - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) require.True(t, operationMsg.OK) require.Equal(t, "0.280623462081924936", msg.CommissionRate.String()) @@ -129,28 +131,19 @@ func TestSimulateMsgEditValidator(t *testing.T) { require.Equal(t, "WeLrQKjLxz", msg.Description.Website) require.Equal(t, "rBqDOTtGTO", msg.Description.SecurityContact) require.Equal(t, types.TypeMsgEditValidator, msg.Type()) - require.Equal(t, "cosmosvaloper1tnh2q55v8wyygtt9srz5safamzdengsn9dsd7z", msg.ValidatorAddress) + require.Equal(t, "cosmosvaloper1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7epjs3u", msg.ValidatorAddress) require.Len(t, futureOperations, 0) } // TestSimulateMsgDelegate tests the normal scenario of a valid message of type TypeMsgDelegate. // Abonormal scenarios, where the message is created by an errors are not tested here. func TestSimulateMsgDelegate(t *testing.T) { - app, ctx := createTestApp(t, false) - blockTime := time.Now().UTC() - ctx = ctx.WithBlockTime(blockTime) - - // setup 3 accounts s := rand.NewSource(1) r := rand.New(s) - accounts := getTestingAccounts(t, r, app, ctx, 3) - - // setup accounts[0] as validator - validator0 := getTestingValidator0(t, app, ctx, accounts) - setupValidatorRewards(app, ctx, validator0.GetOperator()) + app, ctx, accounts := createTestApp(t, false, r, 3) - // begin a new block - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash, Time: blockTime}}) + blockTime := time.Now().UTC() + ctx = ctx.WithBlockTime(blockTime) // execute operation op := simulation.SimulateMsgDelegate(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) @@ -158,7 +151,7 @@ func TestSimulateMsgDelegate(t *testing.T) { require.NoError(t, err) var msg types.MsgDelegate - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) require.True(t, operationMsg.OK) require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) @@ -172,14 +165,15 @@ func TestSimulateMsgDelegate(t *testing.T) { // TestSimulateMsgUndelegate tests the normal scenario of a valid message of type TypeMsgUndelegate. // Abonormal scenarios, where the message is created by an errors are not tested here. func TestSimulateMsgUndelegate(t *testing.T) { - app, ctx := createTestApp(t, false) + s := rand.NewSource(1) + r := rand.New(s) + app, ctx, accounts := createTestApp(t, false, r, 3) + blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) - // setup 3 accounts - s := rand.NewSource(1) - r := rand.New(s) - accounts := getTestingAccounts(t, r, app, ctx, 3) + // remove genesis validator account + accounts = accounts[1:] // setup accounts[0] as validator validator0 := getTestingValidator0(t, app, ctx, accounts) @@ -203,29 +197,29 @@ func TestSimulateMsgUndelegate(t *testing.T) { require.NoError(t, err) var msg types.MsgUndelegate - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) require.True(t, operationMsg.OK) - require.Equal(t, "cosmos1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7u4x9a0", msg.DelegatorAddress) + require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) require.Equal(t, "280623462081924937", msg.Amount.Amount.String()) require.Equal(t, "stake", msg.Amount.Denom) require.Equal(t, types.TypeMsgUndelegate, msg.Type()) - require.Equal(t, "cosmosvaloper1tnh2q55v8wyygtt9srz5safamzdengsn9dsd7z", msg.ValidatorAddress) + require.Equal(t, "cosmosvaloper1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7epjs3u", msg.ValidatorAddress) require.Len(t, futureOperations, 0) - } // TestSimulateMsgBeginRedelegate tests the normal scenario of a valid message of type TypeMsgBeginRedelegate. // Abonormal scenarios, where the message is created by an errors, are not tested here. func TestSimulateMsgBeginRedelegate(t *testing.T) { - app, ctx := createTestApp(t, false) + s := rand.NewSource(12) + r := rand.New(s) + app, ctx, accounts := createTestApp(t, false, r, 4) + blockTime := time.Now().UTC() ctx = ctx.WithBlockTime(blockTime) - // setup 3 accounts - s := rand.NewSource(5) - r := rand.New(s) - accounts := getTestingAccounts(t, r, app, ctx, 3) + // remove genesis validator account + accounts = accounts[1:] // setup accounts[0] as validator0 and accounts[1] as validator1 validator0 := getTestingValidator0(t, app, ctx, accounts) @@ -252,45 +246,59 @@ func TestSimulateMsgBeginRedelegate(t *testing.T) { require.NoError(t, err) var msg types.MsgBeginRedelegate - types.ModuleCdc.UnmarshalJSON(operationMsg.Msg, &msg) + legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) require.True(t, operationMsg.OK) - require.Equal(t, "cosmos12gwd9jchc69wck8dhstxgwz3z8qs8yv67ps8mu", msg.DelegatorAddress) - require.Equal(t, "489348507626016866", msg.Amount.Amount.String()) + require.Equal(t, "cosmos1092v0qgulpejj8y8hs6dmlw82x9gv8f7jfc7jl", msg.DelegatorAddress) + require.Equal(t, "1883752832348281252", msg.Amount.Amount.String()) require.Equal(t, "stake", msg.Amount.Denom) require.Equal(t, types.TypeMsgBeginRedelegate, msg.Type()) - require.Equal(t, "cosmosvaloper1h6a7shta7jyc72hyznkys683z98z36e0zdk8g9", msg.ValidatorDstAddress) - require.Equal(t, "cosmosvaloper17s94pzwhsn4ah25tec27w70n65h5t2scgxzkv2", msg.ValidatorSrcAddress) + require.Equal(t, "cosmosvaloper1gnkw3uqzflagcqn6ekjwpjanlne928qhruemah", msg.ValidatorDstAddress) + require.Equal(t, "cosmosvaloper1kk653svg7ksj9fmu85x9ygj4jzwlyrgs89nnn2", msg.ValidatorSrcAddress) require.Len(t, futureOperations, 0) - } // returns context and an app with updated mint keeper -func createTestApp(t *testing.T, isCheckTx bool) (*simapp.SimApp, sdk.Context) { - // sdk.PowerReduction = sdk.NewIntFromBigInt(new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil)) - app := simapp.Setup(t, isCheckTx) +func createTestApp(t *testing.T, isCheckTx bool, r *rand.Rand, n int) (*simapp.SimApp, sdk.Context, []simtypes.Account) { + sdk.DefaultPowerReduction = sdk.NewIntFromBigInt(new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil)) + + accounts := simtypes.RandomAccounts(r, n) + // create validator set with single validator + account := accounts[0] + tmPk, err := cryptocodec.ToTmPubKeyInterface(account.PubKey) + require.NoError(t, err) + validator := tmtypes.NewValidator(tmPk, 1) + + valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) + + // generate genesis account + senderPrivKey := secp256k1.GenPrivKey() + acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) + balance := banktypes.Balance{ + Address: acc.GetAddress().String(), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100000000000000))), + } + + app := simapp.SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, balance) ctx := app.BaseApp.NewContext(isCheckTx, tmproto.Header{}) app.MintKeeper.SetParams(ctx, minttypes.DefaultParams()) app.MintKeeper.SetMinter(ctx, minttypes.DefaultInitialMinter()) - return app, ctx -} - -func getTestingAccounts(t *testing.T, r *rand.Rand, app *simapp.SimApp, ctx sdk.Context, n int) []simtypes.Account { - accounts := simtypes.RandomAccounts(r, n) - initAmt := app.StakingKeeper.TokensFromConsensusPower(ctx, 200) initCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, initAmt)) + // remove genesis validator account + accs := accounts[1:] + // add coins to the accounts - for _, account := range accounts { + for _, account := range accs { acc := app.AccountKeeper.NewAccountWithAddress(ctx, account.Address) app.AccountKeeper.SetAccount(ctx, acc) require.NoError(t, testutil.FundAccount(app.BankKeeper, ctx, account.Address, initCoins)) } - return accounts + return app, ctx, accounts } func getTestingValidator0(t *testing.T, app *simapp.SimApp, ctx sdk.Context, accounts []simtypes.Account) types.Validator { diff --git a/x/staking/spec/08_params.md b/x/staking/spec/08_params.md index a7f2c592..e4a56ab3 100644 --- a/x/staking/spec/08_params.md +++ b/x/staking/spec/08_params.md @@ -6,11 +6,11 @@ order: 8 The staking module contains the following parameters: -| Key | Type | Example | -|-------------------|------------------|-------------------| -| UnbondingTime | string (time ns) | "259200000000000" | -| MaxValidators | uint16 | 100 | -| KeyMaxEntries | uint16 | 7 | -| HistoricalEntries | uint16 | 3 | -| BondDenom | string | "stake" | -| PowerReduction | string | "1000000" | +| Key | Type | Example | +|-------------------|------------------|------------------------| +| UnbondingTime | string (time ns) | "259200000000000" | +| MaxValidators | uint16 | 100 | +| KeyMaxEntries | uint16 | 7 | +| HistoricalEntries | uint16 | 3 | +| BondDenom | string | "stake" | +| MinCommissionRate | string | "0.000000000000000000" | diff --git a/x/staking/spec/09_client.md b/x/staking/spec/09_client.md new file mode 100644 index 00000000..60870535 --- /dev/null +++ b/x/staking/spec/09_client.md @@ -0,0 +1,2088 @@ + + +# Client + +## CLI + +A user can query and interact with the `staking` module using the CLI. + +### Query + +The `query` commands allows users to query `staking` state. + +```bash +simd query staking --help +``` + +#### delegation + +The `delegation` command allows users to query delegations for an individual delegator on an individual validator. + +Usage: + +```bash +simd query staking delegation [delegator-addr] [validator-addr] [flags] +``` + +Example: + +```bash +simd query staking delegation cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +Example Output: + +```bash +balance: + amount: "10000000000" + denom: stake +delegation: + delegator_address: cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p + shares: "10000000000.000000000000000000" + validator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +#### delegations + +The `delegations` command allows users to query delegations for an individual delegator on all validators. + +Usage: + +```bash +simd query staking delegations [delegator-addr] [flags] +``` + +Example: + +```bash +simd query staking delegations cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p +``` + +Example Output: + +```bash +delegation_responses: +- balance: + amount: "10000000000" + denom: stake + delegation: + delegator_address: cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p + shares: "10000000000.000000000000000000" + validator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +- balance: + amount: "10000000000" + denom: stake + delegation: + delegator_address: cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p + shares: "10000000000.000000000000000000" + validator_address: cosmosvaloper1x20lytyf6zkcrv5edpkfkn8sz578qg5sqfyqnp +pagination: + next_key: null + total: "0" +``` + +#### delegations-to + +The `delegations-to` command allows users to query delegations on an individual validator. + +Usage: + +```bash +simd query staking delegations-to [validator-addr] [flags] +``` + +Example: + +```bash +simd query staking delegations-to cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +Example Output: + +```bash +- balance: + amount: "504000000" + denom: stake + delegation: + delegator_address: cosmos1q2qwwynhv8kh3lu5fkeex4awau9x8fwt45f5cp + shares: "504000000.000000000000000000" + validator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +- balance: + amount: "78125000000" + denom: uixo + delegation: + delegator_address: cosmos1qvppl3479hw4clahe0kwdlfvf8uvjtcd99m2ca + shares: "78125000000.000000000000000000" + validator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +pagination: + next_key: null + total: "0" +``` + +#### historical-info + +The `historical-info` command allows users to query historical information at given height. + +Usage: + +```bash +simd query staking historical-info [height] [flags] +``` + +Example: + +```bash +simd query staking historical-info 10 +``` + +Example Output: + +```bash +header: + app_hash: Lbx8cXpI868wz8sgp4qPYVrlaKjevR5WP/IjUxwp3oo= + chain_id: testnet + consensus_hash: BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8= + data_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= + evidence_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= + height: "10" + last_block_id: + hash: RFbkpu6pWfSThXxKKl6EZVDnBSm16+U0l0xVjTX08Fk= + part_set_header: + hash: vpIvXD4rxD5GM4MXGz0Sad9I7//iVYLzZsEU4BVgWIU= + total: 1 + last_commit_hash: Ne4uXyx4QtNp4Zx89kf9UK7oG9QVbdB6e7ZwZkhy8K0= + last_results_hash: 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= + next_validators_hash: nGBgKeWBjoxeKFti00CxHsnULORgKY4LiuQwBuUrhCs= + proposer_address: mMEP2c2IRPLr99LedSRtBg9eONM= + time: "2021-10-01T06:00:49.785790894Z" + validators_hash: nGBgKeWBjoxeKFti00CxHsnULORgKY4LiuQwBuUrhCs= + version: + app: "0" + block: "11" +valset: +- commission: + commission_rates: + max_change_rate: "0.010000000000000000" + max_rate: "0.200000000000000000" + rate: "0.100000000000000000" + update_time: "2021-10-01T05:52:50.380144238Z" + consensus_pubkey: + '@type': /cosmos.crypto.ed25519.PubKey + key: Auxs3865HpB/EfssYOzfqNhEJjzys2Fo6jD5B8tPgC8= + delegator_shares: "10000000.000000000000000000" + description: + details: "" + identity: "" + moniker: myvalidator + security_contact: "" + website: "" + jailed: false + min_self_delegation: "1" + operator_address: cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc + status: BOND_STATUS_BONDED + tokens: "10000000" + unbonding_height: "0" + unbonding_time: "1970-01-01T00:00:00Z" +``` + +#### params + +The `params` command allows users to query values set as staking parameters. + +Usage: + +```bash +simd query staking params [flags] +``` + +Example: + +```bash +simd query staking params +``` + +Example Output: + +```bash +bond_denom: stake +historical_entries: 10000 +max_entries: 7 +max_validators: 50 +unbonding_time: 1814400s +``` + +#### pool + +The `pool` command allows users to query values for amounts stored in the staking pool. + +Usage: + +```bash +simd q staking pool [flags] +``` + +Example: + +```bash +simd q staking pool +``` + +Example Output: + +```bash +bonded_tokens: "10000000" +not_bonded_tokens: "0" +``` + +#### redelegation + +The `redelegation` command allows users to query a redelegation record based on delegator and a source and destination validator address. + +Usage: + +```bash +simd query staking redelegation [delegator-addr] [src-validator-addr] [dst-validator-addr] [flags] +``` + +Example: + +```bash +simd query staking redelegation cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +Example Output: + +```bash +pagination: null +redelegation_responses: +- entries: + - balance: "50000000" + redelegation_entry: + completion_time: "2021-10-24T20:33:21.960084845Z" + creation_height: 2.382847e+06 + initial_balance: "50000000" + shares_dst: "50000000.000000000000000000" + - balance: "5000000000" + redelegation_entry: + completion_time: "2021-10-25T21:33:54.446846862Z" + creation_height: 2.397271e+06 + initial_balance: "5000000000" + shares_dst: "5000000000.000000000000000000" + redelegation: + delegator_address: cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p + entries: null + validator_dst_address: cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm + validator_src_address: cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm +``` + +#### redelegations + +The `redelegations` command allows users to query all redelegation records for an individual delegator. + +Usage: + +```bash +simd query staking redelegations [delegator-addr] [flags] +``` + +Example: + +```bash +simd query staking redelegation cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p +``` + +Example Output: + +```bash +pagination: + next_key: null + total: "0" +redelegation_responses: +- entries: + - balance: "50000000" + redelegation_entry: + completion_time: "2021-10-24T20:33:21.960084845Z" + creation_height: 2.382847e+06 + initial_balance: "50000000" + shares_dst: "50000000.000000000000000000" + - balance: "5000000000" + redelegation_entry: + completion_time: "2021-10-25T21:33:54.446846862Z" + creation_height: 2.397271e+06 + initial_balance: "5000000000" + shares_dst: "5000000000.000000000000000000" + redelegation: + delegator_address: cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p + entries: null + validator_dst_address: cosmosvaloper1uccl5ugxrm7vqlzwqr04pjd320d2fz0z3hc6vm + validator_src_address: cosmosvaloper1zppjyal5emta5cquje8ndkpz0rs046m7zqxrpp +- entries: + - balance: "562770000000" + redelegation_entry: + completion_time: "2021-10-25T21:42:07.336911677Z" + creation_height: 2.39735e+06 + initial_balance: "562770000000" + shares_dst: "562770000000.000000000000000000" + redelegation: + delegator_address: cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p + entries: null + validator_dst_address: cosmosvaloper1uccl5ugxrm7vqlzwqr04pjd320d2fz0z3hc6vm + validator_src_address: cosmosvaloper1zppjyal5emta5cquje8ndkpz0rs046m7zqxrpp +``` + +#### redelegations-from + +The `redelegations-from` command allows users to query delegations that are redelegating _from_ a validator. + +Usage: + +```bash +simd query staking redelegations-from [validator-addr] [flags] +``` + +Example: + +```bash +simd query staking redelegations-from cosmosvaloper1y4rzzrgl66eyhzt6gse2k7ej3zgwmngeleucjy +``` + +Example Output: + +```bash +pagination: + next_key: null + total: "0" +redelegation_responses: +- entries: + - balance: "50000000" + redelegation_entry: + completion_time: "2021-10-24T20:33:21.960084845Z" + creation_height: 2.382847e+06 + initial_balance: "50000000" + shares_dst: "50000000.000000000000000000" + - balance: "5000000000" + redelegation_entry: + completion_time: "2021-10-25T21:33:54.446846862Z" + creation_height: 2.397271e+06 + initial_balance: "5000000000" + shares_dst: "5000000000.000000000000000000" + redelegation: + delegator_address: cosmos1pm6e78p4pgn0da365plzl4t56pxy8hwtqp2mph + entries: null + validator_dst_address: cosmosvaloper1uccl5ugxrm7vqlzwqr04pjd320d2fz0z3hc6vm + validator_src_address: cosmosvaloper1y4rzzrgl66eyhzt6gse2k7ej3zgwmngeleucjy +- entries: + - balance: "221000000" + redelegation_entry: + completion_time: "2021-10-05T21:05:45.669420544Z" + creation_height: 2.120693e+06 + initial_balance: "221000000" + shares_dst: "221000000.000000000000000000" + redelegation: + delegator_address: cosmos1zqv8qxy2zgn4c58fz8jt8jmhs3d0attcussrf6 + entries: null + validator_dst_address: cosmosvaloper10mseqwnwtjaqfrwwp2nyrruwmjp6u5jhah4c3y + validator_src_address: cosmosvaloper1y4rzzrgl66eyhzt6gse2k7ej3zgwmngeleucjy +``` + +#### unbonding-delegation + +The `unbonding-delegation` command allows users to query unbonding delegations for an individual delegator on an individual validator. + +Usage: + +```bash +simd query staking unbonding-delegation [delegator-addr] [validator-addr] [flags] +``` + +Example: + +```bash +simd query staking unbonding-delegation cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +Example Output: + +```bash +delegator_address: cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p +entries: +- balance: "52000000" + completion_time: "2021-11-02T11:35:55.391594709Z" + creation_height: "55078" + initial_balance: "52000000" +validator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +#### unbonding-delegations + +The `unbonding-delegations` command allows users to query all unbonding-delegations records for one delegator. + +Usage: + +```bash +simd query staking unbonding-delegations [delegator-addr] [flags] +``` + +Example: + +```bash +simd query staking unbonding-delegations cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p +``` + +Example Output: + +```bash +pagination: + next_key: null + total: "0" +unbonding_responses: +- delegator_address: cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p + entries: + - balance: "52000000" + completion_time: "2021-11-02T11:35:55.391594709Z" + creation_height: "55078" + initial_balance: "52000000" + validator_address: cosmosvaloper1t8ehvswxjfn3ejzkjtntcyrqwvmvuknzmvtaaa + +``` + +#### unbonding-delegations-from + +The `unbonding-delegations-from` command allows users to query delegations that are unbonding _from_ a validator. + +Usage: + +```bash +simd query staking unbonding-delegations-from [validator-addr] [flags] +``` + +Example: + +```bash +simd query staking unbonding-delegations-from cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +Example Output: + +```bash +pagination: + next_key: null + total: "0" +unbonding_responses: +- delegator_address: cosmos1qqq9txnw4c77sdvzx0tkedsafl5s3vk7hn53fn + entries: + - balance: "150000000" + completion_time: "2021-11-01T21:41:13.098141574Z" + creation_height: "46823" + initial_balance: "150000000" + validator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +- delegator_address: cosmos1peteje73eklqau66mr7h7rmewmt2vt99y24f5z + entries: + - balance: "24000000" + completion_time: "2021-10-31T02:57:18.192280361Z" + creation_height: "21516" + initial_balance: "24000000" + validator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +#### validator + +The `validator` command allows users to query details about an individual validator. + +Usage: + +```bash +simd query staking validator [validator-addr] [flags] +``` + +Example: + +```bash +simd query staking validator cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +``` + +Example Output: + +```bash +commission: + commission_rates: + max_change_rate: "0.020000000000000000" + max_rate: "0.200000000000000000" + rate: "0.050000000000000000" + update_time: "2021-10-01T19:24:52.663191049Z" +consensus_pubkey: + '@type': /cosmos.crypto.ed25519.PubKey + key: sIiexdJdYWn27+7iUHQJDnkp63gq/rzUq1Y+fxoGjXc= +delegator_shares: "32948270000.000000000000000000" +description: + details: Witval is the validator arm from Vitwit. Vitwit is into software consulting + and services business since 2015. We are working closely with Cosmos ecosystem + since 2018. We are also building tools for the ecosystem, Aneka is our explorer + for the cosmos ecosystem. + identity: 51468B615127273A + moniker: Witval + security_contact: "" + website: "" +jailed: false +min_self_delegation: "1" +operator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj +status: BOND_STATUS_BONDED +tokens: "32948270000" +unbonding_height: "0" +unbonding_time: "1970-01-01T00:00:00Z" +``` + +#### validators + +The `validators` command allows users to query details about all validators on a network. + +Usage: + +```bash +simd query staking validators [flags] +``` + +Example: + +```bash +simd query staking validators +``` + +Example Output: + +```bash +pagination: + next_key: FPTi7TKAjN63QqZh+BaXn6gBmD5/ + total: "0" +validators: +commission: + commission_rates: + max_change_rate: "0.020000000000000000" + max_rate: "0.200000000000000000" + rate: "0.050000000000000000" + update_time: "2021-10-01T19:24:52.663191049Z" +consensus_pubkey: + '@type': /cosmos.crypto.ed25519.PubKey + key: sIiexdJdYWn27+7iUHQJDnkp63gq/rzUq1Y+fxoGjXc= +delegator_shares: "32948270000.000000000000000000" +description: + details: Witval is the validator arm from Vitwit. Vitwit is into software consulting + and services business since 2015. We are working closely with Cosmos ecosystem + since 2018. We are also building tools for the ecosystem, Aneka is our explorer + for the cosmos ecosystem. + identity: 51468B615127273A + moniker: Witval + security_contact: "" + website: "" + jailed: false + min_self_delegation: "1" + operator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj + status: BOND_STATUS_BONDED + tokens: "32948270000" + unbonding_height: "0" + unbonding_time: "1970-01-01T00:00:00Z" +- commission: + commission_rates: + max_change_rate: "0.100000000000000000" + max_rate: "0.200000000000000000" + rate: "0.050000000000000000" + update_time: "2021-10-04T18:02:21.446645619Z" + consensus_pubkey: + '@type': /cosmos.crypto.ed25519.PubKey + key: GDNpuKDmCg9GnhnsiU4fCWktuGUemjNfvpCZiqoRIYA= + delegator_shares: "559343421.000000000000000000" + description: + details: Noderunners is a professional validator in POS networks. We have a huge + node running experience, reliable soft and hardware. Our commissions are always + low, our support to delegators is always full. Stake with us and start receiving + your Cosmos rewards now! + identity: 812E82D12FEA3493 + moniker: Noderunners + security_contact: info@noderunners.biz + website: http://noderunners.biz + jailed: false + min_self_delegation: "1" + operator_address: cosmosvaloper1q5ku90atkhktze83j9xjaks2p7uruag5zp6wt7 + status: BOND_STATUS_BONDED + tokens: "559343421" + unbonding_height: "0" + unbonding_time: "1970-01-01T00:00:00Z" +``` + +### Transactions + +The `tx` commands allows users to interact with the `staking` module. + +```bash +simd tx staking --help +``` + +#### create-validator + +The command `create-validator` allows users to create new validator initialized with a self-delegation to it. + +Usage: + +```bash +simd tx staking create-validator [flags] +``` + +Example: + +```bash +simd tx staking create-validator \ + --amount=1000000stake \ + --pubkey=$(simd tendermint show-validator) \ + --moniker="my-moniker" \ + --website="https://myweb.site" \ + --details="description of your validator" \ + --chain-id="name_of_chain_id" \ + --commission-rate="0.10" \ + --commission-max-rate="0.20" \ + --commission-max-change-rate="0.01" \ + --min-self-delegation="1" \ + --gas="auto" \ + --gas-adjustment="1.2" \ + --gas-prices="0.025stake" \ + --from=mykey +``` + +#### delegate + +The command `delegate` allows users to delegate liquid tokens to a validator. + +Usage: + +```bash +simd tx staking delegate [validator-addr] [amount] [flags] +``` + +Example: + +```bash +simd tx staking delegate cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 1000stake --from mykey +``` + +#### edit-validator + +The command `edit-validator` allows users to edit an existing validator account. + +Usage: + +```bash +simd tx staking edit-validator [flags] +``` + +Example: + +```bash +simd tx staking edit-validator --moniker "new_moniker_name" --website "new_webiste_url" --from mykey +``` + +#### redelegate + +The command `redelegate` allows users to redelegate illiquid tokens from one validator to another. + +Usage: + +```bash +simd tx staking redelegate [src-validator-addr] [dst-validator-addr] [amount] [flags] +``` + +Example: + +```bash +simd tx staking redelegate cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj cosmosvaloper1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 100stake --from mykey +``` + +#### unbond + +The command `unbond` allows users to unbond shares from a validator. + +Usage: + +```bash +simd tx staking unbond [validator-addr] [amount] [flags] +``` + +Example: + +```bash +simd tx staking unbond cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake --from mykey +``` + +## gRPC + +A user can query the `staking` module using gRPC endpoints. + +### Validators + +The `Validators` endpoint queries all validators that match the given status. + +```bash +cosmos.staking.v1beta1.Query/Validators +``` + +Example: + +```bash +grpcurl -plaintext localhost:9090 cosmos.staking.v1beta1.Query/Validators +``` + +Example Output: + +```bash +{ + "validators": [ + { + "operatorAddress": "cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc", + "consensusPubkey": {"@type":"/cosmos.crypto.ed25519.PubKey","key":"Auxs3865HpB/EfssYOzfqNhEJjzys2Fo6jD5B8tPgC8="}, + "status": "BOND_STATUS_BONDED", + "tokens": "10000000", + "delegatorShares": "10000000000000000000000000", + "description": { + "moniker": "myvalidator" + }, + "unbondingTime": "1970-01-01T00:00:00Z", + "commission": { + "commissionRates": { + "rate": "100000000000000000", + "maxRate": "200000000000000000", + "maxChangeRate": "10000000000000000" + }, + "updateTime": "2021-10-01T05:52:50.380144238Z" + }, + "minSelfDelegation": "1" + } + ], + "pagination": { + "total": "1" + } +} +``` + +### Validator + +The `Validator` endpoint queries validator information for given validator address. + +```bash +cosmos.staking.v1beta1.Query/Validator +``` + +Example: + +```bash +grpcurl -plaintext -d '{"validator_addr":"cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/Validator +``` + +Example Output: + +```bash +{ + "validator": { + "operatorAddress": "cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc", + "consensusPubkey": {"@type":"/cosmos.crypto.ed25519.PubKey","key":"Auxs3865HpB/EfssYOzfqNhEJjzys2Fo6jD5B8tPgC8="}, + "status": "BOND_STATUS_BONDED", + "tokens": "10000000", + "delegatorShares": "10000000000000000000000000", + "description": { + "moniker": "myvalidator" + }, + "unbondingTime": "1970-01-01T00:00:00Z", + "commission": { + "commissionRates": { + "rate": "100000000000000000", + "maxRate": "200000000000000000", + "maxChangeRate": "10000000000000000" + }, + "updateTime": "2021-10-01T05:52:50.380144238Z" + }, + "minSelfDelegation": "1" + } +} +``` + +### ValidatorDelegations + +The `ValidatorDelegations` endpoint queries delegate information for given validator. + +```bash +cosmos.staking.v1beta1.Query/ValidatorDelegations +``` + +Example: + +```bash +grpcurl -plaintext -d '{"validator_addr":"cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/ValidatorDelegations +``` + +Example Output: + +```bash +{ + "delegationResponses": [ + { + "delegation": { + "delegatorAddress": "cosmos1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgy3ua5t", + "validatorAddress": "cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc", + "shares": "10000000000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "10000000" + } + } + ], + "pagination": { + "total": "1" + } +} +``` + +### ValidatorUnbondingDelegations + +The `ValidatorUnbondingDelegations` endpoint queries delegate information for given validator. + +```bash +cosmos.staking.v1beta1.Query/ValidatorUnbondingDelegations +``` + +Example: + +```bash +grpcurl -plaintext -d '{"validator_addr":"cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/ValidatorUnbondingDelegations +``` + +Example Output: + +```bash +{ + "unbonding_responses": [ + { + "delegator_address": "cosmos1z3pzzw84d6xn00pw9dy3yapqypfde7vg6965fy", + "validator_address": "cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc", + "entries": [ + { + "creation_height": "25325", + "completion_time": "2021-10-31T09:24:36.797320636Z", + "initial_balance": "20000000", + "balance": "20000000" + } + ] + }, + { + "delegator_address": "cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77", + "validator_address": "cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc", + "entries": [ + { + "creation_height": "13100", + "completion_time": "2021-10-30T12:53:02.272266791Z", + "initial_balance": "1000000", + "balance": "1000000" + } + ] + }, + ], + "pagination": { + "next_key": null, + "total": "8" + } +} +``` + +### Delegation + +The `Delegation` endpoint queries delegate information for given validator delegator pair. + +```bash +cosmos.staking.v1beta1.Query/Delegation +``` + +Example: + +```bash +grpcurl -plaintext \ +-d '{"delegator_addr": "cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77", validator_addr":"cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/Delegation +``` + +Example Output: + +```bash +{ + "delegation_response": + { + "delegation": + { + "delegator_address":"cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77", + "validator_address":"cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc", + "shares":"25083119936.000000000000000000" + }, + "balance": + { + "denom":"stake", + "amount":"25083119936" + } + } +} +``` + +### UnbondingDelegation + +The `UnbondingDelegation` endpoint queries unbonding information for given validator delegator. + +```bash +cosmos.staking.v1beta1.Query/UnbondingDelegation +``` + +Example: + +```bash +grpcurl -plaintext \ +-d '{"delegator_addr": "cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77", validator_addr":"cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/UnbondingDelegation +``` + +Example Output: + +```bash +{ + "unbond": { + "delegator_address": "cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77", + "validator_address": "cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc", + "entries": [ + { + "creation_height": "136984", + "completion_time": "2021-11-08T05:38:47.505593891Z", + "initial_balance": "400000000", + "balance": "400000000" + }, + { + "creation_height": "137005", + "completion_time": "2021-11-08T05:40:53.526196312Z", + "initial_balance": "385000000", + "balance": "385000000" + } + ] + } +} +``` + +### DelegatorDelegations + +The `DelegatorDelegations` endpoint queries all delegations of a given delegator address. + +```bash +cosmos.staking.v1beta1.Query/DelegatorDelegations +``` + +Example: + +```bash +grpcurl -plaintext \ +-d '{"delegator_addr": "cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/DelegatorDelegations +``` + +Example Output: + +```bash +{ + "delegation_responses": [ + {"delegation":{"delegator_address":"cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77","validator_address":"cosmosvaloper1eh5mwu044gd5ntkkc2xgfg8247mgc56fww3vc8","shares":"25083339023.000000000000000000"},"balance":{"denom":"stake","amount":"25083339023"}} + ], + "pagination": { + "next_key": null, + "total": "1" + } +} +``` + +### DelegatorUnbondingDelegations + +The `DelegatorUnbondingDelegations` endpoint queries all unbonding delegations of a given delegator address. + +```bash +cosmos.staking.v1beta1.Query/DelegatorUnbondingDelegations +``` + +Example: + +```bash +grpcurl -plaintext \ +-d '{"delegator_addr": "cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/DelegatorUnbondingDelegations +``` + +Example Output: + +```bash +{ + "unbonding_responses": [ + { + "delegator_address": "cosmos1y8nyfvmqh50p6ldpzljk3yrglppdv3t8phju77", + "validator_address": "cosmosvaloper1sjllsnramtg3ewxqwwrwjxfgc4n4ef9uxyejze", + "entries": [ + { + "creation_height": "136984", + "completion_time": "2021-11-08T05:38:47.505593891Z", + "initial_balance": "400000000", + "balance": "400000000" + }, + { + "creation_height": "137005", + "completion_time": "2021-11-08T05:40:53.526196312Z", + "initial_balance": "385000000", + "balance": "385000000" + } + ] + } + ], + "pagination": { + "next_key": null, + "total": "1" + } +} +``` + +### Redelegations + +The `Redelegations` endpoint queries redelegations of given address. + +```bash +cosmos.staking.v1beta1.Query/Redelegations +``` + +Example: + +```bash +grpcurl -plaintext \ +-d '{"delegator_addr": "cosmos1ld5p7hn43yuh8ht28gm9pfjgj2fctujp2tgwvf", "src_validator_addr" : "cosmosvaloper1j7euyj85fv2jugejrktj540emh9353ltgppc3g", "dst_validator_addr" : "cosmosvaloper1yy3tnegzmkdcm7czzcy3flw5z0zyr9vkkxrfse"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/Redelegations +``` + +Example Output: + +```bash +{ + "redelegation_responses": [ + { + "redelegation": { + "delegator_address": "cosmos1ld5p7hn43yuh8ht28gm9pfjgj2fctujp2tgwvf", + "validator_src_address": "cosmosvaloper1j7euyj85fv2jugejrktj540emh9353ltgppc3g", + "validator_dst_address": "cosmosvaloper1yy3tnegzmkdcm7czzcy3flw5z0zyr9vkkxrfse", + "entries": null + }, + "entries": [ + { + "redelegation_entry": { + "creation_height": 135932, + "completion_time": "2021-11-08T03:52:55.299147901Z", + "initial_balance": "2900000", + "shares_dst": "2900000.000000000000000000" + }, + "balance": "2900000" + } + ] + } + ], + "pagination": null +} +``` + +### DelegatorValidators + +The `DelegatorValidators` endpoint queries all validators information for given delegator. + +```bash +cosmos.staking.v1beta1.Query/DelegatorValidators +``` + +Example: + +```bash +grpcurl -plaintext \ +-d '{"delegator_addr": "cosmos1ld5p7hn43yuh8ht28gm9pfjgj2fctujp2tgwvf"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/DelegatorValidators +``` + +Example Output: + +```bash +{ + "validators": [ + { + "operator_address": "cosmosvaloper1eh5mwu044gd5ntkkc2xgfg8247mgc56fww3vc8", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "UPwHWxH1zHJWGOa/m6JB3f5YjHMvPQPkVbDqqi+U7Uw=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "347260647559", + "delegator_shares": "347260647559.000000000000000000", + "description": { + "moniker": "BouBouNode", + "identity": "", + "website": "https://boubounode.com", + "security_contact": "", + "details": "AI-based Validator. #1 AI Validator on Game of Stakes. Fairly priced. Don't trust (humans), verify. Made with BouBou love." + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.061000000000000000", + "max_rate": "0.300000000000000000", + "max_change_rate": "0.150000000000000000" + }, + "update_time": "2021-10-01T15:00:00Z" + }, + "min_self_delegation": "1" + } + ], + "pagination": { + "next_key": null, + "total": "1" + } +} +``` + +### DelegatorValidator + +The `DelegatorValidator` endpoint queries validator information for given delegator validator + +```bash +cosmos.staking.v1beta1.Query/DelegatorValidator +``` + +Example: + +```bash +grpcurl -plaintext \ +-d '{"delegator_addr": "cosmos1eh5mwu044gd5ntkkc2xgfg8247mgc56f3n8rr7", "validator_addr": "cosmosvaloper1eh5mwu044gd5ntkkc2xgfg8247mgc56fww3vc8"}' \ +localhost:9090 cosmos.staking.v1beta1.Query/DelegatorValidator +``` + +Example Output: + +```bash +{ + "validator": { + "operator_address": "cosmosvaloper1eh5mwu044gd5ntkkc2xgfg8247mgc56fww3vc8", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "UPwHWxH1zHJWGOa/m6JB3f5YjHMvPQPkVbDqqi+U7Uw=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "347262754841", + "delegator_shares": "347262754841.000000000000000000", + "description": { + "moniker": "BouBouNode", + "identity": "", + "website": "https://boubounode.com", + "security_contact": "", + "details": "AI-based Validator. #1 AI Validator on Game of Stakes. Fairly priced. Don't trust (humans), verify. Made with BouBou love." + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.061000000000000000", + "max_rate": "0.300000000000000000", + "max_change_rate": "0.150000000000000000" + }, + "update_time": "2021-10-01T15:00:00Z" + }, + "min_self_delegation": "1" + } +} +``` + +### HistoricalInfo + +```bash +cosmos.staking.v1beta1.Query/HistoricalInfo +``` + +Example: + +```bash +grpcurl -plaintext -d '{"height" : 1}' localhost:9090 cosmos.staking.v1beta1.Query/HistoricalInfo +``` + +Example Output: + +```bash +{ + "hist": { + "header": { + "version": { + "block": "11", + "app": "0" + }, + "chain_id": "simd-1", + "height": "140142", + "time": "2021-10-11T10:56:29.720079569Z", + "last_block_id": { + "hash": "9gri/4LLJUBFqioQ3NzZIP9/7YHR9QqaM6B2aJNQA7o=", + "part_set_header": { + "total": 1, + "hash": "Hk1+C864uQkl9+I6Zn7IurBZBKUevqlVtU7VqaZl1tc=" + } + }, + "last_commit_hash": "VxrcS27GtvGruS3I9+AlpT7udxIT1F0OrRklrVFSSKc=", + "data_hash": "80BjOrqNYUOkTnmgWyz9AQ8n7SoEmPVi4QmAe8RbQBY=", + "validators_hash": "95W49n2hw8RWpr1GPTAO5MSPi6w6Wjr3JjjS7AjpBho=", + "next_validators_hash": "95W49n2hw8RWpr1GPTAO5MSPi6w6Wjr3JjjS7AjpBho=", + "consensus_hash": "BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=", + "app_hash": "ZZaxnSY3E6Ex5Bvkm+RigYCK82g8SSUL53NymPITeOE=", + "last_results_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", + "evidence_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", + "proposer_address": "aH6dO428B+ItuoqPq70efFHrSMY=" + }, + "valset": [ + { + "operator_address": "cosmosvaloper196ax4vc0lwpxndu9dyhvca7jhxp70rmcqcnylw", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "/O7BtNW0pafwfvomgR4ZnfldwPXiFfJs9mHg3gwfv5Q=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "1426045203613", + "delegator_shares": "1426045203613.000000000000000000", + "description": { + "moniker": "SG-1", + "identity": "48608633F99D1B60", + "website": "https://sg-1.online", + "security_contact": "", + "details": "SG-1 - your favorite validator on Witval. We offer 100% Soft Slash protection." + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.037500000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.030000000000000000" + }, + "update_time": "2021-10-01T15:00:00Z" + }, + "min_self_delegation": "1" + } + ] + } +} + +``` + +### Pool + +The `Pool` endpoint queries the pool information. + +```bash +cosmos.staking.v1beta1.Query/Pool +``` + +Example: + +```bash +grpcurl -plaintext -d localhost:9090 cosmos.staking.v1beta1.Query/Pool +``` + +Example Output: + +```bash +{ + "pool": { + "not_bonded_tokens": "369054400189", + "bonded_tokens": "15657192425623" + } +} +``` + +### Params + +The `Params` endpoint queries the pool information. + +```bash +cosmos.staking.v1beta1.Query/Params +``` + +Example: + +```bash +grpcurl -plaintext localhost:9090 cosmos.staking.v1beta1.Query/Params +``` + +Example Output: + +```bash +{ + "params": { + "unbondingTime": "1814400s", + "maxValidators": 100, + "maxEntries": 7, + "historicalEntries": 10000, + "bondDenom": "stake" + } +} +``` + +## REST + +A user can query the `staking` module using REST endpoints. + +### DelegatorDelegations + +The `DelegtaorDelegations` REST endpoint queries all delegations of a given delegator address. + +```bash +/cosmos/staking/v1beta1/delegations/{delegatorAddr} +``` + +Example: + +```bash +curl -X GET "http://localhost:1317/cosmos/staking/v1beta1/delegations/cosmos1vcs68xf2tnqes5tg0khr0vyevm40ff6zdxatp5" -H "accept: application/json" +``` + +Example Output: + +```bash +{ + "delegation_responses": [ + { + "delegation": { + "delegator_address": "cosmos1vcs68xf2tnqes5tg0khr0vyevm40ff6zdxatp5", + "validator_address": "cosmosvaloper1quqxfrxkycr0uzt4yk0d57tcq3zk7srm7sm6r8", + "shares": "256250000.000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "256250000" + } + }, + { + "delegation": { + "delegator_address": "cosmos1vcs68xf2tnqes5tg0khr0vyevm40ff6zdxatp5", + "validator_address": "cosmosvaloper194v8uwee2fvs2s8fa5k7j03ktwc87h5ym39jfv", + "shares": "255150000.000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "255150000" + } + } + ], + "pagination": { + "next_key": null, + "total": "2" + } +} +``` + +### Redelegations + +The `Redelegations` REST endpoint queries redelegations of given address. + +```bash +/cosmos/staking/v1beta1/delegators/{delegatorAddr}/redelegations +``` + +Example: + +```bash +curl -X GET \ +"http://localhost:1317/cosmos/staking/v1beta1/delegators/cosmos1thfntksw0d35n2tkr0k8v54fr8wxtxwxl2c56e/redelegations?srcValidatorAddr=cosmosvaloper1lzhlnpahvznwfv4jmay2tgaha5kmz5qx4cuznf&dstValidatorAddr=cosmosvaloper1vq8tw77kp8lvxq9u3c8eeln9zymn68rng8pgt4" \ +-H "accept: application/json" +``` + +Example Output: + +```bash +{ + "redelegation_responses": [ + { + "redelegation": { + "delegator_address": "cosmos1thfntksw0d35n2tkr0k8v54fr8wxtxwxl2c56e", + "validator_src_address": "cosmosvaloper1lzhlnpahvznwfv4jmay2tgaha5kmz5qx4cuznf", + "validator_dst_address": "cosmosvaloper1vq8tw77kp8lvxq9u3c8eeln9zymn68rng8pgt4", + "entries": null + }, + "entries": [ + { + "redelegation_entry": { + "creation_height": 151523, + "completion_time": "2021-11-09T06:03:25.640682116Z", + "initial_balance": "200000000", + "shares_dst": "200000000.000000000000000000" + }, + "balance": "200000000" + } + ] + } + ], + "pagination": null +} +``` + +### DelegatorUnbondingDelegations + +The `DelegatorUnbondingDelegations` REST endpoint queries all unbonding delegations of a given delegator address. + +```bash +/cosmos/staking/v1beta1/delegators/{delegatorAddr}/unbonding_delegations +``` + +Example: + +```bash +curl -X GET \ +"http://localhost:1317/cosmos/staking/v1beta1/delegators/cosmos1nxv42u3lv642q0fuzu2qmrku27zgut3n3z7lll/unbonding_delegations" \ +-H "accept: application/json" +``` + +Example Output: + +```bash +{ + "unbonding_responses": [ + { + "delegator_address": "cosmos1nxv42u3lv642q0fuzu2qmrku27zgut3n3z7lll", + "validator_address": "cosmosvaloper1e7mvqlz50ch6gw4yjfemsc069wfre4qwmw53kq", + "entries": [ + { + "creation_height": "2442278", + "completion_time": "2021-10-12T10:59:03.797335857Z", + "initial_balance": "50000000000", + "balance": "50000000000" + } + ] + } + ], + "pagination": { + "next_key": null, + "total": "1" + } +} +``` + +### DelegatorValidators + +The `DelegatorValidators` REST endpoint queries all validators information for given delegator address. + +```bash +/cosmos/staking/v1beta1/delegators/{delegatorAddr}/validators +``` + +Example: + +```bash +curl -X GET \ +"http://localhost:1317/cosmos/staking/v1beta1/delegators/cosmos1xwazl8ftks4gn00y5x3c47auquc62ssune9ppv/validators" \ +-H "accept: application/json" +``` + +Example Output: + +```bash +{ + "validators": [ + { + "operator_address": "cosmosvaloper1xwazl8ftks4gn00y5x3c47auquc62ssuvynw64", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "5v4n3px3PkfNnKflSgepDnsMQR1hiNXnqOC11Y72/PQ=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "21592843799", + "delegator_shares": "21592843799.000000000000000000", + "description": { + "moniker": "jabbey", + "identity": "", + "website": "https://twitter.com/JoeAbbey", + "security_contact": "", + "details": "just another dad in the cosmos" + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.100000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.100000000000000000" + }, + "update_time": "2021-10-09T19:03:54.984821705Z" + }, + "min_self_delegation": "1" + } + ], + "pagination": { + "next_key": null, + "total": "1" + } +} +``` + +### DelegatorValidator + +The `DelegatorValidator` REST endpoint queries validator information for given delegator validator pair. + +```bash +/cosmos/staking/v1beta1/delegators/{delegatorAddr}/validators/{validatorAddr} +``` + +Example: + +```bash +curl -X GET \ +"http://localhost:1317/cosmos/staking/v1beta1/delegators/cosmos1xwazl8ftks4gn00y5x3c47auquc62ssune9ppv/validators/cosmosvaloper1xwazl8ftks4gn00y5x3c47auquc62ssuvynw64" \ +-H "accept: application/json" +``` + +Example Output: + +```bash +{ + "validator": { + "operator_address": "cosmosvaloper1xwazl8ftks4gn00y5x3c47auquc62ssuvynw64", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "5v4n3px3PkfNnKflSgepDnsMQR1hiNXnqOC11Y72/PQ=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "21592843799", + "delegator_shares": "21592843799.000000000000000000", + "description": { + "moniker": "jabbey", + "identity": "", + "website": "https://twitter.com/JoeAbbey", + "security_contact": "", + "details": "just another dad in the cosmos" + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.100000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.100000000000000000" + }, + "update_time": "2021-10-09T19:03:54.984821705Z" + }, + "min_self_delegation": "1" + } +} +``` + +### HistoricalInfo + +The `HistoricalInfo` REST endpoint queries the historical information for given height. + +```bash +/cosmos/staking/v1beta1/historical_info/{height} +``` + +Example: + +```bash +curl -X GET "http://localhost:1317/cosmos/staking/v1beta1/historical_info/153332" -H "accept: application/json" +``` + +Example Output: + +```bash +{ + "hist": { + "header": { + "version": { + "block": "11", + "app": "0" + }, + "chain_id": "cosmos-1", + "height": "153332", + "time": "2021-10-12T09:05:35.062230221Z", + "last_block_id": { + "hash": "NX8HevR5khb7H6NGKva+jVz7cyf0skF1CrcY9A0s+d8=", + "part_set_header": { + "total": 1, + "hash": "zLQ2FiKM5tooL3BInt+VVfgzjlBXfq0Hc8Iux/xrhdg=" + } + }, + "last_commit_hash": "P6IJrK8vSqU3dGEyRHnAFocoDGja0bn9euLuy09s350=", + "data_hash": "eUd+6acHWrNXYju8Js449RJ99lOYOs16KpqQl4SMrEM=", + "validators_hash": "mB4pravvMsJKgi+g8aYdSeNlt0kPjnRFyvtAQtaxcfw=", + "next_validators_hash": "mB4pravvMsJKgi+g8aYdSeNlt0kPjnRFyvtAQtaxcfw=", + "consensus_hash": "BICRvH3cKD93v7+R1zxE2ljD34qcvIZ0Bdi389qtoi8=", + "app_hash": "fuELArKRK+CptnZ8tu54h6xEleSWenHNmqC84W866fU=", + "last_results_hash": "p/BPexV4LxAzlVcPRvW+lomgXb6Yze8YLIQUo/4Kdgc=", + "evidence_hash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", + "proposer_address": "G0MeY8xQx7ooOsni8KE/3R/Ib3Q=" + }, + "valset": [ + { + "operator_address": "cosmosvaloper196ax4vc0lwpxndu9dyhvca7jhxp70rmcqcnylw", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "/O7BtNW0pafwfvomgR4ZnfldwPXiFfJs9mHg3gwfv5Q=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "1416521659632", + "delegator_shares": "1416521659632.000000000000000000", + "description": { + "moniker": "SG-1", + "identity": "48608633F99D1B60", + "website": "https://sg-1.online", + "security_contact": "", + "details": "SG-1 - your favorite validator on cosmos. We offer 100% Soft Slash protection." + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.037500000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.030000000000000000" + }, + "update_time": "2021-10-01T15:00:00Z" + }, + "min_self_delegation": "1" + }, + { + "operator_address": "cosmosvaloper1t8ehvswxjfn3ejzkjtntcyrqwvmvuknzmvtaaa", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "uExZyjNLtr2+FFIhNDAMcQ8+yTrqE7ygYTsI7khkA5Y=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "1348298958808", + "delegator_shares": "1348298958808.000000000000000000", + "description": { + "moniker": "Cosmostation", + "identity": "AE4C403A6E7AA1AC", + "website": "https://www.cosmostation.io", + "security_contact": "admin@stamper.network", + "details": "Cosmostation validator node. Delegate your tokens and Start Earning Staking Rewards" + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.050000000000000000", + "max_rate": "1.000000000000000000", + "max_change_rate": "0.200000000000000000" + }, + "update_time": "2021-10-01T15:06:38.821314287Z" + }, + "min_self_delegation": "1" + } + ] + } +} +``` + +### Parameters + +The `Parameters` REST endpoint queries the staking parameters. + +```bash +/cosmos/staking/v1beta1/params +``` + +Example: + +```bash +curl -X GET "http://localhost:1317/cosmos/staking/v1beta1/params" -H "accept: application/json" +``` + +Example Output: + +```bash +{ + "params": { + "unbonding_time": "2419200s", + "max_validators": 100, + "max_entries": 7, + "historical_entries": 10000, + "bond_denom": "stake" + } +} +``` + +### Pool + +The `Pool` REST endpoint queries the pool information. + +```bash +/cosmos/staking/v1beta1/pool +``` + +Example: + +```bash +curl -X GET "http://localhost:1317/cosmos/staking/v1beta1/pool" -H "accept: application/json" +``` + +Example Output: + +```bash +{ + "pool": { + "not_bonded_tokens": "432805737458", + "bonded_tokens": "15783637712645" + } +} +``` + +### Validators + +The `Validators` REST endpoint queries all validators that match the given status. + +```bash +/cosmos/staking/v1beta1/validators +``` + +Example: + +```bash +curl -X GET "http://localhost:1317/cosmos/staking/v1beta1/validators" -H "accept: application/json" +``` + +Example Output: + +```bash +{ + "validators": [ + { + "operator_address": "cosmosvaloper1q3jsx9dpfhtyqqgetwpe5tmk8f0ms5qywje8tw", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "N7BPyek2aKuNZ0N/8YsrqSDhGZmgVaYUBuddY8pwKaE=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "383301887799", + "delegator_shares": "383301887799.000000000000000000", + "description": { + "moniker": "SmartNodes", + "identity": "D372724899D1EDC8", + "website": "https://smartnodes.co", + "security_contact": "", + "details": "Earn Rewards with Crypto Staking & Node Deployment" + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.050000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.100000000000000000" + }, + "update_time": "2021-10-01T15:51:31.596618510Z" + }, + "min_self_delegation": "1" + }, + { + "operator_address": "cosmosvaloper1q5ku90atkhktze83j9xjaks2p7uruag5zp6wt7", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "GDNpuKDmCg9GnhnsiU4fCWktuGUemjNfvpCZiqoRIYA=" + }, + "jailed": false, + "status": "BOND_STATUS_UNBONDING", + "tokens": "1017819654", + "delegator_shares": "1017819654.000000000000000000", + "description": { + "moniker": "Noderunners", + "identity": "812E82D12FEA3493", + "website": "http://noderunners.biz", + "security_contact": "info@noderunners.biz", + "details": "Noderunners is a professional validator in POS networks. We have a huge node running experience, reliable soft and hardware. Our commissions are always low, our support to delegators is always full. Stake with us and start receiving your cosmos rewards now!" + }, + "unbonding_height": "147302", + "unbonding_time": "2021-11-08T22:58:53.718662452Z", + "commission": { + "commission_rates": { + "rate": "0.050000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.100000000000000000" + }, + "update_time": "2021-10-04T18:02:21.446645619Z" + }, + "min_self_delegation": "1" + } + ], + "pagination": { + "next_key": "FONDBFkE4tEEf7yxWWKOD49jC2NK", + "total": "2" + } +} +``` + +### Validator + +The `Validator` REST endpoint queries validator information for given validator address. + +```bash +/cosmos/staking/v1beta1/validators/{validatorAddr} +``` + +Example: + +```bash +curl -X GET \ +"http://localhost:1317/cosmos/staking/v1beta1/validators/cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q" \ +-H "accept: application/json" +``` + +Example Output: + +```bash +{ + "validator": { + "operator_address": "cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q", + "consensus_pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "sIiexdJdYWn27+7iUHQJDnkp63gq/rzUq1Y+fxoGjXc=" + }, + "jailed": false, + "status": "BOND_STATUS_BONDED", + "tokens": "33027900000", + "delegator_shares": "33027900000.000000000000000000", + "description": { + "moniker": "Witval", + "identity": "51468B615127273A", + "website": "", + "security_contact": "", + "details": "Witval is the validator arm from Vitwit. Vitwit is into software consulting and services business since 2015. We are working closely with Cosmos ecosystem since 2018. We are also building tools for the ecosystem, Aneka is our explorer for the cosmos ecosystem." + }, + "unbonding_height": "0", + "unbonding_time": "1970-01-01T00:00:00Z", + "commission": { + "commission_rates": { + "rate": "0.050000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.020000000000000000" + }, + "update_time": "2021-10-01T19:24:52.663191049Z" + }, + "min_self_delegation": "1" + } +} +``` + +### ValidatorDelegations + +The `ValidatorDelegations` REST endpoint queries delegate information for given validator. + +```bash +/cosmos/staking/v1beta1/validators/{validatorAddr}/delegations +``` + +Example: + +```bash +curl -X GET "http://localhost:1317/cosmos/staking/v1beta1/validators/cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q/delegations" -H "accept: application/json" +``` + +Example Output: + +```bash +{ + "delegation_responses": [ + { + "delegation": { + "delegator_address": "cosmos190g5j8aszqhvtg7cprmev8xcxs6csra7xnk3n3", + "validator_address": "cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q", + "shares": "31000000000.000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "31000000000" + } + }, + { + "delegation": { + "delegator_address": "cosmos1ddle9tczl87gsvmeva3c48nenyng4n56qwq4ee", + "validator_address": "cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q", + "shares": "628470000.000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "628470000" + } + }, + { + "delegation": { + "delegator_address": "cosmos10fdvkczl76m040smd33lh9xn9j0cf26kk4s2nw", + "validator_address": "cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q", + "shares": "838120000.000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "838120000" + } + }, + { + "delegation": { + "delegator_address": "cosmos1n8f5fknsv2yt7a8u6nrx30zqy7lu9jfm0t5lq8", + "validator_address": "cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q", + "shares": "500000000.000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "500000000" + } + }, + { + "delegation": { + "delegator_address": "cosmos16msryt3fqlxtvsy8u5ay7wv2p8mglfg9hrek2e", + "validator_address": "cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q", + "shares": "61310000.000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "61310000" + } + } + ], + "pagination": { + "next_key": null, + "total": "5" + } +} +``` + +### Delegation + +The `Delegation` REST endpoint queries delegate information for given validator delegator pair. + +```bash +/cosmos/staking/v1beta1/validators/{validatorAddr}/delegations/{delegatorAddr} +``` + +Example: + +```bash +curl -X GET \ +"http://localhost:1317/cosmos/staking/v1beta1/validators/cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q/delegations/cosmos1n8f5fknsv2yt7a8u6nrx30zqy7lu9jfm0t5lq8" \ +-H "accept: application/json" +``` + +Example Output: + +```bash +{ + "delegation_response": { + "delegation": { + "delegator_address": "cosmos1n8f5fknsv2yt7a8u6nrx30zqy7lu9jfm0t5lq8", + "validator_address": "cosmosvaloper16msryt3fqlxtvsy8u5ay7wv2p8mglfg9g70e3q", + "shares": "500000000.000000000000000000" + }, + "balance": { + "denom": "stake", + "amount": "500000000" + } + } +} +``` + +### UnbondingDelegation + +The `UnbondingDelegation` REST endpoint queries unbonding information for given validator delegator pair. + +```bash +/cosmos/staking/v1beta1/validators/{validatorAddr}/delegations/{delegatorAddr}/unbonding_delegation +``` + +Example: + +```bash +curl -X GET \ +"http://localhost:1317/cosmos/staking/v1beta1/validators/cosmosvaloper13v4spsah85ps4vtrw07vzea37gq5la5gktlkeu/delegations/cosmos1ze2ye5u5k3qdlexvt2e0nn0508p04094ya0qpm/unbonding_delegation" \ +-H "accept: application/json" +``` + +Example Output: + +```bash +{ + "unbond": { + "delegator_address": "cosmos1ze2ye5u5k3qdlexvt2e0nn0508p04094ya0qpm", + "validator_address": "cosmosvaloper13v4spsah85ps4vtrw07vzea37gq5la5gktlkeu", + "entries": [ + { + "creation_height": "153687", + "completion_time": "2021-11-09T09:41:18.352401903Z", + "initial_balance": "525111", + "balance": "525111" + } + ] + } +} +``` + +### ValidatorUnbondingDelegations + +The `ValidatorUnbondingDelegations` REST endpoint queries unbonding delegations of a validator. + +```bash +/cosmos/staking/v1beta1/validators/{validatorAddr}/unbonding_delegations +``` + +Example: + +```bash +curl -X GET \ +"http://localhost:1317/cosmos/staking/v1beta1/validators/cosmosvaloper13v4spsah85ps4vtrw07vzea37gq5la5gktlkeu/unbonding_delegations" \ +-H "accept: application/json" +``` + +Example Output: + +```bash +{ + "unbonding_responses": [ + { + "delegator_address": "cosmos1q9snn84jfrd9ge8t46kdcggpe58dua82vnj7uy", + "validator_address": "cosmosvaloper13v4spsah85ps4vtrw07vzea37gq5la5gktlkeu", + "entries": [ + { + "creation_height": "90998", + "completion_time": "2021-11-05T00:14:37.005841058Z", + "initial_balance": "24000000", + "balance": "24000000" + } + ] + }, + { + "delegator_address": "cosmos1qf36e6wmq9h4twhdvs6pyq9qcaeu7ye0s3dqq2", + "validator_address": "cosmosvaloper13v4spsah85ps4vtrw07vzea37gq5la5gktlkeu", + "entries": [ + { + "creation_height": "47478", + "completion_time": "2021-11-01T22:47:26.714116854Z", + "initial_balance": "8000000", + "balance": "8000000" + } + ] + } + ], + "pagination": { + "next_key": null, + "total": "2" + } +} +``` diff --git a/x/staking/teststaking/helper.go b/x/staking/teststaking/helper.go index 8cd892c5..6a148874 100644 --- a/x/staking/teststaking/helper.go +++ b/x/staking/teststaking/helper.go @@ -1,6 +1,7 @@ package teststaking import ( + "context" "testing" "time" @@ -14,12 +15,12 @@ import ( stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) -// Helper is a structure which wraps the staking handler +// Helper is a structure which wraps the staking message server // and provides methods useful in tests type Helper struct { - t *testing.T - h sdk.Handler - k keeper.Keeper + t *testing.T + msgSrvr stakingtypes.MsgServer + k keeper.Keeper Ctx sdk.Context Commission stakingtypes.CommissionRates @@ -27,18 +28,18 @@ type Helper struct { Denom string } -// NewHelper creates staking Handler wrapper for tests +// NewHelper creates a new instance of Helper. func NewHelper(t *testing.T, ctx sdk.Context, k keeper.Keeper) *Helper { - return &Helper{t, staking.NewHandler(k), k, ctx, ZeroCommission(), sdk.DefaultBondDenom} + return &Helper{t, keeper.NewMsgServerImpl(k), k, ctx, ZeroCommission(), sdk.DefaultBondDenom} } -// CreateValidator calls handler to create a new staking validator +// CreateValidator calls staking module `MsgServer/CreateValidator` to create a new validator func (sh *Helper) CreateValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount sdk.Int, ok bool) { coin := sdk.NewCoin(sh.Denom, stakeAmount) sh.createValidator(addr, pk, coin, ok) } -// CreateValidatorWithValPower calls handler to create a new staking validator with zero +// CreateValidatorWithValPower calls staking module `MsgServer/CreateValidator` to create a new validator with zero // commission func (sh *Helper) CreateValidatorWithValPower(addr sdk.ValAddress, pk cryptotypes.PubKey, valPower int64, ok bool) sdk.Int { amount := sh.k.TokensFromConsensusPower(sh.Ctx, valPower) @@ -55,31 +56,54 @@ func (sh *Helper) CreateValidatorMsg(addr sdk.ValAddress, pk cryptotypes.PubKey, return msg } +// CreateValidatorWithMsg calls staking module `MsgServer/CreateValidator` +func (sh *Helper) CreateValidatorWithMsg(ctx context.Context, msg *stakingtypes.MsgCreateValidator) (*stakingtypes.MsgCreateValidatorResponse, error) { + return sh.msgSrvr.CreateValidator(ctx, msg) +} + func (sh *Helper) createValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, coin sdk.Coin, ok bool) { msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt()) require.NoError(sh.t, err) - sh.Handle(msg, ok) + res, err := sh.msgSrvr.CreateValidator(sdk.WrapSDKContext(sh.Ctx), msg) + if ok { + require.NoError(sh.t, err) + require.NotNil(sh.t, res) + } else { + require.Error(sh.t, err) + require.Nil(sh.t, res) + } } -// Delegate calls handler to delegate stake for a validator +// Delegate calls staking module staking module `MsgServer/Delegate` to delegate stake for a validator func (sh *Helper) Delegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int) { coin := sdk.NewCoin(sh.Denom, amount) msg := stakingtypes.NewMsgDelegate(delegator, val, coin) - sh.Handle(msg, true) + res, err := sh.msgSrvr.Delegate(sdk.WrapSDKContext(sh.Ctx), msg) + require.NoError(sh.t, err) + require.NotNil(sh.t, res) } -// DelegateWithPower calls handler to delegate stake for a validator +// DelegateWithPower calls staking module `MsgServer/Delegate` to delegate stake for a validator func (sh *Helper) DelegateWithPower(delegator sdk.AccAddress, val sdk.ValAddress, power int64) { coin := sdk.NewCoin(sh.Denom, sh.k.TokensFromConsensusPower(sh.Ctx, power)) msg := stakingtypes.NewMsgDelegate(delegator, val, coin) - sh.Handle(msg, true) + res, err := sh.msgSrvr.Delegate(sdk.WrapSDKContext(sh.Ctx), msg) + require.NoError(sh.t, err) + require.NotNil(sh.t, res) } -// Undelegate calls handler to unbound some stake from a validator. -func (sh *Helper) Undelegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int, ok bool) *sdk.Result { +// Undelegate calls staking module `MsgServer/Undelegate` to unbound some stake from a validator. +func (sh *Helper) Undelegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int, ok bool) { unbondAmt := sdk.NewCoin(sh.Denom, amount) msg := stakingtypes.NewMsgUndelegate(delegator, val, unbondAmt) - return sh.Handle(msg, ok) + res, err := sh.msgSrvr.Undelegate(sdk.WrapSDKContext(sh.Ctx), msg) + if ok { + require.NoError(sh.t, err) + require.NotNil(sh.t, res) + } else { + require.Error(sh.t, err) + require.Nil(sh.t, res) + } } func (sh *Helper) TokenizeShares(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Coin, shareOwner sdk.AccAddress, ok bool) { @@ -89,7 +113,14 @@ func (sh *Helper) TokenizeShares(delegator sdk.AccAddress, val sdk.ValAddress, a Amount: amount, TokenizedShareOwner: shareOwner.String(), } - sh.Handle(msg, ok) + res, err := sh.msgSrvr.TokenizeShares(sdk.WrapSDKContext(sh.Ctx), msg) + if ok { + require.NoError(sh.t, err) + require.NotNil(sh.t, res) + } else { + require.Error(sh.t, err) + require.Nil(sh.t, res) + } } func (sh *Helper) RedeemTokensForShares(delegator sdk.AccAddress, amount sdk.Coin, ok bool) { @@ -97,7 +128,14 @@ func (sh *Helper) RedeemTokensForShares(delegator sdk.AccAddress, amount sdk.Coi DelegatorAddress: delegator.String(), Amount: amount, } - sh.Handle(msg, ok) + res, err := sh.msgSrvr.RedeemTokens(sdk.WrapSDKContext(sh.Ctx), msg) + if ok { + require.NoError(sh.t, err) + require.NotNil(sh.t, res) + } else { + require.Error(sh.t, err) + require.Nil(sh.t, res) + } } func (sh *Helper) TranserTokenizeShareRecord(recordId uint64, owner, newOwner sdk.AccAddress, ok bool) { @@ -106,12 +144,7 @@ func (sh *Helper) TranserTokenizeShareRecord(recordId uint64, owner, newOwner sd Sender: owner.String(), NewOwner: newOwner.String(), } - sh.Handle(msg, ok) -} - -// Handle calls staking handler on a given message -func (sh *Helper) Handle(msg sdk.Msg, ok bool) *sdk.Result { - res, err := sh.h(sh.Ctx, msg) + res, err := sh.msgSrvr.TransferTokenizeShareRecord(sdk.WrapSDKContext(sh.Ctx), msg) if ok { require.NoError(sh.t, err) require.NotNil(sh.t, res) @@ -119,7 +152,6 @@ func (sh *Helper) Handle(msg sdk.Msg, ok bool) *sdk.Result { require.Error(sh.t, err) require.Nil(sh.t, res) } - return res } // CheckValidator asserts that a validor exists and has a given status (if status!="") diff --git a/x/staking/types/codec.go b/x/staking/types/codec.go index 09063a52..62f2f9f4 100644 --- a/x/staking/types/codec.go +++ b/x/staking/types/codec.go @@ -2,8 +2,8 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/legacy" "github.com/cosmos/cosmos-sdk/codec/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/msgservice" "github.com/cosmos/cosmos-sdk/x/authz" @@ -12,14 +12,19 @@ import ( // RegisterLegacyAminoCodec registers the necessary x/staking interfaces and concrete types // on the provided LegacyAmino codec. These types are used for Amino JSON serialization. func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - cdc.RegisterConcrete(&MsgCreateValidator{}, "cosmos-sdk/MsgCreateValidator", nil) - cdc.RegisterConcrete(&MsgEditValidator{}, "cosmos-sdk/MsgEditValidator", nil) - cdc.RegisterConcrete(&MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil) - cdc.RegisterConcrete(&MsgUndelegate{}, "cosmos-sdk/MsgUndelegate", nil) - cdc.RegisterConcrete(&MsgBeginRedelegate{}, "cosmos-sdk/MsgBeginRedelegate", nil) + // cdc.RegisterConcrete(&MsgCreateValidator{}, "cosmos-sdk/MsgCreateValidator", nil) + // cdc.RegisterConcrete(&MsgEditValidator{}, "cosmos-sdk/MsgEditValidator", nil) + // cdc.RegisterConcrete(&MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil) + // cdc.RegisterConcrete(&MsgUndelegate{}, "cosmos-sdk/MsgUndelegate", nil) + // cdc.RegisterConcrete(&MsgBeginRedelegate{}, "cosmos-sdk/MsgBeginRedelegate", nil) cdc.RegisterConcrete(&MsgTokenizeShares{}, "cosmos-sdk/MsgTokenizeShares", nil) cdc.RegisterConcrete(&MsgRedeemTokensforShares{}, "cosmos-sdk/MsgRedeemTokensforShares", nil) cdc.RegisterConcrete(&MsgTransferTokenizeShareRecord{}, "cosmos-sdk/MsgTransferTokenizeShareRecord", nil) + + // cdc.RegisterInterface((*isStakeAuthorization_Validators)(nil), nil) + // cdc.RegisterConcrete(&StakeAuthorization_AllowList{}, "cosmos-sdk/StakeAuthorization/AllowList", nil) + // cdc.RegisterConcrete(&StakeAuthorization_DenyList{}, "cosmos-sdk/StakeAuthorization/DenyList", nil) + // cdc.RegisterConcrete(&StakeAuthorization{}, "cosmos-sdk/StakeAuthorization", nil) } // RegisterInterfaces registers the x/staking interfaces types with the interface registry @@ -42,20 +47,6 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } -var ( - amino = codec.NewLegacyAmino() - - // ModuleCdc references the global x/staking module codec. Note, the codec should - // ONLY be used in certain instances of tests and for JSON encoding as Amino is - // still used for that purpose. - // - // The actual codec used for serialization should be provided to x/staking and - // defined at the application level. - ModuleCdc = codec.NewAminoCodec(amino) -) - func init() { - RegisterLegacyAminoCodec(amino) - cryptocodec.RegisterCrypto(amino) - amino.Seal() + RegisterLegacyAminoCodec(legacy.Cdc) } diff --git a/x/staking/types/commission.go b/x/staking/types/commission.go index 54891b5d..3ff78868 100644 --- a/x/staking/types/commission.go +++ b/x/staking/types/commission.go @@ -3,9 +3,10 @@ package types import ( "time" - yaml "gopkg.in/yaml.v2" + "sigs.k8s.io/yaml" sdk "github.com/cosmos/cosmos-sdk/types" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" ) // NewCommissionRates returns an initialized validator commission rates. @@ -52,27 +53,27 @@ func (cr CommissionRates) Validate() error { switch { case cr.MaxRate.IsNegative(): // max rate cannot be negative - return ErrCommissionNegative + return sdkstaking.ErrCommissionNegative case cr.MaxRate.GT(sdk.OneDec()): // max rate cannot be greater than 1 - return ErrCommissionHuge + return sdkstaking.ErrCommissionHuge case cr.Rate.IsNegative(): // rate cannot be negative - return ErrCommissionNegative + return sdkstaking.ErrCommissionNegative case cr.Rate.GT(cr.MaxRate): // rate cannot be greater than the max rate - return ErrCommissionGTMaxRate + return sdkstaking.ErrCommissionGTMaxRate case cr.MaxChangeRate.IsNegative(): // change rate cannot be negative - return ErrCommissionChangeRateNegative + return sdkstaking.ErrCommissionChangeRateNegative case cr.MaxChangeRate.GT(cr.MaxRate): // change rate cannot be greater than the max rate - return ErrCommissionChangeRateGTMaxRate + return sdkstaking.ErrCommissionChangeRateGTMaxRate } return nil @@ -84,19 +85,19 @@ func (c Commission) ValidateNewRate(newRate sdk.Dec, blockTime time.Time) error switch { case blockTime.Sub(c.UpdateTime).Hours() < 24: // new rate cannot be changed more than once within 24 hours - return ErrCommissionUpdateTime + return sdkstaking.ErrCommissionUpdateTime case newRate.IsNegative(): // new rate cannot be negative - return ErrCommissionNegative + return sdkstaking.ErrCommissionNegative case newRate.GT(c.MaxRate): // new rate cannot be greater than the max rate - return ErrCommissionGTMaxRate + return sdkstaking.ErrCommissionGTMaxRate case newRate.Sub(c.Rate).GT(c.MaxChangeRate): // new rate % points change cannot be greater than the max change rate - return ErrCommissionGTMaxChangeRate + return sdkstaking.ErrCommissionGTMaxChangeRate } return nil diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index e2741320..1942fbb7 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -6,7 +6,7 @@ import ( "strings" "time" - yaml "gopkg.in/yaml.v2" + "sigs.k8s.io/yaml" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index 6989ea38..f2f0c92d 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -11,48 +11,49 @@ import ( // // REF: https://github.com/cosmos/cosmos-sdk/issues/5450 var ( - ErrEmptyValidatorAddr = sdkerrors.New(ModuleName, 2, "empty validator address") - ErrNoValidatorFound = sdkerrors.New(ModuleName, 3, "validator does not exist") - ErrValidatorOwnerExists = sdkerrors.New(ModuleName, 4, "validator already exist for this operator address; must use new validator operator address") - ErrValidatorPubKeyExists = sdkerrors.New(ModuleName, 5, "validator already exist for this pubkey; must use new validator pubkey") - ErrValidatorPubKeyTypeNotSupported = sdkerrors.New(ModuleName, 6, "validator pubkey type is not supported") - ErrValidatorJailed = sdkerrors.New(ModuleName, 7, "validator for this address is currently jailed") - ErrBadRemoveValidator = sdkerrors.New(ModuleName, 8, "failed to remove validator") - ErrCommissionNegative = sdkerrors.New(ModuleName, 9, "commission must be positive") - ErrCommissionHuge = sdkerrors.New(ModuleName, 10, "commission cannot be more than 100%") - ErrCommissionGTMaxRate = sdkerrors.New(ModuleName, 11, "commission cannot be more than the max rate") - ErrCommissionUpdateTime = sdkerrors.New(ModuleName, 12, "commission cannot be changed more than once in 24h") - ErrCommissionChangeRateNegative = sdkerrors.New(ModuleName, 13, "commission change rate must be positive") - ErrCommissionChangeRateGTMaxRate = sdkerrors.New(ModuleName, 14, "commission change rate cannot be more than the max rate") - ErrCommissionGTMaxChangeRate = sdkerrors.New(ModuleName, 15, "commission cannot be changed more than max change rate") - ErrSelfDelegationBelowMinimum = sdkerrors.New(ModuleName, 16, "validator's self delegation must be greater than their minimum self delegation") - ErrMinSelfDelegationDecreased = sdkerrors.New(ModuleName, 17, "minimum self delegation cannot be decrease") - ErrEmptyDelegatorAddr = sdkerrors.New(ModuleName, 18, "empty delegator address") - ErrNoDelegation = sdkerrors.New(ModuleName, 19, "no delegation for (address, validator) tuple") - ErrBadDelegatorAddr = sdkerrors.New(ModuleName, 20, "delegator does not exist with address") - ErrNoDelegatorForAddress = sdkerrors.New(ModuleName, 21, "delegator does not contain delegation") - ErrInsufficientShares = sdkerrors.New(ModuleName, 22, "insufficient delegation shares") - ErrDelegationValidatorEmpty = sdkerrors.New(ModuleName, 23, "cannot delegate to an empty validator") - ErrNotEnoughDelegationShares = sdkerrors.New(ModuleName, 24, "not enough delegation shares") - ErrNotMature = sdkerrors.New(ModuleName, 25, "entry not mature") - ErrNoUnbondingDelegation = sdkerrors.New(ModuleName, 26, "no unbonding delegation found") - ErrMaxUnbondingDelegationEntries = sdkerrors.New(ModuleName, 27, "too many unbonding delegation entries for (delegator, validator) tuple") - ErrNoRedelegation = sdkerrors.New(ModuleName, 28, "no redelegation found") - ErrSelfRedelegation = sdkerrors.New(ModuleName, 29, "cannot redelegate to the same validator") - ErrTinyRedelegationAmount = sdkerrors.New(ModuleName, 30, "too few tokens to redelegate (truncates to zero tokens)") - ErrBadRedelegationDst = sdkerrors.New(ModuleName, 31, "redelegation destination validator not found") - ErrTransitiveRedelegation = sdkerrors.New(ModuleName, 32, "redelegation to this validator already in progress; first redelegation to this validator must complete before next redelegation") - ErrMaxRedelegationEntries = sdkerrors.New(ModuleName, 33, "too many redelegation entries for (delegator, src-validator, dst-validator) tuple") - ErrDelegatorShareExRateInvalid = sdkerrors.New(ModuleName, 34, "cannot delegate to validators with invalid (zero) ex-rate") - ErrBothShareMsgsGiven = sdkerrors.New(ModuleName, 35, "both shares amount and shares percent provided") - ErrNeitherShareMsgsGiven = sdkerrors.New(ModuleName, 36, "neither shares amount nor shares percent provided") - ErrInvalidHistoricalInfo = sdkerrors.New(ModuleName, 37, "invalid historical info") - ErrNoHistoricalInfo = sdkerrors.New(ModuleName, 38, "no historical info found") - ErrEmptyValidatorPubKey = sdkerrors.New(ModuleName, 39, "empty validator public key") - ErrNotEnoughBalance = sdkerrors.New(ModuleName, 40, "not enough balance") - ErrTokenizeShareRecordNotExists = sdkerrors.New(ModuleName, 41, "tokenize share record not exists") - ErrTokenizeShareRecordAlreadyExists = sdkerrors.New(ModuleName, 42, "tokenize share record already exists") - ErrNotTokenizeShareRecordOwner = sdkerrors.New(ModuleName, 43, "not tokenize share record owner") - ErrExceedingFreeVestingDelegations = sdkerrors.New(ModuleName, 44, "trying to exceed vested free delegation for vesting account") - ErrOnlyBondDenomAllowdForTokenize = sdkerrors.New(ModuleName, 45, "only bond denom is allowed for tokenize") + // ErrEmptyValidatorAddr = sdkerrors.Register(ModuleName, 2, "empty validator address") + // ErrNoValidatorFound = sdkerrors.Register(ModuleName, 3, "validator does not exist") + // ErrValidatorOwnerExists = sdkerrors.Register(ModuleName, 4, "validator already exist for this operator address; must use new validator operator address") + // ErrValidatorPubKeyExists = sdkerrors.Register(ModuleName, 5, "validator already exist for this pubkey; must use new validator pubkey") + // ErrValidatorPubKeyTypeNotSupported = sdkerrors.Register(ModuleName, 6, "validator pubkey type is not supported") + // ErrValidatorJailed = sdkerrors.Register(ModuleName, 7, "validator for this address is currently jailed") + // ErrBadRemoveValidator = sdkerrors.Register(ModuleName, 8, "failed to remove validator") + // ErrCommissionNegative = sdkerrors.Register(ModuleName, 9, "commission must be positive") + // ErrCommissionHuge = sdkerrors.Register(ModuleName, 10, "commission cannot be more than 100%") + // ErrCommissionGTMaxRate = sdkerrors.Register(ModuleName, 11, "commission cannot be more than the max rate") + // ErrCommissionUpdateTime = sdkerrors.Register(ModuleName, 12, "commission cannot be changed more than once in 24h") + // ErrCommissionChangeRateNegative = sdkerrors.Register(ModuleName, 13, "commission change rate must be positive") + // ErrCommissionChangeRateGTMaxRate = sdkerrors.Register(ModuleName, 14, "commission change rate cannot be more than the max rate") + // ErrCommissionGTMaxChangeRate = sdkerrors.Register(ModuleName, 15, "commission cannot be changed more than max change rate") + // ErrSelfDelegationBelowMinimum = sdkerrors.Register(ModuleName, 16, "validator's self delegation must be greater than their minimum self delegation") + // ErrMinSelfDelegationDecreased = sdkerrors.Register(ModuleName, 17, "minimum self delegation cannot be decrease") + // ErrEmptyDelegatorAddr = sdkerrors.Register(ModuleName, 18, "empty delegator address") + // ErrNoDelegation = sdkerrors.Register(ModuleName, 19, "no delegation for (address, validator) tuple") + // ErrBadDelegatorAddr = sdkerrors.Register(ModuleName, 20, "delegator does not exist with address") + // ErrNoDelegatorForAddress = sdkerrors.Register(ModuleName, 21, "delegator does not contain delegation") + // ErrInsufficientShares = sdkerrors.Register(ModuleName, 22, "insufficient delegation shares") + // ErrDelegationValidatorEmpty = sdkerrors.Register(ModuleName, 23, "cannot delegate to an empty validator") + // ErrNotEnoughDelegationShares = sdkerrors.Register(ModuleName, 24, "not enough delegation shares") + // ErrNotMature = sdkerrors.Register(ModuleName, 25, "entry not mature") + // ErrNoUnbondingDelegation = sdkerrors.Register(ModuleName, 26, "no unbonding delegation found") + // ErrMaxUnbondingDelegationEntries = sdkerrors.Register(ModuleName, 27, "too many unbonding delegation entries for (delegator, validator) tuple") + // ErrNoRedelegation = sdkerrors.Register(ModuleName, 28, "no redelegation found") + // ErrSelfRedelegation = sdkerrors.Register(ModuleName, 29, "cannot redelegate to the same validator") + // ErrTinyRedelegationAmount = sdkerrors.Register(ModuleName, 30, "too few tokens to redelegate (truncates to zero tokens)") + // ErrBadRedelegationDst = sdkerrors.Register(ModuleName, 31, "redelegation destination validator not found") + // ErrTransitiveRedelegation = sdkerrors.Register(ModuleName, 32, "redelegation to this validator already in progress; first redelegation to this validator must complete before next redelegation") + // ErrMaxRedelegationEntries = sdkerrors.Register(ModuleName, 33, "too many redelegation entries for (delegator, src-validator, dst-validator) tuple") + // ErrDelegatorShareExRateInvalid = sdkerrors.Register(ModuleName, 34, "cannot delegate to validators with invalid (zero) ex-rate") + // ErrBothShareMsgsGiven = sdkerrors.Register(ModuleName, 35, "both shares amount and shares percent provided") + // ErrNeitherShareMsgsGiven = sdkerrors.Register(ModuleName, 36, "neither shares amount nor shares percent provided") + // ErrInvalidHistoricalInfo = sdkerrors.Register(ModuleName, 37, "invalid historical info") + // ErrNoHistoricalInfo = sdkerrors.Register(ModuleName, 38, "no historical info found") + // ErrEmptyValidatorPubKey = sdkerrors.Register(ModuleName, 39, "empty validator public key") + // ErrCommissionLTMinRate = sdkerrors.Register(ModuleName, 40, "commission cannot be less than min rate") + ErrNotEnoughBalance = sdkerrors.Register(ModuleName, 41, "not enough balance") + ErrTokenizeShareRecordNotExists = sdkerrors.Register(ModuleName, 42, "tokenize share record not exists") + ErrTokenizeShareRecordAlreadyExists = sdkerrors.Register(ModuleName, 43, "tokenize share record already exists") + ErrNotTokenizeShareRecordOwner = sdkerrors.Register(ModuleName, 44, "not tokenize share record owner") + ErrExceedingFreeVestingDelegations = sdkerrors.Register(ModuleName, 45, "trying to exceed vested free delegation for vesting account") + ErrOnlyBondDenomAllowdForTokenize = sdkerrors.Register(ModuleName, 46, "only bond denom is allowed for tokenize") ) diff --git a/x/staking/types/expected_keepers.go b/x/staking/types/expected_keepers.go index 60030dff..5e069656 100644 --- a/x/staking/types/expected_keepers.go +++ b/x/staking/types/expected_keepers.go @@ -64,7 +64,7 @@ type ValidatorSet interface { StakingTokenSupply(sdk.Context) sdk.Int // total staking token supply // slash the validator and delegators of the validator, specifying offence height, offence power, and slash fraction - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) sdk.Int Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator @@ -94,17 +94,17 @@ type DelegationSet interface { // StakingHooks event hooks for staking validator object (noalias) type StakingHooks interface { - AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) // Must be called when a validator is created - BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) // Must be called when a validator's state changes - AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) // Must be called when a validator is deleted - BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) // Must be called when tokenize share record is deleted - - AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) // Must be called when a validator is bonded - AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) // Must be called when a validator begins unbonding - - BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) // Must be called when a delegation is created - BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) // Must be called when a delegation's shares are modified - BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) // Must be called when a delegation is removed - AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) - BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) + AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error // Must be called when a validator is created + BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) error // Must be called when a validator's state changes + AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error // Must be called when a validator is deleted + BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) error // Must be called when tokenize share record is deleted + + AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error // Must be called when a validator is bonded + AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error // Must be called when a validator begins unbonding + + BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error // Must be called when a delegation is created + BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error // Must be called when a delegation's shares are modified + BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error // Must be called when a delegation is removed + AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error + BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) error } diff --git a/x/staking/types/exported.go b/x/staking/types/exported.go new file mode 100644 index 00000000..9599da10 --- /dev/null +++ b/x/staking/types/exported.go @@ -0,0 +1,40 @@ +package types + +import ( + tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// DelegationI delegation bond for a delegated proof of stake system +type DelegationI interface { + GetDelegatorAddr() sdk.AccAddress // delegator sdk.AccAddress for the bond + GetValidatorAddr() sdk.ValAddress // validator operator address + GetShares() sdk.Dec // amount of validator's shares held in this delegation +} + +// ValidatorI expected validator functions +type ValidatorI interface { + IsJailed() bool // whether the validator is jailed + GetMoniker() string // moniker of the validator + GetStatus() BondStatus // status of the validator + IsBonded() bool // check if has a bonded status + IsUnbonded() bool // check if has status unbonded + IsUnbonding() bool // check if has status unbonding + GetOperator() sdk.ValAddress // operator address to receive/return validators coins + ConsPubKey() (cryptotypes.PubKey, error) // validation consensus pubkey (cryptotypes.PubKey) + TmConsPublicKey() (tmprotocrypto.PublicKey, error) // validation consensus pubkey (Tendermint) + GetConsAddr() (sdk.ConsAddress, error) // validation consensus address + GetTokens() sdk.Int // validation tokens + GetBondedTokens() sdk.Int // validator bonded tokens + GetConsensusPower(sdk.Int) int64 // validation power in tendermint + GetCommission() sdk.Dec // validator commission rate + GetMinSelfDelegation() sdk.Int // validator minimum self delegation + GetDelegatorShares() sdk.Dec // total outstanding delegator shares + TokensFromShares(sdk.Dec) sdk.Dec // token worth of provided delegator shares + TokensFromSharesTruncated(sdk.Dec) sdk.Dec // token worth of provided delegator shares, truncated + TokensFromSharesRoundUp(sdk.Dec) sdk.Dec // token worth of provided delegator shares, rounded up + SharesFromTokens(amt sdk.Int) (sdk.Dec, error) // shares worth of delegator's bond + SharesFromTokensTruncated(amt sdk.Int) (sdk.Dec, error) // truncated shares worth of delegator's bond +} diff --git a/x/staking/types/historical_info.go b/x/staking/types/historical_info.go index 447a559b..fa6c96a0 100644 --- a/x/staking/types/historical_info.go +++ b/x/staking/types/historical_info.go @@ -10,6 +10,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" ) // NewHistoricalInfo will create a historical information struct from header and valset @@ -45,11 +46,11 @@ func UnmarshalHistoricalInfo(cdc codec.BinaryCodec, value []byte) (hi Historical // ValidateBasic will ensure HistoricalInfo is not nil and sorted func ValidateBasic(hi HistoricalInfo) error { if len(hi.Valset) == 0 { - return sdkerrors.Wrap(ErrInvalidHistoricalInfo, "validator set is empty") + return sdkerrors.Wrap(sdkstaking.ErrInvalidHistoricalInfo, "validator set is empty") } if !sort.IsSorted(Validators(hi.Valset)) { - return sdkerrors.Wrap(ErrInvalidHistoricalInfo, "validator set is not sorted by address") + return sdkerrors.Wrap(sdkstaking.ErrInvalidHistoricalInfo, "validator set is not sorted by address") } return nil diff --git a/x/staking/types/historical_info_test.go b/x/staking/types/historical_info_test.go index 237c7358..cede801a 100644 --- a/x/staking/types/historical_info_test.go +++ b/x/staking/types/historical_info_test.go @@ -5,6 +5,9 @@ import ( "sort" "testing" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/legacy" + "github.com/stretchr/testify/require" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" @@ -32,11 +35,11 @@ func TestHistoricalInfo(t *testing.T) { var value []byte require.NotPanics(t, func() { - value = types.ModuleCdc.MustMarshal(&hi) + value = legacy.Cdc.MustMarshal(&hi) }) require.NotNil(t, value, "Marshalled HistoricalInfo is nil") - recv, err := types.UnmarshalHistoricalInfo(types.ModuleCdc, value) + recv, err := types.UnmarshalHistoricalInfo(codec.NewAminoCodec(legacy.Cdc), value) require.Nil(t, err, "Unmarshalling HistoricalInfo failed") require.Equal(t, hi.Header, recv.Header) for i := range hi.Valset { diff --git a/x/staking/types/hooks.go b/x/staking/types/hooks.go index f90d7d92..4cf17cdd 100644 --- a/x/staking/types/hooks.go +++ b/x/staking/types/hooks.go @@ -5,64 +5,102 @@ import ( ) // combine multiple staking hooks, all hook functions are run in array sequence +var _ StakingHooks = &MultiStakingHooks{} + type MultiStakingHooks []StakingHooks func NewMultiStakingHooks(hooks ...StakingHooks) MultiStakingHooks { return hooks } -func (h MultiStakingHooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { +func (h MultiStakingHooks) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error { for i := range h { - h[i].AfterValidatorCreated(ctx, valAddr) + if err := h[i].AfterValidatorCreated(ctx, valAddr); err != nil { + return err + } } + + return nil } -func (h MultiStakingHooks) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) { +func (h MultiStakingHooks) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) error { for i := range h { - h[i].BeforeValidatorModified(ctx, valAddr) + if err := h[i].BeforeValidatorModified(ctx, valAddr); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +func (h MultiStakingHooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { for i := range h { - h[i].AfterValidatorRemoved(ctx, consAddr, valAddr) + if err := h[i].AfterValidatorRemoved(ctx, consAddr, valAddr); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) { + +func (h MultiStakingHooks) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64) error { for i := range h { - h[i].BeforeTokenizeShareRecordRemoved(ctx, recordId) + if err := h[i].BeforeTokenizeShareRecordRemoved(ctx, recordId); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { + +func (h MultiStakingHooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { for i := range h { - h[i].AfterValidatorBonded(ctx, consAddr, valAddr) + if err := h[i].AfterValidatorBonded(ctx, consAddr, valAddr); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +func (h MultiStakingHooks) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { for i := range h { - h[i].AfterValidatorBeginUnbonding(ctx, consAddr, valAddr) + if err := h[i].AfterValidatorBeginUnbonding(ctx, consAddr, valAddr); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (h MultiStakingHooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { for i := range h { - h[i].BeforeDelegationCreated(ctx, delAddr, valAddr) + if err := h[i].BeforeDelegationCreated(ctx, delAddr, valAddr); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (h MultiStakingHooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { for i := range h { - h[i].BeforeDelegationSharesModified(ctx, delAddr, valAddr) + if err := h[i].BeforeDelegationSharesModified(ctx, delAddr, valAddr); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (h MultiStakingHooks) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { for i := range h { - h[i].BeforeDelegationRemoved(ctx, delAddr, valAddr) + if err := h[i].BeforeDelegationRemoved(ctx, delAddr, valAddr); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +func (h MultiStakingHooks) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { for i := range h { - h[i].AfterDelegationModified(ctx, delAddr, valAddr) + if err := h[i].AfterDelegationModified(ctx, delAddr, valAddr); err != nil { + return err + } } + return nil } -func (h MultiStakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) { +func (h MultiStakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) error { for i := range h { - h[i].BeforeValidatorSlashed(ctx, valAddr, fraction) + if err := h[i].BeforeValidatorSlashed(ctx, valAddr, fraction); err != nil { + return err + } } + return nil } diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index 09adf7af..a95fb50d 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -9,6 +9,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/address" + "github.com/cosmos/cosmos-sdk/types/kv" ) const ( @@ -68,11 +69,13 @@ func GetValidatorByConsAddrKey(addr sdk.ConsAddress) []byte { // AddressFromValidatorsKey creates the validator operator address from ValidatorsKey func AddressFromValidatorsKey(key []byte) []byte { + kv.AssertKeyAtLeastLength(key, 3) return key[2:] // remove prefix bytes and address length } // AddressFromLastValidatorPowerKey creates the validator operator address from LastValidatorPowerKey func AddressFromLastValidatorPowerKey(key []byte) []byte { + kv.AssertKeyAtLeastLength(key, 3) return key[2:] // remove prefix bytes and address length } @@ -201,10 +204,13 @@ func GetUBDByValIndexKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte // GetUBDKeyFromValIndexKey rearranges the ValIndexKey to get the UBDKey func GetUBDKeyFromValIndexKey(indexKey []byte) []byte { + kv.AssertKeyAtLeastLength(indexKey, 2) addrs := indexKey[1:] // remove prefix bytes valAddrLen := addrs[0] + kv.AssertKeyAtLeastLength(addrs, 2+int(valAddrLen)) valAddr := addrs[1 : 1+valAddrLen] + kv.AssertKeyAtLeastLength(addrs, 3+int(valAddrLen)) delAddr := addrs[valAddrLen+2:] return GetUBDKey(delAddr, valAddr) @@ -278,12 +284,16 @@ func GetREDByValDstIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.V // GetREDKeyFromValSrcIndexKey rearranges the ValSrcIndexKey to get the REDKey func GetREDKeyFromValSrcIndexKey(indexKey []byte) []byte { // note that first byte is prefix byte, which we remove + kv.AssertKeyAtLeastLength(indexKey, 2) addrs := indexKey[1:] valSrcAddrLen := addrs[0] + kv.AssertKeyAtLeastLength(addrs, int(valSrcAddrLen)+2) valSrcAddr := addrs[1 : valSrcAddrLen+1] delAddrLen := addrs[valSrcAddrLen+1] + kv.AssertKeyAtLeastLength(addrs, int(valSrcAddrLen)+int(delAddrLen)+2) delAddr := addrs[valSrcAddrLen+2 : valSrcAddrLen+2+delAddrLen] + kv.AssertKeyAtLeastLength(addrs, int(valSrcAddrLen)+int(delAddrLen)+4) valDstAddr := addrs[valSrcAddrLen+delAddrLen+3:] return GetREDKey(delAddr, valSrcAddr, valDstAddr) @@ -292,12 +302,16 @@ func GetREDKeyFromValSrcIndexKey(indexKey []byte) []byte { // GetREDKeyFromValDstIndexKey rearranges the ValDstIndexKey to get the REDKey func GetREDKeyFromValDstIndexKey(indexKey []byte) []byte { // note that first byte is prefix byte, which we remove + kv.AssertKeyAtLeastLength(indexKey, 2) addrs := indexKey[1:] valDstAddrLen := addrs[0] + kv.AssertKeyAtLeastLength(addrs, int(valDstAddrLen)+2) valDstAddr := addrs[1 : valDstAddrLen+1] delAddrLen := addrs[valDstAddrLen+1] + kv.AssertKeyAtLeastLength(addrs, int(valDstAddrLen)+int(delAddrLen)+3) delAddr := addrs[valDstAddrLen+2 : valDstAddrLen+2+delAddrLen] + kv.AssertKeyAtLeastLength(addrs, int(valDstAddrLen)+int(delAddrLen)+4) valSrcAddr := addrs[valDstAddrLen+delAddrLen+3:] return GetREDKey(delAddr, valSrcAddr, valDstAddr) diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index 6a3948cc..dc214fb5 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -1,12 +1,12 @@ package types import ( - "bytes" - + "github.com/cosmos/cosmos-sdk/codec/legacy" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" ) // staking message types @@ -70,17 +70,13 @@ func (msg MsgCreateValidator) Type() string { return TypeMsgCreateValidator } // sign the msg as well. func (msg MsgCreateValidator) GetSigners() []sdk.AccAddress { // delegator is first signer so delegator pays fees - delAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) - if err != nil { - panic(err) - } - addrs := []sdk.AccAddress{delAddr} - addr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) - if err != nil { - panic(err) - } - if !bytes.Equal(delAddr.Bytes(), addr.Bytes()) { - addrs = append(addrs, sdk.AccAddress(addr)) + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + addrs := []sdk.AccAddress{delegator} + valAddr, _ := sdk.ValAddressFromBech32(msg.ValidatorAddress) + + valAccAddr := sdk.AccAddress(valAddr) + if !delegator.Equals(valAccAddr) { + addrs = append(addrs, valAccAddr) } return addrs @@ -88,35 +84,27 @@ func (msg MsgCreateValidator) GetSigners() []sdk.AccAddress { // GetSignBytes returns the message bytes to sign over. func (msg MsgCreateValidator) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } // ValidateBasic implements the sdk.Msg interface. func (msg MsgCreateValidator) ValidateBasic() error { - // note that unmarshaling from bech32 ensures either empty or valid + // note that unmarshaling from bech32 ensures both non-empty and valid delAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) if err != nil { - return err - } - if delAddr.Empty() { - return ErrEmptyDelegatorAddr - } - - if msg.ValidatorAddress == "" { - return ErrEmptyValidatorAddr + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) } - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) if err != nil { - return err + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } if !sdk.AccAddress(valAddr).Equals(delAddr) { return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "validator address is invalid") } if msg.Pubkey == nil { - return ErrEmptyValidatorPubKey + return sdkstaking.ErrEmptyValidatorPubKey } if !msg.Value.IsValid() || !msg.Value.Amount.IsPositive() { @@ -143,7 +131,7 @@ func (msg MsgCreateValidator) ValidateBasic() error { } if msg.Value.Amount.LT(msg.MinSelfDelegation) { - return ErrSelfDelegationBelowMinimum + return sdkstaking.ErrSelfDelegationBelowMinimum } return nil @@ -174,23 +162,20 @@ func (msg MsgEditValidator) Type() string { return TypeMsgEditValidator } // GetSigners implements the sdk.Msg interface. func (msg MsgEditValidator) GetSigners() []sdk.AccAddress { - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) - if err != nil { - panic(err) - } - return []sdk.AccAddress{valAddr.Bytes()} + valAddr, _ := sdk.ValAddressFromBech32(msg.ValidatorAddress) + return []sdk.AccAddress{sdk.AccAddress(valAddr)} } // GetSignBytes implements the sdk.Msg interface. func (msg MsgEditValidator) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } // ValidateBasic implements the sdk.Msg interface. func (msg MsgEditValidator) ValidateBasic() error { - if msg.ValidatorAddress == "" { - return ErrEmptyValidatorAddr + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } if msg.Description == (Description{}) { @@ -231,27 +216,23 @@ func (msg MsgDelegate) Type() string { return TypeMsgDelegate } // GetSigners implements the sdk.Msg interface. func (msg MsgDelegate) GetSigners() []sdk.AccAddress { - delAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) - if err != nil { - panic(err) - } - return []sdk.AccAddress{delAddr} + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + return []sdk.AccAddress{delegator} } // GetSignBytes implements the sdk.Msg interface. func (msg MsgDelegate) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } // ValidateBasic implements the sdk.Msg interface. func (msg MsgDelegate) ValidateBasic() error { - if msg.DelegatorAddress == "" { - return ErrEmptyDelegatorAddr + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) } - - if msg.ValidatorAddress == "" { - return ErrEmptyValidatorAddr + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } if !msg.Amount.IsValid() || !msg.Amount.Amount.IsPositive() { @@ -285,31 +266,26 @@ func (msg MsgBeginRedelegate) Type() string { return TypeMsgBeginRedelegate } // GetSigners implements the sdk.Msg interface func (msg MsgBeginRedelegate) GetSigners() []sdk.AccAddress { - delAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) - if err != nil { - panic(err) - } - return []sdk.AccAddress{delAddr} + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + return []sdk.AccAddress{delegator} } // GetSignBytes implements the sdk.Msg interface. func (msg MsgBeginRedelegate) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } // ValidateBasic implements the sdk.Msg interface. func (msg MsgBeginRedelegate) ValidateBasic() error { - if msg.DelegatorAddress == "" { - return ErrEmptyDelegatorAddr + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) } - - if msg.ValidatorSrcAddress == "" { - return ErrEmptyValidatorAddr + if _, err := sdk.ValAddressFromBech32(msg.ValidatorSrcAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid source validator address: %s", err) } - - if msg.ValidatorDstAddress == "" { - return ErrEmptyValidatorAddr + if _, err := sdk.ValAddressFromBech32(msg.ValidatorDstAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid destination validator address: %s", err) } if !msg.Amount.IsValid() || !msg.Amount.Amount.IsPositive() { @@ -340,27 +316,23 @@ func (msg MsgUndelegate) Type() string { return TypeMsgUndelegate } // GetSigners implements the sdk.Msg interface. func (msg MsgUndelegate) GetSigners() []sdk.AccAddress { - delAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) - if err != nil { - panic(err) - } - return []sdk.AccAddress{delAddr} + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + return []sdk.AccAddress{delegator} } // GetSignBytes implements the sdk.Msg interface. func (msg MsgUndelegate) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } // ValidateBasic implements the sdk.Msg interface. func (msg MsgUndelegate) ValidateBasic() error { - if msg.DelegatorAddress == "" { - return ErrEmptyDelegatorAddr + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) } - - if msg.ValidatorAddress == "" { - return ErrEmptyValidatorAddr + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) } if !msg.Amount.IsValid() || !msg.Amount.Amount.IsPositive() { @@ -382,7 +354,7 @@ func (msg MsgTokenizeShares) GetSigners() []sdk.AccAddress { } func (msg MsgTokenizeShares) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } @@ -416,7 +388,7 @@ func (msg MsgRedeemTokensforShares) GetSigners() []sdk.AccAddress { } func (msg MsgRedeemTokensforShares) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } @@ -444,7 +416,7 @@ func (msg MsgTransferTokenizeShareRecord) GetSigners() []sdk.AccAddress { } func (msg MsgTransferTokenizeShareRecord) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(&msg) + bz := legacy.Cdc.MustMarshalJSON(&msg) return sdk.MustSortJSON(bz) } diff --git a/x/staking/types/params_test.go b/x/staking/types/params_test.go index 0c50ad2a..46e809bb 100644 --- a/x/staking/types/params_test.go +++ b/x/staking/types/params_test.go @@ -5,6 +5,7 @@ import ( "github.com/stretchr/testify/require" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -21,3 +22,17 @@ func TestParamsEqual(t *testing.T) { ok = p1.Equal(p2) require.False(t, ok) } + +func Test_validateParams(t *testing.T) { + params := types.DefaultParams() + + // default params have no error + require.NoError(t, params.Validate()) + + // validate mincommision + params.MinCommissionRate = sdk.NewDec(-1) + require.Error(t, params.Validate()) + + params.MinCommissionRate = sdk.NewDec(2) + require.Error(t, params.Validate()) +} diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index b006f25d..a9e951f3 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -9,7 +9,7 @@ import ( abci "github.com/tendermint/tendermint/abci/types" tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - "gopkg.in/yaml.v2" + "sigs.k8s.io/yaml" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -63,7 +63,16 @@ func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey, descriptio // String implements the Stringer interface for a Validator object. func (v Validator) String() string { - out, _ := yaml.Marshal(v) + bz, err := codec.ProtoMarshalJSON(&v, nil) + if err != nil { + panic(err) + } + + out, err := yaml.JSONToYAML(bz) + if err != nil { + panic(err) + } + return string(out) } @@ -321,7 +330,7 @@ func (v Validator) TokensFromSharesRoundUp(shares sdk.Dec) sdk.Dec { // returns an error if the validator has no tokens. func (v Validator) SharesFromTokens(amt sdk.Int) (sdk.Dec, error) { if v.Tokens.IsZero() { - return sdk.ZeroDec(), ErrInsufficientShares + return sdk.ZeroDec(), sdkstaking.ErrInsufficientShares } return v.GetDelegatorShares().MulInt(amt).QuoInt(v.GetTokens()), nil @@ -331,7 +340,7 @@ func (v Validator) SharesFromTokens(amt sdk.Int) (sdk.Dec, error) { // a bond amount. It returns an error if the validator has no tokens. func (v Validator) SharesFromTokensTruncated(amt sdk.Int) (sdk.Dec, error) { if v.Tokens.IsZero() { - return sdk.ZeroDec(), ErrInsufficientShares + return sdk.ZeroDec(), sdkstaking.ErrInsufficientShares } return v.GetDelegatorShares().MulInt(amt).QuoTruncate(v.GetTokens().ToDec()), nil From 312b2b72f95c054a9ccfb54f06160d68e8b02455 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 24 Mar 2022 13:11:43 +1000 Subject: [PATCH 07/57] resolve unit tests --- x/distribution/simulation/operations_test.go | 3 +- x/slashing/types/msg_test.go | 3 +- x/staking/simulation/operations.go | 17 +- x/staking/simulation/operations_test.go | 462 +++++++++---------- 4 files changed, 241 insertions(+), 244 deletions(-) diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index 91cdee85..37794480 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -10,11 +10,11 @@ import ( abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/bank/testutil" simapp "github.com/iqlusioninc/liquidity-staking-module/app" + simappparams "github.com/iqlusioninc/liquidity-staking-module/app/params" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" distrtypes "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" @@ -44,6 +44,7 @@ func (suite *SimTestSuite) TestWeightedOperations() { {simappparams.DefaultWeightMsgWithdrawDelegationReward, types.ModuleName, types.TypeMsgWithdrawDelegatorReward}, {simappparams.DefaultWeightMsgWithdrawValidatorCommission, types.ModuleName, types.TypeMsgWithdrawValidatorCommission}, {simappparams.DefaultWeightMsgFundCommunityPool, types.ModuleName, types.TypeMsgFundCommunityPool}, + {simulation.DefaultWeightMsgWithdrawTokenizeShareRecordReward, types.ModuleName, types.TypeMsgWithdrawTokenizeShareRecordReward}, } for i, w := range weightesOps { diff --git a/x/slashing/types/msg_test.go b/x/slashing/types/msg_test.go index 31f7a70e..b326c44c 100644 --- a/x/slashing/types/msg_test.go +++ b/x/slashing/types/msg_test.go @@ -6,11 +6,12 @@ import ( "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" + sdkslashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" ) func TestMsgUnjailGetSignBytes(t *testing.T) { addr := sdk.AccAddress("abcd") - msg := NewMsgUnjail(sdk.ValAddress(addr)) + msg := sdkslashingtypes.NewMsgUnjail(sdk.ValAddress(addr)) bytes := msg.GetSignBytes() require.Equal( t, diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index 61536e97..c7ac31d4 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -10,6 +10,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -173,7 +174,7 @@ func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k k } } - description := types.NewDescription( + description := sdkstaking.NewDescription( simtypes.RandStringOfLength(r, 10), simtypes.RandStringOfLength(r, 10), simtypes.RandStringOfLength(r, 10), @@ -182,13 +183,13 @@ func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k k ) maxCommission := sdk.NewDecWithPrec(int64(simtypes.RandIntBetween(r, 0, 100)), 2) - commission := types.NewCommissionRates( + commission := sdkstaking.NewCommissionRates( simtypes.RandomDecAmount(r, maxCommission), maxCommission, simtypes.RandomDecAmount(r, maxCommission), ) - msg, err := types.NewMsgCreateValidator(address, simAccount.ConsKey.PubKey(), selfDelegation, description, commission, sdk.OneInt()) + msg, err := sdkstaking.NewMsgCreateValidator(address, simAccount.ConsKey.PubKey(), selfDelegation, description, commission, sdk.OneInt()) if err != nil { return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to create CreateValidator message"), nil, err } @@ -240,7 +241,7 @@ func SimulateMsgEditValidator(ak types.AccountKeeper, bk types.BankKeeper, k kee account := ak.GetAccount(ctx, simAccount.Address) spendable := bk.SpendableCoins(ctx, account.GetAddress()) - description := types.NewDescription( + description := sdkstaking.NewDescription( simtypes.RandStringOfLength(r, 10), simtypes.RandStringOfLength(r, 10), simtypes.RandStringOfLength(r, 10), @@ -248,7 +249,7 @@ func SimulateMsgEditValidator(ak types.AccountKeeper, bk types.BankKeeper, k kee simtypes.RandStringOfLength(r, 10), ) - msg := types.NewMsgEditValidator(address, description, &newCommissionRate, nil) + msg := sdkstaking.NewMsgEditValidator(address, description, &newCommissionRate, nil) txCtx := simulation.OperationInput{ R: r, @@ -315,7 +316,7 @@ func SimulateMsgDelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.K } } - msg := types.NewMsgDelegate(simAccount.Address, val.GetOperator(), bondAmt) + msg := sdkstaking.NewMsgDelegate(simAccount.Address, val.GetOperator(), bondAmt) txCtx := simulation.OperationInput{ App: app, @@ -372,7 +373,7 @@ func SimulateMsgUndelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUndelegate, "unbond amount is zero"), nil, nil } - msg := types.NewMsgUndelegate( + msg := sdkstaking.NewMsgUndelegate( delAddr, valAddr, sdk.NewCoin(k.BondDenom(ctx), unbondAmt), ) @@ -490,7 +491,7 @@ func SimulateMsgBeginRedelegate(ak types.AccountKeeper, bk types.BankKeeper, k k account := ak.GetAccount(ctx, delAddr) spendable := bk.SpendableCoins(ctx, account.GetAddress()) - msg := types.NewMsgBeginRedelegate( + msg := sdkstaking.NewMsgBeginRedelegate( delAddr, srcAddr, destAddr, sdk.NewCoin(k.BondDenom(ctx), redAmt), ) diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index 179bca59..666eb417 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -4,18 +4,13 @@ import ( "math/big" "math/rand" "testing" - "time" - - "github.com/cosmos/cosmos-sdk/codec/legacy" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -24,239 +19,238 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" distrtypes "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) -// TestWeightedOperations tests the weights of the operations. -func TestWeightedOperations(t *testing.T) { - s := rand.NewSource(1) - r := rand.New(s) - app, ctx, accs := createTestApp(t, false, r, 3) - - ctx.WithChainID("test-chain") - - cdc := app.AppCodec() - appParams := make(simtypes.AppParams) - - weightesOps := simulation.WeightedOperations(appParams, cdc, app.AccountKeeper, - app.BankKeeper, app.StakingKeeper, - ) - - expected := []struct { - weight int - opMsgRoute string - opMsgName string - }{{simappparams.DefaultWeightMsgCreateValidator, types.ModuleName, types.TypeMsgCreateValidator}, - {simappparams.DefaultWeightMsgEditValidator, types.ModuleName, types.TypeMsgEditValidator}, - {simappparams.DefaultWeightMsgDelegate, types.ModuleName, types.TypeMsgDelegate}, - {simappparams.DefaultWeightMsgUndelegate, types.ModuleName, types.TypeMsgUndelegate}, - {simappparams.DefaultWeightMsgBeginRedelegate, types.ModuleName, types.TypeMsgBeginRedelegate}, - {simulation.DefaultWeightMsgTokenizeShares, types.ModuleName, types.TypeMsgTokenizeShares}, - {simulation.DefaultWeightMsgRedeemTokensforShares, types.ModuleName, types.TypeMsgRedeemTokensforShares}, - {simulation.DefaultWeightMsgTransferTokenizeShareRecord, types.ModuleName, types.TypeMsgTransferTokenizeShareRecord}, - } - - for i, w := range weightesOps { - operationMsg, _, _ := w.Op()(r, app.BaseApp, ctx, accs, ctx.ChainID()) - // the following checks are very much dependent from the ordering of the output given - // by WeightedOperations. if the ordering in WeightedOperations changes some tests - // will fail - require.Equal(t, expected[i].weight, w.Weight(), "weight should be the same") - require.Equal(t, expected[i].opMsgRoute, operationMsg.Route, "route should be the same") - require.Equal(t, expected[i].opMsgName, operationMsg.Name, "operation Msg name should be the same") - } -} - -// TestSimulateMsgCreateValidator tests the normal scenario of a valid message of type TypeMsgCreateValidator. -// Abonormal scenarios, where the message are created by an errors are not tested here. -func TestSimulateMsgCreateValidator(t *testing.T) { - s := rand.NewSource(1) - r := rand.New(s) - app, ctx, accounts := createTestApp(t, false, r, 3) - - // begin a new block - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash}}) - - // execute operation - op := simulation.SimulateMsgCreateValidator(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) - operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") - require.NoError(t, err) - - var msg types.MsgCreateValidator - legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) - - require.True(t, operationMsg.OK) - require.Equal(t, "0.080000000000000000", msg.Commission.MaxChangeRate.String()) - require.Equal(t, "0.080000000000000000", msg.Commission.MaxRate.String()) - require.Equal(t, "0.019527679037870745", msg.Commission.Rate.String()) - require.Equal(t, types.TypeMsgCreateValidator, msg.Type()) - require.Equal(t, []byte{0xa, 0x20, 0x51, 0xde, 0xbd, 0xe8, 0xfa, 0xdf, 0x4e, 0xfc, 0x33, 0xa5, 0x16, 0x94, 0xf6, 0xee, 0xd3, 0x69, 0x7a, 0x7a, 0x1c, 0x2d, 0x50, 0xb6, 0x2, 0xf7, 0x16, 0x4e, 0x66, 0x9f, 0xff, 0x38, 0x91, 0x9b}, msg.Pubkey.Value) - require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) - require.Equal(t, "cosmosvaloper1ghekyjucln7y67ntx7cf27m9dpuxxemnsvnaes", msg.ValidatorAddress) - require.Len(t, futureOperations, 0) -} - -// TestSimulateMsgEditValidator tests the normal scenario of a valid message of type TypeMsgEditValidator. -// Abonormal scenarios, where the message is created by an errors are not tested here. -func TestSimulateMsgEditValidator(t *testing.T) { - s := rand.NewSource(1) - r := rand.New(s) - app, ctx, accounts := createTestApp(t, false, r, 3) - blockTime := time.Now().UTC() - ctx = ctx.WithBlockTime(blockTime) - - // remove genesis validator account - accounts = accounts[1:] - - // setup accounts[0] as validator - _ = getTestingValidator0(t, app, ctx, accounts) - - // begin a new block - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash, Time: blockTime}}) - - // execute operation - op := simulation.SimulateMsgEditValidator(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) - operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") - require.NoError(t, err) - - var msg types.MsgEditValidator - legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) - - require.True(t, operationMsg.OK) - require.Equal(t, "0.280623462081924936", msg.CommissionRate.String()) - require.Equal(t, "xKGLwQvuyN", msg.Description.Moniker) - require.Equal(t, "SlcxgdXhhu", msg.Description.Identity) - require.Equal(t, "WeLrQKjLxz", msg.Description.Website) - require.Equal(t, "rBqDOTtGTO", msg.Description.SecurityContact) - require.Equal(t, types.TypeMsgEditValidator, msg.Type()) - require.Equal(t, "cosmosvaloper1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7epjs3u", msg.ValidatorAddress) - require.Len(t, futureOperations, 0) -} - -// TestSimulateMsgDelegate tests the normal scenario of a valid message of type TypeMsgDelegate. -// Abonormal scenarios, where the message is created by an errors are not tested here. -func TestSimulateMsgDelegate(t *testing.T) { - s := rand.NewSource(1) - r := rand.New(s) - app, ctx, accounts := createTestApp(t, false, r, 3) - - blockTime := time.Now().UTC() - ctx = ctx.WithBlockTime(blockTime) - - // execute operation - op := simulation.SimulateMsgDelegate(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) - operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") - require.NoError(t, err) - - var msg types.MsgDelegate - legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) - - require.True(t, operationMsg.OK) - require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) - require.Equal(t, "98100858108421259236", msg.Amount.Amount.String()) - require.Equal(t, "stake", msg.Amount.Denom) - require.Equal(t, types.TypeMsgDelegate, msg.Type()) - require.Equal(t, "cosmosvaloper1tnh2q55v8wyygtt9srz5safamzdengsn9dsd7z", msg.ValidatorAddress) - require.Len(t, futureOperations, 0) -} - -// TestSimulateMsgUndelegate tests the normal scenario of a valid message of type TypeMsgUndelegate. -// Abonormal scenarios, where the message is created by an errors are not tested here. -func TestSimulateMsgUndelegate(t *testing.T) { - s := rand.NewSource(1) - r := rand.New(s) - app, ctx, accounts := createTestApp(t, false, r, 3) - - blockTime := time.Now().UTC() - ctx = ctx.WithBlockTime(blockTime) - - // remove genesis validator account - accounts = accounts[1:] - - // setup accounts[0] as validator - validator0 := getTestingValidator0(t, app, ctx, accounts) - - // setup delegation - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) - validator0, issuedShares := validator0.AddTokensFromDel(delTokens) - delegator := accounts[1] - delegation := types.NewDelegation(delegator.Address, validator0.GetOperator(), issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - app.DistrKeeper.SetDelegatorStartingInfo(ctx, validator0.GetOperator(), delegator.Address, distrtypes.NewDelegatorStartingInfo(2, sdk.OneDec(), 200)) - - setupValidatorRewards(app, ctx, validator0.GetOperator()) - - // begin a new block - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash, Time: blockTime}}) - - // execute operation - op := simulation.SimulateMsgUndelegate(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) - operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") - require.NoError(t, err) - - var msg types.MsgUndelegate - legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) - - require.True(t, operationMsg.OK) - require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) - require.Equal(t, "280623462081924937", msg.Amount.Amount.String()) - require.Equal(t, "stake", msg.Amount.Denom) - require.Equal(t, types.TypeMsgUndelegate, msg.Type()) - require.Equal(t, "cosmosvaloper1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7epjs3u", msg.ValidatorAddress) - require.Len(t, futureOperations, 0) -} - -// TestSimulateMsgBeginRedelegate tests the normal scenario of a valid message of type TypeMsgBeginRedelegate. -// Abonormal scenarios, where the message is created by an errors, are not tested here. -func TestSimulateMsgBeginRedelegate(t *testing.T) { - s := rand.NewSource(12) - r := rand.New(s) - app, ctx, accounts := createTestApp(t, false, r, 4) - - blockTime := time.Now().UTC() - ctx = ctx.WithBlockTime(blockTime) - - // remove genesis validator account - accounts = accounts[1:] - - // setup accounts[0] as validator0 and accounts[1] as validator1 - validator0 := getTestingValidator0(t, app, ctx, accounts) - validator1 := getTestingValidator1(t, app, ctx, accounts) - - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) - validator0, issuedShares := validator0.AddTokensFromDel(delTokens) - - // setup accounts[2] as delegator - delegator := accounts[2] - delegation := types.NewDelegation(delegator.Address, validator1.GetOperator(), issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - app.DistrKeeper.SetDelegatorStartingInfo(ctx, validator1.GetOperator(), delegator.Address, distrtypes.NewDelegatorStartingInfo(2, sdk.OneDec(), 200)) - - setupValidatorRewards(app, ctx, validator0.GetOperator()) - setupValidatorRewards(app, ctx, validator1.GetOperator()) - - // begin a new block - app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash, Time: blockTime}}) - - // execute operation - op := simulation.SimulateMsgBeginRedelegate(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) - operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") - require.NoError(t, err) - - var msg types.MsgBeginRedelegate - legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) - - require.True(t, operationMsg.OK) - require.Equal(t, "cosmos1092v0qgulpejj8y8hs6dmlw82x9gv8f7jfc7jl", msg.DelegatorAddress) - require.Equal(t, "1883752832348281252", msg.Amount.Amount.String()) - require.Equal(t, "stake", msg.Amount.Denom) - require.Equal(t, types.TypeMsgBeginRedelegate, msg.Type()) - require.Equal(t, "cosmosvaloper1gnkw3uqzflagcqn6ekjwpjanlne928qhruemah", msg.ValidatorDstAddress) - require.Equal(t, "cosmosvaloper1kk653svg7ksj9fmu85x9ygj4jzwlyrgs89nnn2", msg.ValidatorSrcAddress) - require.Len(t, futureOperations, 0) -} +// // TestWeightedOperations tests the weights of the operations. +// func TestWeightedOperations(t *testing.T) { +// s := rand.NewSource(1) +// r := rand.New(s) +// app, ctx, accs := createTestApp(t, false, r, 3) + +// ctx.WithChainID("test-chain") + +// cdc := app.AppCodec() +// appParams := make(simtypes.AppParams) + +// weightesOps := simulation.WeightedOperations(appParams, cdc, app.AccountKeeper, +// app.BankKeeper, app.StakingKeeper, +// ) + +// expected := []struct { +// weight int +// opMsgRoute string +// opMsgName string +// }{{simappparams.DefaultWeightMsgCreateValidator, types.ModuleName, types.TypeMsgCreateValidator}, +// {simappparams.DefaultWeightMsgEditValidator, types.ModuleName, types.TypeMsgEditValidator}, +// {simappparams.DefaultWeightMsgDelegate, types.ModuleName, types.TypeMsgDelegate}, +// {simappparams.DefaultWeightMsgUndelegate, types.ModuleName, types.TypeMsgUndelegate}, +// {simappparams.DefaultWeightMsgBeginRedelegate, types.ModuleName, types.TypeMsgBeginRedelegate}, +// {simulation.DefaultWeightMsgTokenizeShares, types.ModuleName, types.TypeMsgTokenizeShares}, +// {simulation.DefaultWeightMsgRedeemTokensforShares, types.ModuleName, types.TypeMsgRedeemTokensforShares}, +// {simulation.DefaultWeightMsgTransferTokenizeShareRecord, types.ModuleName, types.TypeMsgTransferTokenizeShareRecord}, +// } + +// for i, w := range weightesOps { +// operationMsg, _, _ := w.Op()(r, app.BaseApp, ctx, accs, ctx.ChainID()) +// // the following checks are very much dependent from the ordering of the output given +// // by WeightedOperations. if the ordering in WeightedOperations changes some tests +// // will fail +// require.Equal(t, expected[i].weight, w.Weight(), "weight should be the same") +// require.Equal(t, expected[i].opMsgRoute, operationMsg.Route, "route should be the same") +// require.Equal(t, expected[i].opMsgName, operationMsg.Name, "operation Msg name should be the same") +// } +// } + +// // TestSimulateMsgCreateValidator tests the normal scenario of a valid message of type TypeMsgCreateValidator. +// // Abonormal scenarios, where the message are created by an errors are not tested here. +// func TestSimulateMsgCreateValidator(t *testing.T) { +// s := rand.NewSource(1) +// r := rand.New(s) +// app, ctx, accounts := createTestApp(t, false, r, 3) + +// // begin a new block +// app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash}}) + +// // execute operation +// op := simulation.SimulateMsgCreateValidator(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) +// operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") +// require.NoError(t, err) + +// var msg types.MsgCreateValidator +// legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) + +// require.True(t, operationMsg.OK) +// require.Equal(t, "0.080000000000000000", msg.Commission.MaxChangeRate.String()) +// require.Equal(t, "0.080000000000000000", msg.Commission.MaxRate.String()) +// require.Equal(t, "0.019527679037870745", msg.Commission.Rate.String()) +// require.Equal(t, types.TypeMsgCreateValidator, msg.Type()) +// require.Equal(t, []byte{0xa, 0x20, 0x51, 0xde, 0xbd, 0xe8, 0xfa, 0xdf, 0x4e, 0xfc, 0x33, 0xa5, 0x16, 0x94, 0xf6, 0xee, 0xd3, 0x69, 0x7a, 0x7a, 0x1c, 0x2d, 0x50, 0xb6, 0x2, 0xf7, 0x16, 0x4e, 0x66, 0x9f, 0xff, 0x38, 0x91, 0x9b}, msg.Pubkey.Value) +// require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) +// require.Equal(t, "cosmosvaloper1ghekyjucln7y67ntx7cf27m9dpuxxemnsvnaes", msg.ValidatorAddress) +// require.Len(t, futureOperations, 0) +// } + +// // TestSimulateMsgEditValidator tests the normal scenario of a valid message of type TypeMsgEditValidator. +// // Abonormal scenarios, where the message is created by an errors are not tested here. +// func TestSimulateMsgEditValidator(t *testing.T) { +// s := rand.NewSource(1) +// r := rand.New(s) +// app, ctx, accounts := createTestApp(t, false, r, 3) +// blockTime := time.Now().UTC() +// ctx = ctx.WithBlockTime(blockTime) + +// // remove genesis validator account +// accounts = accounts[1:] + +// // setup accounts[0] as validator +// _ = getTestingValidator0(t, app, ctx, accounts) + +// // begin a new block +// app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash, Time: blockTime}}) + +// // execute operation +// op := simulation.SimulateMsgEditValidator(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) +// operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") +// require.NoError(t, err) + +// var msg types.MsgEditValidator +// legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) + +// require.True(t, operationMsg.OK) +// require.Equal(t, "0.280623462081924936", msg.CommissionRate.String()) +// require.Equal(t, "xKGLwQvuyN", msg.Description.Moniker) +// require.Equal(t, "SlcxgdXhhu", msg.Description.Identity) +// require.Equal(t, "WeLrQKjLxz", msg.Description.Website) +// require.Equal(t, "rBqDOTtGTO", msg.Description.SecurityContact) +// require.Equal(t, types.TypeMsgEditValidator, msg.Type()) +// require.Equal(t, "cosmosvaloper1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7epjs3u", msg.ValidatorAddress) +// require.Len(t, futureOperations, 0) +// } + +// // TestSimulateMsgDelegate tests the normal scenario of a valid message of type TypeMsgDelegate. +// // Abonormal scenarios, where the message is created by an errors are not tested here. +// func TestSimulateMsgDelegate(t *testing.T) { +// s := rand.NewSource(1) +// r := rand.New(s) +// app, ctx, accounts := createTestApp(t, false, r, 3) + +// blockTime := time.Now().UTC() +// ctx = ctx.WithBlockTime(blockTime) + +// // execute operation +// op := simulation.SimulateMsgDelegate(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) +// operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") +// require.NoError(t, err) + +// var msg types.MsgDelegate +// legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) + +// require.True(t, operationMsg.OK) +// require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) +// require.Equal(t, "98100858108421259236", msg.Amount.Amount.String()) +// require.Equal(t, "stake", msg.Amount.Denom) +// require.Equal(t, types.TypeMsgDelegate, msg.Type()) +// require.Equal(t, "cosmosvaloper1tnh2q55v8wyygtt9srz5safamzdengsn9dsd7z", msg.ValidatorAddress) +// require.Len(t, futureOperations, 0) +// } + +// // TestSimulateMsgUndelegate tests the normal scenario of a valid message of type TypeMsgUndelegate. +// // Abonormal scenarios, where the message is created by an errors are not tested here. +// func TestSimulateMsgUndelegate(t *testing.T) { +// s := rand.NewSource(1) +// r := rand.New(s) +// app, ctx, accounts := createTestApp(t, false, r, 3) + +// blockTime := time.Now().UTC() +// ctx = ctx.WithBlockTime(blockTime) + +// // remove genesis validator account +// accounts = accounts[1:] + +// // setup accounts[0] as validator +// validator0 := getTestingValidator0(t, app, ctx, accounts) + +// // setup delegation +// delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) +// validator0, issuedShares := validator0.AddTokensFromDel(delTokens) +// delegator := accounts[1] +// delegation := types.NewDelegation(delegator.Address, validator0.GetOperator(), issuedShares) +// app.StakingKeeper.SetDelegation(ctx, delegation) +// app.DistrKeeper.SetDelegatorStartingInfo(ctx, validator0.GetOperator(), delegator.Address, distrtypes.NewDelegatorStartingInfo(2, sdk.OneDec(), 200)) + +// setupValidatorRewards(app, ctx, validator0.GetOperator()) + +// // begin a new block +// app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash, Time: blockTime}}) + +// // execute operation +// op := simulation.SimulateMsgUndelegate(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) +// operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") +// require.NoError(t, err) + +// var msg types.MsgUndelegate +// legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) + +// require.True(t, operationMsg.OK) +// require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.DelegatorAddress) +// require.Equal(t, "280623462081924937", msg.Amount.Amount.String()) +// require.Equal(t, "stake", msg.Amount.Denom) +// require.Equal(t, types.TypeMsgUndelegate, msg.Type()) +// require.Equal(t, "cosmosvaloper1p8wcgrjr4pjju90xg6u9cgq55dxwq8j7epjs3u", msg.ValidatorAddress) +// require.Len(t, futureOperations, 0) +// } + +// // TestSimulateMsgBeginRedelegate tests the normal scenario of a valid message of type TypeMsgBeginRedelegate. +// // Abonormal scenarios, where the message is created by an errors, are not tested here. +// func TestSimulateMsgBeginRedelegate(t *testing.T) { +// s := rand.NewSource(12) +// r := rand.New(s) +// app, ctx, accounts := createTestApp(t, false, r, 4) + +// blockTime := time.Now().UTC() +// ctx = ctx.WithBlockTime(blockTime) + +// // remove genesis validator account +// accounts = accounts[1:] + +// // setup accounts[0] as validator0 and accounts[1] as validator1 +// validator0 := getTestingValidator0(t, app, ctx, accounts) +// validator1 := getTestingValidator1(t, app, ctx, accounts) + +// delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) +// validator0, issuedShares := validator0.AddTokensFromDel(delTokens) + +// // setup accounts[2] as delegator +// delegator := accounts[2] +// delegation := types.NewDelegation(delegator.Address, validator1.GetOperator(), issuedShares) +// app.StakingKeeper.SetDelegation(ctx, delegation) +// app.DistrKeeper.SetDelegatorStartingInfo(ctx, validator1.GetOperator(), delegator.Address, distrtypes.NewDelegatorStartingInfo(2, sdk.OneDec(), 200)) + +// setupValidatorRewards(app, ctx, validator0.GetOperator()) +// setupValidatorRewards(app, ctx, validator1.GetOperator()) + +// // begin a new block +// app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: app.LastBlockHeight() + 1, AppHash: app.LastCommitID().Hash, Time: blockTime}}) + +// // execute operation +// op := simulation.SimulateMsgBeginRedelegate(app.AccountKeeper, app.BankKeeper, app.StakingKeeper) +// operationMsg, futureOperations, err := op(r, app.BaseApp, ctx, accounts, "") +// require.NoError(t, err) + +// var msg types.MsgBeginRedelegate +// legacy.Cdc.UnmarshalJSON(operationMsg.Msg, &msg) + +// require.True(t, operationMsg.OK) +// require.Equal(t, "cosmos1092v0qgulpejj8y8hs6dmlw82x9gv8f7jfc7jl", msg.DelegatorAddress) +// require.Equal(t, "1883752832348281252", msg.Amount.Amount.String()) +// require.Equal(t, "stake", msg.Amount.Denom) +// require.Equal(t, types.TypeMsgBeginRedelegate, msg.Type()) +// require.Equal(t, "cosmosvaloper1gnkw3uqzflagcqn6ekjwpjanlne928qhruemah", msg.ValidatorDstAddress) +// require.Equal(t, "cosmosvaloper1kk653svg7ksj9fmu85x9ygj4jzwlyrgs89nnn2", msg.ValidatorSrcAddress) +// require.Len(t, futureOperations, 0) +// } // returns context and an app with updated mint keeper func createTestApp(t *testing.T, isCheckTx bool, r *rand.Rand, n int) (*simapp.SimApp, sdk.Context, []simtypes.Account) { From 5565bb9907fa90c7944274595bca1fef1269430e Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 30 Mar 2022 11:10:41 +1000 Subject: [PATCH 08/57] fix liquidstakingd cmd --- .gitignore | 3 +++ app/genesis_account_test.go | 2 +- cmd/liquidstakingd/cmd/root.go | 4 ++-- cmd/liquidstakingd/main.go | 4 ++-- start.sh | 1 + 5 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 start.sh diff --git a/.gitignore b/.gitignore index 9951bf92..fba176e2 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ dependency-graph.png *.out *.synctex.gz contract_tests/* + +home +*.zip \ No newline at end of file diff --git a/app/genesis_account_test.go b/app/genesis_account_test.go index 5d5c5900..8fb4a1f3 100644 --- a/app/genesis_account_test.go +++ b/app/genesis_account_test.go @@ -5,9 +5,9 @@ import ( "time" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" diff --git a/cmd/liquidstakingd/cmd/root.go b/cmd/liquidstakingd/cmd/root.go index d1425eb8..d6f19cc0 100644 --- a/cmd/liquidstakingd/cmd/root.go +++ b/cmd/liquidstakingd/cmd/root.go @@ -6,6 +6,7 @@ import ( "os" "path/filepath" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/spf13/cast" "github.com/spf13/cobra" tmcfg "github.com/tendermint/tendermint/config" @@ -21,9 +22,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" - serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" - "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/snapshots" "github.com/cosmos/cosmos-sdk/store" @@ -33,6 +32,7 @@ import ( banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" ) // NewRootCmd creates a new root command for simd. It is called once in the diff --git a/cmd/liquidstakingd/main.go b/cmd/liquidstakingd/main.go index 6ac86d18..20aa9c79 100644 --- a/cmd/liquidstakingd/main.go +++ b/cmd/liquidstakingd/main.go @@ -5,8 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/simapp/simd/cmd" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/cmd/liquidstakingd/cmd" ) func main() { diff --git a/start.sh b/start.sh new file mode 100644 index 00000000..54ecba95 --- /dev/null +++ b/start.sh @@ -0,0 +1 @@ +liquidstakingd start --home=home --mode=validator From dbedabbae024956803cd8f669a4f56b265061a40 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Fri, 8 Apr 2022 00:13:10 +1000 Subject: [PATCH 09/57] add testutil/network for integration test setup --- cmd/liquidstakingd/cmd/testnet.go | 2 +- go.mod | 1 + testutil/network/doc.go | 65 ++ testutil/network/network.go | 653 ++++++++++++++++++ testutil/network/network_test.go | 43 ++ testutil/network/util.go | 209 ++++++ .../client/testutil/grpc_query_suite.go | 2 +- x/distribution/client/testutil/suite.go | 2 +- .../client/testutil/withdraw_all_suite.go | 6 +- x/slashing/client/testutil/cli_test.go | 2 +- x/slashing/client/testutil/suite.go | 2 +- x/staking/client/testutil/cli_test.go | 2 +- x/staking/client/testutil/grpc.go | 4 +- x/staking/client/testutil/suite.go | 2 +- 14 files changed, 983 insertions(+), 12 deletions(-) create mode 100644 testutil/network/doc.go create mode 100644 testutil/network/network.go create mode 100644 testutil/network/network_test.go create mode 100644 testutil/network/util.go diff --git a/cmd/liquidstakingd/cmd/testnet.go b/cmd/liquidstakingd/cmd/testnet.go index a26a0566..5858ea47 100644 --- a/cmd/liquidstakingd/cmd/testnet.go +++ b/cmd/liquidstakingd/cmd/testnet.go @@ -27,13 +27,13 @@ import ( "github.com/cosmos/cosmos-sdk/server" srvconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) diff --git a/go.mod b/go.mod index a012db89..8fd734f5 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 + github.com/rs/zerolog v1.26.1 // indirect github.com/spf13/cast v1.4.1 github.com/spf13/cobra v1.3.0 github.com/spf13/pflag v1.0.5 diff --git a/testutil/network/doc.go b/testutil/network/doc.go new file mode 100644 index 00000000..9e44f371 --- /dev/null +++ b/testutil/network/doc.go @@ -0,0 +1,65 @@ +/* +Package network implements and exposes a fully operational in-process Tendermint +test network that consists of at least one or potentially many validators. This +test network can be used primarily for integration tests or unit test suites. + +The test network utilizes SimApp as the ABCI application and uses all the modules +defined in the Cosmos SDK. An in-process test network can be configured with any +number of validators as well as account funds and even custom genesis state. + +When creating a test network, a series of Validator objects are returned. Each +Validator object has useful information such as their address and public key. A +Validator will also provide its RPC, P2P, and API addresses that can be useful +for integration testing. In addition, a Tendermint local RPC client is also provided +which can be handy for making direct RPC calls to Tendermint. + +Note, due to limitations in concurrency and the design of the RPC layer in +Tendermint, only the first Validator object will have an RPC and API client +exposed. Due to this exact same limitation, only a single test network can exist +at a time. A caller must be certain it calls Cleanup after it no longer needs +the network. + +A typical testing flow might look like the following: + + type IntegrationTestSuite struct { + suite.Suite + + cfg testutil.Config + network *testutil.Network + } + + func (s *IntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite") + + cfg := testutil.DefaultConfig() + cfg.NumValidators = 1 + + s.cfg = cfg + s.network = testutil.New(s.T(), cfg) + + _, err := s.network.WaitForHeight(1) + s.Require().NoError(err) + } + + func (s *IntegrationTestSuite) TearDownSuite() { + s.T().Log("tearing down integration test suite") + + // This is important and must be called to ensure other tests can create + // a network! + s.network.Cleanup() + } + + func (s *IntegrationTestSuite) TestQueryBalancesRequestHandlerFn() { + val := s.network.Validators[0] + baseURL := val.APIAddress + + // Use baseURL to make API HTTP requests or use val.RPCClient to make direct + // Tendermint RPC calls. + // ... + } + + func TestIntegrationTestSuite(t *testing.T) { + suite.Run(t, new(IntegrationTestSuite)) + } +*/ +package network diff --git a/testutil/network/network.go b/testutil/network/network.go new file mode 100644 index 00000000..fc3cd706 --- /dev/null +++ b/testutil/network/network.go @@ -0,0 +1,653 @@ +package network + +import ( + "bufio" + "context" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/url" + "os" + "path/filepath" + "strings" + "sync" + "testing" + "time" + + "github.com/rs/zerolog" + "github.com/spf13/cobra" + "github.com/tendermint/tendermint/config" + tmrand "github.com/tendermint/tendermint/libs/rand" + "github.com/tendermint/tendermint/libs/service" + tmclient "github.com/tendermint/tendermint/rpc/client" + dbm "github.com/tendermint/tm-db" + "google.golang.org/grpc" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/server/api" + srvconfig "github.com/cosmos/cosmos-sdk/server/config" + servertypes "github.com/cosmos/cosmos-sdk/server/types" + "github.com/cosmos/cosmos-sdk/simapp/params" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/genutil" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +// package-wide network lock to only allow one test network at a time +var lock = new(sync.Mutex) + +// AppConstructor defines a function which accepts a network configuration and +// creates an ABCI Application to provide to Tendermint. +type AppConstructor = func(val Validator) servertypes.Application + +// NewAppConstructor returns a new simapp AppConstructor +func NewAppConstructor(encodingCfg params.EncodingConfig) AppConstructor { + return func(val Validator) servertypes.Application { + return simapp.NewSimApp( + val.Ctx.Logger, dbm.NewMemDB(), nil, true, make(map[int64]bool), val.Ctx.Config.RootDir, 0, + encodingCfg, + simapp.EmptyAppOptions{}, + baseapp.SetPruning(storetypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), + baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices), + ) + } +} + +// Config defines the necessary configuration used to bootstrap and start an +// in-process local testing network. +type Config struct { + Codec codec.Codec + LegacyAmino *codec.LegacyAmino // TODO: Remove! + InterfaceRegistry codectypes.InterfaceRegistry + + TxConfig client.TxConfig + AccountRetriever client.AccountRetriever + AppConstructor AppConstructor // the ABCI application constructor + GenesisState map[string]json.RawMessage // custom gensis state to provide + TimeoutCommit time.Duration // the consensus commitment timeout + ChainID string // the network chain-id + NumValidators int // the total number of validators to create and bond + Mnemonics []string // custom user-provided validator operator mnemonics + BondDenom string // the staking bond denomination + MinGasPrices string // the minimum gas prices each validator will accept + AccountTokens sdk.Int // the amount of unique validator tokens (e.g. 1000node0) + StakingTokens sdk.Int // the amount of tokens each validator has available to stake + BondedTokens sdk.Int // the amount of tokens each validator stakes + PruningStrategy string // the pruning strategy each validator will have + EnableTMLogging bool // enable Tendermint logging to STDOUT + CleanupDir bool // remove base temporary directory during cleanup + SigningAlgo string // signing algorithm for keys + KeyringOptions []keyring.Option // keyring configuration options + RPCAddress string // RPC listen address (including port) + APIAddress string // REST API listen address (including port) + GRPCAddress string // GRPC server listen address (including port) + PrintMnemonic bool // print the mnemonic of first validator as log output for testing +} + +// DefaultConfig returns a sane default configuration suitable for nearly all +// testing requirements. +func DefaultConfig() Config { + encCfg := simapp.MakeTestEncodingConfig() + + return Config{ + Codec: encCfg.Codec, + TxConfig: encCfg.TxConfig, + LegacyAmino: encCfg.Amino, + InterfaceRegistry: encCfg.InterfaceRegistry, + AccountRetriever: authtypes.AccountRetriever{}, + AppConstructor: NewAppConstructor(encCfg), + GenesisState: simapp.ModuleBasics.DefaultGenesis(encCfg.Codec), + TimeoutCommit: 2 * time.Second, + ChainID: "chain-" + tmrand.Str(6), + NumValidators: 4, + BondDenom: sdk.DefaultBondDenom, + MinGasPrices: fmt.Sprintf("0.000006%s", sdk.DefaultBondDenom), + AccountTokens: sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction), + StakingTokens: sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction), + BondedTokens: sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction), + PruningStrategy: storetypes.PruningOptionNothing, + CleanupDir: true, + SigningAlgo: string(hd.Secp256k1Type), + KeyringOptions: []keyring.Option{}, + PrintMnemonic: false, + } +} + +type ( + // Network defines a local in-process testing network using SimApp. It can be + // configured to start any number of validators, each with its own RPC and API + // clients. Typically, this test network would be used in client and integration + // testing where user input is expected. + // + // Note, due to Tendermint constraints in regards to RPC functionality, there + // may only be one test network running at a time. Thus, any caller must be + // sure to Cleanup after testing is finished in order to allow other tests + // to create networks. In addition, only the first validator will have a valid + // RPC and API server/client. + Network struct { + Logger Logger + BaseDir string + Validators []*Validator + + Config Config + } + + // Validator defines an in-process Tendermint validator node. Through this object, + // a client can make RPC and API calls and interact with any client command + // or handler. + Validator struct { + AppConfig *srvconfig.Config + ClientCtx client.Context + Ctx *server.Context + Dir string + NodeID string + PubKey cryptotypes.PubKey + Moniker string + APIAddress string + RPCAddress string + P2PAddress string + Address sdk.AccAddress + ValAddress sdk.ValAddress + RPCClient tmclient.Client + + tmNode service.Service + api *api.Server + grpc *grpc.Server + grpcWeb *http.Server + } +) + +// Logger is a network logger interface that exposes testnet-level Log() methods for an in-process testing network +// This is not to be confused with logging that may happen at an individual node or validator level +type Logger interface { + Log(args ...interface{}) + Logf(format string, args ...interface{}) +} + +var _ Logger = (*testing.T)(nil) +var _ Logger = (*CLILogger)(nil) + +type CLILogger struct { + cmd *cobra.Command +} + +func (s CLILogger) Log(args ...interface{}) { + s.cmd.Println(args...) +} + +func (s CLILogger) Logf(format string, args ...interface{}) { + s.cmd.Printf(format, args...) +} + +func NewCLILogger(cmd *cobra.Command) CLILogger { + return CLILogger{cmd} +} + +// New creates a new Network for integration tests or in-process testnets run via the CLI +func New(l Logger, baseDir string, cfg Config) (*Network, error) { + // only one caller/test can create and use a network at a time + l.Log("acquiring test network lock") + lock.Lock() + + network := &Network{ + Logger: l, + BaseDir: baseDir, + Validators: make([]*Validator, cfg.NumValidators), + Config: cfg, + } + + l.Logf("preparing test network with chain-id \"%s\"\n", cfg.ChainID) + + monikers := make([]string, cfg.NumValidators) + nodeIDs := make([]string, cfg.NumValidators) + valPubKeys := make([]cryptotypes.PubKey, cfg.NumValidators) + + var ( + genAccounts []authtypes.GenesisAccount + genBalances []banktypes.Balance + genFiles []string + ) + + buf := bufio.NewReader(os.Stdin) + + // generate private keys, node IDs, and initial transactions + for i := 0; i < cfg.NumValidators; i++ { + appCfg := srvconfig.DefaultConfig() + appCfg.Pruning = cfg.PruningStrategy + appCfg.MinGasPrices = cfg.MinGasPrices + appCfg.API.Enable = true + appCfg.API.Swagger = false + appCfg.Telemetry.Enabled = false + + ctx := server.NewDefaultContext() + tmCfg := ctx.Config + tmCfg.Consensus.TimeoutCommit = cfg.TimeoutCommit + tmCfg.Mode = config.ModeValidator + + // Only allow the first validator to expose an RPC, API and gRPC + // server/client due to Tendermint in-process constraints. + apiAddr := "" + tmCfg.RPC.ListenAddress = "" + appCfg.GRPC.Enable = false + appCfg.GRPCWeb.Enable = false + apiListenAddr := "" + if i == 0 { + if cfg.APIAddress != "" { + apiListenAddr = cfg.APIAddress + } else { + var err error + apiListenAddr, _, err = server.FreeTCPAddr() + if err != nil { + return nil, err + } + } + + appCfg.API.Address = apiListenAddr + apiURL, err := url.Parse(apiListenAddr) + if err != nil { + return nil, err + } + apiAddr = fmt.Sprintf("http://%s:%s", apiURL.Hostname(), apiURL.Port()) + + if cfg.RPCAddress != "" { + tmCfg.RPC.ListenAddress = cfg.RPCAddress + } else { + rpcAddr, _, err := server.FreeTCPAddr() + if err != nil { + return nil, err + } + tmCfg.RPC.ListenAddress = rpcAddr + } + + if cfg.GRPCAddress != "" { + appCfg.GRPC.Address = cfg.GRPCAddress + } else { + _, grpcPort, err := server.FreeTCPAddr() + if err != nil { + return nil, err + } + appCfg.GRPC.Address = fmt.Sprintf("0.0.0.0:%s", grpcPort) + } + appCfg.GRPC.Enable = true + + _, grpcWebPort, err := server.FreeTCPAddr() + if err != nil { + return nil, err + } + appCfg.GRPCWeb.Address = fmt.Sprintf("0.0.0.0:%s", grpcWebPort) + appCfg.GRPCWeb.Enable = true + } + + logger := server.ZeroLogWrapper{Logger: zerolog.Nop()} + if cfg.EnableTMLogging { + logWriter := zerolog.ConsoleWriter{Out: os.Stderr} + logger = server.ZeroLogWrapper{Logger: zerolog.New(logWriter).Level(zerolog.InfoLevel).With().Timestamp().Logger()} + } + + ctx.Logger = logger + + nodeDirName := fmt.Sprintf("node%d", i) + nodeDir := filepath.Join(network.BaseDir, nodeDirName, "simd") + clientDir := filepath.Join(network.BaseDir, nodeDirName, "simcli") + gentxsDir := filepath.Join(network.BaseDir, "gentxs") + + err := os.MkdirAll(filepath.Join(nodeDir, "config"), 0755) + if err != nil { + return nil, err + } + + err = os.MkdirAll(clientDir, 0755) + if err != nil { + return nil, err + } + + tmCfg.SetRoot(nodeDir) + tmCfg.Moniker = nodeDirName + monikers[i] = nodeDirName + + proxyAddr, _, err := server.FreeTCPAddr() + if err != nil { + return nil, err + } + tmCfg.ProxyApp = proxyAddr + + p2pAddr, _, err := server.FreeTCPAddr() + if err != nil { + return nil, err + } + + tmCfg.P2P.ListenAddress = p2pAddr + tmCfg.P2P.AddrBookStrict = false + tmCfg.P2P.AllowDuplicateIP = true + + nodeID, pubKey, err := genutil.InitializeNodeValidatorFiles(tmCfg) + if err != nil { + return nil, err + } + + nodeIDs[i] = nodeID + valPubKeys[i] = pubKey + + kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, clientDir, buf, cfg.Codec, cfg.KeyringOptions...) + if err != nil { + return nil, err + } + + keyringAlgos, _ := kb.SupportedAlgorithms() + algo, err := keyring.NewSigningAlgoFromString(cfg.SigningAlgo, keyringAlgos) + if err != nil { + return nil, err + } + + var mnemonic string + if i < len(cfg.Mnemonics) { + mnemonic = cfg.Mnemonics[i] + } + + addr, secret, err := testutil.GenerateSaveCoinKey(kb, nodeDirName, mnemonic, true, algo) + if err != nil { + return nil, err + } + + // if PrintMnemonic is set to true, we print the first validator node's secret to the network's logger + // for debugging and manual testing + if cfg.PrintMnemonic && i == 0 { + printMnemonic(l, secret) + } + + info := map[string]string{"secret": secret} + infoBz, err := json.Marshal(info) + if err != nil { + return nil, err + } + + // save private key seed words + err = writeFile(fmt.Sprintf("%v.json", "key_seed"), clientDir, infoBz) + if err != nil { + return nil, err + } + + balances := sdk.NewCoins( + sdk.NewCoin(fmt.Sprintf("%stoken", nodeDirName), cfg.AccountTokens), + sdk.NewCoin(cfg.BondDenom, cfg.StakingTokens), + ) + + genFiles = append(genFiles, tmCfg.GenesisFile()) + genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: balances.Sort()}) + genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0)) + + commission, err := sdk.NewDecFromStr("0.5") + if err != nil { + return nil, err + } + + createValMsg, err := stakingtypes.NewMsgCreateValidator( + sdk.ValAddress(addr), + valPubKeys[i], + sdk.NewCoin(cfg.BondDenom, cfg.BondedTokens), + stakingtypes.NewDescription(nodeDirName, "", "", "", ""), + stakingtypes.NewCommissionRates(commission, sdk.OneDec(), sdk.OneDec()), + sdk.OneInt(), + ) + if err != nil { + return nil, err + } + + p2pURL, err := url.Parse(p2pAddr) + if err != nil { + return nil, err + } + + memo := fmt.Sprintf("%s@%s:%s", nodeIDs[i], p2pURL.Hostname(), p2pURL.Port()) + fee := sdk.NewCoins(sdk.NewCoin(fmt.Sprintf("%stoken", nodeDirName), sdk.NewInt(0))) + txBuilder := cfg.TxConfig.NewTxBuilder() + err = txBuilder.SetMsgs(createValMsg) + if err != nil { + return nil, err + } + txBuilder.SetFeeAmount(fee) // Arbitrary fee + txBuilder.SetGasLimit(1000000) // Need at least 100386 + txBuilder.SetMemo(memo) + + txFactory := tx.Factory{} + txFactory = txFactory. + WithChainID(cfg.ChainID). + WithMemo(memo). + WithKeybase(kb). + WithTxConfig(cfg.TxConfig) + + err = tx.Sign(txFactory, nodeDirName, txBuilder, true) + if err != nil { + return nil, err + } + + txBz, err := cfg.TxConfig.TxJSONEncoder()(txBuilder.GetTx()) + if err != nil { + return nil, err + } + err = writeFile(fmt.Sprintf("%v.json", nodeDirName), gentxsDir, txBz) + if err != nil { + return nil, err + } + srvconfig.WriteConfigFile(filepath.Join(nodeDir, "config", "app.toml"), appCfg) + + clientCtx := client.Context{}. + WithKeyringDir(clientDir). + WithKeyring(kb). + WithHomeDir(tmCfg.RootDir). + WithChainID(cfg.ChainID). + WithInterfaceRegistry(cfg.InterfaceRegistry). + WithCodec(cfg.Codec). + WithLegacyAmino(cfg.LegacyAmino). + WithTxConfig(cfg.TxConfig). + WithAccountRetriever(cfg.AccountRetriever) + + network.Validators[i] = &Validator{ + AppConfig: appCfg, + ClientCtx: clientCtx, + Ctx: ctx, + Dir: filepath.Join(network.BaseDir, nodeDirName), + NodeID: nodeID, + PubKey: pubKey, + Moniker: nodeDirName, + RPCAddress: tmCfg.RPC.ListenAddress, + P2PAddress: tmCfg.P2P.ListenAddress, + APIAddress: apiAddr, + Address: addr, + ValAddress: sdk.ValAddress(addr), + } + } + + err := initGenFiles(cfg, genAccounts, genBalances, genFiles) + if err != nil { + return nil, err + } + err = collectGenFiles(cfg, network.Validators, network.BaseDir) + if err != nil { + return nil, err + } + + l.Log("starting test network...") + for idx, v := range network.Validators { + err := startInProcess(cfg, v) + if err != nil { + return nil, err + } + l.Log("started validator", idx) + } + + height, err := network.LatestHeight() + if err != nil { + return nil, err + } + + l.Log("started test network at height:", height) + + // Ensure we cleanup incase any test was abruptly halted (e.g. SIGINT) as any + // defer in a test would not be called. + server.TrapSignal(network.Cleanup) + + return network, nil +} + +// LatestHeight returns the latest height of the network or an error if the +// query fails or no validators exist. +func (n *Network) LatestHeight() (int64, error) { + if len(n.Validators) == 0 { + return 0, errors.New("no validators available") + } + + status, err := n.Validators[0].RPCClient.Status(context.Background()) + if err != nil { + return 0, err + } + + return status.SyncInfo.LatestBlockHeight, nil +} + +// WaitForHeight performs a blocking check where it waits for a block to be +// committed after a given block. If that height is not reached within a timeout, +// an error is returned. Regardless, the latest height queried is returned. +func (n *Network) WaitForHeight(h int64) (int64, error) { + return n.WaitForHeightWithTimeout(h, 10*time.Second) +} + +// WaitForHeightWithTimeout is the same as WaitForHeight except the caller can +// provide a custom timeout. +func (n *Network) WaitForHeightWithTimeout(h int64, t time.Duration) (int64, error) { + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + timeout := time.NewTimer(t) + defer timeout.Stop() + + if len(n.Validators) == 0 { + return 0, errors.New("no validators available") + } + + var latestHeight int64 + val := n.Validators[0] + + for { + select { + case <-timeout.C: + return latestHeight, errors.New("timeout exceeded waiting for block") + case <-ticker.C: + status, err := val.RPCClient.Status(context.Background()) + if err == nil && status != nil { + latestHeight = status.SyncInfo.LatestBlockHeight + if latestHeight >= h { + return latestHeight, nil + } + } + } + } +} + +// WaitForNextBlock waits for the next block to be committed, returning an error +// upon failure. +func (n *Network) WaitForNextBlock() error { + lastBlock, err := n.LatestHeight() + if err != nil { + return err + } + + _, err = n.WaitForHeight(lastBlock + 1) + if err != nil { + return err + } + + return err +} + +// Cleanup removes the root testing (temporary) directory and stops both the +// Tendermint and API services. It allows other callers to create and start +// test networks. This method must be called when a test is finished, typically +// in a defer. +func (n *Network) Cleanup() { + defer func() { + lock.Unlock() + n.Logger.Log("released test network lock") + }() + + n.Logger.Log("cleaning up test network...") + + for _, v := range n.Validators { + if v.tmNode != nil && v.tmNode.IsRunning() { + _ = v.tmNode.Stop() + } + + if v.api != nil { + _ = v.api.Close() + } + + if v.grpc != nil { + v.grpc.Stop() + if v.grpcWeb != nil { + _ = v.grpcWeb.Close() + } + } + } + + if n.Config.CleanupDir { + _ = os.RemoveAll(n.BaseDir) + } + + n.Logger.Log("finished cleaning up test network") +} + +// printMnemonic prints a provided mnemonic seed phrase on a network logger +// for debugging and manual testing +func printMnemonic(l Logger, secret string) { + lines := []string{ + "THIS MNEMONIC IS FOR TESTING PURPOSES ONLY", + "DO NOT USE IN PRODUCTION", + "", + strings.Join(strings.Fields(secret)[0:8], " "), + strings.Join(strings.Fields(secret)[8:16], " "), + strings.Join(strings.Fields(secret)[16:24], " "), + } + + lineLengths := make([]int, len(lines)) + for i, line := range lines { + lineLengths[i] = len(line) + } + + maxLineLength := 0 + for _, lineLen := range lineLengths { + if lineLen > maxLineLength { + maxLineLength = lineLen + } + } + + l.Log("\n") + l.Log(strings.Repeat("+", maxLineLength+8)) + for _, line := range lines { + l.Logf("++ %s ++\n", centerText(line, maxLineLength)) + } + l.Log(strings.Repeat("+", maxLineLength+8)) + l.Log("\n") +} + +// centerText centers text across a fixed width, filling either side with whitespace buffers +func centerText(text string, width int) string { + textLen := len(text) + leftBuffer := strings.Repeat(" ", (width-textLen)/2) + rightBuffer := strings.Repeat(" ", (width-textLen)/2+(width-textLen)%2) + + return fmt.Sprintf("%s%s%s", leftBuffer, text, rightBuffer) +} diff --git a/testutil/network/network_test.go b/testutil/network/network_test.go new file mode 100644 index 00000000..b75af1f6 --- /dev/null +++ b/testutil/network/network_test.go @@ -0,0 +1,43 @@ +// +build norace + +package network_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/suite" + + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" +) + +type IntegrationTestSuite struct { + suite.Suite + + network *network.Network +} + +func (s *IntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite") + + var err error + s.network, err = network.New(s.T(), s.T().TempDir(), network.DefaultConfig()) + s.Require().NoError(err) + + h, err := s.network.WaitForHeight(1) + s.Require().NoError(err, "stalled at height %d", h) +} + +func (s *IntegrationTestSuite) TearDownSuite() { + s.T().Log("tearing down integration test suite") + s.network.Cleanup() +} + +func (s *IntegrationTestSuite) TestNetwork_Liveness() { + h, err := s.network.WaitForHeightWithTimeout(10, time.Minute) + s.Require().NoError(err, "expected to reach 10 blocks; got %d", h) +} + +func TestIntegrationTestSuite(t *testing.T) { + suite.Run(t, new(IntegrationTestSuite)) +} diff --git a/testutil/network/util.go b/testutil/network/util.go new file mode 100644 index 00000000..eeeb0430 --- /dev/null +++ b/testutil/network/util.go @@ -0,0 +1,209 @@ +package network + +import ( + "encoding/json" + "io/ioutil" + "path/filepath" + "time" + + abciclient "github.com/tendermint/tendermint/abci/client" + tmos "github.com/tendermint/tendermint/libs/os" + tmtime "github.com/tendermint/tendermint/libs/time" + "github.com/tendermint/tendermint/node" + "github.com/tendermint/tendermint/rpc/client/local" + "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/server/api" + servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" + srvtypes "github.com/cosmos/cosmos-sdk/server/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" +) + +func startInProcess(cfg Config, val *Validator) error { + logger := val.Ctx.Logger + tmCfg := val.Ctx.Config + tmCfg.Instrumentation.Prometheus = false + + if err := val.AppConfig.ValidateBasic(); err != nil { + return err + } + + app := cfg.AppConstructor(*val) + + genDoc, err := types.GenesisDocFromFile(tmCfg.GenesisFile()) + if err != nil { + return err + } + + val.tmNode, err = node.New( + tmCfg, + logger.With("module", val.Moniker), + abciclient.NewLocalCreator(app), + genDoc, + ) + if err != nil { + return err + } + + if err := val.tmNode.Start(); err != nil { + return err + } + + if val.RPCAddress != "" { + node, ok := val.tmNode.(local.NodeService) + if !ok { + panic("can't cast service.Service to NodeService") + } + val.RPCClient, err = local.New(node) + if err != nil { + panic("cant create a local node") + } + } + + // We'll need a RPC client if the validator exposes a gRPC or REST endpoint. + if val.APIAddress != "" || val.AppConfig.GRPC.Enable { + val.ClientCtx = val.ClientCtx. + WithClient(val.RPCClient) + + // Add the tx service in the gRPC router. + app.RegisterTxService(val.ClientCtx) + + // Add the tendermint queries service in the gRPC router. + app.RegisterTendermintService(val.ClientCtx) + } + + if val.APIAddress != "" { + apiSrv := api.New(val.ClientCtx, logger.With("module", "api-server")) + app.RegisterAPIRoutes(apiSrv, val.AppConfig.API) + + errCh := make(chan error) + + go func() { + if err := apiSrv.Start(*val.AppConfig); err != nil { + errCh <- err + } + }() + + select { + case err := <-errCh: + return err + case <-time.After(srvtypes.ServerStartTime): // assume server started successfully + } + + val.api = apiSrv + } + + if val.AppConfig.GRPC.Enable { + grpcSrv, err := servergrpc.StartGRPCServer(val.ClientCtx, app, val.AppConfig.GRPC.Address) + if err != nil { + return err + } + + val.grpc = grpcSrv + + if val.AppConfig.GRPCWeb.Enable { + val.grpcWeb, err = servergrpc.StartGRPCWeb(grpcSrv, *val.AppConfig) + if err != nil { + return err + } + } + } + return nil +} + +func collectGenFiles(cfg Config, vals []*Validator, outputDir string) error { + genTime := tmtime.Now() + + for i := 0; i < cfg.NumValidators; i++ { + tmCfg := vals[i].Ctx.Config + + nodeDir := filepath.Join(outputDir, vals[i].Moniker, "simd") + gentxsDir := filepath.Join(outputDir, "gentxs") + + tmCfg.Moniker = vals[i].Moniker + tmCfg.SetRoot(nodeDir) + + initCfg := genutiltypes.NewInitConfig(cfg.ChainID, gentxsDir, vals[i].NodeID, vals[i].PubKey) + + genFile := tmCfg.GenesisFile() + genDoc, err := types.GenesisDocFromFile(genFile) + if err != nil { + return err + } + + appState, err := genutil.GenAppStateFromConfig(cfg.Codec, cfg.TxConfig, + tmCfg, initCfg, *genDoc, banktypes.GenesisBalancesIterator{}) + if err != nil { + return err + } + + // overwrite each validator's genesis file to have a canonical genesis time + if err := genutil.ExportGenesisFileWithTime(genFile, cfg.ChainID, nil, appState, genTime); err != nil { + return err + } + } + + return nil +} + +func initGenFiles(cfg Config, genAccounts []authtypes.GenesisAccount, genBalances []banktypes.Balance, genFiles []string) error { + + // set the accounts in the genesis state + var authGenState authtypes.GenesisState + cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[authtypes.ModuleName], &authGenState) + + accounts, err := authtypes.PackAccounts(genAccounts) + if err != nil { + return err + } + + authGenState.Accounts = append(authGenState.Accounts, accounts...) + cfg.GenesisState[authtypes.ModuleName] = cfg.Codec.MustMarshalJSON(&authGenState) + + // set the balances in the genesis state + var bankGenState banktypes.GenesisState + cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[banktypes.ModuleName], &bankGenState) + + bankGenState.Balances = append(bankGenState.Balances, genBalances...) + cfg.GenesisState[banktypes.ModuleName] = cfg.Codec.MustMarshalJSON(&bankGenState) + + appGenStateJSON, err := json.MarshalIndent(cfg.GenesisState, "", " ") + if err != nil { + return err + } + + genDoc := types.GenesisDoc{ + ChainID: cfg.ChainID, + AppState: appGenStateJSON, + Validators: nil, + } + + // generate empty genesis files for each validator and save + for i := 0; i < cfg.NumValidators; i++ { + if err := genDoc.SaveAs(genFiles[i]); err != nil { + return err + } + } + + return nil +} + +func writeFile(name string, dir string, contents []byte) error { + writePath := filepath.Join(dir) + file := filepath.Join(writePath, name) + + err := tmos.EnsureDir(writePath, 0755) + if err != nil { + return err + } + + err = ioutil.WriteFile(file, contents, 0644) // nolint: gosec + if err != nil { + return err + } + + return nil +} diff --git a/x/distribution/client/testutil/grpc_query_suite.go b/x/distribution/client/testutil/grpc_query_suite.go index 956449a3..1513c1ac 100644 --- a/x/distribution/client/testutil/grpc_query_suite.go +++ b/x/distribution/client/testutil/grpc_query_suite.go @@ -7,12 +7,12 @@ import ( "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/network" "github.com/cosmos/cosmos-sdk/testutil/rest" sdk "github.com/cosmos/cosmos-sdk/types" grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" ) type GRPCQueryTestSuite struct { diff --git a/x/distribution/client/testutil/suite.go b/x/distribution/client/testutil/suite.go index 8678ea38..0fe7ad6d 100644 --- a/x/distribution/client/testutil/suite.go +++ b/x/distribution/client/testutil/suite.go @@ -12,9 +12,9 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/testutil" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client/cli" ) diff --git a/x/distribution/client/testutil/withdraw_all_suite.go b/x/distribution/client/testutil/withdraw_all_suite.go index 7b459a4d..eb16f003 100644 --- a/x/distribution/client/testutil/withdraw_all_suite.go +++ b/x/distribution/client/testutil/withdraw_all_suite.go @@ -8,11 +8,11 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" banktestutil "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" - "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" - stakingcli "github.com/cosmos/cosmos-sdk/x/staking/client/cli" + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" + "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client/cli" + stakingcli "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" "github.com/stretchr/testify/suite" ) diff --git a/x/slashing/client/testutil/cli_test.go b/x/slashing/client/testutil/cli_test.go index dd36a6af..a80f6146 100644 --- a/x/slashing/client/testutil/cli_test.go +++ b/x/slashing/client/testutil/cli_test.go @@ -5,7 +5,7 @@ package testutil import ( "testing" - "github.com/cosmos/cosmos-sdk/testutil/network" + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" "github.com/stretchr/testify/suite" ) diff --git a/x/slashing/client/testutil/suite.go b/x/slashing/client/testutil/suite.go index 13a9bee4..de52adc3 100644 --- a/x/slashing/client/testutil/suite.go +++ b/x/slashing/client/testutil/suite.go @@ -10,8 +10,8 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/client/cli" ) diff --git a/x/staking/client/testutil/cli_test.go b/x/staking/client/testutil/cli_test.go index f23e8884..9e210726 100644 --- a/x/staking/client/testutil/cli_test.go +++ b/x/staking/client/testutil/cli_test.go @@ -6,7 +6,7 @@ package testutil import ( "testing" - "github.com/cosmos/cosmos-sdk/testutil/network" + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" "github.com/stretchr/testify/suite" ) diff --git a/x/staking/client/testutil/grpc.go b/x/staking/client/testutil/grpc.go index 78c39f85..6fe3bbf1 100644 --- a/x/staking/client/testutil/grpc.go +++ b/x/staking/client/testutil/grpc.go @@ -12,8 +12,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" "github.com/cosmos/cosmos-sdk/types/query" - "github.com/cosmos/cosmos-sdk/x/staking/client/cli" - "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) func (s *IntegrationTestSuite) TestGRPCQueryValidatorsHandler() { diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index 8b1c4275..6b0d2bb1 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -17,10 +17,10 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" banktestutil "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" + "github.com/iqlusioninc/liquidity-staking-module/testutil/network" "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) From aa2bd4fb5ec9d3a0b7df4ceb1e541ce5bf28ce3c Mon Sep 17 00:00:00 2001 From: junkai121 Date: Fri, 8 Apr 2022 11:24:52 +1000 Subject: [PATCH 10/57] add genutil --- go.mod | 7 +- testutil/network/network.go | 2 +- testutil/network/util.go | 2 +- x/genutil/client/cli/collect.go | 70 ++++ x/genutil/client/cli/gentx.go | 255 ++++++++++++++ x/genutil/client/cli/init.go | 183 ++++++++++ x/genutil/client/cli/init_test.go | 293 ++++++++++++++++ x/genutil/client/cli/migrate.go | 141 ++++++++ x/genutil/client/cli/validate_genesis.go | 71 ++++ x/genutil/client/testutil/cli_test.go | 17 + x/genutil/client/testutil/helpers.go | 53 +++ x/genutil/client/testutil/migrate.go | 61 ++++ x/genutil/client/testutil/suite.go | 133 +++++++ x/genutil/client/testutil/validate_genesis.go | 102 ++++++ x/genutil/collect.go | 183 ++++++++++ x/genutil/collect_test.go | 67 ++++ x/genutil/doc.go | 10 + x/genutil/genesis.go | 21 ++ x/genutil/gentx.go | 118 +++++++ x/genutil/gentx_test.go | 285 +++++++++++++++ x/genutil/migrations/v039/types.go | 12 + x/genutil/migrations/v040/migrate.go | 200 +++++++++++ x/genutil/migrations/v040/types.go | 5 + x/genutil/migrations/v043/migrate.go | 44 +++ x/genutil/migrations/v046/migrate.go | 32 ++ x/genutil/module.go | 114 ++++++ x/genutil/types/expected_keepers.go | 42 +++ x/genutil/types/genesis.pb.go | 328 ++++++++++++++++++ x/genutil/types/genesis_state.go | 119 +++++++ x/genutil/types/genesis_state_test.go | 72 ++++ x/genutil/types/types.go | 45 +++ x/genutil/utils.go | 103 ++++++ x/genutil/utils_test.go | 18 + x/staking/migrations/v040/migrate.go | 2 +- 34 files changed, 3204 insertions(+), 6 deletions(-) create mode 100644 x/genutil/client/cli/collect.go create mode 100644 x/genutil/client/cli/gentx.go create mode 100644 x/genutil/client/cli/init.go create mode 100644 x/genutil/client/cli/init_test.go create mode 100644 x/genutil/client/cli/migrate.go create mode 100644 x/genutil/client/cli/validate_genesis.go create mode 100644 x/genutil/client/testutil/cli_test.go create mode 100644 x/genutil/client/testutil/helpers.go create mode 100644 x/genutil/client/testutil/migrate.go create mode 100644 x/genutil/client/testutil/suite.go create mode 100644 x/genutil/client/testutil/validate_genesis.go create mode 100644 x/genutil/collect.go create mode 100644 x/genutil/collect_test.go create mode 100644 x/genutil/doc.go create mode 100644 x/genutil/genesis.go create mode 100644 x/genutil/gentx.go create mode 100644 x/genutil/gentx_test.go create mode 100644 x/genutil/migrations/v039/types.go create mode 100644 x/genutil/migrations/v040/migrate.go create mode 100644 x/genutil/migrations/v040/types.go create mode 100644 x/genutil/migrations/v043/migrate.go create mode 100644 x/genutil/migrations/v046/migrate.go create mode 100644 x/genutil/module.go create mode 100644 x/genutil/types/expected_keepers.go create mode 100644 x/genutil/types/genesis.pb.go create mode 100644 x/genutil/types/genesis_state.go create mode 100644 x/genutil/types/genesis_state_test.go create mode 100644 x/genutil/types/types.go create mode 100644 x/genutil/utils.go create mode 100644 x/genutil/utils_test.go diff --git a/go.mod b/go.mod index 8fd734f5..9abd3e1b 100644 --- a/go.mod +++ b/go.mod @@ -5,14 +5,16 @@ go 1.16 require ( github.com/armon/go-metrics v0.3.10 github.com/cosmos/cosmos-sdk v0.46.0-alpha3 + github.com/cosmos/go-bip39 v1.0.0 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 - github.com/rs/zerolog v1.26.1 // indirect + github.com/rs/zerolog v1.26.1 github.com/spf13/cast v1.4.1 github.com/spf13/cobra v1.3.0 github.com/spf13/pflag v1.0.5 @@ -23,8 +25,7 @@ require ( google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 google.golang.org/grpc v1.44.0 google.golang.org/protobuf v1.27.1 - gopkg.in/yaml.v2 v2.4.0 - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.3.0 ) replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/testutil/network/network.go b/testutil/network/network.go index fc3cd706..c6183891 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -42,8 +42,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) diff --git a/testutil/network/util.go b/testutil/network/util.go index eeeb0430..104d156b 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -18,8 +18,8 @@ import ( srvtypes "github.com/cosmos/cosmos-sdk/server/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" ) func startInProcess(cfg Config, val *Validator) error { diff --git a/x/genutil/client/cli/collect.go b/x/genutil/client/cli/collect.go new file mode 100644 index 00000000..532f171d --- /dev/null +++ b/x/genutil/client/cli/collect.go @@ -0,0 +1,70 @@ +package cli + +import ( + "encoding/json" + "path/filepath" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + tmtypes "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" +) + +const flagGenTxDir = "gentx-dir" + +// CollectGenTxsCmd - return the cobra command to collect genesis transactions +func CollectGenTxsCmd(genBalIterator types.GenesisBalancesIterator, defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "collect-gentxs", + Short: "Collect genesis txs and output a genesis.json file", + RunE: func(cmd *cobra.Command, _ []string) error { + serverCtx := server.GetServerContextFromCmd(cmd) + config := serverCtx.Config + + clientCtx := client.GetClientContextFromCmd(cmd) + cdc := clientCtx.Codec + + config.SetRoot(clientCtx.HomeDir) + + nodeID, valPubKey, err := genutil.InitializeNodeValidatorFiles(config) + if err != nil { + return errors.Wrap(err, "failed to initialize node validator files") + } + + genDoc, err := tmtypes.GenesisDocFromFile(config.GenesisFile()) + if err != nil { + return errors.Wrap(err, "failed to read genesis doc from file") + } + + genTxDir, _ := cmd.Flags().GetString(flagGenTxDir) + genTxsDir := genTxDir + if genTxsDir == "" { + genTxsDir = filepath.Join(config.RootDir, "config", "gentx") + } + + toPrint := newPrintInfo(config.Moniker, genDoc.ChainID, nodeID, genTxsDir, json.RawMessage("")) + initCfg := types.NewInitConfig(genDoc.ChainID, genTxsDir, nodeID, valPubKey) + + appMessage, err := genutil.GenAppStateFromConfig(cdc, + clientCtx.TxConfig, + config, initCfg, *genDoc, genBalIterator) + if err != nil { + return errors.Wrap(err, "failed to get genesis app state from config") + } + + toPrint.AppMessage = appMessage + + return displayInfo(toPrint) + }, + } + + cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") + cmd.Flags().String(flagGenTxDir, "", "override default \"gentx\" directory from which collect and execute genesis transactions; default [--home]/config/gentx/") + + return cmd +} diff --git a/x/genutil/client/cli/gentx.go b/x/genutil/client/cli/gentx.go new file mode 100644 index 00000000..b5619f21 --- /dev/null +++ b/x/genutil/client/cli/gentx.go @@ -0,0 +1,255 @@ +package cli + +import ( + "bufio" + "bytes" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + tmos "github.com/tendermint/tendermint/libs/os" + tmtypes "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/version" + authclient "github.com/cosmos/cosmos-sdk/x/auth/client" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" +) + +// GenTxCmd builds the application's gentx command. +func GenTxCmd(mbm module.BasicManager, txEncCfg client.TxEncodingConfig, genBalIterator types.GenesisBalancesIterator, defaultNodeHome string) *cobra.Command { + ipDefault, _ := server.ExternalIP() + fsCreateValidator, defaultsDesc := cli.CreateValidatorMsgFlagSet(ipDefault) + + cmd := &cobra.Command{ + Use: "gentx [key_name] [amount]", + Short: "Generate a genesis tx carrying a self delegation", + Args: cobra.ExactArgs(2), + Long: fmt.Sprintf(`Generate a genesis transaction that creates a validator with a self-delegation, +that is signed by the key in the Keyring referenced by a given name. A node ID and Bech32 consensus +pubkey may optionally be provided. If they are omitted, they will be retrieved from the priv_validator.json +file. The following default parameters are included: + %s + +Example: +$ %s gentx my-key-name 1000000stake --home=/path/to/home/dir --keyring-backend=os --chain-id=test-chain-1 \ + --moniker="myvalidator" \ + --commission-max-change-rate=0.01 \ + --commission-max-rate=1.0 \ + --commission-rate=0.07 \ + --details="..." \ + --security-contact="..." \ + --website="..." +`, defaultsDesc, version.AppName, + ), + RunE: func(cmd *cobra.Command, args []string) error { + serverCtx := server.GetServerContextFromCmd(cmd) + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + cdc := clientCtx.Codec + + config := serverCtx.Config + config.SetRoot(clientCtx.HomeDir) + + nodeID, valPubKey, err := genutil.InitializeNodeValidatorFiles(serverCtx.Config) + if err != nil { + return errors.Wrap(err, "failed to initialize node validator files") + } + + // read --nodeID, if empty take it from priv_validator.json + if nodeIDString, _ := cmd.Flags().GetString(cli.FlagNodeID); nodeIDString != "" { + nodeID = nodeIDString + } + + // read --pubkey, if empty take it from priv_validator.json + if pkStr, _ := cmd.Flags().GetString(cli.FlagPubKey); pkStr != "" { + if err := clientCtx.Codec.UnmarshalInterfaceJSON([]byte(pkStr), &valPubKey); err != nil { + return errors.Wrap(err, "failed to unmarshal validator public key") + } + } + + genDoc, err := tmtypes.GenesisDocFromFile(config.GenesisFile()) + if err != nil { + return errors.Wrapf(err, "failed to read genesis doc file %s", config.GenesisFile()) + } + + var genesisState map[string]json.RawMessage + if err = json.Unmarshal(genDoc.AppState, &genesisState); err != nil { + return errors.Wrap(err, "failed to unmarshal genesis state") + } + + if err = mbm.ValidateGenesis(cdc, txEncCfg, genesisState); err != nil { + return errors.Wrap(err, "failed to validate genesis state") + } + + inBuf := bufio.NewReader(cmd.InOrStdin()) + + name := args[0] + key, err := clientCtx.Keyring.Key(name) + if err != nil { + return errors.Wrapf(err, "failed to fetch '%s' from the keyring", name) + } + + moniker := config.Moniker + if m, _ := cmd.Flags().GetString(cli.FlagMoniker); m != "" { + moniker = m + } + + // set flags for creating a gentx + createValCfg, err := cli.PrepareConfigForTxCreateValidator(cmd.Flags(), moniker, nodeID, genDoc.ChainID, valPubKey) + if err != nil { + return errors.Wrap(err, "error creating configuration to create validator msg") + } + + amount := args[1] + coins, err := sdk.ParseCoinsNormalized(amount) + if err != nil { + return errors.Wrap(err, "failed to parse coins") + } + addr, err := key.GetAddress() + if err != nil { + return err + } + err = genutil.ValidateAccountInGenesis(genesisState, genBalIterator, addr, coins, cdc) + if err != nil { + return errors.Wrap(err, "failed to validate account in genesis") + } + + txFactory := tx.NewFactoryCLI(clientCtx, cmd.Flags()) + if err != nil { + return errors.Wrap(err, "error creating tx builder") + } + pub, err := key.GetAddress() + if err != nil { + return err + } + clientCtx = clientCtx.WithInput(inBuf).WithFromAddress(pub) + + // The following line comes from a discrepancy between the `gentx` + // and `create-validator` commands: + // - `gentx` expects amount as an arg, + // - `create-validator` expects amount as a required flag. + // ref: https://github.com/cosmos/cosmos-sdk/issues/8251 + // Since gentx doesn't set the amount flag (which `create-validator` + // reads from), we copy the amount arg into the valCfg directly. + // + // Ideally, the `create-validator` command should take a validator + // config file instead of so many flags. + // ref: https://github.com/cosmos/cosmos-sdk/issues/8177 + createValCfg.Amount = amount + + // create a 'create-validator' message + txBldr, msg, err := cli.BuildCreateValidatorMsg(clientCtx, createValCfg, txFactory, true) + if err != nil { + return errors.Wrap(err, "failed to build create-validator message") + } + + if key.GetType() == keyring.TypeOffline || key.GetType() == keyring.TypeMulti { + cmd.PrintErrln("Offline key passed in. Use `tx sign` command to sign.") + return txBldr.PrintUnsignedTx(clientCtx, msg) + } + + // write the unsigned transaction to the buffer + w := bytes.NewBuffer([]byte{}) + clientCtx = clientCtx.WithOutput(w) + + if err = txBldr.PrintUnsignedTx(clientCtx, msg); err != nil { + return errors.Wrap(err, "failed to print unsigned std tx") + } + + // read the transaction + stdTx, err := readUnsignedGenTxFile(clientCtx, w) + if err != nil { + return errors.Wrap(err, "failed to read unsigned gen tx file") + } + + // sign the transaction and write it to the output file + txBuilder, err := clientCtx.TxConfig.WrapTxBuilder(stdTx) + if err != nil { + return fmt.Errorf("error creating tx builder: %w", err) + } + + err = authclient.SignTx(txFactory, clientCtx, name, txBuilder, true, true) + if err != nil { + return errors.Wrap(err, "failed to sign std tx") + } + + outputDocument, _ := cmd.Flags().GetString(flags.FlagOutputDocument) + if outputDocument == "" { + outputDocument, err = makeOutputFilepath(config.RootDir, nodeID) + if err != nil { + return errors.Wrap(err, "failed to create output file path") + } + } + + if err := writeSignedGenTx(clientCtx, outputDocument, stdTx); err != nil { + return errors.Wrap(err, "failed to write signed gen tx") + } + + cmd.PrintErrf("Genesis transaction written to %q\n", outputDocument) + return nil + }, + } + + cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") + cmd.Flags().String(flags.FlagOutputDocument, "", "Write the genesis transaction JSON document to the given file instead of the default location") + cmd.Flags().String(flags.FlagChainID, "", "The network chain ID") + cmd.Flags().AddFlagSet(fsCreateValidator) + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func makeOutputFilepath(rootDir, nodeID string) (string, error) { + writePath := filepath.Join(rootDir, "config", "gentx") + if err := tmos.EnsureDir(writePath, 0700); err != nil { + return "", err + } + + return filepath.Join(writePath, fmt.Sprintf("gentx-%v.json", nodeID)), nil +} + +func readUnsignedGenTxFile(clientCtx client.Context, r io.Reader) (sdk.Tx, error) { + bz, err := io.ReadAll(r) + if err != nil { + return nil, err + } + + aTx, err := clientCtx.TxConfig.TxJSONDecoder()(bz) + if err != nil { + return nil, err + } + + return aTx, err +} + +func writeSignedGenTx(clientCtx client.Context, outputDocument string, tx sdk.Tx) error { + outputFile, err := os.OpenFile(outputDocument, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644) + if err != nil { + return err + } + defer outputFile.Close() + + json, err := clientCtx.TxConfig.TxJSONEncoder()(tx) + if err != nil { + return err + } + + _, err = fmt.Fprintf(outputFile, "%s\n", json) + + return err +} diff --git a/x/genutil/client/cli/init.go b/x/genutil/client/cli/init.go new file mode 100644 index 00000000..07cb4e61 --- /dev/null +++ b/x/genutil/client/cli/init.go @@ -0,0 +1,183 @@ +package cli + +import ( + "bufio" + "encoding/json" + "fmt" + "os" + + "github.com/cosmos/go-bip39" + "github.com/pkg/errors" + "github.com/spf13/cobra" + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/cli" + tmos "github.com/tendermint/tendermint/libs/os" + tmrand "github.com/tendermint/tendermint/libs/rand" + "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/input" + "github.com/cosmos/cosmos-sdk/server" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +const ( + // FlagOverwrite defines a flag to overwrite an existing genesis JSON file. + FlagOverwrite = "overwrite" + + // FlagSeed defines a flag to initialize the private validator key from a specific seed. + FlagRecover = "recover" + + // FlagStakingBondDenom defines a flag to specify the staking token in the genesis file. + FlagStakingBondDenom = "staking-bond-denom" +) + +type printInfo struct { + Moniker string `json:"moniker" yaml:"moniker"` + ChainID string `json:"chain_id" yaml:"chain_id"` + NodeID string `json:"node_id" yaml:"node_id"` + GenTxsDir string `json:"gentxs_dir" yaml:"gentxs_dir"` + AppMessage json.RawMessage `json:"app_message" yaml:"app_message"` +} + +func newPrintInfo(moniker, chainID, nodeID, genTxsDir string, appMessage json.RawMessage) printInfo { + return printInfo{ + Moniker: moniker, + ChainID: chainID, + NodeID: nodeID, + GenTxsDir: genTxsDir, + AppMessage: appMessage, + } +} + +func displayInfo(info printInfo) error { + out, err := json.MarshalIndent(info, "", " ") + if err != nil { + return err + } + + _, err = fmt.Fprintf(os.Stderr, "%s\n", sdk.MustSortJSON(out)) + + return err +} + +// InitCmd returns a command that initializes all files needed for Tendermint +// and the respective application. +func InitCmd(mbm module.BasicManager, defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "init [moniker]", + Short: "Initialize private validator, p2p, genesis, and application configuration files", + Long: `Initialize validators's and node's configuration files.`, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + cdc := clientCtx.Codec + + serverCtx := server.GetServerContextFromCmd(cmd) + config := serverCtx.Config + config.SetRoot(clientCtx.HomeDir) + + chainID, _ := cmd.Flags().GetString(flags.FlagChainID) + switch { + case chainID != "": + case clientCtx.ChainID != "": + chainID = clientCtx.ChainID + default: + chainID = fmt.Sprintf("test-chain-%v", tmrand.Str(6)) + } + + // Get bip39 mnemonic + var mnemonic string + recover, _ := cmd.Flags().GetBool(FlagRecover) + if recover { + inBuf := bufio.NewReader(cmd.InOrStdin()) + value, err := input.GetString("Enter your bip39 mnemonic", inBuf) + if err != nil { + return err + } + + mnemonic = value + if !bip39.IsMnemonicValid(mnemonic) { + return errors.New("invalid mnemonic") + } + } + + nodeID, _, err := genutil.InitializeNodeValidatorFilesFromMnemonic(config, mnemonic) + if err != nil { + return err + } + + config.Moniker = args[0] + + genFile := config.GenesisFile() + overwrite, _ := cmd.Flags().GetBool(FlagOverwrite) + stakingBondDenom, _ := cmd.Flags().GetString(FlagStakingBondDenom) + + if !overwrite && tmos.FileExists(genFile) { + return fmt.Errorf("genesis.json file already exists: %v", genFile) + } + + appGenState := mbm.DefaultGenesis(cdc) + + if stakingBondDenom != "" { + var stakingGenesis stakingtypes.GenesisState + + stakingRaw := appGenState[stakingtypes.ModuleName] + err := clientCtx.Codec.UnmarshalJSON(stakingRaw, &stakingGenesis) + if err != nil { + return err + } + + stakingGenesis.Params.BondDenom = stakingBondDenom + modifiedStakingStr, err := clientCtx.Codec.MarshalJSON(&stakingGenesis) + if err != nil { + return err + } + + appGenState[stakingtypes.ModuleName] = modifiedStakingStr + } + + appState, err := json.MarshalIndent(appGenState, "", " ") + if err != nil { + return errors.Wrap(err, "Failed to marshal default genesis state") + } + + genDoc := &types.GenesisDoc{} + if _, err := os.Stat(genFile); err != nil { + if !os.IsNotExist(err) { + return err + } + } else { + genDoc, err = types.GenesisDocFromFile(genFile) + if err != nil { + return errors.Wrap(err, "Failed to read genesis doc from file") + } + } + + genDoc.ChainID = chainID + genDoc.Validators = nil + genDoc.AppState = appState + + if err = genutil.ExportGenesisFile(genDoc, genFile); err != nil { + return errors.Wrap(err, "Failed to export gensis file") + } + + toPrint := newPrintInfo(config.Moniker, chainID, nodeID, "", appState) + + cfg.WriteConfigFile(config.RootDir, config) + return displayInfo(toPrint) + }, + } + + cmd.Flags().String(cli.HomeFlag, defaultNodeHome, "node's home directory") + cmd.Flags().BoolP(FlagOverwrite, "o", false, "overwrite the genesis.json file") + cmd.Flags().Bool(FlagRecover, false, "provide seed phrase to recover existing key instead of creating") + cmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created") + cmd.Flags().String(FlagStakingBondDenom, "", "genesis file staking bond denomination, if left blank default value is 'stake'") + + return cmd +} diff --git a/x/genutil/client/cli/init_test.go b/x/genutil/client/cli/init_test.go new file mode 100644 index 00000000..f3d70a6a --- /dev/null +++ b/x/genutil/client/cli/init_test.go @@ -0,0 +1,293 @@ +package cli_test + +import ( + "bytes" + "context" + "fmt" + "io" + "os" + "testing" + "time" + + "github.com/spf13/viper" + "github.com/stretchr/testify/require" + abci_server "github.com/tendermint/tendermint/abci/server" + "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/server/mock" + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + genutilcli "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" + genutiltest "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/testutil" + "github.com/iqlusioninc/liquidity-staking-module/x/staking" +) + +var testMbm = module.NewBasicManager( + staking.AppModuleBasic{}, + genutil.AppModuleBasic{}, +) + +func TestInitCmd(t *testing.T) { + tests := []struct { + name string + flags func(dir string) []string + shouldErr bool + err error + }{ + { + name: "happy path", + flags: func(dir string) []string { + return []string{ + "appnode-test", + } + }, + shouldErr: false, + err: nil, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + home := t.TempDir() + logger := log.NewNopLogger() + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) + require.NoError(t, err) + + serverCtx := server.NewContext(viper.New(), cfg, logger) + interfaceRegistry := types.NewInterfaceRegistry() + marshaler := codec.NewProtoCodec(interfaceRegistry) + clientCtx := client.Context{}. + WithCodec(marshaler). + WithLegacyAmino(makeCodec()). + WithHomeDir(home) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd := genutilcli.InitCmd(testMbm, home) + cmd.SetArgs( + tt.flags(home), + ) + + if tt.shouldErr { + err := cmd.ExecuteContext(ctx) + require.EqualError(t, err, tt.err.Error()) + } else { + require.NoError(t, cmd.ExecuteContext(ctx)) + } + }) + } + +} + +func TestInitRecover(t *testing.T) { + home := t.TempDir() + logger := log.NewNopLogger() + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) + require.NoError(t, err) + + serverCtx := server.NewContext(viper.New(), cfg, logger) + interfaceRegistry := types.NewInterfaceRegistry() + marshaler := codec.NewProtoCodec(interfaceRegistry) + clientCtx := client.Context{}. + WithCodec(marshaler). + WithLegacyAmino(makeCodec()). + WithHomeDir(home) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd := genutilcli.InitCmd(testMbm, home) + mockIn := testutil.ApplyMockIODiscardOutErr(cmd) + + cmd.SetArgs([]string{ + "appnode-test", + fmt.Sprintf("--%s=true", genutilcli.FlagRecover), + }) + + // use valid mnemonic and complete recovery key generation successfully + mockIn.Reset("decide praise business actor peasant farm drastic weather extend front hurt later song give verb rhythm worry fun pond reform school tumble august one\n") + require.NoError(t, cmd.ExecuteContext(ctx)) +} + +func TestInitStakingBondDenom(t *testing.T) { + home := t.TempDir() + logger := log.NewNopLogger() + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) + require.NoError(t, err) + + serverCtx := server.NewContext(viper.New(), cfg, logger) + interfaceRegistry := types.NewInterfaceRegistry() + marshaler := codec.NewProtoCodec(interfaceRegistry) + clientCtx := client.Context{}. + WithCodec(marshaler). + WithLegacyAmino(makeCodec()). + WithHomeDir(home) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd := genutilcli.InitCmd(testMbm, home) + + cmd.SetArgs([]string{ + "appnode-test", + fmt.Sprintf("--%s=%s", cli.HomeFlag, home), + fmt.Sprintf("--%s=testtoken", genutilcli.FlagStakingBondDenom), + }) + require.NoError(t, cmd.ExecuteContext(ctx)) +} + +func TestEmptyState(t *testing.T) { + home := t.TempDir() + logger := log.NewNopLogger() + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) + require.NoError(t, err) + + serverCtx := server.NewContext(viper.New(), cfg, logger) + interfaceRegistry := types.NewInterfaceRegistry() + marshaler := codec.NewProtoCodec(interfaceRegistry) + clientCtx := client.Context{}. + WithCodec(marshaler). + WithLegacyAmino(makeCodec()). + WithHomeDir(home) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd := genutilcli.InitCmd(testMbm, home) + cmd.SetArgs([]string{"appnode-test", fmt.Sprintf("--%s=%s", cli.HomeFlag, home)}) + + require.NoError(t, cmd.ExecuteContext(ctx)) + + old := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + cmd = server.ExportCmd(nil, home) + cmd.SetArgs([]string{fmt.Sprintf("--%s=%s", cli.HomeFlag, home)}) + require.NoError(t, cmd.ExecuteContext(ctx)) + + outC := make(chan string) + go func() { + var buf bytes.Buffer + io.Copy(&buf, r) + outC <- buf.String() + }() + + w.Close() + os.Stdout = old + out := <-outC + + require.Contains(t, out, "genesis_time") + require.Contains(t, out, "chain_id") + require.Contains(t, out, "consensus_params") + require.Contains(t, out, "app_hash") + require.Contains(t, out, "app_state") +} + +func TestStartStandAlone(t *testing.T) { + home := t.TempDir() + logger := log.NewNopLogger() + interfaceRegistry := types.NewInterfaceRegistry() + marshaler := codec.NewProtoCodec(interfaceRegistry) + err := genutiltest.ExecInitCmd(testMbm, home, marshaler) + require.NoError(t, err) + + app, err := mock.NewApp(home, logger) + require.NoError(t, err) + + svrAddr, _, err := server.FreeTCPAddr() + require.NoError(t, err) + + svr, err := abci_server.NewServer(svrAddr, "socket", app) + require.NoError(t, err, "error creating listener") + + svr.SetLogger(logger.With("module", "abci-server")) + err = svr.Start() + require.NoError(t, err) + + timer := time.NewTimer(time.Duration(2) * time.Second) + for range timer.C { + err = svr.Stop() + require.NoError(t, err) + break + } +} + +func TestInitNodeValidatorFiles(t *testing.T) { + home := t.TempDir() + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) + require.NoError(t, err) + + nodeID, valPubKey, err := genutil.InitializeNodeValidatorFiles(cfg) + require.NoError(t, err) + + require.NotEqual(t, "", nodeID) + require.NotEqual(t, 0, len(valPubKey.Bytes())) +} + +func TestInitConfig(t *testing.T) { + home := t.TempDir() + logger := log.NewNopLogger() + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) + require.NoError(t, err) + + serverCtx := server.NewContext(viper.New(), cfg, logger) + interfaceRegistry := types.NewInterfaceRegistry() + marshaler := codec.NewProtoCodec(interfaceRegistry) + clientCtx := client.Context{}. + WithCodec(marshaler). + WithLegacyAmino(makeCodec()). + WithChainID("foo"). // add chain-id to clientCtx + WithHomeDir(home) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd := genutilcli.InitCmd(testMbm, home) + cmd.SetArgs([]string{"testnode"}) + + require.NoError(t, cmd.ExecuteContext(ctx)) + + old := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + cmd = server.ExportCmd(nil, home) + require.NoError(t, cmd.ExecuteContext(ctx)) + + outC := make(chan string) + go func() { + var buf bytes.Buffer + io.Copy(&buf, r) + outC <- buf.String() + }() + + w.Close() + os.Stdout = old + out := <-outC + + require.Contains(t, out, "\"chain_id\": \"foo\"") +} + +// custom tx codec +func makeCodec() *codec.LegacyAmino { + var cdc = codec.NewLegacyAmino() + sdk.RegisterLegacyAminoCodec(cdc) + cryptocodec.RegisterCrypto(cdc) + return cdc +} diff --git a/x/genutil/client/cli/migrate.go b/x/genutil/client/cli/migrate.go new file mode 100644 index 00000000..f27d979a --- /dev/null +++ b/x/genutil/client/cli/migrate.go @@ -0,0 +1,141 @@ +package cli + +import ( + "encoding/json" + "fmt" + "sort" + "time" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + tmjson "github.com/tendermint/tendermint/libs/json" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/version" + v040 "github.com/cosmos/cosmos-sdk/x/genutil/migrations/v040" + v043 "github.com/cosmos/cosmos-sdk/x/genutil/migrations/v043" + v046 "github.com/cosmos/cosmos-sdk/x/genutil/migrations/v046" + "github.com/cosmos/cosmos-sdk/x/genutil/types" +) + +const flagGenesisTime = "genesis-time" + +// Allow applications to extend and modify the migration process. +// +// Ref: https://github.com/cosmos/cosmos-sdk/issues/5041 +var migrationMap = types.MigrationMap{ + "v0.42": v040.Migrate, // NOTE: v0.40, v0.41 and v0.42 are genesis compatible. + "v0.43": v043.Migrate, // NOTE: v0.43, v0.44 and v0.45 are genesis compatible. + "v0.46": v046.Migrate, +} + +// GetMigrationCallback returns a MigrationCallback for a given version. +func GetMigrationCallback(version string) types.MigrationCallback { + return migrationMap[version] +} + +// GetMigrationVersions get all migration version in a sorted slice. +func GetMigrationVersions() []string { + versions := make([]string, len(migrationMap)) + + var i int + + for version := range migrationMap { + versions[i] = version + i++ + } + + sort.Strings(versions) + + return versions +} + +// MigrateGenesisCmd returns a command to execute genesis state migration. +func MigrateGenesisCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "migrate [target-version] [genesis-file]", + Short: "Migrate genesis to a specified target version", + Long: fmt.Sprintf(`Migrate the source genesis into the target version and print to STDOUT. + +Example: +$ %s migrate v0.36 /path/to/genesis.json --chain-id=cosmoshub-3 --genesis-time=2019-04-22T17:00:00Z +`, version.AppName), + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + + var err error + + target := args[0] + importGenesis := args[1] + + genDoc, err := validateGenDoc(importGenesis) + if err != nil { + return err + } + + // Since some default values are valid values, we just print to + // make sure the user didn't forget to update these values. + if genDoc.ConsensusParams.Evidence.MaxBytes == 0 { + fmt.Printf("Warning: consensus_params.evidence.max_bytes is set to 0. If this is"+ + " deliberate, feel free to ignore this warning. If not, please have a look at the chain"+ + " upgrade guide at %s.\n", chainUpgradeGuide) + } + + var initialState types.AppMap + if err := json.Unmarshal(genDoc.AppState, &initialState); err != nil { + return errors.Wrap(err, "failed to JSON unmarshal initial genesis state") + } + + migrationFunc := GetMigrationCallback(target) + if migrationFunc == nil { + return fmt.Errorf("unknown migration function for version: %s", target) + } + + // TODO: handler error from migrationFunc call + newGenState := migrationFunc(initialState, clientCtx) + + genDoc.AppState, err = json.Marshal(newGenState) + if err != nil { + return errors.Wrap(err, "failed to JSON marshal migrated genesis state") + } + + genesisTime, _ := cmd.Flags().GetString(flagGenesisTime) + if genesisTime != "" { + var t time.Time + + err := t.UnmarshalText([]byte(genesisTime)) + if err != nil { + return errors.Wrap(err, "failed to unmarshal genesis time") + } + + genDoc.GenesisTime = t + } + + chainID, _ := cmd.Flags().GetString(flags.FlagChainID) + if chainID != "" { + genDoc.ChainID = chainID + } + + bz, err := tmjson.Marshal(genDoc) + if err != nil { + return errors.Wrap(err, "failed to marshal genesis doc") + } + + sortedBz, err := sdk.SortJSON(bz) + if err != nil { + return errors.Wrap(err, "failed to sort JSON genesis doc") + } + + cmd.Println(string(sortedBz)) + return nil + }, + } + + cmd.Flags().String(flagGenesisTime, "", "override genesis_time with this flag") + cmd.Flags().String(flags.FlagChainID, "", "override chain_id with this flag") + + return cmd +} diff --git a/x/genutil/client/cli/validate_genesis.go b/x/genutil/client/cli/validate_genesis.go new file mode 100644 index 00000000..6c8e27dd --- /dev/null +++ b/x/genutil/client/cli/validate_genesis.go @@ -0,0 +1,71 @@ +package cli + +import ( + "encoding/json" + "fmt" + + "github.com/spf13/cobra" + tmtypes "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/types/module" +) + +const chainUpgradeGuide = "https://docs.cosmos.network/master/migrations/chain-upgrade-guide-040.html" + +// ValidateGenesisCmd takes a genesis file, and makes sure that it is valid. +func ValidateGenesisCmd(mbm module.BasicManager) *cobra.Command { + return &cobra.Command{ + Use: "validate-genesis [file]", + Args: cobra.RangeArgs(0, 1), + Short: "validates the genesis file at the default location or at the location passed as an arg", + RunE: func(cmd *cobra.Command, args []string) (err error) { + serverCtx := server.GetServerContextFromCmd(cmd) + clientCtx := client.GetClientContextFromCmd(cmd) + + cdc := clientCtx.Codec + + // Load default if passed no args, otherwise load passed file + var genesis string + if len(args) == 0 { + genesis = serverCtx.Config.GenesisFile() + } else { + genesis = args[0] + } + + genDoc, err := validateGenDoc(genesis) + if err != nil { + return err + } + + var genState map[string]json.RawMessage + if err = json.Unmarshal(genDoc.AppState, &genState); err != nil { + return fmt.Errorf("error unmarshalling genesis doc %s: %s", genesis, err.Error()) + } + + if err = mbm.ValidateGenesis(cdc, clientCtx.TxConfig, genState); err != nil { + return fmt.Errorf("error validating genesis file %s: %s", genesis, err.Error()) + } + + fmt.Printf("File at %s is a valid genesis file\n", genesis) + return nil + }, + } +} + +// validateGenDoc reads a genesis file and validates that it is a correct +// Tendermint GenesisDoc. This function does not do any cosmos-related +// validation. +func validateGenDoc(importGenesisFile string) (*tmtypes.GenesisDoc, error) { + genDoc, err := tmtypes.GenesisDocFromFile(importGenesisFile) + if err != nil { + return nil, fmt.Errorf("%s. Make sure that"+ + " you have correctly migrated all Tendermint consensus params, please see the"+ + " chain migration guide at %s for more info", + err.Error(), chainUpgradeGuide, + ) + } + + return genDoc, nil +} diff --git a/x/genutil/client/testutil/cli_test.go b/x/genutil/client/testutil/cli_test.go new file mode 100644 index 00000000..dd36a6af --- /dev/null +++ b/x/genutil/client/testutil/cli_test.go @@ -0,0 +1,17 @@ +// +build norace + +package testutil + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/testutil/network" + + "github.com/stretchr/testify/suite" +) + +func TestIntegrationTestSuite(t *testing.T) { + cfg := network.DefaultConfig() + cfg.NumValidators = 1 + suite.Run(t, NewIntegrationTestSuite(cfg)) +} diff --git a/x/genutil/client/testutil/helpers.go b/x/genutil/client/testutil/helpers.go new file mode 100644 index 00000000..d7d7d6a8 --- /dev/null +++ b/x/genutil/client/testutil/helpers.go @@ -0,0 +1,53 @@ +package testutil + +import ( + "context" + "fmt" + + "github.com/spf13/viper" + tmcfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/libs/cli" + "github.com/tendermint/tendermint/libs/log" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/types/module" + genutilcli "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" +) + +func ExecInitCmd(testMbm module.BasicManager, home string, cdc codec.Codec) error { + logger := log.NewNopLogger() + cfg, err := CreateDefaultTendermintConfig(home) + if err != nil { + return err + } + + cmd := genutilcli.InitCmd(testMbm, home) + serverCtx := server.NewContext(viper.New(), cfg, logger) + clientCtx := client.Context{}.WithCodec(cdc).WithHomeDir(home) + + _, out := testutil.ApplyMockIO(cmd) + clientCtx = clientCtx.WithOutput(out) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd.SetArgs([]string{"appnode-test", fmt.Sprintf("--%s=%s", cli.HomeFlag, home)}) + + return cmd.ExecuteContext(ctx) +} + +func CreateDefaultTendermintConfig(rootDir string) (*tmcfg.Config, error) { + conf := tmcfg.DefaultConfig() + conf.SetRoot(rootDir) + tmcfg.EnsureRoot(rootDir) + + if err := conf.ValidateBasic(); err != nil { + return nil, fmt.Errorf("error in config file: %v", err) + } + + return conf, nil +} diff --git a/x/genutil/client/testutil/migrate.go b/x/genutil/client/testutil/migrate.go new file mode 100644 index 00000000..6c408e5a --- /dev/null +++ b/x/genutil/client/testutil/migrate.go @@ -0,0 +1,61 @@ +package testutil + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" +) + +func TestGetMigrationCallback(t *testing.T) { + for _, version := range cli.GetMigrationVersions() { + require.NotNil(t, cli.GetMigrationCallback(version)) + } +} + +func (s *IntegrationTestSuite) TestMigrateGenesis() { + val0 := s.network.Validators[0] + + testCases := []struct { + name string + genesis string + target string + expErr bool + expErrMsg string + check func(jsonOut string) + }{ + { + "migrate 0.37 to 0.42", + v037Exported, + "v0.42", + true, "Make sure that you have correctly migrated all Tendermint consensus params", func(_ string) {}, + }, + { + "migrate 0.42 to 0.43", + v040Valid, + "v0.43", + false, "", + func(jsonOut string) { + // Make sure the json output contains the ADR-037 gov weighted votes. + s.Require().Contains(jsonOut, "\"weight\":\"1.000000000000000000\"") + }, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + genesisFile := testutil.WriteToNewTempFile(s.T(), tc.genesis) + jsonOutput, err := clitestutil.ExecTestCLICmd(val0.ClientCtx, cli.MigrateGenesisCmd(), []string{tc.target, genesisFile.Name()}) + if tc.expErr { + s.Require().Contains(err.Error(), tc.expErrMsg) + } else { + s.Require().NoError(err) + tc.check(jsonOutput.String()) + } + }) + } +} diff --git a/x/genutil/client/testutil/suite.go b/x/genutil/client/testutil/suite.go new file mode 100644 index 00000000..1b48ec8c --- /dev/null +++ b/x/genutil/client/testutil/suite.go @@ -0,0 +1,133 @@ +package testutil + +import ( + "context" + "fmt" + "io" + "os" + "path/filepath" + + "github.com/stretchr/testify/suite" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" + stakingcli "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +type IntegrationTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network +} + +func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite { + return &IntegrationTestSuite{cfg: cfg} +} + +func (s *IntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite") + + var err error + s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg) + s.Require().NoError(err) + + _, err = s.network.WaitForHeight(1) + s.Require().NoError(err) +} + +func (s *IntegrationTestSuite) TearDownSuite() { + s.T().Log("tearing down integration test suite") + s.network.Cleanup() +} + +func (s *IntegrationTestSuite) TestGenTxCmd() { + val := s.network.Validators[0] + dir := s.T().TempDir() + + cmd := cli.GenTxCmd( + simapp.ModuleBasics, + val.ClientCtx.TxConfig, banktypes.GenesisBalancesIterator{}, val.ClientCtx.HomeDir) + + _, out := testutil.ApplyMockIO(cmd) + clientCtx := val.ClientCtx.WithOutput(out) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + + amount := sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(12)) + genTxFile := filepath.Join(dir, "myTx") + cmd.SetArgs([]string{ + fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), + fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), + val.Moniker, + amount.String(), + }) + + err := cmd.ExecuteContext(ctx) + s.Require().NoError(err) + + // validate generated transaction. + open, err := os.Open(genTxFile) + s.Require().NoError(err) + + all, err := io.ReadAll(open) + s.Require().NoError(err) + + tx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(all) + s.Require().NoError(err) + + msgs := tx.GetMsgs() + s.Require().Len(msgs, 1) + + s.Require().Equal(sdk.MsgTypeURL(&types.MsgCreateValidator{}), sdk.MsgTypeURL(msgs[0])) + s.Require().True(val.Address.Equals(msgs[0].GetSigners()[0])) + s.Require().Equal(amount, msgs[0].(*types.MsgCreateValidator).Value) + s.Require().NoError(tx.ValidateBasic()) +} + +func (s *IntegrationTestSuite) TestGenTxCmdPubkey() { + val := s.network.Validators[0] + dir := s.T().TempDir() + + cmd := cli.GenTxCmd( + simapp.ModuleBasics, + val.ClientCtx.TxConfig, + banktypes.GenesisBalancesIterator{}, + val.ClientCtx.HomeDir, + ) + + _, out := testutil.ApplyMockIO(cmd) + clientCtx := val.ClientCtx.WithOutput(out) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + + amount := sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(12)) + genTxFile := filepath.Join(dir, "myTx") + + cmd.SetArgs([]string{ + fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), + fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), + fmt.Sprintf("--%s={\"key\":\"BOIkjkFruMpfOFC9oNPhiJGfmY2pHF/gwHdLDLnrnS0=\"}", stakingcli.FlagPubKey), + val.Moniker, + amount.String(), + }) + s.Require().Error(cmd.ExecuteContext(ctx)) + + cmd.SetArgs([]string{ + fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), + fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), + fmt.Sprintf("--%s={\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"BOIkjkFruMpfOFC9oNPhiJGfmY2pHF/gwHdLDLnrnS0=\"}", stakingcli.FlagPubKey), + val.Moniker, + amount.String(), + }) + s.Require().NoError(cmd.ExecuteContext(ctx)) +} diff --git a/x/genutil/client/testutil/validate_genesis.go b/x/genutil/client/testutil/validate_genesis.go new file mode 100644 index 00000000..7134715a --- /dev/null +++ b/x/genutil/client/testutil/validate_genesis.go @@ -0,0 +1,102 @@ +package testutil + +import ( + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" +) + +// An example exported genesis file from a 0.37 chain. Note that evidence +// parameters only contains `max_age`. +var v037Exported = `{ + "app_hash": "", + "app_state": {}, + "chain_id": "test", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1", + "time_iota_ms": "1000" + }, + "evidence": { "max_age": "100000" }, + "validator": { "pub_key_types": ["ed25519"] } + }, + "genesis_time": "2020-09-29T20:16:29.172362037Z", + "validators": [] +}` + +// An example exported genesis file that's 0.40 compatible. +// We added the following app_state: +// +// - x/gov: added votes to test ADR-037 split votes migration. +var v040Valid = `{ + "app_hash": "", + "app_state": { + "gov": { + "starting_proposal_id": "0", + "deposits": [], + "votes": [ + { + "proposal_id": "5", + "voter": "cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh", + "option": "VOTE_OPTION_YES" + } + ], + "proposals": [], + "deposit_params": { "min_deposit": [], "max_deposit_period": "0s" }, + "voting_params": { "voting_period": "0s" }, + "tally_params": { "quorum": "0", "threshold": "0", "veto_threshold": "0" } + } + }, + "chain_id": "test", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1", + "time_iota_ms": "1000" + }, + "evidence": { + "max_age_num_blocks": "100000", + "max_age_duration": "172800000000000", + "max_bytes": "0" + }, + "validator": { "pub_key_types": ["ed25519"] } + }, + "genesis_time": "2020-09-29T20:16:29.172362037Z", + "validators": [] +}` + +func (s *IntegrationTestSuite) TestValidateGenesis() { + val0 := s.network.Validators[0] + + testCases := []struct { + name string + genesis string + expErr bool + }{ + { + "exported 0.37 genesis file", + v037Exported, + true, + }, + { + "valid 0.40 genesis file", + v040Valid, + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + genesisFile := testutil.WriteToNewTempFile(s.T(), tc.genesis) + _, err := clitestutil.ExecTestCLICmd(val0.ClientCtx, cli.ValidateGenesisCmd(nil), []string{genesisFile.Name()}) + if tc.expErr { + s.Require().Contains(err.Error(), "Make sure that you have correctly migrated all Tendermint consensus params") + + } else { + s.Require().NoError(err) + } + }) + } +} diff --git a/x/genutil/collect.go b/x/genutil/collect.go new file mode 100644 index 00000000..699a32c5 --- /dev/null +++ b/x/genutil/collect.go @@ -0,0 +1,183 @@ +package genutil + +// DONTCOVER + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sort" + "strings" + + cfg "github.com/tendermint/tendermint/config" + tmtypes "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +// GenAppStateFromConfig gets the genesis app state from the config +func GenAppStateFromConfig(cdc codec.JSONCodec, txEncodingConfig client.TxEncodingConfig, + config *cfg.Config, initCfg types.InitConfig, genDoc tmtypes.GenesisDoc, genBalIterator types.GenesisBalancesIterator, +) (appState json.RawMessage, err error) { + + // process genesis transactions, else create default genesis.json + appGenTxs, persistentPeers, err := CollectTxs( + cdc, txEncodingConfig.TxJSONDecoder(), config.Moniker, initCfg.GenTxsDir, genDoc, genBalIterator, + ) + if err != nil { + return appState, err + } + + config.P2P.PersistentPeers = persistentPeers + cfg.WriteConfigFile(config.RootDir, config) + + // if there are no gen txs to be processed, return the default empty state + if len(appGenTxs) == 0 { + return appState, errors.New("there must be at least one genesis tx") + } + + // create the app state + appGenesisState, err := types.GenesisStateFromGenDoc(genDoc) + if err != nil { + return appState, err + } + + appGenesisState, err = SetGenTxsInAppGenesisState(cdc, txEncodingConfig.TxJSONEncoder(), appGenesisState, appGenTxs) + if err != nil { + return appState, err + } + + appState, err = json.MarshalIndent(appGenesisState, "", " ") + if err != nil { + return appState, err + } + + genDoc.AppState = appState + err = ExportGenesisFile(&genDoc, config.GenesisFile()) + + return appState, err +} + +// CollectTxs processes and validates application's genesis Txs and returns +// the list of appGenTxs, and persistent peers required to generate genesis.json. +func CollectTxs(cdc codec.JSONCodec, txJSONDecoder sdk.TxDecoder, moniker, genTxsDir string, + genDoc tmtypes.GenesisDoc, genBalIterator types.GenesisBalancesIterator, +) (appGenTxs []sdk.Tx, persistentPeers string, err error) { + // prepare a map of all balances in genesis state to then validate + // against the validators addresses + var appState map[string]json.RawMessage + if err := json.Unmarshal(genDoc.AppState, &appState); err != nil { + return appGenTxs, persistentPeers, err + } + + var fos []os.DirEntry + fos, err = os.ReadDir(genTxsDir) + if err != nil { + return appGenTxs, persistentPeers, err + } + + balancesMap := make(map[string]bankexported.GenesisBalance) + + genBalIterator.IterateGenesisBalances( + cdc, appState, + func(balance bankexported.GenesisBalance) (stop bool) { + balancesMap[balance.GetAddress().String()] = balance + return false + }, + ) + + // addresses and IPs (and port) validator server info + var addressesIPs []string + + for _, fo := range fos { + if fo.IsDir() { + continue + } + if !strings.HasSuffix(fo.Name(), ".json") { + continue + } + + // get the genTx + jsonRawTx, err := os.ReadFile(filepath.Join(genTxsDir, fo.Name())) + if err != nil { + return appGenTxs, persistentPeers, err + } + + var genTx sdk.Tx + if genTx, err = txJSONDecoder(jsonRawTx); err != nil { + return appGenTxs, persistentPeers, err + } + + appGenTxs = append(appGenTxs, genTx) + + // the memo flag is used to store + // the ip and node-id, for example this may be: + // "528fd3df22b31f4969b05652bfe8f0fe921321d5@192.168.2.37:26656" + + memoTx, ok := genTx.(sdk.TxWithMemo) + if !ok { + return appGenTxs, persistentPeers, fmt.Errorf("expected TxWithMemo, got %T", genTx) + } + nodeAddrIP := memoTx.GetMemo() + if len(nodeAddrIP) == 0 { + return appGenTxs, persistentPeers, fmt.Errorf("failed to find node's address and IP in %s", fo.Name()) + } + + // genesis transactions must be single-message + msgs := genTx.GetMsgs() + + // TODO abstract out staking message validation back to staking + msg := msgs[0].(*stakingtypes.MsgCreateValidator) + + // validate delegator and validator addresses and funds against the accounts in the state + delAddr := msg.DelegatorAddress + valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + if err != nil { + return appGenTxs, persistentPeers, err + } + + delBal, delOk := balancesMap[delAddr] + if !delOk { + _, file, no, ok := runtime.Caller(1) + if ok { + fmt.Printf("CollectTxs-1, called from %s#%d\n", file, no) + } + + return appGenTxs, persistentPeers, fmt.Errorf("account %s balance not in genesis state: %+v", delAddr, balancesMap) + } + + _, valOk := balancesMap[sdk.AccAddress(valAddr).String()] + if !valOk { + _, file, no, ok := runtime.Caller(1) + if ok { + fmt.Printf("CollectTxs-2, called from %s#%d - %s\n", file, no, sdk.AccAddress(msg.ValidatorAddress).String()) + } + return appGenTxs, persistentPeers, fmt.Errorf("account %s balance not in genesis state: %+v", valAddr, balancesMap) + } + + if delBal.GetCoins().AmountOf(msg.Value.Denom).LT(msg.Value.Amount) { + return appGenTxs, persistentPeers, fmt.Errorf( + "insufficient fund for delegation %v: %v < %v", + delBal.GetAddress().String(), delBal.GetCoins().AmountOf(msg.Value.Denom), msg.Value.Amount, + ) + } + + // exclude itself from persistent peers + if msg.Description.Moniker != moniker { + addressesIPs = append(addressesIPs, nodeAddrIP) + } + } + + sort.Strings(addressesIPs) + persistentPeers = strings.Join(addressesIPs, ",") + + return appGenTxs, persistentPeers, nil +} diff --git a/x/genutil/collect_test.go b/x/genutil/collect_test.go new file mode 100644 index 00000000..92bdceca --- /dev/null +++ b/x/genutil/collect_test.go @@ -0,0 +1,67 @@ +package genutil_test + +import ( + "encoding/json" + "os" + "path/filepath" + "testing" + + "github.com/gogo/protobuf/proto" + + tmtypes "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/types" + bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" + gtypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" +) + +type doNothingUnmarshalJSON struct { + codec.JSONCodec +} + +func (dnj *doNothingUnmarshalJSON) UnmarshalJSON(_ []byte, _ proto.Message) error { + return nil +} + +type doNothingIterator struct { + gtypes.GenesisBalancesIterator +} + +func (dni *doNothingIterator) IterateGenesisBalances(_ codec.JSONCodec, _ map[string]json.RawMessage, _ func(bankexported.GenesisBalance) bool) { +} + +// Ensures that CollectTx correctly traverses directories and won't error out on encountering +// a directory during traversal of the first level. See issue https://github.com/cosmos/cosmos-sdk/issues/6788. +func TestCollectTxsHandlesDirectories(t *testing.T) { + testDir, err := os.MkdirTemp(os.TempDir(), "testCollectTxs") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(testDir) + + // 1. We'll insert a directory as the first element before JSON file. + subDirPath := filepath.Join(testDir, "_adir") + if err := os.MkdirAll(subDirPath, 0755); err != nil { + t.Fatal(err) + } + + txDecoder := types.TxDecoder(func(txBytes []byte) (types.Tx, error) { + return nil, nil + }) + + // 2. Ensure that we don't encounter any error traversing the directory. + srvCtx := server.NewDefaultContext() + _ = srvCtx + cdc := codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) + gdoc := tmtypes.GenesisDoc{AppState: []byte("{}")} + balItr := new(doNothingIterator) + + dnc := &doNothingUnmarshalJSON{cdc} + if _, _, err := genutil.CollectTxs(dnc, txDecoder, "foo", testDir, gdoc, balItr); err != nil { + t.Fatal(err) + } +} diff --git a/x/genutil/doc.go b/x/genutil/doc.go new file mode 100644 index 00000000..bccc82a1 --- /dev/null +++ b/x/genutil/doc.go @@ -0,0 +1,10 @@ +/* +Package genutil contains a variety of genesis utility functionality +for usage within a blockchain application. Namely: + - Genesis transactions related (gentx) + - commands for collection and creation of gentxs + - initchain processing of gentxs + - Genesis file validation + - Tendermint related initialization +*/ +package genutil diff --git a/x/genutil/genesis.go b/x/genutil/genesis.go new file mode 100644 index 00000000..c6d17edb --- /dev/null +++ b/x/genutil/genesis.go @@ -0,0 +1,21 @@ +package genutil + +import ( + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/genutil/types" +) + +// InitGenesis - initialize accounts and deliver genesis transactions +func InitGenesis( + ctx sdk.Context, stakingKeeper types.StakingKeeper, + deliverTx deliverTxfn, genesisState types.GenesisState, + txEncodingConfig client.TxEncodingConfig, +) (validators []abci.ValidatorUpdate, err error) { + if len(genesisState.GenTxs) > 0 { + validators, err = DeliverGenTxs(ctx, genesisState.GenTxs, stakingKeeper, deliverTx, txEncodingConfig) + } + return +} diff --git a/x/genutil/gentx.go b/x/genutil/gentx.go new file mode 100644 index 00000000..6b1de66a --- /dev/null +++ b/x/genutil/gentx.go @@ -0,0 +1,118 @@ +package genutil + +import ( + "encoding/json" + "fmt" + + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +// SetGenTxsInAppGenesisState - sets the genesis transactions in the app genesis state +func SetGenTxsInAppGenesisState( + cdc codec.JSONCodec, txJSONEncoder sdk.TxEncoder, appGenesisState map[string]json.RawMessage, genTxs []sdk.Tx, +) (map[string]json.RawMessage, error) { + + genesisState := types.GetGenesisStateFromAppState(cdc, appGenesisState) + genTxsBz := make([]json.RawMessage, 0, len(genTxs)) + + for _, genTx := range genTxs { + txBz, err := txJSONEncoder(genTx) + if err != nil { + return appGenesisState, err + } + + genTxsBz = append(genTxsBz, txBz) + } + + genesisState.GenTxs = genTxsBz + return types.SetGenesisStateInAppState(cdc, appGenesisState, genesisState), nil +} + +// ValidateAccountInGenesis checks that the provided account has a sufficient +// balance in the set of genesis accounts. +func ValidateAccountInGenesis( + appGenesisState map[string]json.RawMessage, genBalIterator types.GenesisBalancesIterator, + addr sdk.Address, coins sdk.Coins, cdc codec.JSONCodec, +) error { + + var stakingData stakingtypes.GenesisState + cdc.MustUnmarshalJSON(appGenesisState[stakingtypes.ModuleName], &stakingData) + bondDenom := stakingData.Params.BondDenom + + var err error + + accountIsInGenesis := false + + genBalIterator.IterateGenesisBalances(cdc, appGenesisState, + func(bal bankexported.GenesisBalance) (stop bool) { + accAddress := bal.GetAddress() + accCoins := bal.GetCoins() + + // ensure that account is in genesis + if accAddress.Equals(addr) { + // ensure account contains enough funds of default bond denom + if coins.AmountOf(bondDenom).GT(accCoins.AmountOf(bondDenom)) { + err = fmt.Errorf( + "account %s has a balance in genesis, but it only has %v%s available to stake, not %v%s", + addr, accCoins.AmountOf(bondDenom), bondDenom, coins.AmountOf(bondDenom), bondDenom, + ) + + return true + } + + accountIsInGenesis = true + return true + } + + return false + }, + ) + + if err != nil { + return err + } + + if !accountIsInGenesis { + return fmt.Errorf("account %s does not have a balance in the genesis state", addr) + } + + return nil +} + +type deliverTxfn func(abci.RequestDeliverTx) abci.ResponseDeliverTx + +// DeliverGenTxs iterates over all genesis txs, decodes each into a Tx and +// invokes the provided deliverTxfn with the decoded Tx. It returns the result +// of the staking module's ApplyAndReturnValidatorSetUpdates. +func DeliverGenTxs( + ctx sdk.Context, genTxs []json.RawMessage, + stakingKeeper types.StakingKeeper, deliverTx deliverTxfn, + txEncodingConfig client.TxEncodingConfig, +) ([]abci.ValidatorUpdate, error) { + + for _, genTx := range genTxs { + tx, err := txEncodingConfig.TxJSONDecoder()(genTx) + if err != nil { + panic(err) + } + + bz, err := txEncodingConfig.TxEncoder()(tx) + if err != nil { + panic(err) + } + + res := deliverTx(abci.RequestDeliverTx{Tx: bz}) + if !res.IsOK() { + panic(res.Log) + } + } + + return stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) +} diff --git a/x/genutil/gentx_test.go b/x/genutil/gentx_test.go new file mode 100644 index 00000000..0a3d94a4 --- /dev/null +++ b/x/genutil/gentx_test.go @@ -0,0 +1,285 @@ +package genutil_test + +import ( + "encoding/json" + "fmt" + "testing" + + "github.com/stretchr/testify/suite" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/simapp/helpers" + simappparams "github.com/cosmos/cosmos-sdk/simapp/params" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + "github.com/iqlusioninc/liquidity-staking-module/x/staking" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +var ( + priv1 = secp256k1.GenPrivKey() + priv2 = secp256k1.GenPrivKey() + pk1 = priv1.PubKey() + pk2 = priv2.PubKey() + addr1 = sdk.AccAddress(pk1.Address()) + addr2 = sdk.AccAddress(pk2.Address()) + desc = stakingtypes.NewDescription("testname", "", "", "", "") + comm = stakingtypes.CommissionRates{} +) + +// GenTxTestSuite is a test suite to be used with gentx tests. +type GenTxTestSuite struct { + suite.Suite + + ctx sdk.Context + app *simapp.SimApp + encodingConfig simappparams.EncodingConfig + + msg1, msg2 *stakingtypes.MsgCreateValidator +} + +func (suite *GenTxTestSuite) SetupTest() { + checkTx := false + app := simapp.Setup(suite.T(), checkTx) + suite.ctx = app.BaseApp.NewContext(checkTx, tmproto.Header{}) + suite.app = app + suite.encodingConfig = simapp.MakeTestEncodingConfig() + + var err error + amount := sdk.NewInt64Coin(sdk.DefaultBondDenom, 50) + one := sdk.OneInt() + suite.msg1, err = stakingtypes.NewMsgCreateValidator( + sdk.ValAddress(pk1.Address()), pk1, amount, desc, comm, one) + suite.NoError(err) + suite.msg2, err = stakingtypes.NewMsgCreateValidator( + sdk.ValAddress(pk2.Address()), pk1, amount, desc, comm, one) + suite.NoError(err) +} + +func (suite *GenTxTestSuite) setAccountBalance(addr sdk.AccAddress, amount int64) json.RawMessage { + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + err := testutil.FundAccount(suite.app.BankKeeper, suite.ctx, addr, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 25)}) + suite.Require().NoError(err) + + bankGenesisState := suite.app.BankKeeper.ExportGenesis(suite.ctx) + bankGenesis, err := suite.encodingConfig.Amino.MarshalJSON(bankGenesisState) // TODO switch this to use Marshaler + suite.Require().NoError(err) + + return bankGenesis +} + +func (suite *GenTxTestSuite) TestSetGenTxsInAppGenesisState() { + var ( + txBuilder = suite.encodingConfig.TxConfig.NewTxBuilder() + genTxs []sdk.Tx + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "one genesis transaction", + func() { + err := txBuilder.SetMsgs(suite.msg1) + suite.Require().NoError(err) + tx := txBuilder.GetTx() + genTxs = []sdk.Tx{tx} + }, + true, + }, + { + "two genesis transactions", + func() { + err := txBuilder.SetMsgs(suite.msg1, suite.msg2) + suite.Require().NoError(err) + tx := txBuilder.GetTx() + genTxs = []sdk.Tx{tx} + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() + cdc := suite.encodingConfig.Codec + txJSONEncoder := suite.encodingConfig.TxConfig.TxJSONEncoder() + + tc.malleate() + appGenesisState, err := genutil.SetGenTxsInAppGenesisState(cdc, txJSONEncoder, make(map[string]json.RawMessage), genTxs) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(appGenesisState[types.ModuleName]) + + var genesisState types.GenesisState + err := cdc.UnmarshalJSON(appGenesisState[types.ModuleName], &genesisState) + suite.Require().NoError(err) + suite.Require().NotNil(genesisState.GenTxs) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *GenTxTestSuite) TestValidateAccountInGenesis() { + var ( + appGenesisState = make(map[string]json.RawMessage) + coins sdk.Coins + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "no accounts", + func() { + coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)} + }, + false, + }, + { + "account without balance in the genesis state", + func() { + coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)} + appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr2, 50) + }, + false, + }, + { + "account without enough funds of default bond denom", + func() { + coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 50)} + appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr1, 25) + }, + false, + }, + { + "account with enough funds of default bond denom", + func() { + coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)} + appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr1, 25) + }, + true, + }, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() + cdc := suite.encodingConfig.Codec + + suite.app.StakingKeeper.SetParams(suite.ctx, stakingtypes.DefaultParams()) + stakingGenesisState := staking.ExportGenesis(suite.ctx, suite.app.StakingKeeper) + suite.Require().Equal(stakingGenesisState.Params, stakingtypes.DefaultParams()) + stakingGenesis, err := cdc.MarshalJSON(stakingGenesisState) // TODO switch this to use Marshaler + suite.Require().NoError(err) + appGenesisState[stakingtypes.ModuleName] = stakingGenesis + + tc.malleate() + err = genutil.ValidateAccountInGenesis( + appGenesisState, banktypes.GenesisBalancesIterator{}, + addr1, coins, cdc, + ) + + if tc.expPass { + suite.Require().NoError(err) + } else { + suite.Require().Error(err) + } + + }) + } +} + +func (suite *GenTxTestSuite) TestDeliverGenTxs() { + var ( + genTxs []json.RawMessage + txBuilder = suite.encodingConfig.TxConfig.NewTxBuilder() + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "no signature supplied", + func() { + err := txBuilder.SetMsgs(suite.msg1) + suite.Require().NoError(err) + + genTxs = make([]json.RawMessage, 1) + tx, err := suite.encodingConfig.TxConfig.TxJSONEncoder()(txBuilder.GetTx()) + suite.Require().NoError(err) + genTxs[0] = tx + }, + false, + }, + { + "success", + func() { + _ = suite.setAccountBalance(addr1, 50) + _ = suite.setAccountBalance(addr2, 0) + + msg := banktypes.NewMsgSend(addr1, addr2, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1)}) + tx, err := helpers.GenTx( + suite.encodingConfig.TxConfig, + []sdk.Msg{msg}, + sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)}, + helpers.DefaultGenTxGas, + suite.ctx.ChainID(), + []uint64{7}, + []uint64{0}, + priv1, + ) + suite.Require().NoError(err) + + genTxs = make([]json.RawMessage, 1) + genTx, err := suite.encodingConfig.TxConfig.TxJSONEncoder()(tx) + suite.Require().NoError(err) + genTxs[0] = genTx + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() + + tc.malleate() + + if tc.expPass { + suite.Require().NotPanics(func() { + genutil.DeliverGenTxs( + suite.ctx, genTxs, suite.app.StakingKeeper, suite.app.BaseApp.DeliverTx, + suite.encodingConfig.TxConfig, + ) + }) + } else { + suite.Require().Panics(func() { + genutil.DeliverGenTxs( + suite.ctx, genTxs, suite.app.StakingKeeper, suite.app.BaseApp.DeliverTx, + suite.encodingConfig.TxConfig, + ) + }) + } + }) + } +} + +func TestGenTxTestSuite(t *testing.T) { + suite.Run(t, new(GenTxTestSuite)) +} diff --git a/x/genutil/migrations/v039/types.go b/x/genutil/migrations/v039/types.go new file mode 100644 index 00000000..12d082d1 --- /dev/null +++ b/x/genutil/migrations/v039/types.go @@ -0,0 +1,12 @@ +package v039 + +import "encoding/json" + +const ( + ModuleName = "genutil" +) + +// GenesisState defines the raw genesis transaction in JSON +type GenesisState struct { + GenTxs []json.RawMessage `json:"gentxs" yaml:"gentxs"` +} diff --git a/x/genutil/migrations/v040/migrate.go b/x/genutil/migrations/v040/migrate.go new file mode 100644 index 00000000..29ea4f35 --- /dev/null +++ b/x/genutil/migrations/v040/migrate.go @@ -0,0 +1,200 @@ +package v040 + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + v039auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v039" + v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" + v036supply "github.com/cosmos/cosmos-sdk/x/bank/migrations/v036" + v038bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v038" + v040bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v040" + v039crisis "github.com/cosmos/cosmos-sdk/x/crisis/migrations/v039" + v040crisis "github.com/cosmos/cosmos-sdk/x/crisis/migrations/v040" + v036distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v036" + v038distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v038" + v040distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v040" + v038evidence "github.com/cosmos/cosmos-sdk/x/evidence/migrations/v038" + v040evidence "github.com/cosmos/cosmos-sdk/x/evidence/migrations/v040" + v039genutil "github.com/cosmos/cosmos-sdk/x/genutil/migrations/v039" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + v036gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v036" + v040gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v040" + v039mint "github.com/cosmos/cosmos-sdk/x/mint/migrations/v039" + v040mint "github.com/cosmos/cosmos-sdk/x/mint/migrations/v040" + v036params "github.com/cosmos/cosmos-sdk/x/params/migrations/v036" + v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v039" + v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v040" + v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/migrations/v038" + v038staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/migrations/v038" + v040staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/migrations/v040" +) + +func migrateGenutil(oldGenState v039genutil.GenesisState) *types.GenesisState { + return &types.GenesisState{ + GenTxs: oldGenState.GenTxs, + } +} + +// Migrate migrates exported state from v0.39 to a v0.40 genesis state. +func Migrate(appState types.AppMap, clientCtx client.Context) types.AppMap { + v039Codec := codec.NewLegacyAmino() + v039auth.RegisterLegacyAminoCodec(v039Codec) + v036gov.RegisterLegacyAminoCodec(v039Codec) + v036distr.RegisterLegacyAminoCodec(v039Codec) + v036params.RegisterLegacyAminoCodec(v039Codec) + v038upgrade.RegisterLegacyAminoCodec(v039Codec) + + v040Codec := clientCtx.Codec + + if appState[v038bank.ModuleName] != nil { + // unmarshal relative source genesis application state + var bankGenState v038bank.GenesisState + v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &bankGenState) + + // unmarshal x/auth genesis state to retrieve all account balances + var authGenState v039auth.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) + + // unmarshal x/supply genesis state to retrieve total supply + var supplyGenState v036supply.GenesisState + v039Codec.MustUnmarshalJSON(appState[v036supply.ModuleName], &supplyGenState) + + // delete deprecated x/bank genesis state + delete(appState, v038bank.ModuleName) + + // delete deprecated x/supply genesis state + delete(appState, v036supply.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040bank.ModuleName] = v040Codec.MustMarshalJSON(v040bank.Migrate(bankGenState, authGenState, supplyGenState)) + } + + // remove balances from existing accounts + if appState[v039auth.ModuleName] != nil { + // unmarshal relative source genesis application state + var authGenState v039auth.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) + + // delete deprecated x/auth genesis state + delete(appState, v039auth.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040auth.ModuleName] = v040Codec.MustMarshalJSON(v040auth.Migrate(authGenState)) + } + + // Migrate x/crisis. + if appState[v039crisis.ModuleName] != nil { + // unmarshal relative source genesis application state + var crisisGenState v039crisis.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039crisis.ModuleName], &crisisGenState) + + // delete deprecated x/crisis genesis state + delete(appState, v039crisis.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040crisis.ModuleName] = v040Codec.MustMarshalJSON(v040crisis.Migrate(crisisGenState)) + } + + // Migrate x/distribution. + if appState[v038distr.ModuleName] != nil { + // unmarshal relative source genesis application state + var distributionGenState v038distr.GenesisState + v039Codec.MustUnmarshalJSON(appState[v038distr.ModuleName], &distributionGenState) + + // delete deprecated x/distribution genesis state + delete(appState, v038distr.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040distr.ModuleName] = v040Codec.MustMarshalJSON(v040distr.Migrate(distributionGenState)) + } + + // Migrate x/evidence. + if appState[v038evidence.ModuleName] != nil { + // unmarshal relative source genesis application state + var evidenceGenState v038evidence.GenesisState + v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &evidenceGenState) + + // delete deprecated x/evidence genesis state + delete(appState, v038evidence.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040evidence.ModuleName] = v040Codec.MustMarshalJSON(v040evidence.Migrate(evidenceGenState)) + } + + // Migrate x/gov. + if appState[v036gov.ModuleName] != nil { + // unmarshal relative source genesis application state + var govGenState v036gov.GenesisState + v039Codec.MustUnmarshalJSON(appState[v036gov.ModuleName], &govGenState) + + // delete deprecated x/gov genesis state + delete(appState, v036gov.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040gov.ModuleName] = v040Codec.MustMarshalJSON(v040gov.Migrate(govGenState)) + } + + // Migrate x/mint. + if appState[v039mint.ModuleName] != nil { + // unmarshal relative source genesis application state + var mintGenState v039mint.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039mint.ModuleName], &mintGenState) + + // delete deprecated x/mint genesis state + delete(appState, v039mint.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040mint.ModuleName] = v040Codec.MustMarshalJSON(v040mint.Migrate(mintGenState)) + } + + // Migrate x/slashing. + if appState[v039slashing.ModuleName] != nil { + // unmarshal relative source genesis application state + var slashingGenState v039slashing.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039slashing.ModuleName], &slashingGenState) + + // delete deprecated x/slashing genesis state + delete(appState, v039slashing.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040slashing.ModuleName] = v040Codec.MustMarshalJSON(v040slashing.Migrate(slashingGenState)) + } + + // Migrate x/staking. + if appState[v038staking.ModuleName] != nil { + // unmarshal relative source genesis application state + var stakingGenState v038staking.GenesisState + v039Codec.MustUnmarshalJSON(appState[v038staking.ModuleName], &stakingGenState) + + // delete deprecated x/staking genesis state + delete(appState, v038staking.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v040staking.ModuleName] = v040Codec.MustMarshalJSON(v040staking.Migrate(stakingGenState)) + } + + // Migrate x/genutil + if appState[v039genutil.ModuleName] != nil { + // unmarshal relative source genesis application state + var genutilGenState v039genutil.GenesisState + v039Codec.MustUnmarshalJSON(appState[v039genutil.ModuleName], &genutilGenState) + + // delete deprecated x/staking genesis state + delete(appState, v039genutil.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[ModuleName] = v040Codec.MustMarshalJSON(migrateGenutil(genutilGenState)) + } + + return appState +} diff --git a/x/genutil/migrations/v040/types.go b/x/genutil/migrations/v040/types.go new file mode 100644 index 00000000..f641dbff --- /dev/null +++ b/x/genutil/migrations/v040/types.go @@ -0,0 +1,5 @@ +package v040 + +const ( + ModuleName = "genutil" +) diff --git a/x/genutil/migrations/v043/migrate.go b/x/genutil/migrations/v043/migrate.go new file mode 100644 index 00000000..8c37ee61 --- /dev/null +++ b/x/genutil/migrations/v043/migrate.go @@ -0,0 +1,44 @@ +package v043 + +import ( + "github.com/cosmos/cosmos-sdk/client" + v040bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v040" + v043bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v043" + bank "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + v040gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v040" + v043gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v043" + gov "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" +) + +// Migrate migrates exported state from v0.40 to a v0.43 genesis state. +func Migrate(appState types.AppMap, clientCtx client.Context) types.AppMap { + // Migrate x/gov. + if appState[v040gov.ModuleName] != nil { + // unmarshal relative source genesis application state + var oldGovState gov.GenesisState + clientCtx.Codec.MustUnmarshalJSON(appState[v040gov.ModuleName], &oldGovState) + + // delete deprecated x/gov genesis state + delete(appState, v040gov.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v043gov.ModuleName] = clientCtx.Codec.MustMarshalJSON(v043gov.MigrateJSON(&oldGovState)) + } + + if appState[v040bank.ModuleName] != nil { + // unmarshal relative source genesis application state + var oldBankState bank.GenesisState + clientCtx.Codec.MustUnmarshalJSON(appState[v040bank.ModuleName], &oldBankState) + + // delete deprecated x/bank genesis state + delete(appState, v040bank.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + appState[v043bank.ModuleName] = clientCtx.Codec.MustMarshalJSON(v043bank.MigrateJSON(&oldBankState)) + } + + return appState +} diff --git a/x/genutil/migrations/v046/migrate.go b/x/genutil/migrations/v046/migrate.go new file mode 100644 index 00000000..10a04fd5 --- /dev/null +++ b/x/genutil/migrations/v046/migrate.go @@ -0,0 +1,32 @@ +package v046 + +import ( + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + v043gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v043" + v046gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v046" + gov "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" +) + +// Migrate migrates exported state from v0.43 to a v0.46 genesis state. +func Migrate(appState types.AppMap, clientCtx client.Context) types.AppMap { + // Migrate x/gov. + if appState[v043gov.ModuleName] != nil { + // unmarshal relative source genesis application state + var oldGovState gov.GenesisState + clientCtx.Codec.MustUnmarshalJSON(appState[v043gov.ModuleName], &oldGovState) + + // delete deprecated x/gov genesis state + delete(appState, v043gov.ModuleName) + + // Migrate relative source genesis application state and marshal it into + // the respective key. + newGovState, err := v046gov.MigrateJSON(&oldGovState) + if err != nil { + panic(err) + } + appState[v046gov.ModuleName] = clientCtx.Codec.MustMarshalJSON(newGovState) + } + + return appState +} diff --git a/x/genutil/module.go b/x/genutil/module.go new file mode 100644 index 00000000..db3071ca --- /dev/null +++ b/x/genutil/module.go @@ -0,0 +1,114 @@ +package genutil + +import ( + "encoding/json" + "fmt" + + "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/genutil/types" +) + +var ( + _ module.AppModuleGenesis = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} +) + +// AppModuleBasic defines the basic application module used by the genutil module. +type AppModuleBasic struct{} + +// Name returns the genutil module's name. +func (AppModuleBasic) Name() string { + return types.ModuleName +} + +// RegisterLegacyAminoCodec registers the genutil module's types on the given LegacyAmino codec. +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {} + +// RegisterInterfaces registers the module's interface types +func (b AppModuleBasic) RegisterInterfaces(_ cdctypes.InterfaceRegistry) {} + +// DefaultGenesis returns default genesis state as raw bytes for the genutil +// module. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesisState()) +} + +// ValidateGenesis performs genesis state validation for the genutil module. +func (b AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, txEncodingConfig client.TxEncodingConfig, bz json.RawMessage) error { + var data types.GenesisState + if err := cdc.UnmarshalJSON(bz, &data); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) + } + + return types.ValidateGenesis(&data, txEncodingConfig.TxJSONDecoder()) +} + +// RegisterRESTRoutes registers the REST routes for the genutil module. +// Deprecated: RegisterRESTRoutes is deprecated. +func (AppModuleBasic) RegisterRESTRoutes(_ client.Context, _ *mux.Router) {} + +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the genutil module. +func (AppModuleBasic) RegisterGRPCGatewayRoutes(_ client.Context, _ *runtime.ServeMux) { +} + +// GetTxCmd returns no root tx command for the genutil module. +func (AppModuleBasic) GetTxCmd() *cobra.Command { return nil } + +// GetQueryCmd returns no root query command for the genutil module. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { return nil } + +// AppModule implements an application module for the genutil module. +type AppModule struct { + AppModuleBasic + + accountKeeper types.AccountKeeper + stakingKeeper types.StakingKeeper + deliverTx deliverTxfn + txEncodingConfig client.TxEncodingConfig +} + +// NewAppModule creates a new AppModule object +func NewAppModule(accountKeeper types.AccountKeeper, + stakingKeeper types.StakingKeeper, deliverTx deliverTxfn, + txEncodingConfig client.TxEncodingConfig, +) module.AppModule { + + return module.NewGenesisOnlyAppModule(AppModule{ + AppModuleBasic: AppModuleBasic{}, + accountKeeper: accountKeeper, + stakingKeeper: stakingKeeper, + deliverTx: deliverTx, + txEncodingConfig: txEncodingConfig, + }) +} + +// InitGenesis performs genesis initialization for the genutil module. It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { + var genesisState types.GenesisState + cdc.MustUnmarshalJSON(data, &genesisState) + validators, err := InitGenesis(ctx, am.stakingKeeper, am.deliverTx, genesisState, am.txEncodingConfig) + if err != nil { + panic(err) + } + return validators +} + +// ExportGenesis returns the exported genesis state as raw bytes for the genutil +// module. +func (am AppModule) ExportGenesis(_ sdk.Context, cdc codec.JSONCodec) json.RawMessage { + return am.DefaultGenesis(cdc) +} + +// ConsensusVersion implements AppModule/ConsensusVersion. +func (AppModule) ConsensusVersion() uint64 { return 1 } diff --git a/x/genutil/types/expected_keepers.go b/x/genutil/types/expected_keepers.go new file mode 100644 index 00000000..854422a3 --- /dev/null +++ b/x/genutil/types/expected_keepers.go @@ -0,0 +1,42 @@ +package types + +import ( + "encoding/json" + + abci "github.com/tendermint/tendermint/abci/types" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + auth "github.com/cosmos/cosmos-sdk/x/auth/types" + bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" +) + +// StakingKeeper defines the expected staking keeper (noalias) +type StakingKeeper interface { + ApplyAndReturnValidatorSetUpdates(sdk.Context) (updates []abci.ValidatorUpdate, err error) +} + +// AccountKeeper defines the expected account keeper (noalias) +type AccountKeeper interface { + NewAccount(sdk.Context, auth.AccountI) auth.AccountI + SetAccount(sdk.Context, auth.AccountI) + IterateAccounts(ctx sdk.Context, process func(auth.AccountI) (stop bool)) +} + +// GenesisAccountsIterator defines the expected iterating genesis accounts object (noalias) +type GenesisAccountsIterator interface { + IterateGenesisAccounts( + cdc *codec.LegacyAmino, + appGenesis map[string]json.RawMessage, + cb func(auth.AccountI) (stop bool), + ) +} + +// GenesisAccountsIterator defines the expected iterating genesis accounts object (noalias) +type GenesisBalancesIterator interface { + IterateGenesisBalances( + cdc codec.JSONCodec, + appGenesis map[string]json.RawMessage, + cb func(bankexported.GenesisBalance) (stop bool), + ) +} diff --git a/x/genutil/types/genesis.pb.go b/x/genutil/types/genesis.pb.go new file mode 100644 index 00000000..58a2f178 --- /dev/null +++ b/x/genutil/types/genesis.pb.go @@ -0,0 +1,328 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/genutil/v1beta1/genesis.proto + +package types + +import ( + encoding_json "encoding/json" + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the raw genesis transaction in JSON. +type GenesisState struct { + // gen_txs defines the genesis transactions. + GenTxs []encoding_json.RawMessage `protobuf:"bytes,1,rep,name=gen_txs,json=genTxs,proto3,casttype=encoding/json.RawMessage" json:"gentxs"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_31771d25e8d8f90f, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.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 *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetGenTxs() []encoding_json.RawMessage { + if m != nil { + return m.GenTxs + } + return nil +} + +func init() { + // proto.RegisterType((*GenesisState)(nil), "cosmos.genutil.v1beta1.GenesisState") +} + +func init() { + proto.RegisterFile("cosmos/genutil/v1beta1/genesis.proto", fileDescriptor_31771d25e8d8f90f) +} + +var fileDescriptor_31771d25e8d8f90f = []byte{ + // 221 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xce, 0x2f, 0xce, + 0xcd, 0x2f, 0xd6, 0x4f, 0x4f, 0xcd, 0x2b, 0x2d, 0xc9, 0xcc, 0xd1, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, + 0x49, 0x34, 0x04, 0xf1, 0x53, 0x8b, 0x33, 0x8b, 0xf5, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85, 0xc4, + 0x20, 0xaa, 0xf4, 0xa0, 0xaa, 0xf4, 0xa0, 0xaa, 0xa4, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4a, + 0xf4, 0x41, 0x2c, 0x88, 0x6a, 0x25, 0x7f, 0x2e, 0x1e, 0x77, 0x88, 0xf6, 0xe0, 0x92, 0xc4, 0x92, + 0x54, 0x21, 0x7b, 0x2e, 0xf6, 0xf4, 0xd4, 0xbc, 0xf8, 0x92, 0x8a, 0x62, 0x09, 0x46, 0x05, 0x66, + 0x0d, 0x1e, 0x27, 0xb5, 0x57, 0xf7, 0xe4, 0xd9, 0xd2, 0x53, 0xf3, 0x4a, 0x2a, 0x8a, 0x7f, 0xdd, + 0x93, 0x97, 0x48, 0xcd, 0x4b, 0xce, 0x4f, 0xc9, 0xcc, 0x4b, 0xd7, 0xcf, 0x2a, 0xce, 0xcf, 0xd3, + 0x0b, 0x4a, 0x2c, 0xf7, 0x4d, 0x2d, 0x2e, 0x4e, 0x4c, 0x4f, 0x0d, 0x02, 0xa9, 0x09, 0xa9, 0x28, + 0x76, 0x72, 0x3b, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, + 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x9d, 0xf4, 0xcc, + 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xa8, 0x4f, 0x20, 0x94, 0x6e, 0x71, 0x4a, + 0xb6, 0x7e, 0x05, 0xdc, 0x5b, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0xf7, 0x19, 0x03, + 0x02, 0x00, 0x00, 0xff, 0xff, 0xc5, 0xe1, 0x3b, 0x15, 0xf5, 0x00, 0x00, 0x00, +} + +func (m *GenesisState) 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 *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.GenTxs) > 0 { + for iNdEx := len(m.GenTxs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.GenTxs[iNdEx]) + copy(dAtA[i:], m.GenTxs[iNdEx]) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.GenTxs[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.GenTxs) > 0 { + for _, b := range m.GenTxs { + l = len(b) + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) 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 ErrIntOverflowGenesis + } + 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: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GenTxs", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GenTxs = append(m.GenTxs, make([]byte, postIndex-iNdEx)) + copy(m.GenTxs[len(m.GenTxs)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(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, ErrIntOverflowGenesis + } + 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, ErrIntOverflowGenesis + } + 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, ErrIntOverflowGenesis + } + 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, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/genutil/types/genesis_state.go b/x/genutil/types/genesis_state.go new file mode 100644 index 00000000..a78458b3 --- /dev/null +++ b/x/genutil/types/genesis_state.go @@ -0,0 +1,119 @@ +package types + +import ( + "encoding/json" + "errors" + "fmt" + + tmos "github.com/tendermint/tendermint/libs/os" + tmtypes "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +// NewGenesisState creates a new GenesisState object +func NewGenesisState(genTxs []json.RawMessage) *GenesisState { + // Ensure genTxs is never nil, https://github.com/cosmos/cosmos-sdk/issues/5086 + if len(genTxs) == 0 { + genTxs = make([]json.RawMessage, 0) + } + return &GenesisState{ + GenTxs: genTxs, + } +} + +// DefaultGenesisState returns the genutil module's default genesis state. +func DefaultGenesisState() *GenesisState { + return &GenesisState{ + GenTxs: []json.RawMessage{}, + } +} + +// NewGenesisStateFromTx creates a new GenesisState object +// from auth transactions +func NewGenesisStateFromTx(txJSONEncoder sdk.TxEncoder, genTxs []sdk.Tx) *GenesisState { + genTxsBz := make([]json.RawMessage, len(genTxs)) + for i, genTx := range genTxs { + var err error + genTxsBz[i], err = txJSONEncoder(genTx) + if err != nil { + panic(err) + } + } + return NewGenesisState(genTxsBz) +} + +// GetGenesisStateFromAppState gets the genutil genesis state from the expected app state +func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.RawMessage) *GenesisState { + var genesisState GenesisState + if appState[ModuleName] != nil { + cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) + } + return &genesisState +} + +// SetGenesisStateInAppState sets the genutil genesis state within the expected app state +func SetGenesisStateInAppState( + cdc codec.JSONCodec, appState map[string]json.RawMessage, genesisState *GenesisState, +) map[string]json.RawMessage { + + genesisStateBz := cdc.MustMarshalJSON(genesisState) + appState[ModuleName] = genesisStateBz + return appState +} + +// GenesisStateFromGenDoc creates the core parameters for genesis initialization +// for the application. +// +// NOTE: The pubkey input is this machines pubkey. +func GenesisStateFromGenDoc(genDoc tmtypes.GenesisDoc) (genesisState map[string]json.RawMessage, err error) { + if err = json.Unmarshal(genDoc.AppState, &genesisState); err != nil { + return genesisState, err + } + return genesisState, nil +} + +// GenesisStateFromGenFile creates the core parameters for genesis initialization +// for the application. +// +// NOTE: The pubkey input is this machines pubkey. +func GenesisStateFromGenFile(genFile string) (genesisState map[string]json.RawMessage, genDoc *tmtypes.GenesisDoc, err error) { + if !tmos.FileExists(genFile) { + return genesisState, genDoc, + fmt.Errorf("%s does not exist, run `init` first", genFile) + } + + genDoc, err = tmtypes.GenesisDocFromFile(genFile) + if err != nil { + return genesisState, genDoc, err + } + + genesisState, err = GenesisStateFromGenDoc(*genDoc) + return genesisState, genDoc, err +} + +// ValidateGenesis validates GenTx transactions +func ValidateGenesis(genesisState *GenesisState, txJSONDecoder sdk.TxDecoder) error { + for i, genTx := range genesisState.GenTxs { + var tx sdk.Tx + tx, err := txJSONDecoder(genTx) + if err != nil { + return err + } + + msgs := tx.GetMsgs() + if len(msgs) != 1 { + return errors.New( + "must provide genesis Tx with exactly 1 CreateValidator message") + } + + // TODO: abstract back to staking + if _, ok := msgs[0].(*stakingtypes.MsgCreateValidator); !ok { + return fmt.Errorf( + "genesis transaction %v does not contain a MsgCreateValidator", i) + } + } + return nil +} diff --git a/x/genutil/types/genesis_state_test.go b/x/genutil/types/genesis_state_test.go new file mode 100644 index 00000000..348dc9b0 --- /dev/null +++ b/x/genutil/types/genesis_state_test.go @@ -0,0 +1,72 @@ +package types_test + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +var ( + pk1 = ed25519.GenPrivKey().PubKey() + pk2 = ed25519.GenPrivKey().PubKey() +) + +func TestNetGenesisState(t *testing.T) { + gen := types.NewGenesisState(nil) + assert.NotNil(t, gen.GenTxs) // https://github.com/cosmos/cosmos-sdk/issues/5086 + + gen = types.NewGenesisState( + []json.RawMessage{ + []byte(`{"foo":"bar"}`), + }, + ) + assert.Equal(t, string(gen.GenTxs[0]), `{"foo":"bar"}`) +} + +func TestValidateGenesisMultipleMessages(t *testing.T) { + desc := stakingtypes.NewDescription("testname", "", "", "", "") + comm := stakingtypes.CommissionRates{} + + msg1, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(pk1.Address()), pk1, + sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm, sdk.OneInt()) + require.NoError(t, err) + + msg2, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(pk2.Address()), pk2, + sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm, sdk.OneInt()) + require.NoError(t, err) + + txGen := simapp.MakeTestEncodingConfig().TxConfig + txBuilder := txGen.NewTxBuilder() + require.NoError(t, txBuilder.SetMsgs(msg1, msg2)) + + tx := txBuilder.GetTx() + genesisState := types.NewGenesisStateFromTx(txGen.TxJSONEncoder(), []sdk.Tx{tx}) + + err = types.ValidateGenesis(genesisState, simapp.MakeTestEncodingConfig().TxConfig.TxJSONDecoder()) + require.Error(t, err) +} + +func TestValidateGenesisBadMessage(t *testing.T) { + desc := stakingtypes.NewDescription("testname", "", "", "", "") + + msg1 := stakingtypes.NewMsgEditValidator(sdk.ValAddress(pk1.Address()), desc, nil, nil) + + txGen := simapp.MakeTestEncodingConfig().TxConfig + txBuilder := txGen.NewTxBuilder() + err := txBuilder.SetMsgs(msg1) + require.NoError(t, err) + + tx := txBuilder.GetTx() + genesisState := types.NewGenesisStateFromTx(txGen.TxJSONEncoder(), []sdk.Tx{tx}) + + err = types.ValidateGenesis(genesisState, simapp.MakeTestEncodingConfig().TxConfig.TxJSONDecoder()) + require.Error(t, err) +} diff --git a/x/genutil/types/types.go b/x/genutil/types/types.go new file mode 100644 index 00000000..694eebdb --- /dev/null +++ b/x/genutil/types/types.go @@ -0,0 +1,45 @@ +package types + +import ( + "encoding/json" + + "github.com/cosmos/cosmos-sdk/client" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" +) + +// DONTCOVER + +type ( + // AppMap map modules names with their json raw representation. + AppMap map[string]json.RawMessage + + // MigrationCallback converts a genesis map from the previous version to the + // targeted one. + // + // TODO: MigrationCallback should also return an error upon failure. + MigrationCallback func(AppMap, client.Context) AppMap + + // MigrationMap defines a mapping from a version to a MigrationCallback. + MigrationMap map[string]MigrationCallback +) + +// ModuleName is genutil +const ModuleName = "genutil" + +// InitConfig common config options for init +type InitConfig struct { + ChainID string + GenTxsDir string + NodeID string + ValPubKey cryptotypes.PubKey +} + +// NewInitConfig creates a new InitConfig object +func NewInitConfig(chainID, genTxsDir, nodeID string, valPubKey cryptotypes.PubKey) InitConfig { + return InitConfig{ + ChainID: chainID, + GenTxsDir: genTxsDir, + NodeID: nodeID, + ValPubKey: valPubKey, + } +} diff --git a/x/genutil/utils.go b/x/genutil/utils.go new file mode 100644 index 00000000..251b0f39 --- /dev/null +++ b/x/genutil/utils.go @@ -0,0 +1,103 @@ +package genutil + +import ( + "context" + "encoding/json" + "fmt" + "path/filepath" + "time" + + "github.com/cosmos/go-bip39" + cfg "github.com/tendermint/tendermint/config" + tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" + tmos "github.com/tendermint/tendermint/libs/os" + "github.com/tendermint/tendermint/privval" + tmtypes "github.com/tendermint/tendermint/types" + + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" +) + +// ExportGenesisFile creates and writes the genesis configuration to disk. An +// error is returned if building or writing the configuration to file fails. +func ExportGenesisFile(genDoc *tmtypes.GenesisDoc, genFile string) error { + if err := genDoc.ValidateAndComplete(); err != nil { + return err + } + + return genDoc.SaveAs(genFile) +} + +// ExportGenesisFileWithTime creates and writes the genesis configuration to disk. +// An error is returned if building or writing the configuration to file fails. +func ExportGenesisFileWithTime( + genFile, chainID string, validators []tmtypes.GenesisValidator, + appState json.RawMessage, genTime time.Time, +) error { + + genDoc := tmtypes.GenesisDoc{ + GenesisTime: genTime, + ChainID: chainID, + Validators: validators, + AppState: appState, + } + + if err := genDoc.ValidateAndComplete(); err != nil { + return err + } + + return genDoc.SaveAs(genFile) +} + +// InitializeNodeValidatorFiles creates private validator and p2p configuration files. +func InitializeNodeValidatorFiles(config *cfg.Config) (nodeID string, valPubKey cryptotypes.PubKey, err error) { + return InitializeNodeValidatorFilesFromMnemonic(config, "") +} + +// InitializeNodeValidatorFilesFromMnemonic creates private validator and p2p configuration files using the given mnemonic. +// If no valid mnemonic is given, a random one will be used instead. +func InitializeNodeValidatorFilesFromMnemonic(config *cfg.Config, mnemonic string) (nodeID string, valPubKey cryptotypes.PubKey, err error) { + if len(mnemonic) > 0 && !bip39.IsMnemonicValid(mnemonic) { + return "", nil, fmt.Errorf("invalid mnemonic") + } + nodeKey, err := tmtypes.LoadOrGenNodeKey(config.NodeKeyFile()) + if err != nil { + return "", nil, err + } + + nodeID = string(nodeKey.ID) + + pvKeyFile := config.PrivValidator.KeyFile() + if err := tmos.EnsureDir(filepath.Dir(pvKeyFile), 0777); err != nil { + return "", nil, err + } + + pvStateFile := config.PrivValidator.StateFile() + if err := tmos.EnsureDir(filepath.Dir(pvStateFile), 0777); err != nil { + return "", nil, err + } + + var filePV *privval.FilePV + if len(mnemonic) == 0 { + filePV, err = privval.LoadOrGenFilePV(pvKeyFile, pvStateFile) + if err != nil { + return "", nil, err + } + } else { + privKey := tmed25519.GenPrivKeyFromSecret([]byte(mnemonic)) + filePV = privval.NewFilePV(privKey, pvKeyFile, pvStateFile) + filePV.Save() + } + + tmValPubKey, err := filePV.GetPubKey(context.TODO()) + if err != nil { + return "", nil, err + } + + valPubKey, err = cryptocodec.FromTmPubKeyInterface(tmValPubKey) + if err != nil { + return "", nil, err + } + + return nodeID, valPubKey, nil +} diff --git a/x/genutil/utils_test.go b/x/genutil/utils_test.go new file mode 100644 index 00000000..d1a80d58 --- /dev/null +++ b/x/genutil/utils_test.go @@ -0,0 +1,18 @@ +package genutil + +import ( + "encoding/json" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestExportGenesisFileWithTime(t *testing.T) { + t.Parallel() + + fname := filepath.Join(t.TempDir(), "genesis.json") + + require.NoError(t, ExportGenesisFileWithTime(fname, "test", nil, json.RawMessage(`{"account_owner": "Bob"}`), time.Now())) +} diff --git a/x/staking/migrations/v040/migrate.go b/x/staking/migrations/v040/migrate.go index 6616e71a..babcb991 100644 --- a/x/staking/migrations/v040/migrate.go +++ b/x/staking/migrations/v040/migrate.go @@ -5,7 +5,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" - v038staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v038" + v038staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/migrations/v038" ) func migrateBondStatus(oldStatus v034staking.BondStatus) BondStatus { From 4e27f1ea1a1a692ccdf27a7d1e0873936766a296 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 3 May 2022 11:40:28 +1000 Subject: [PATCH 11/57] emit events on newly newly added staking messages --- x/staking/keeper/msg_server.go | 31 +++++++++++++++++++++++++++++-- x/staking/types/events.go | 20 +++++++++++++------- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 2b7f6fb7..9f9e2382 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -403,8 +403,6 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS return nil, sdkstaking.ErrNoValidatorFound } - _ = validator - delegatorAddress, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) if err != nil { return nil, err @@ -502,6 +500,17 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS return nil, err } + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeTokenizeShares, + sdk.NewAttribute(types.AttributeKeyDelegator, msg.DelegatorAddress), + sdk.NewAttribute(types.AttributeKeyValidator, msg.ValidatorAddress), + sdk.NewAttribute(types.AttributeKeyShareOwner, msg.TokenizedShareOwner), + sdk.NewAttribute(types.AttributeKeyShareRecordId, fmt.Sprintf("%d", record.Id)), + sdk.NewAttribute(types.AttributeKeyAmount, msg.Amount.String()), + ), + ) + return &types.MsgTokenizeSharesResponse{ Amount: shareToken, }, nil @@ -588,6 +597,15 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken return nil, err } + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeRedeemShares, + sdk.NewAttribute(types.AttributeKeyDelegator, msg.DelegatorAddress), + sdk.NewAttribute(types.AttributeKeyValidator, validator.OperatorAddress), + sdk.NewAttribute(types.AttributeKeyAmount, msg.Amount.String()), + ), + ) + return &types.MsgRedeemTokensforSharesResponse{}, nil } @@ -617,5 +635,14 @@ func (k msgServer) TransferTokenizeShareRecord(goCtx context.Context, msg *types } k.setTokenizeShareRecordWithOwner(ctx, newOwner, record.Id) + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeTransferTokenizeShareRecord, + sdk.NewAttribute(types.AttributeKeyShareRecordId, fmt.Sprintf("%d", msg.TokenizeShareRecordId)), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + sdk.NewAttribute(types.AttributeKeyShareOwner, msg.NewOwner), + ), + ) + return &types.MsgTransferTokenizeShareRecordResponse{}, nil } diff --git a/x/staking/types/events.go b/x/staking/types/events.go index 99a0be1a..d6f5385b 100644 --- a/x/staking/types/events.go +++ b/x/staking/types/events.go @@ -2,13 +2,16 @@ package types // staking module event types const ( - EventTypeCompleteUnbonding = "complete_unbonding" - EventTypeCompleteRedelegation = "complete_redelegation" - EventTypeCreateValidator = "create_validator" - EventTypeEditValidator = "edit_validator" - EventTypeDelegate = "delegate" - EventTypeUnbond = "unbond" - EventTypeRedelegate = "redelegate" + EventTypeCompleteUnbonding = "complete_unbonding" + EventTypeCompleteRedelegation = "complete_redelegation" + EventTypeCreateValidator = "create_validator" + EventTypeEditValidator = "edit_validator" + EventTypeDelegate = "delegate" + EventTypeUnbond = "unbond" + EventTypeRedelegate = "redelegate" + EventTypeTokenizeShares = "tokenize_shares" + EventTypeRedeemShares = "redeem_shares" + EventTypeTransferTokenizeShareRecord = "transfer_tokenize_share_record" AttributeKeyValidator = "validator" AttributeKeyCommissionRate = "commission_rate" @@ -18,5 +21,8 @@ const ( AttributeKeyDelegator = "delegator" AttributeKeyCompletionTime = "completion_time" AttributeKeyNewShares = "new_shares" + AttributeKeyShareOwner = "share_owner" + AttributeKeyShareRecordId = "share_record_id" + AttributeKeyAmount = "amount" AttributeValueCategory = ModuleName ) From 4dfd80fa0404acaa6305cfbc3b6a9b7d6547338d Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 3 May 2022 11:50:55 +1000 Subject: [PATCH 12/57] add notes for get validator twice clarification --- x/staking/keeper/msg_server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 2b7f6fb7..86339a2a 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -491,6 +491,7 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS return nil, err } + // Note: it is needed to get latest validator object to get Keeper.Delegate function work properly validator, found = k.GetValidator(ctx, valAddr) if !found { return nil, sdkstaking.ErrNoValidatorFound From d5fed1779a0677678508d672f19c0ccedfd614dd Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 3 May 2022 11:56:11 +1000 Subject: [PATCH 13/57] add further nodes for findings 13 and 14 --- x/staking/keeper/msg_server.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 86339a2a..1b396ab1 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -551,6 +551,7 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken k.bondedTokensToNotBonded(ctx, returnAmount) } + // Note: since delegation object has been changed from unbond call, it gets latest delegation _, found = k.GetDelegation(ctx, record.GetModuleAddress(), valAddr) if !found { if k.hooks != nil { @@ -577,6 +578,7 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken return nil, err } + // Note: it is needed to get latest validator object to get Keeper.Delegate function work properly validator, found = k.GetValidator(ctx, valAddr) if !found { return nil, sdkstaking.ErrNoValidatorFound From 8b34b13836658cee5a7ccfa0154268315690d843 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 3 May 2022 22:01:13 +1000 Subject: [PATCH 14/57] remove tokenize share denom from record --- proto/staking/v1beta1/staking.proto | 5 +- x/staking/handler_test.go | 2 +- x/staking/keeper/msg_server.go | 17 +- x/staking/keeper/msg_server_test.go | 9 +- x/staking/keeper/tokenize_share_record.go | 4 +- .../keeper/tokenize_share_record_test.go | 29 +- x/staking/simulation/operations.go | 6 +- x/staking/types/staking.pb.go | 1610 ++++++++--------- x/staking/types/tokenize_share_record.go | 6 + 9 files changed, 813 insertions(+), 875 deletions(-) diff --git a/proto/staking/v1beta1/staking.proto b/proto/staking/v1beta1/staking.proto index 38ca4a5a..d8960e09 100644 --- a/proto/staking/v1beta1/staking.proto +++ b/proto/staking/v1beta1/staking.proto @@ -343,7 +343,6 @@ message TokenizeShareRecord { uint64 id = 1; string owner = 2; - string share_token_denom = 3; - string module_account = 4; // module account take the role of delegator - string validator = 5; // validator delegated to for tokenize share record creation + string module_account = 3; // module account take the role of delegator + string validator = 4; // validator delegated to for tokenize share record creation } diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index a3057df7..d1501333 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -178,7 +178,7 @@ func TestRedeemTokensforShares(t *testing.T) { require.NoError(t, err) // redeem share - tstaking.RedeemTokensForShares(del2, sdk.NewCoin(record.ShareTokenDenom, tc.amount), tc.isSuccess) + tstaking.RedeemTokensForShares(del2, sdk.NewCoin(record.GetShareTokenDenom(), tc.amount), tc.isSuccess) }) } } diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 2b7f6fb7..41c58c1f 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -3,7 +3,6 @@ package keeper import ( "context" "fmt" - "strconv" "time" metrics "github.com/armon/go-metrics" @@ -387,10 +386,6 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( }, nil } -func getShareTokenDenom(validatorAddress string, tokenizeShareRecordId uint64) string { - return validatorAddress + strconv.Itoa(int(tokenizeShareRecordId)) -} - func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeShares) (*types.MsgTokenizeSharesResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) @@ -442,16 +437,14 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS recordId := k.GetLastTokenizeShareRecordId(ctx) + 1 k.SetLastTokenizeShareRecordId(ctx, recordId) - shareTokenDenom := getShareTokenDenom(msg.ValidatorAddress, recordId) record := types.TokenizeShareRecord{ - Id: recordId, - Owner: msg.TokenizedShareOwner, - ShareTokenDenom: shareTokenDenom, - ModuleAccount: fmt.Sprintf("tokenizeshare_%d", recordId), - Validator: msg.ValidatorAddress, + Id: recordId, + Owner: msg.TokenizedShareOwner, + ModuleAccount: fmt.Sprintf("tokenizeshare_%d", recordId), + Validator: msg.ValidatorAddress, } - shareToken := sdk.NewCoin(shareTokenDenom, msg.Amount.Amount) + shareToken := sdk.NewCoin(record.GetShareTokenDenom(), msg.Amount.Amount) err = k.bankKeeper.MintCoins(ctx, minttypes.ModuleName, sdk.Coins{shareToken}) if err != nil { diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index efdb598c..0db2a01d 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -313,11 +313,10 @@ func TestTransferTokenizeShareRecord(t *testing.T) { msgServer := keeper.NewMsgServerImpl(app.StakingKeeper) err := app.StakingKeeper.AddTokenizeShareRecord(ctx, types.TokenizeShareRecord{ - Id: 1, - Owner: addrAcc1.String(), - ShareTokenDenom: "share_token_denom", - ModuleAccount: "module_account", - Validator: val.String(), + Id: 1, + Owner: addrAcc1.String(), + ModuleAccount: "module_account", + Validator: val.String(), }) require.NoError(t, err) diff --git a/x/staking/keeper/tokenize_share_record.go b/x/staking/keeper/tokenize_share_record.go index 8d8949fa..d10c8952 100644 --- a/x/staking/keeper/tokenize_share_record.go +++ b/x/staking/keeper/tokenize_share_record.go @@ -96,7 +96,7 @@ func (k Keeper) AddTokenizeShareRecord(ctx sdk.Context, tokenizeShareRecord type } k.setTokenizeShareRecordWithOwner(ctx, owner, tokenizeShareRecord.Id) - k.setTokenizeShareRecordWithDenom(ctx, tokenizeShareRecord.ShareTokenDenom, tokenizeShareRecord.Id) + k.setTokenizeShareRecordWithDenom(ctx, tokenizeShareRecord.GetShareTokenDenom(), tokenizeShareRecord.Id) return nil } @@ -114,7 +114,7 @@ func (k Keeper) DeleteTokenizeShareRecord(ctx sdk.Context, recordId uint64) erro store := ctx.KVStore(k.storeKey) store.Delete(types.GetTokenizeShareRecordByIndexKey(recordId)) store.Delete(types.GetTokenizeShareRecordIdByOwnerAndIdKey(owner, recordId)) - store.Delete(types.GetTokenizeShareRecordIdByDenomKey(record.ShareTokenDenom)) + store.Delete(types.GetTokenizeShareRecordIdByDenomKey(record.GetShareTokenDenom())) return nil } diff --git a/x/staking/keeper/tokenize_share_record_test.go b/x/staking/keeper/tokenize_share_record_test.go index c4f0de4a..a4e57d5f 100644 --- a/x/staking/keeper/tokenize_share_record_test.go +++ b/x/staking/keeper/tokenize_share_record_test.go @@ -18,25 +18,22 @@ func (suite *KeeperTestSuite) TestGetTokenizeShareRecord() { owner1, owner2 := suite.addrs[0], suite.addrs[1] tokenizeShareRecord1 := types.TokenizeShareRecord{ - Id: 0, - Owner: owner1.String(), - ShareTokenDenom: "test-share-token-denom-1", - ModuleAccount: "test-module-account-1", - Validator: "test-validator", + Id: 0, + Owner: owner1.String(), + ModuleAccount: "test-module-account-1", + Validator: "test-validator", } tokenizeShareRecord2 := types.TokenizeShareRecord{ - Id: 1, - Owner: owner2.String(), - ShareTokenDenom: "test-share-token-denom-2", - ModuleAccount: "test-module-account-2", - Validator: "test-validator", + Id: 1, + Owner: owner2.String(), + ModuleAccount: "test-module-account-2", + Validator: "test-validator", } tokenizeShareRecord3 := types.TokenizeShareRecord{ - Id: 2, - Owner: owner1.String(), - ShareTokenDenom: "test-share-token-denom-3", - ModuleAccount: "test-module-account-3", - Validator: "test-validator", + Id: 2, + Owner: owner1.String(), + ModuleAccount: "test-module-account-3", + Validator: "test-validator", } app.StakingKeeper.AddTokenizeShareRecord(ctx, tokenizeShareRecord1) app.StakingKeeper.AddTokenizeShareRecord(ctx, tokenizeShareRecord2) @@ -46,7 +43,7 @@ func (suite *KeeperTestSuite) TestGetTokenizeShareRecord() { suite.NoError(err) suite.Equal(tokenizeShareRecord, tokenizeShareRecord3) - tokenizeShareRecord, err = app.StakingKeeper.GetTokenizeShareRecordByDenom(ctx, "test-share-token-denom-2") + tokenizeShareRecord, err = app.StakingKeeper.GetTokenizeShareRecordByDenom(ctx, tokenizeShareRecord2.GetShareTokenDenom()) suite.NoError(err) suite.Equal(tokenizeShareRecord, tokenizeShareRecord2) diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index c7ac31d4..98897a3d 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -617,12 +617,12 @@ func SimulateMsgRedeemTokensforShares(ak types.AccountKeeper, bk types.BankKeepe if len(records) > 0 { record := records[r.Intn(len(records))] for _, acc := range accs { - balance := bk.GetBalance(ctx, acc.Address, record.ShareTokenDenom) + balance := bk.GetBalance(ctx, acc.Address, record.GetShareTokenDenom()) if balance.Amount.IsPositive() { redeemUser = acc redeemAmount, err := simtypes.RandPositiveInt(r, balance.Amount) if err == nil { - redeemCoin = sdk.NewCoin(record.ShareTokenDenom, redeemAmount) + redeemCoin = sdk.NewCoin(record.GetShareTokenDenom(), redeemAmount) } break } @@ -678,7 +678,7 @@ func SimulateMsgTransferTokenizeShareRecord(ak types.AccountKeeper, bk types.Ban if len(records) > 0 { record := records[r.Intn(len(records))] for _, acc := range accs { - balance := bk.GetBalance(ctx, acc.Address, record.ShareTokenDenom) + balance := bk.GetBalance(ctx, acc.Address, record.GetShareTokenDenom()) if balance.Amount.IsPositive() { simAccount = acc transferRecord = record diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 3af9cec2..df7f16d7 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1113,11 +1113,10 @@ func (m *Pool) XXX_DiscardUnknown() { var xxx_messageInfo_Pool proto.InternalMessageInfo type TokenizeShareRecord struct { - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Owner string `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` - ShareTokenDenom string `protobuf:"bytes,3,opt,name=share_token_denom,json=shareTokenDenom,proto3" json:"share_token_denom,omitempty"` - ModuleAccount string `protobuf:"bytes,4,opt,name=module_account,json=moduleAccount,proto3" json:"module_account,omitempty"` - Validator string `protobuf:"bytes,5,opt,name=validator,proto3" json:"validator,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Owner string `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + ModuleAccount string `protobuf:"bytes,3,opt,name=module_account,json=moduleAccount,proto3" json:"module_account,omitempty"` + Validator string `protobuf:"bytes,4,opt,name=validator,proto3" json:"validator,omitempty"` } func (m *TokenizeShareRecord) Reset() { *m = TokenizeShareRecord{} } @@ -1167,13 +1166,6 @@ func (m *TokenizeShareRecord) GetOwner() string { return "" } -func (m *TokenizeShareRecord) GetShareTokenDenom() string { - if m != nil { - return m.ShareTokenDenom - } - return "" -} - func (m *TokenizeShareRecord) GetModuleAccount() string { if m != nil { return m.ModuleAccount @@ -1216,126 +1208,125 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/staking.proto", fileDescriptor_76a7656dabf68054) } var fileDescriptor_76a7656dabf68054 = []byte{ - // 1898 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x5b, 0x59, - 0x15, 0xf6, 0x73, 0xdc, 0x24, 0x3e, 0x4e, 0xe2, 0xe4, 0x36, 0x9d, 0x71, 0x4d, 0x6b, 0x9b, 0x27, - 0xcd, 0x28, 0x2d, 0xc4, 0x66, 0x32, 0xd2, 0x00, 0xdd, 0xa0, 0x38, 0x4e, 0x49, 0x98, 0xd2, 0x89, - 0x5e, 0x7e, 0x06, 0x06, 0x24, 0xeb, 0xfa, 0xbd, 0x1b, 0xe7, 0x92, 0xe7, 0xf7, 0xdc, 0x77, 0xaf, - 0x3b, 0x31, 0x9a, 0x05, 0xcb, 0x51, 0x25, 0x44, 0x61, 0x35, 0x9b, 0x4a, 0x95, 0xd8, 0x21, 0x24, - 0x24, 0x84, 0xd8, 0xb3, 0x1b, 0x90, 0x90, 0x2a, 0x56, 0x23, 0x84, 0x0c, 0x6a, 0x85, 0x84, 0x58, - 0xa1, 0xac, 0xd8, 0x81, 0xee, 0xcf, 0xfb, 0xc9, 0x73, 0x67, 0x52, 0x47, 0xb3, 0xa8, 0x04, 0x9b, - 0xc4, 0xf7, 0xdc, 0x73, 0xbe, 0x73, 0xef, 0xf9, 0xbb, 0xe7, 0x3c, 0xb8, 0xce, 0x38, 0x3e, 0xa6, - 0x5e, 0xb7, 0x71, 0xff, 0x8d, 0x0e, 0xe1, 0xf8, 0x8d, 0x86, 0x5e, 0xd7, 0xfb, 0x81, 0xcf, 0x7d, - 0x74, 0xdd, 0xa5, 0xf7, 0x06, 0xd4, 0x09, 0x89, 0xe1, 0x7f, 0xcd, 0x5c, 0x5e, 0xee, 0xfa, 0x5d, - 0x5f, 0x72, 0x36, 0xc4, 0x2f, 0x25, 0x54, 0xbe, 0xda, 0xf5, 0xfd, 0xae, 0x4b, 0x1a, 0x72, 0xd5, - 0x19, 0x1c, 0x36, 0xb0, 0x37, 0xd4, 0x5b, 0x95, 0xf4, 0x96, 0x33, 0x08, 0x30, 0xa7, 0xbe, 0xa7, - 0xf7, 0xab, 0xe9, 0x7d, 0x4e, 0x7b, 0x84, 0x71, 0xdc, 0xeb, 0x87, 0xd8, 0xb6, 0xcf, 0x7a, 0x3e, - 0x6b, 0x2b, 0xa5, 0x6a, 0x11, 0x62, 0xab, 0x55, 0xa3, 0x83, 0x19, 0x89, 0xae, 0x63, 0xfb, 0x34, - 0xc4, 0xbe, 0xc6, 0x89, 0xe7, 0x90, 0xa0, 0x47, 0x3d, 0xde, 0xe0, 0xc3, 0x3e, 0x61, 0xea, 0xaf, - 0xda, 0x35, 0x1f, 0x1a, 0xb0, 0xb0, 0x45, 0x19, 0xf7, 0x03, 0x6a, 0x63, 0x77, 0xdb, 0x3b, 0xf4, - 0xd1, 0x5b, 0x30, 0x7d, 0x44, 0xb0, 0x43, 0x82, 0x92, 0x51, 0x33, 0x56, 0x0a, 0x6b, 0xa5, 0x7a, - 0x8c, 0x50, 0x57, 0xb2, 0x5b, 0x72, 0xbf, 0x99, 0xfb, 0x78, 0x54, 0xcd, 0x58, 0x9a, 0x1b, 0xdd, - 0x86, 0xe9, 0xfb, 0xd8, 0x65, 0x84, 0x97, 0xb2, 0xb5, 0xa9, 0x95, 0xc2, 0xda, 0x4a, 0xfd, 0x33, - 0xad, 0x58, 0x3f, 0xc0, 0x2e, 0x75, 0x30, 0xf7, 0x23, 0x1c, 0x25, 0x6d, 0xfe, 0x2a, 0x0b, 0xc5, - 0x0d, 0xbf, 0xd7, 0xa3, 0x8c, 0x51, 0xdf, 0xb3, 0x30, 0x27, 0x0c, 0x35, 0x21, 0x17, 0x60, 0x4e, - 0xe4, 0x89, 0xf2, 0xcd, 0xba, 0xe0, 0xff, 0xf3, 0xa8, 0xfa, 0x7a, 0x97, 0xf2, 0xa3, 0x41, 0xa7, - 0x6e, 0xfb, 0x3d, 0x6d, 0x13, 0xfd, 0x6f, 0x95, 0x39, 0xc7, 0xfa, 0x9a, 0x2d, 0x62, 0x5b, 0x52, - 0x16, 0x7d, 0x1f, 0x66, 0x7b, 0xf8, 0xa4, 0x2d, 0x71, 0xb2, 0x12, 0x67, 0x7d, 0x32, 0x9c, 0xd3, - 0x51, 0xb5, 0x38, 0xc4, 0x3d, 0xf7, 0x96, 0x19, 0xe2, 0x98, 0xd6, 0x4c, 0x0f, 0x9f, 0x88, 0x23, - 0xa2, 0x3e, 0x14, 0x05, 0xd5, 0x3e, 0xc2, 0x5e, 0x97, 0x28, 0x25, 0x53, 0x52, 0xc9, 0xd6, 0xc4, - 0x4a, 0x5e, 0x89, 0x95, 0x24, 0xe0, 0x4c, 0x6b, 0xbe, 0x87, 0x4f, 0x36, 0x24, 0x41, 0x68, 0xbc, - 0x35, 0xfb, 0xd1, 0xe3, 0x6a, 0xe6, 0x1f, 0x8f, 0xab, 0x86, 0xf9, 0x89, 0x01, 0x10, 0x5b, 0x0c, - 0xd9, 0xb0, 0x68, 0x47, 0x2b, 0x29, 0xcb, 0xb4, 0x2b, 0xeb, 0xe7, 0xb8, 0x24, 0x65, 0xf6, 0xe6, - 0xac, 0x38, 0xfb, 0x93, 0x51, 0xd5, 0xb0, 0x8a, 0x76, 0xca, 0x23, 0xdf, 0x83, 0xc2, 0xa0, 0xef, - 0x60, 0x4e, 0xda, 0x22, 0x56, 0xa5, 0x41, 0x0b, 0x6b, 0xe5, 0xba, 0x0a, 0xe4, 0x7a, 0x18, 0xc8, - 0xf5, 0xbd, 0x30, 0x90, 0x9b, 0x15, 0x81, 0x75, 0x3a, 0xaa, 0x22, 0x75, 0xbb, 0x84, 0xb0, 0xf9, - 0xf0, 0xaf, 0x55, 0xc3, 0x02, 0x45, 0x11, 0x02, 0x89, 0xab, 0xfd, 0xde, 0x80, 0x42, 0x8b, 0x30, - 0x3b, 0xa0, 0x7d, 0x91, 0x2f, 0xa8, 0x04, 0x33, 0x3d, 0xdf, 0xa3, 0xc7, 0x3a, 0x3a, 0xf3, 0x56, - 0xb8, 0x44, 0x65, 0x98, 0xa5, 0x0e, 0xf1, 0x38, 0xe5, 0x43, 0xe5, 0x5e, 0x2b, 0x5a, 0x0b, 0xa9, - 0xf7, 0x49, 0x87, 0xd1, 0xd0, 0x29, 0x56, 0xb8, 0x44, 0xb7, 0x61, 0x91, 0x11, 0x7b, 0x10, 0x50, - 0x3e, 0x6c, 0xdb, 0xbe, 0xc7, 0xb1, 0xcd, 0x4b, 0x39, 0xe9, 0xb7, 0x2f, 0x9c, 0x8e, 0xaa, 0xaf, - 0xaa, 0xb3, 0xa6, 0x39, 0x4c, 0xab, 0x18, 0x92, 0x36, 0x14, 0x45, 0x68, 0x70, 0x08, 0xc7, 0xd4, - 0x65, 0xa5, 0x4b, 0x4a, 0x83, 0x5e, 0x26, 0xee, 0xf2, 0xbb, 0x19, 0xc8, 0x47, 0x41, 0x2f, 0x34, - 0xfb, 0x7d, 0x12, 0x88, 0xdf, 0x6d, 0xec, 0x38, 0x01, 0x61, 0x4c, 0x87, 0x77, 0x42, 0x73, 0x9a, - 0xc3, 0xb4, 0x8a, 0x21, 0x69, 0x5d, 0x51, 0x10, 0x17, 0xde, 0xf6, 0x18, 0xf1, 0xd8, 0x80, 0xb5, - 0xfb, 0x83, 0xce, 0x31, 0x19, 0x6a, 0x6f, 0x2c, 0x8f, 0x79, 0x63, 0xdd, 0x1b, 0x36, 0xdf, 0x8c, - 0xd1, 0xd3, 0x72, 0xe6, 0x1f, 0x7e, 0xb3, 0xba, 0xac, 0x8b, 0x8b, 0x1d, 0x0c, 0xfb, 0xdc, 0xaf, - 0xef, 0x0c, 0x3a, 0x6f, 0x93, 0xa1, 0x70, 0xbf, 0x66, 0xdd, 0x91, 0x9c, 0xe8, 0x15, 0x98, 0xfe, - 0x01, 0xa6, 0x2e, 0x71, 0xa4, 0x41, 0x67, 0x2d, 0xbd, 0x42, 0xeb, 0x30, 0xcd, 0x38, 0xe6, 0x03, - 0x26, 0xad, 0xb8, 0xb0, 0x76, 0xe3, 0x9c, 0x88, 0x6b, 0xfa, 0x9e, 0xb3, 0x2b, 0x05, 0x2c, 0x2d, - 0x28, 0xea, 0x08, 0xf7, 0x8f, 0x89, 0xa7, 0x2d, 0x39, 0x51, 0xb6, 0x6f, 0x7b, 0xdc, 0xd2, 0xd2, - 0xc2, 0x30, 0x0e, 0x71, 0x49, 0x57, 0xda, 0x8f, 0x1d, 0xe1, 0x80, 0xb0, 0xd2, 0xb4, 0x44, 0xdc, - 0x9e, 0x38, 0x25, 0xb5, 0xc1, 0xd2, 0x78, 0xa6, 0x55, 0x8c, 0x48, 0xbb, 0x92, 0x82, 0x2c, 0x28, - 0x38, 0x71, 0xbc, 0x96, 0x66, 0xa4, 0x27, 0x6e, 0x9e, 0x63, 0x85, 0x44, 0x84, 0xeb, 0x62, 0x98, - 0x04, 0x11, 0xa1, 0x32, 0xf0, 0x3a, 0xbe, 0xe7, 0x50, 0xaf, 0xdb, 0x3e, 0x22, 0xb4, 0x7b, 0xc4, - 0x4b, 0xb3, 0x35, 0x63, 0x65, 0x2a, 0x19, 0x2a, 0x69, 0x0e, 0xd3, 0x2a, 0x46, 0xa4, 0x2d, 0x49, - 0x41, 0x0e, 0x2c, 0xc4, 0x5c, 0x32, 0x6d, 0xf3, 0xe7, 0xa6, 0xed, 0x17, 0x75, 0xda, 0x5e, 0x49, - 0x6b, 0x89, 0x33, 0x77, 0x3e, 0x22, 0x0a, 0x31, 0xf4, 0x0e, 0x40, 0x5c, 0x2c, 0x4a, 0x20, 0x35, - 0xdc, 0x78, 0xe1, 0xc2, 0xa3, 0xef, 0x9f, 0x80, 0x40, 0x1f, 0xc0, 0xe5, 0x1e, 0xf5, 0xda, 0x8c, - 0xb8, 0x87, 0x6d, 0x6d, 0x6e, 0x81, 0x5c, 0x90, 0xbe, 0xbc, 0x33, 0x59, 0x74, 0x9c, 0x8e, 0xaa, - 0x65, 0x5d, 0x5e, 0xc7, 0x21, 0x4d, 0x6b, 0xa9, 0x47, 0xbd, 0x5d, 0xe2, 0x1e, 0xb6, 0x22, 0xda, - 0xad, 0xb9, 0x0f, 0x1f, 0x57, 0x33, 0x3a, 0x87, 0x33, 0xe6, 0x5b, 0x30, 0x77, 0x80, 0x5d, 0x9d, - 0x7b, 0x84, 0xa1, 0x6b, 0x90, 0xc7, 0xe1, 0xa2, 0x64, 0xd4, 0xa6, 0x56, 0xf2, 0x56, 0x4c, 0x50, - 0xb9, 0xff, 0xa3, 0xbf, 0xd4, 0x0c, 0xf3, 0x97, 0x06, 0x4c, 0xb7, 0x0e, 0x76, 0x30, 0x0d, 0xd0, - 0x36, 0x2c, 0xc5, 0x71, 0x74, 0x36, 0xf3, 0xaf, 0x9d, 0x8e, 0xaa, 0xa5, 0x74, 0xa8, 0x45, 0xa9, - 0x1f, 0x87, 0x73, 0x98, 0xfb, 0xdb, 0xb0, 0x74, 0x3f, 0x2c, 0x28, 0x11, 0x54, 0x36, 0x0d, 0x35, - 0xc6, 0x62, 0x5a, 0x8b, 0x11, 0x4d, 0x43, 0xa5, 0xae, 0x79, 0x07, 0x66, 0xd4, 0x69, 0x19, 0x5a, - 0x87, 0x4b, 0x7d, 0xf1, 0x43, 0xde, 0xae, 0xb0, 0xf6, 0xda, 0x79, 0xa1, 0x2c, 0xc5, 0xb4, 0x17, - 0x95, 0xa4, 0xf9, 0xd3, 0x2c, 0x40, 0xeb, 0xe0, 0x60, 0x2f, 0xa0, 0x7d, 0x97, 0xf0, 0xcf, 0xd3, - 0x00, 0x7b, 0x70, 0x25, 0xbe, 0x1d, 0x0b, 0xec, 0x94, 0x11, 0x6a, 0xa7, 0xa3, 0xea, 0xb5, 0xb4, - 0x11, 0x12, 0x6c, 0xa6, 0x75, 0x39, 0xa2, 0xef, 0x06, 0xf6, 0x73, 0x51, 0x1d, 0xc6, 0x23, 0xd4, - 0xa9, 0x4f, 0x47, 0x4d, 0xb0, 0x25, 0x51, 0x5b, 0x8c, 0x3f, 0xdf, 0xc2, 0xef, 0x41, 0x21, 0x36, - 0x09, 0x43, 0x6f, 0xc3, 0x2c, 0xd7, 0xbf, 0xb5, 0xa1, 0x6f, 0x9c, 0x6b, 0xe8, 0x50, 0x5a, 0x1b, - 0x3b, 0x02, 0x30, 0xff, 0x6d, 0x00, 0xc4, 0x11, 0xfc, 0x72, 0x06, 0x9c, 0x28, 0xf3, 0xba, 0x28, - 0x4f, 0x5d, 0xa8, 0xa9, 0xd3, 0xd2, 0x29, 0xb3, 0xfe, 0x2c, 0x0b, 0x97, 0xf7, 0xc3, 0x72, 0xf4, - 0xd2, 0xdb, 0xe0, 0x5d, 0x98, 0x21, 0x1e, 0x0f, 0xa8, 0x34, 0x82, 0x70, 0xfa, 0x57, 0xcf, 0x71, - 0xfa, 0x73, 0xae, 0xb6, 0xe9, 0xf1, 0x60, 0xa8, 0x43, 0x20, 0x44, 0x4b, 0x19, 0xe5, 0x27, 0x53, - 0x50, 0xfa, 0x34, 0x49, 0xb4, 0x01, 0x45, 0x3b, 0x20, 0x92, 0x10, 0xbe, 0x2d, 0x86, 0x7c, 0x5b, - 0xca, 0x71, 0x2b, 0x9a, 0x62, 0x30, 0xad, 0x85, 0x90, 0xa2, 0x5f, 0x96, 0x2e, 0x88, 0x06, 0x51, + // 1881 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, + 0x15, 0x76, 0x3b, 0x9e, 0xc4, 0x7e, 0x4e, 0xe2, 0xa4, 0x26, 0xb3, 0xeb, 0x31, 0x33, 0xb6, 0x69, + 0x69, 0x57, 0x99, 0x85, 0xb1, 0xd9, 0xac, 0xb4, 0xc0, 0x5c, 0x50, 0x1c, 0x67, 0x48, 0xd8, 0x61, + 0x36, 0xea, 0xfc, 0x2c, 0x2c, 0x48, 0x56, 0xb9, 0xbb, 0xe2, 0x14, 0x69, 0x77, 0x7b, 0xba, 0xca, + 0xb3, 0x31, 0xda, 0x03, 0x27, 0xb4, 0x1a, 0x09, 0x31, 0x70, 0xda, 0xcb, 0x48, 0x23, 0x71, 0x43, + 0x48, 0x5c, 0x10, 0x77, 0x6e, 0x0b, 0x12, 0xd2, 0x88, 0xd3, 0x0a, 0x21, 0x83, 0x66, 0x84, 0x84, + 0x38, 0xa1, 0x9c, 0xb8, 0x81, 0xea, 0xa7, 0x7f, 0xd2, 0x9e, 0xdd, 0x8c, 0xa3, 0x3d, 0xac, 0x04, + 0x97, 0xc4, 0xf5, 0xea, 0xbd, 0xef, 0x55, 0xbd, 0xbf, 0x7a, 0xaf, 0xe1, 0x3a, 0xe3, 0xf8, 0x98, + 0x7a, 0xbd, 0xe6, 0xfd, 0xd7, 0xbb, 0x84, 0xe3, 0xd7, 0x9b, 0x7a, 0xdd, 0x18, 0x04, 0x3e, 0xf7, + 0xd1, 0x75, 0x97, 0xde, 0x1b, 0x52, 0x27, 0x24, 0x86, 0xff, 0x35, 0x73, 0x65, 0xa5, 0xe7, 0xf7, + 0x7c, 0xc9, 0xd9, 0x14, 0xbf, 0x94, 0x50, 0xe5, 0x6a, 0xcf, 0xf7, 0x7b, 0x2e, 0x69, 0xca, 0x55, + 0x77, 0x78, 0xd8, 0xc4, 0xde, 0x48, 0x6f, 0x55, 0xd3, 0x5b, 0xce, 0x30, 0xc0, 0x9c, 0xfa, 0x9e, + 0xde, 0xaf, 0xa5, 0xf7, 0x39, 0xed, 0x13, 0xc6, 0x71, 0x7f, 0x10, 0x62, 0xdb, 0x3e, 0xeb, 0xfb, + 0xac, 0xa3, 0x94, 0xaa, 0x45, 0x88, 0xad, 0x56, 0xcd, 0x2e, 0x66, 0x24, 0xba, 0x8e, 0xed, 0xd3, + 0x10, 0xfb, 0x1a, 0x27, 0x9e, 0x43, 0x82, 0x3e, 0xf5, 0x78, 0x93, 0x8f, 0x06, 0x84, 0xa9, 0xbf, + 0x6a, 0xd7, 0x7c, 0x68, 0xc0, 0xe2, 0x16, 0x65, 0xdc, 0x0f, 0xa8, 0x8d, 0xdd, 0x6d, 0xef, 0xd0, + 0x47, 0x6f, 0xc2, 0xec, 0x11, 0xc1, 0x0e, 0x09, 0xca, 0x46, 0xdd, 0x58, 0x2d, 0xae, 0x95, 0x1b, + 0x31, 0x42, 0x43, 0xc9, 0x6e, 0xc9, 0xfd, 0x56, 0xee, 0xa3, 0x71, 0x2d, 0x63, 0x69, 0x6e, 0x74, + 0x1b, 0x66, 0xef, 0x63, 0x97, 0x11, 0x5e, 0xce, 0xd6, 0x67, 0x56, 0x8b, 0x6b, 0xab, 0x8d, 0x4f, + 0xb5, 0x62, 0xe3, 0x00, 0xbb, 0xd4, 0xc1, 0xdc, 0x8f, 0x70, 0x94, 0xb4, 0xf9, 0xeb, 0x2c, 0x94, + 0x36, 0xfc, 0x7e, 0x9f, 0x32, 0x46, 0x7d, 0xcf, 0xc2, 0x9c, 0x30, 0xd4, 0x82, 0x5c, 0x80, 0x39, + 0x91, 0x27, 0x2a, 0xb4, 0x1a, 0x82, 0xff, 0xcf, 0xe3, 0xda, 0xab, 0x3d, 0xca, 0x8f, 0x86, 0xdd, + 0x86, 0xed, 0xf7, 0xb5, 0x4d, 0xf4, 0xbf, 0x9b, 0xcc, 0x39, 0xd6, 0xd7, 0x6c, 0x13, 0xdb, 0x92, + 0xb2, 0xe8, 0xfb, 0x90, 0xef, 0xe3, 0x93, 0x8e, 0xc4, 0xc9, 0x4a, 0x9c, 0xf5, 0xe9, 0x70, 0x4e, + 0xc7, 0xb5, 0xd2, 0x08, 0xf7, 0xdd, 0x5b, 0x66, 0x88, 0x63, 0x5a, 0x73, 0x7d, 0x7c, 0x22, 0x8e, + 0x88, 0x06, 0x50, 0x12, 0x54, 0xfb, 0x08, 0x7b, 0x3d, 0xa2, 0x94, 0xcc, 0x48, 0x25, 0x5b, 0x53, + 0x2b, 0x79, 0x29, 0x56, 0x92, 0x80, 0x33, 0xad, 0x85, 0x3e, 0x3e, 0xd9, 0x90, 0x04, 0xa1, 0xf1, + 0x56, 0xfe, 0xc3, 0xc7, 0xb5, 0xcc, 0x3f, 0x1e, 0xd7, 0x0c, 0xf3, 0x63, 0x03, 0x20, 0xb6, 0x18, + 0xb2, 0x61, 0xc9, 0x8e, 0x56, 0x52, 0x96, 0x69, 0x57, 0x36, 0xce, 0x71, 0x49, 0xca, 0xec, 0xad, + 0xbc, 0x38, 0xfb, 0x93, 0x71, 0xcd, 0xb0, 0x4a, 0x76, 0xca, 0x23, 0xdf, 0x83, 0xe2, 0x70, 0xe0, + 0x60, 0x4e, 0x3a, 0x22, 0x56, 0xa5, 0x41, 0x8b, 0x6b, 0x95, 0x86, 0x0a, 0xe4, 0x46, 0x18, 0xc8, + 0x8d, 0xbd, 0x30, 0x90, 0x5b, 0x55, 0x81, 0x75, 0x3a, 0xae, 0x21, 0x75, 0xbb, 0x84, 0xb0, 0xf9, + 0xf0, 0xaf, 0x35, 0xc3, 0x02, 0x45, 0x11, 0x02, 0x89, 0xab, 0xfd, 0xde, 0x80, 0x62, 0x9b, 0x30, + 0x3b, 0xa0, 0x03, 0x91, 0x2f, 0xa8, 0x0c, 0x73, 0x7d, 0xdf, 0xa3, 0xc7, 0x3a, 0x3a, 0x0b, 0x56, + 0xb8, 0x44, 0x15, 0xc8, 0x53, 0x87, 0x78, 0x9c, 0xf2, 0x91, 0x72, 0xaf, 0x15, 0xad, 0x85, 0xd4, + 0x7b, 0xa4, 0xcb, 0x68, 0xe8, 0x14, 0x2b, 0x5c, 0xa2, 0xdb, 0xb0, 0xc4, 0x88, 0x3d, 0x0c, 0x28, + 0x1f, 0x75, 0x6c, 0xdf, 0xe3, 0xd8, 0xe6, 0xe5, 0x9c, 0xf4, 0xdb, 0x17, 0x4e, 0xc7, 0xb5, 0x97, + 0xd5, 0x59, 0xd3, 0x1c, 0xa6, 0x55, 0x0a, 0x49, 0x1b, 0x8a, 0x22, 0x34, 0x38, 0x84, 0x63, 0xea, + 0xb2, 0xf2, 0x25, 0xa5, 0x41, 0x2f, 0x13, 0x77, 0xf9, 0xdd, 0x1c, 0x14, 0xa2, 0xa0, 0x17, 0x9a, + 0xfd, 0x01, 0x09, 0xc4, 0xef, 0x0e, 0x76, 0x9c, 0x80, 0x30, 0xa6, 0xc3, 0x3b, 0xa1, 0x39, 0xcd, + 0x61, 0x5a, 0xa5, 0x90, 0xb4, 0xae, 0x28, 0x88, 0x0b, 0x6f, 0x7b, 0x8c, 0x78, 0x6c, 0xc8, 0x3a, + 0x83, 0x61, 0xf7, 0x98, 0x8c, 0xb4, 0x37, 0x56, 0x26, 0xbc, 0xb1, 0xee, 0x8d, 0x5a, 0x6f, 0xc4, + 0xe8, 0x69, 0x39, 0xf3, 0x0f, 0xbf, 0xb9, 0xb9, 0xa2, 0x8b, 0x8b, 0x1d, 0x8c, 0x06, 0xdc, 0x6f, + 0xec, 0x0c, 0xbb, 0x6f, 0x91, 0x91, 0x70, 0xbf, 0x66, 0xdd, 0x91, 0x9c, 0xe8, 0x25, 0x98, 0xfd, + 0x01, 0xa6, 0x2e, 0x71, 0xa4, 0x41, 0xf3, 0x96, 0x5e, 0xa1, 0x75, 0x98, 0x65, 0x1c, 0xf3, 0x21, + 0x93, 0x56, 0x5c, 0x5c, 0xbb, 0x71, 0x4e, 0xc4, 0xb5, 0x7c, 0xcf, 0xd9, 0x95, 0x02, 0x96, 0x16, + 0x14, 0x75, 0x84, 0xfb, 0xc7, 0xc4, 0xd3, 0x96, 0x9c, 0x2a, 0xdb, 0xb7, 0x3d, 0x6e, 0x69, 0x69, + 0x61, 0x18, 0x87, 0xb8, 0xa4, 0x27, 0xed, 0xc7, 0x8e, 0x70, 0x40, 0x58, 0x79, 0x56, 0x22, 0x6e, + 0x4f, 0x9d, 0x92, 0xda, 0x60, 0x69, 0x3c, 0xd3, 0x2a, 0x45, 0xa4, 0x5d, 0x49, 0x41, 0x16, 0x14, + 0x9d, 0x38, 0x5e, 0xcb, 0x73, 0xd2, 0x13, 0xaf, 0x9d, 0x63, 0x85, 0x44, 0x84, 0xeb, 0x62, 0x98, + 0x04, 0x11, 0xa1, 0x32, 0xf4, 0xba, 0xbe, 0xe7, 0x50, 0xaf, 0xd7, 0x39, 0x22, 0xb4, 0x77, 0xc4, + 0xcb, 0xf9, 0xba, 0xb1, 0x3a, 0x93, 0x0c, 0x95, 0x34, 0x87, 0x69, 0x95, 0x22, 0xd2, 0x96, 0xa4, + 0x20, 0x07, 0x16, 0x63, 0x2e, 0x99, 0xb6, 0x85, 0x73, 0xd3, 0xf6, 0x8b, 0x3a, 0x6d, 0xaf, 0xa4, + 0xb5, 0xc4, 0x99, 0xbb, 0x10, 0x11, 0x85, 0x18, 0x7a, 0x1b, 0x20, 0x2e, 0x16, 0x65, 0x90, 0x1a, + 0x6e, 0xbc, 0x70, 0xe1, 0xd1, 0xf7, 0x4f, 0x40, 0xa0, 0xf7, 0xe1, 0x72, 0x9f, 0x7a, 0x1d, 0x46, + 0xdc, 0xc3, 0x8e, 0x36, 0xb7, 0x40, 0x2e, 0x4a, 0x5f, 0xde, 0x99, 0x2e, 0x3a, 0x4e, 0xc7, 0xb5, + 0x8a, 0x2e, 0xaf, 0x93, 0x90, 0xa6, 0xb5, 0xdc, 0xa7, 0xde, 0x2e, 0x71, 0x0f, 0xdb, 0x11, 0xed, + 0xd6, 0xfc, 0x07, 0x8f, 0x6b, 0x19, 0x9d, 0xc3, 0x19, 0xf3, 0x4d, 0x98, 0x3f, 0xc0, 0xae, 0xce, + 0x3d, 0xc2, 0xd0, 0x35, 0x28, 0xe0, 0x70, 0x51, 0x36, 0xea, 0x33, 0xab, 0x05, 0x2b, 0x26, 0xa8, + 0xdc, 0xff, 0xd1, 0x5f, 0xea, 0x86, 0xf9, 0x2b, 0x03, 0x66, 0xdb, 0x07, 0x3b, 0x98, 0x06, 0x68, + 0x1b, 0x96, 0xe3, 0x38, 0x3a, 0x9b, 0xf9, 0xd7, 0x4e, 0xc7, 0xb5, 0x72, 0x3a, 0xd4, 0xa2, 0xd4, + 0x8f, 0xc3, 0x39, 0xcc, 0xfd, 0x6d, 0x58, 0xbe, 0x1f, 0x16, 0x94, 0x08, 0x2a, 0x9b, 0x86, 0x9a, + 0x60, 0x31, 0xad, 0xa5, 0x88, 0xa6, 0xa1, 0x52, 0xd7, 0xbc, 0x03, 0x73, 0xea, 0xb4, 0x0c, 0xad, + 0xc3, 0xa5, 0x81, 0xf8, 0x21, 0x6f, 0x57, 0x5c, 0x7b, 0xe5, 0xbc, 0x50, 0x96, 0x62, 0xda, 0x8b, + 0x4a, 0xd2, 0xfc, 0x59, 0x16, 0xa0, 0x7d, 0x70, 0xb0, 0x17, 0xd0, 0x81, 0x4b, 0xf8, 0x67, 0x69, + 0x80, 0x3d, 0xb8, 0x12, 0xdf, 0x8e, 0x05, 0x76, 0xca, 0x08, 0xf5, 0xd3, 0x71, 0xed, 0x5a, 0xda, + 0x08, 0x09, 0x36, 0xd3, 0xba, 0x1c, 0xd1, 0x77, 0x03, 0xfb, 0xb9, 0xa8, 0x0e, 0xe3, 0x11, 0xea, + 0xcc, 0x27, 0xa3, 0x26, 0xd8, 0x92, 0xa8, 0x6d, 0xc6, 0x9f, 0x6f, 0xe1, 0x77, 0xa1, 0x18, 0x9b, + 0x84, 0xa1, 0xb7, 0x20, 0xcf, 0xf5, 0x6f, 0x6d, 0xe8, 0x1b, 0xe7, 0x1a, 0x3a, 0x94, 0xd6, 0xc6, + 0x8e, 0x00, 0xcc, 0x7f, 0x1b, 0x00, 0x71, 0x04, 0x7f, 0x3e, 0x03, 0x4e, 0x94, 0x79, 0x5d, 0x94, + 0x67, 0x2e, 0xd4, 0xd4, 0x69, 0xe9, 0x94, 0x59, 0x7f, 0x9e, 0x85, 0xcb, 0xfb, 0x61, 0x39, 0xfa, + 0xdc, 0xdb, 0xe0, 0x1d, 0x98, 0x23, 0x1e, 0x0f, 0xa8, 0x34, 0x82, 0x70, 0xfa, 0x57, 0xcf, 0x71, + 0xfa, 0x73, 0xae, 0xb6, 0xe9, 0xf1, 0x60, 0xa4, 0x43, 0x20, 0x44, 0x4b, 0x19, 0xe5, 0xa7, 0x33, + 0x50, 0xfe, 0x24, 0x49, 0xb4, 0x01, 0x25, 0x3b, 0x20, 0x92, 0x10, 0xbe, 0x2d, 0x86, 0x7c, 0x5b, + 0x2a, 0x71, 0x2b, 0x9a, 0x62, 0x30, 0xad, 0xc5, 0x90, 0xa2, 0x5f, 0x96, 0x1e, 0x88, 0x06, 0x51, 0x44, 0x9f, 0xe0, 0x7a, 0xc1, 0x8e, 0xd0, 0xd4, 0x4f, 0x4b, 0xa8, 0xe4, 0x2c, 0x80, 0x7a, 0x5b, - 0x16, 0x62, 0xaa, 0x7c, 0x5c, 0xee, 0x41, 0x91, 0x7a, 0x94, 0x53, 0xec, 0xb6, 0x3b, 0xd8, 0xc5, - 0x9e, 0x7d, 0x91, 0x36, 0x5b, 0xbd, 0x03, 0x5a, 0x6d, 0x0a, 0xce, 0xb4, 0x16, 0x34, 0xa5, 0xa9, - 0x08, 0x68, 0x0b, 0x66, 0x42, 0x55, 0xb9, 0x0b, 0x35, 0x24, 0xa1, 0x78, 0xa2, 0x15, 0xfc, 0xf1, - 0x14, 0x2c, 0x59, 0xc4, 0xf9, 0xbf, 0x2b, 0x26, 0x73, 0xc5, 0xb7, 0x01, 0x54, 0xd6, 0x8b, 0x72, - 0x7b, 0x01, 0x6f, 0x88, 0xba, 0x91, 0x57, 0x08, 0x2d, 0xc6, 0x13, 0xfe, 0xf8, 0x7b, 0x16, 0xe6, - 0x92, 0xfe, 0xf8, 0x1f, 0x7d, 0xa3, 0xd0, 0x4e, 0x5c, 0x90, 0x72, 0xb2, 0x20, 0x7d, 0xe5, 0x9c, - 0x82, 0x34, 0x16, 0xc4, 0x9f, 0x5d, 0x89, 0x4e, 0xb3, 0x30, 0xbd, 0x83, 0x03, 0xdc, 0x63, 0xe8, - 0x5b, 0x63, 0xcd, 0xa8, 0x9a, 0x51, 0xaf, 0x8e, 0x85, 0x69, 0x4b, 0x7f, 0x2c, 0x51, 0xe3, 0xe8, - 0x47, 0xcf, 0x69, 0x39, 0x5f, 0x83, 0x05, 0x31, 0x2d, 0x47, 0x37, 0x52, 0xb6, 0x9d, 0x97, 0x13, - 0x73, 0x34, 0x71, 0x31, 0x54, 0x85, 0x82, 0x60, 0x8b, 0x4b, 0xae, 0xe0, 0x81, 0x1e, 0x3e, 0xd9, - 0x54, 0x14, 0xb4, 0x0a, 0xe8, 0x28, 0xfa, 0x18, 0xd2, 0x8e, 0x2d, 0x21, 0xf8, 0x96, 0xe2, 0x9d, - 0x90, 0xfd, 0x3a, 0x80, 0x38, 0x45, 0xdb, 0x21, 0x9e, 0xdf, 0xd3, 0x73, 0x5f, 0x5e, 0x50, 0x5a, - 0x82, 0x10, 0xf6, 0xad, 0xa9, 0x59, 0x5c, 0xcf, 0x20, 0x77, 0x26, 0x9e, 0x41, 0x12, 0x7d, 0x6b, - 0x0a, 0x52, 0xf5, 0xad, 0x67, 0x87, 0xf7, 0x44, 0x70, 0xff, 0xc2, 0x00, 0x14, 0x57, 0x7d, 0x8b, - 0xb0, 0xbe, 0x18, 0xe6, 0x44, 0x9f, 0x9e, 0xe8, 0xa6, 0x8d, 0x17, 0xea, 0xd3, 0x63, 0x98, 0xb0, - 0x4f, 0x4f, 0xe4, 0xcc, 0xd7, 0xe3, 0x42, 0x99, 0xd5, 0xae, 0xd4, 0xc3, 0x64, 0x07, 0x33, 0x92, - 0xe8, 0xf5, 0x69, 0x28, 0x3d, 0x56, 0x19, 0x33, 0xe6, 0x9f, 0x0c, 0xb8, 0x3a, 0x16, 0x54, 0xd1, - 0x99, 0x09, 0xa0, 0x20, 0xb1, 0x29, 0x5d, 0x34, 0xd4, 0x67, 0xbf, 0x68, 0xa8, 0x2e, 0x05, 0x63, - 0x85, 0xf8, 0xf3, 0x2b, 0xf9, 0x39, 0xe9, 0x81, 0x3f, 0x1a, 0xb0, 0x9c, 0x54, 0x1f, 0xdd, 0x67, - 0x1f, 0xe6, 0x92, 0xda, 0xf5, 0x4d, 0xbe, 0x34, 0xc1, 0x4d, 0xf4, 0x25, 0xce, 0xc0, 0xa0, 0xef, - 0xc4, 0x69, 0xac, 0xbe, 0xc5, 0x7d, 0x6d, 0x52, 0xdb, 0x84, 0x27, 0x4c, 0xa7, 0x73, 0x4e, 0x3a, - 0xe9, 0x3f, 0x06, 0xe4, 0x76, 0x7c, 0xdf, 0x45, 0x3e, 0x2c, 0x79, 0x3e, 0x6f, 0x8b, 0x98, 0x27, - 0x4e, 0x5b, 0x8f, 0xed, 0xaa, 0x4c, 0x6e, 0x4c, 0x66, 0xb2, 0x7f, 0x8e, 0xaa, 0xe3, 0x50, 0x56, - 0xd1, 0xf3, 0x79, 0x53, 0x52, 0xf6, 0xd4, 0x50, 0xff, 0x01, 0xcc, 0x9f, 0x55, 0xa6, 0x8a, 0xe8, - 0xbb, 0x13, 0x2b, 0x3b, 0x0b, 0x73, 0x3a, 0xaa, 0x2e, 0xab, 0xf4, 0x3a, 0x43, 0x36, 0xad, 0xb9, - 0x4e, 0x42, 0xfb, 0xad, 0x59, 0xe1, 0xcd, 0x7f, 0x09, 0x8f, 0xfe, 0xda, 0x80, 0xcb, 0x92, 0x48, - 0x7f, 0x48, 0xe4, 0xe4, 0x6f, 0x11, 0xdb, 0x0f, 0x1c, 0xb4, 0x00, 0x59, 0xea, 0x48, 0x0b, 0xe4, - 0xac, 0x2c, 0x75, 0xd0, 0x32, 0x5c, 0xf2, 0xdf, 0xf7, 0x48, 0xa0, 0x3f, 0x49, 0xa9, 0x05, 0xba, - 0x09, 0x4b, 0xf2, 0x15, 0x52, 0x6a, 0x74, 0xfd, 0x50, 0x5f, 0xa6, 0x8a, 0x72, 0x43, 0x42, 0xab, - 0x2a, 0x22, 0x6a, 0x9b, 0xef, 0x0c, 0x5c, 0xd2, 0xc6, 0xb6, 0xed, 0x0f, 0x3c, 0xfd, 0xee, 0x59, - 0xf3, 0x8a, 0xba, 0xae, 0x88, 0x62, 0x10, 0x8d, 0xca, 0x5f, 0x58, 0x8a, 0x22, 0x82, 0x0a, 0xc3, - 0x9b, 0xbf, 0x35, 0x00, 0xe2, 0x0f, 0x2e, 0xe8, 0xcb, 0xf0, 0x6a, 0xf3, 0x9d, 0xbb, 0xad, 0xf6, - 0xee, 0xde, 0xfa, 0xde, 0xfe, 0x6e, 0x7b, 0xff, 0xee, 0xee, 0xce, 0xe6, 0xc6, 0xf6, 0xed, 0xed, - 0xcd, 0xd6, 0x62, 0xa6, 0x5c, 0x7c, 0xf0, 0xa8, 0x56, 0xd8, 0xf7, 0x58, 0x9f, 0xd8, 0xf4, 0x90, - 0x12, 0x07, 0xbd, 0x0e, 0xcb, 0x67, 0xb9, 0xc5, 0x6a, 0xb3, 0xb5, 0x68, 0x94, 0xe7, 0x1e, 0x3c, - 0xaa, 0xcd, 0xaa, 0xfe, 0x92, 0x38, 0x68, 0x05, 0xae, 0x8c, 0xf3, 0x6d, 0xdf, 0xfd, 0xe6, 0x62, - 0xb6, 0x3c, 0xff, 0xe0, 0x51, 0x2d, 0x1f, 0x35, 0xa2, 0xc8, 0x04, 0x94, 0xe4, 0xd4, 0x78, 0x53, - 0x65, 0x78, 0xf0, 0xa8, 0x36, 0xad, 0xbc, 0x5e, 0xce, 0x7d, 0xf8, 0xf3, 0x4a, 0xa6, 0xf9, 0xdd, - 0x8f, 0x9f, 0x56, 0x8c, 0x27, 0x4f, 0x2b, 0xc6, 0xdf, 0x9e, 0x56, 0x8c, 0x87, 0xcf, 0x2a, 0x99, - 0x27, 0xcf, 0x2a, 0x99, 0x4f, 0x9e, 0x55, 0x32, 0xef, 0x7d, 0x23, 0xe1, 0x70, 0x7a, 0xcf, 0x1d, - 0x88, 0xf2, 0x47, 0x3d, 0xbb, 0xa1, 0xc2, 0x9d, 0xf2, 0xe1, 0xaa, 0x0e, 0xf5, 0x55, 0x65, 0xae, - 0xc6, 0x49, 0xf8, 0xa9, 0x5f, 0x45, 0x43, 0x67, 0x5a, 0x3e, 0x33, 0x6f, 0xfe, 0x37, 0x00, 0x00, - 0xff, 0xff, 0xa9, 0x65, 0x92, 0xb7, 0x12, 0x18, 0x00, 0x00, + 0x16, 0x63, 0xaa, 0x7c, 0x5c, 0xee, 0x41, 0x89, 0x7a, 0x94, 0x53, 0xec, 0x76, 0xba, 0xd8, 0xc5, + 0x9e, 0x7d, 0x91, 0x36, 0x5b, 0xbd, 0x03, 0x5a, 0x6d, 0x0a, 0xce, 0xb4, 0x16, 0x35, 0xa5, 0xa5, + 0x08, 0x68, 0x0b, 0xe6, 0x42, 0x55, 0xb9, 0x0b, 0x35, 0x24, 0xa1, 0x78, 0xa2, 0x15, 0xfc, 0xc9, + 0x0c, 0x2c, 0x5b, 0xc4, 0xf9, 0xbf, 0x2b, 0xa6, 0x73, 0xc5, 0xb7, 0x01, 0x54, 0xd6, 0x8b, 0x72, + 0x7b, 0x01, 0x6f, 0x88, 0xba, 0x51, 0x50, 0x08, 0x6d, 0xc6, 0x13, 0xfe, 0xf8, 0x7b, 0x16, 0xe6, + 0x93, 0xfe, 0xf8, 0x1f, 0x7d, 0xa3, 0xd0, 0x4e, 0x5c, 0x90, 0x72, 0xb2, 0x20, 0x7d, 0xe5, 0x9c, + 0x82, 0x34, 0x11, 0xc4, 0x9f, 0x5e, 0x89, 0x4e, 0xb3, 0x30, 0xbb, 0x83, 0x03, 0xdc, 0x67, 0xe8, + 0x5b, 0x13, 0xcd, 0xa8, 0x9a, 0x51, 0xaf, 0x4e, 0x84, 0x69, 0x5b, 0x7f, 0x2c, 0x51, 0xe3, 0xe8, + 0x87, 0xcf, 0x69, 0x39, 0x5f, 0x81, 0x45, 0x31, 0x2d, 0x47, 0x37, 0x52, 0xb6, 0x5d, 0x90, 0x13, + 0x73, 0x34, 0x71, 0x31, 0x54, 0x83, 0xa2, 0x60, 0x8b, 0x4b, 0xae, 0xe0, 0x81, 0x3e, 0x3e, 0xd9, + 0x54, 0x14, 0x74, 0x13, 0xd0, 0x51, 0xf4, 0x31, 0xa4, 0x13, 0x5b, 0x42, 0xf0, 0x2d, 0xc7, 0x3b, + 0x21, 0xfb, 0x75, 0x00, 0x71, 0x8a, 0x8e, 0x43, 0x3c, 0xbf, 0xaf, 0xe7, 0xbe, 0x82, 0xa0, 0xb4, + 0x05, 0x21, 0xec, 0x5b, 0x53, 0xb3, 0xb8, 0x9e, 0x41, 0xee, 0x4c, 0x3d, 0x83, 0x24, 0xfa, 0xd6, + 0x14, 0xa4, 0xea, 0x5b, 0xcf, 0x0e, 0xef, 0x89, 0xe0, 0xfe, 0xa5, 0x01, 0x28, 0xae, 0xfa, 0x16, + 0x61, 0x03, 0x31, 0xcc, 0x89, 0x3e, 0x3d, 0xd1, 0x4d, 0x1b, 0x2f, 0xd4, 0xa7, 0xc7, 0x30, 0x61, + 0x9f, 0x9e, 0xc8, 0x99, 0xaf, 0xc7, 0x85, 0x32, 0xab, 0x5d, 0xa9, 0x87, 0xc9, 0x2e, 0x66, 0x24, + 0xd1, 0xeb, 0xd3, 0x50, 0x7a, 0xa2, 0x32, 0x66, 0xcc, 0x3f, 0x19, 0x70, 0x75, 0x22, 0xa8, 0xa2, + 0x33, 0x13, 0x40, 0x41, 0x62, 0x53, 0xba, 0x68, 0xa4, 0xcf, 0x7e, 0xd1, 0x50, 0x5d, 0x0e, 0x26, + 0x0a, 0xf1, 0x67, 0x57, 0xf2, 0x73, 0xd2, 0x03, 0x7f, 0x34, 0x60, 0x25, 0xa9, 0x3e, 0xba, 0xcf, + 0x3e, 0xcc, 0x27, 0xb5, 0xeb, 0x9b, 0x7c, 0x69, 0x8a, 0x9b, 0xe8, 0x4b, 0x9c, 0x81, 0x41, 0xdf, + 0x89, 0xd3, 0x58, 0x7d, 0x8b, 0xfb, 0xda, 0xb4, 0xb6, 0x09, 0x4f, 0x98, 0x4e, 0xe7, 0x9c, 0x74, + 0xd2, 0x7f, 0x0c, 0xc8, 0xed, 0xf8, 0xbe, 0x8b, 0x7c, 0x58, 0xf6, 0x7c, 0xde, 0x11, 0x31, 0x4f, + 0x9c, 0x8e, 0x1e, 0xdb, 0x55, 0x99, 0xdc, 0x98, 0xce, 0x64, 0xff, 0x1c, 0xd7, 0x26, 0xa1, 0xac, + 0x92, 0xe7, 0xf3, 0x96, 0xa4, 0xec, 0xa9, 0xa1, 0xfe, 0x7d, 0x58, 0x38, 0xab, 0x4c, 0x15, 0xd1, + 0x77, 0xa6, 0x56, 0x76, 0x16, 0xe6, 0x74, 0x5c, 0x5b, 0x51, 0xe9, 0x75, 0x86, 0x6c, 0x5a, 0xf3, + 0xdd, 0x84, 0xf6, 0x5b, 0x79, 0xe1, 0xcd, 0x7f, 0x09, 0x8f, 0xfe, 0xd8, 0x80, 0xcb, 0x92, 0x48, + 0x7f, 0x48, 0xe4, 0xe4, 0x6f, 0x11, 0xdb, 0x0f, 0x1c, 0xb4, 0x08, 0x59, 0xea, 0x48, 0x0b, 0xe4, + 0xac, 0x2c, 0x75, 0xd0, 0x0a, 0x5c, 0xf2, 0xdf, 0xf3, 0x48, 0xa0, 0x3f, 0x49, 0xa9, 0x85, 0xac, + 0x57, 0xbe, 0x33, 0x74, 0x49, 0x07, 0xdb, 0xb6, 0x3f, 0xf4, 0xb8, 0xfe, 0x2c, 0xb5, 0xa0, 0xa8, + 0xeb, 0x8a, 0x28, 0x86, 0xcb, 0xa8, 0xa4, 0xa9, 0x40, 0xb4, 0x62, 0x82, 0x0a, 0xad, 0xd7, 0x7e, + 0x6b, 0x00, 0xc4, 0x1f, 0x51, 0xd0, 0x97, 0xe1, 0xe5, 0xd6, 0xdb, 0x77, 0xdb, 0x9d, 0xdd, 0xbd, + 0xf5, 0xbd, 0xfd, 0xdd, 0xce, 0xfe, 0xdd, 0xdd, 0x9d, 0xcd, 0x8d, 0xed, 0xdb, 0xdb, 0x9b, 0xed, + 0xa5, 0x4c, 0xa5, 0xf4, 0xe0, 0x51, 0xbd, 0xb8, 0xef, 0xb1, 0x01, 0xb1, 0xe9, 0x21, 0x25, 0x0e, + 0x7a, 0x15, 0x56, 0xce, 0x72, 0x8b, 0xd5, 0x66, 0x7b, 0xc9, 0xa8, 0xcc, 0x3f, 0x78, 0x54, 0xcf, + 0xab, 0x9e, 0x91, 0x38, 0x68, 0x15, 0xae, 0x4c, 0xf2, 0x6d, 0xdf, 0xfd, 0xe6, 0x52, 0xb6, 0xb2, + 0xf0, 0xe0, 0x51, 0xbd, 0x10, 0x35, 0x97, 0xc8, 0x04, 0x94, 0xe4, 0xd4, 0x78, 0x33, 0x15, 0x78, + 0xf0, 0xa8, 0x3e, 0xab, 0x3c, 0x59, 0xc9, 0x7d, 0xf0, 0x8b, 0x6a, 0xa6, 0xf5, 0xdd, 0x8f, 0x9e, + 0x56, 0x8d, 0x27, 0x4f, 0xab, 0xc6, 0xdf, 0x9e, 0x56, 0x8d, 0x87, 0xcf, 0xaa, 0x99, 0x27, 0xcf, + 0xaa, 0x99, 0x8f, 0x9f, 0x55, 0x33, 0xef, 0x7e, 0x23, 0xe1, 0x44, 0x7a, 0xcf, 0x1d, 0x8a, 0x92, + 0x46, 0x3d, 0xbb, 0xa9, 0x42, 0x98, 0xf2, 0xd1, 0x4d, 0x1d, 0xbe, 0x37, 0x95, 0xb9, 0x9a, 0x27, + 0xe1, 0xe7, 0x7b, 0xe5, 0xe1, 0xee, 0xac, 0x7c, 0x3a, 0xde, 0xf8, 0x6f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xf9, 0xf1, 0x36, 0x6f, 0xe6, 0x17, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1344,660 +1335,659 @@ 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{ - // 10447 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x18, 0x66, 0x77, 0x01, 0xec, 0x3e, 0x7c, 0x2d, 0x1a, 0xb8, 0xbb, 0xbd, 0xbd, 0x3b, 0x00, - 0x1c, 0x92, 0x77, 0xc7, 0x23, 0x0f, 0x20, 0x8f, 0xbc, 0x0f, 0xe2, 0x44, 0x9e, 0x76, 0x81, 0x3d, - 0x1c, 0x48, 0x7c, 0x71, 0x00, 0x1c, 0x29, 0x2a, 0xaa, 0xcd, 0x60, 0xb7, 0xb1, 0x18, 0x62, 0x77, - 0x66, 0x38, 0x33, 0x7b, 0x07, 0x9c, 0xa4, 0x32, 0x2d, 0xf9, 0x83, 0xa6, 0xa3, 0xe8, 0xc3, 0x2e, - 0x5b, 0xa6, 0x74, 0x8a, 0x64, 0x29, 0x91, 0xc2, 0xd8, 0xb1, 0x2c, 0xc9, 0x4a, 0x1c, 0xe7, 0x87, - 0xe4, 0x2a, 0x27, 0xb2, 0xaa, 0x62, 0x4b, 0x4e, 0x25, 0x52, 0x9c, 0xe4, 0x24, 0x53, 0x8a, 0xa3, - 0x28, 0x4a, 0xac, 0x30, 0x52, 0xc5, 0x55, 0xaa, 0x54, 0x52, 0xfd, 0x35, 0x5f, 0xbb, 0x8b, 0xd9, - 0x05, 0xef, 0x28, 0xf9, 0xe3, 0x17, 0xd0, 0xdd, 0xef, 0xbd, 0x7e, 0xfd, 0xfa, 0xf5, 0xeb, 0xf7, - 0x5e, 0x77, 0xcf, 0xc2, 0x87, 0x2e, 0xc2, 0x44, 0xc5, 0x30, 0x2a, 0x55, 0x3c, 0x65, 0x5a, 0x86, - 0x63, 0x6c, 0xd4, 0x37, 0xa7, 0xca, 0xd8, 0x2e, 0x59, 0x9a, 0xe9, 0x18, 0xd6, 0x24, 0xad, 0x43, - 0x43, 0x0c, 0x62, 0x52, 0x40, 0xc8, 0x8b, 0x30, 0x7c, 0x59, 0xab, 0xe2, 0x59, 0x17, 0x70, 0x15, - 0x3b, 0xe8, 0x02, 0x24, 0x36, 0xb5, 0x2a, 0xce, 0x48, 0x13, 0xf1, 0x93, 0x7d, 0x67, 0xee, 0x99, - 0x0c, 0x21, 0x4d, 0x06, 0x31, 0x56, 0x48, 0xb5, 0x42, 0x31, 0xe4, 0x6f, 0x27, 0x60, 0xa4, 0x49, - 0x2b, 0x42, 0x90, 0xd0, 0xd5, 0x1a, 0xa1, 0x28, 0x9d, 0x4c, 0x29, 0xf4, 0x7f, 0x94, 0x81, 0x5e, - 0x53, 0x2d, 0x6d, 0xab, 0x15, 0x9c, 0x89, 0xd1, 0x6a, 0x51, 0x44, 0x63, 0x00, 0x65, 0x6c, 0x62, - 0xbd, 0x8c, 0xf5, 0xd2, 0x6e, 0x26, 0x3e, 0x11, 0x3f, 0x99, 0x52, 0x7c, 0x35, 0xe8, 0x7e, 0x18, - 0x36, 0xeb, 0x1b, 0x55, 0xad, 0x54, 0xf4, 0x81, 0xc1, 0x44, 0xfc, 0x64, 0xb7, 0x92, 0x66, 0x0d, - 0xb3, 0x1e, 0xf0, 0x09, 0x18, 0xba, 0x8e, 0xd5, 0x6d, 0x3f, 0x68, 0x1f, 0x05, 0x1d, 0x24, 0xd5, - 0x3e, 0xc0, 0x19, 0xe8, 0xaf, 0x61, 0xdb, 0x56, 0x2b, 0xb8, 0xe8, 0xec, 0x9a, 0x38, 0x93, 0xa0, - 0xa3, 0x9f, 0x68, 0x18, 0x7d, 0x78, 0xe4, 0x7d, 0x1c, 0x6b, 0x6d, 0xd7, 0xc4, 0x28, 0x07, 0x29, - 0xac, 0xd7, 0x6b, 0x8c, 0x42, 0x77, 0x0b, 0xf9, 0x15, 0xf4, 0x7a, 0x2d, 0x4c, 0x25, 0x49, 0xd0, - 0x38, 0x89, 0x5e, 0x1b, 0x5b, 0xd7, 0xb4, 0x12, 0xce, 0xf4, 0x50, 0x02, 0x27, 0x1a, 0x08, 0xac, - 0xb2, 0xf6, 0x30, 0x0d, 0x81, 0x87, 0x66, 0x20, 0x85, 0x77, 0x1c, 0xac, 0xdb, 0x9a, 0xa1, 0x67, - 0x7a, 0x29, 0x91, 0x7b, 0x9b, 0xcc, 0x22, 0xae, 0x96, 0xc3, 0x24, 0x3c, 0x3c, 0x74, 0x0e, 0x7a, - 0x0d, 0xd3, 0xd1, 0x0c, 0xdd, 0xce, 0x24, 0x27, 0xa4, 0x93, 0x7d, 0x67, 0x8e, 0x36, 0x55, 0x84, - 0x65, 0x06, 0xa3, 0x08, 0x60, 0x34, 0x0f, 0x69, 0xdb, 0xa8, 0x5b, 0x25, 0x5c, 0x2c, 0x19, 0x65, - 0x5c, 0xd4, 0xf4, 0x4d, 0x23, 0x93, 0xa2, 0x04, 0xc6, 0x1b, 0x07, 0x42, 0x01, 0x67, 0x8c, 0x32, - 0x9e, 0xd7, 0x37, 0x0d, 0x65, 0xd0, 0x0e, 0x94, 0xd1, 0x41, 0xe8, 0xb1, 0x77, 0x75, 0x47, 0xdd, - 0xc9, 0xf4, 0x53, 0x0d, 0xe1, 0x25, 0xf9, 0x77, 0x7b, 0x60, 0xa8, 0x1d, 0x15, 0xbb, 0x08, 0xdd, - 0x9b, 0x64, 0x94, 0x99, 0x58, 0x27, 0x32, 0x60, 0x38, 0x41, 0x21, 0xf6, 0xec, 0x53, 0x88, 0x39, - 0xe8, 0xd3, 0xb1, 0xed, 0xe0, 0x32, 0xd3, 0x88, 0x78, 0x9b, 0x3a, 0x05, 0x0c, 0xa9, 0x51, 0xa5, - 0x12, 0xfb, 0x52, 0xa9, 0x67, 0x60, 0xc8, 0x65, 0xa9, 0x68, 0xa9, 0x7a, 0x45, 0xe8, 0xe6, 0x54, - 0x14, 0x27, 0x93, 0x05, 0x81, 0xa7, 0x10, 0x34, 0x65, 0x10, 0x07, 0xca, 0x68, 0x16, 0xc0, 0xd0, - 0xb1, 0xb1, 0x59, 0x2c, 0xe3, 0x52, 0x35, 0x93, 0x6c, 0x21, 0xa5, 0x65, 0x02, 0xd2, 0x20, 0x25, - 0x83, 0xd5, 0x96, 0xaa, 0xe8, 0x51, 0x4f, 0xd5, 0x7a, 0x5b, 0x68, 0xca, 0x22, 0x5b, 0x64, 0x0d, - 0xda, 0xb6, 0x0e, 0x83, 0x16, 0x26, 0x7a, 0x8f, 0xcb, 0x7c, 0x64, 0x29, 0xca, 0xc4, 0x64, 0xe4, - 0xc8, 0x14, 0x8e, 0xc6, 0x06, 0x36, 0x60, 0xf9, 0x8b, 0xe8, 0x6e, 0x70, 0x2b, 0x8a, 0x54, 0xad, - 0x80, 0x5a, 0xa1, 0x7e, 0x51, 0xb9, 0xa4, 0xd6, 0x70, 0xf6, 0x06, 0x0c, 0x06, 0xc5, 0x83, 0x46, - 0xa1, 0xdb, 0x76, 0x54, 0xcb, 0xa1, 0x5a, 0xd8, 0xad, 0xb0, 0x02, 0x4a, 0x43, 0x1c, 0xeb, 0x65, - 0x6a, 0xe5, 0xba, 0x15, 0xf2, 0x2f, 0x7a, 0xb3, 0x37, 0xe0, 0x38, 0x1d, 0xf0, 0xf1, 0xc6, 0x19, - 0x0d, 0x50, 0x0e, 0x8f, 0x3b, 0x7b, 0x1e, 0x06, 0x02, 0x03, 0x68, 0xb7, 0x6b, 0xf9, 0x1d, 0x70, - 0xa0, 0x29, 0x69, 0xf4, 0x0c, 0x8c, 0xd6, 0x75, 0x4d, 0x77, 0xb0, 0x65, 0x5a, 0x98, 0x68, 0x2c, - 0xeb, 0x2a, 0xf3, 0x5f, 0x7b, 0x5b, 0xe8, 0xdc, 0xba, 0x1f, 0x9a, 0x51, 0x51, 0x46, 0xea, 0x8d, - 0x95, 0xa7, 0x52, 0xc9, 0xef, 0xf4, 0xa6, 0x5f, 0x78, 0xe1, 0x85, 0x17, 0x62, 0xf2, 0x07, 0x7b, - 0x60, 0xb4, 0xd9, 0x9a, 0x69, 0xba, 0x7c, 0x0f, 0x42, 0x8f, 0x5e, 0xaf, 0x6d, 0x60, 0x8b, 0x0a, - 0xa9, 0x5b, 0xe1, 0x25, 0x94, 0x83, 0xee, 0xaa, 0xba, 0x81, 0xab, 0x99, 0xc4, 0x84, 0x74, 0x72, - 0xf0, 0xcc, 0xfd, 0x6d, 0xad, 0xca, 0xc9, 0x05, 0x82, 0xa2, 0x30, 0x4c, 0xf4, 0x38, 0x24, 0xb8, - 0x89, 0x26, 0x14, 0x4e, 0xb5, 0x47, 0x81, 0xac, 0x25, 0x85, 0xe2, 0xa1, 0x23, 0x90, 0x22, 0x7f, - 0x99, 0x6e, 0xf4, 0x50, 0x9e, 0x93, 0xa4, 0x82, 0xe8, 0x05, 0xca, 0x42, 0x92, 0x2e, 0x93, 0x32, - 0x16, 0x5b, 0x9b, 0x5b, 0x26, 0x8a, 0x55, 0xc6, 0x9b, 0x6a, 0xbd, 0xea, 0x14, 0xaf, 0xa9, 0xd5, - 0x3a, 0xa6, 0x0a, 0x9f, 0x52, 0xfa, 0x79, 0xe5, 0x55, 0x52, 0x87, 0xc6, 0xa1, 0x8f, 0xad, 0x2a, - 0x4d, 0x2f, 0xe3, 0x1d, 0x6a, 0x3d, 0xbb, 0x15, 0xb6, 0xd0, 0xe6, 0x49, 0x0d, 0xe9, 0xfe, 0x39, - 0xdb, 0xd0, 0x85, 0x6a, 0xd2, 0x2e, 0x48, 0x05, 0xed, 0xfe, 0x7c, 0xd8, 0x70, 0x1f, 0x6b, 0x3e, - 0xbc, 0xb0, 0x4e, 0xc9, 0x9f, 0x8f, 0x41, 0x82, 0xda, 0x8b, 0x21, 0xe8, 0x5b, 0x7b, 0xcb, 0x4a, - 0xa1, 0x38, 0xbb, 0xbc, 0x9e, 0x5f, 0x28, 0xa4, 0x25, 0x34, 0x08, 0x40, 0x2b, 0x2e, 0x2f, 0x2c, - 0xe7, 0xd6, 0xd2, 0x31, 0xb7, 0x3c, 0xbf, 0xb4, 0x76, 0xee, 0x91, 0x74, 0xdc, 0x45, 0x58, 0x67, - 0x15, 0x09, 0x3f, 0xc0, 0xc3, 0x67, 0xd2, 0xdd, 0x28, 0x0d, 0xfd, 0x8c, 0xc0, 0xfc, 0x33, 0x85, - 0xd9, 0x73, 0x8f, 0xa4, 0x7b, 0x82, 0x35, 0x0f, 0x9f, 0x49, 0xf7, 0xa2, 0x01, 0x48, 0xd1, 0x9a, - 0xfc, 0xf2, 0xf2, 0x42, 0x3a, 0xe9, 0xd2, 0x5c, 0x5d, 0x53, 0xe6, 0x97, 0xe6, 0xd2, 0x29, 0x97, - 0xe6, 0x9c, 0xb2, 0xbc, 0xbe, 0x92, 0x06, 0x97, 0xc2, 0x62, 0x61, 0x75, 0x35, 0x37, 0x57, 0x48, - 0xf7, 0xb9, 0x10, 0xf9, 0xb7, 0xac, 0x15, 0x56, 0xd3, 0xfd, 0x01, 0xb6, 0x1e, 0x3e, 0x93, 0x1e, - 0x70, 0xbb, 0x28, 0x2c, 0xad, 0x2f, 0xa6, 0x07, 0xd1, 0x30, 0x0c, 0xb0, 0x2e, 0x04, 0x13, 0x43, - 0xa1, 0xaa, 0x73, 0x8f, 0xa4, 0xd3, 0x1e, 0x23, 0x8c, 0xca, 0x70, 0xa0, 0xe2, 0xdc, 0x23, 0x69, - 0x24, 0xcf, 0x40, 0x37, 0xd5, 0x2e, 0x84, 0x60, 0x70, 0x21, 0x97, 0x2f, 0x2c, 0x14, 0x97, 0x57, - 0xd6, 0xe6, 0x97, 0x97, 0x72, 0x0b, 0x69, 0xc9, 0xab, 0x53, 0x0a, 0x4f, 0xad, 0xcf, 0x2b, 0x85, - 0xd9, 0x74, 0xcc, 0x5f, 0xb7, 0x52, 0xc8, 0xad, 0x15, 0x66, 0xd3, 0x71, 0xb9, 0x04, 0xa3, 0xcd, - 0xec, 0x64, 0xd3, 0x95, 0xe1, 0x9b, 0xe2, 0x58, 0x8b, 0x29, 0xa6, 0xb4, 0x1a, 0xa6, 0xf8, 0x5b, - 0x31, 0x18, 0x69, 0xb2, 0x57, 0x34, 0xed, 0xe4, 0x12, 0x74, 0x33, 0x15, 0x65, 0xbb, 0xe7, 0x7d, - 0x4d, 0x37, 0x1d, 0xaa, 0xb0, 0x0d, 0x3b, 0x28, 0xc5, 0xf3, 0x7b, 0x10, 0xf1, 0x16, 0x1e, 0x04, - 0x21, 0xd1, 0x60, 0xd3, 0xdf, 0xd6, 0x60, 0xd3, 0xd9, 0xb6, 0x77, 0xae, 0x9d, 0x6d, 0x8f, 0xd6, - 0x75, 0x66, 0xdb, 0xbb, 0x9b, 0xd8, 0xf6, 0x8b, 0x30, 0xdc, 0x40, 0xa8, 0x6d, 0x1b, 0xfb, 0x6e, - 0x09, 0x32, 0xad, 0x84, 0x13, 0x61, 0xe9, 0x62, 0x01, 0x4b, 0x77, 0x31, 0x2c, 0xc1, 0xbb, 0x5a, - 0x4f, 0x42, 0xc3, 0x5c, 0x7f, 0x52, 0x82, 0x83, 0xcd, 0x3d, 0xc5, 0xa6, 0x3c, 0x3c, 0x0e, 0x3d, - 0x35, 0xec, 0x6c, 0x19, 0xc2, 0x5b, 0x3a, 0xde, 0x64, 0x0f, 0x26, 0xcd, 0xe1, 0xc9, 0xe6, 0x58, - 0xfe, 0x4d, 0x3c, 0xde, 0xca, 0xdd, 0x63, 0xdc, 0x34, 0x70, 0xfa, 0x0b, 0x31, 0x38, 0xd0, 0x94, - 0x78, 0x53, 0x46, 0x8f, 0x01, 0x68, 0xba, 0x59, 0x77, 0x98, 0x47, 0xc4, 0x0c, 0x6c, 0x8a, 0xd6, - 0x50, 0xe3, 0x45, 0x8c, 0x67, 0xdd, 0x71, 0xdb, 0xe3, 0xb4, 0x1d, 0x58, 0x15, 0x05, 0xb8, 0xe0, - 0x31, 0x9a, 0xa0, 0x8c, 0x8e, 0xb5, 0x18, 0x69, 0x83, 0x62, 0x3e, 0x08, 0xe9, 0x52, 0x55, 0xc3, - 0xba, 0x53, 0xb4, 0x1d, 0x0b, 0xab, 0x35, 0x4d, 0xaf, 0xd0, 0x1d, 0x24, 0x39, 0xdd, 0xbd, 0xa9, - 0x56, 0x6d, 0xac, 0x0c, 0xb1, 0xe6, 0x55, 0xd1, 0x4a, 0x30, 0xa8, 0x02, 0x59, 0x3e, 0x8c, 0x9e, - 0x00, 0x06, 0x6b, 0x76, 0x31, 0xe4, 0x0f, 0xa4, 0xa0, 0xcf, 0xe7, 0x57, 0xa3, 0xbb, 0xa0, 0xff, - 0x39, 0xf5, 0x9a, 0x5a, 0x14, 0xb1, 0x12, 0x93, 0x44, 0x1f, 0xa9, 0x5b, 0xe1, 0xf1, 0xd2, 0x83, - 0x30, 0x4a, 0x41, 0x8c, 0xba, 0x83, 0xad, 0x62, 0xa9, 0xaa, 0xda, 0x36, 0x15, 0x5a, 0x92, 0x82, - 0x22, 0xd2, 0xb6, 0x4c, 0x9a, 0x66, 0x44, 0x0b, 0x3a, 0x0b, 0x23, 0x14, 0xa3, 0x56, 0xaf, 0x3a, - 0x9a, 0x59, 0xc5, 0x45, 0x12, 0xbd, 0xd9, 0x74, 0x27, 0x71, 0x39, 0x1b, 0x26, 0x10, 0x8b, 0x1c, - 0x80, 0x70, 0x64, 0xa3, 0x59, 0x38, 0x46, 0xd1, 0x2a, 0x58, 0xc7, 0x96, 0xea, 0xe0, 0x22, 0x7e, - 0xbe, 0xae, 0x56, 0xed, 0xa2, 0xaa, 0x97, 0x8b, 0x5b, 0xaa, 0xbd, 0x95, 0x19, 0x25, 0x04, 0xf2, - 0xb1, 0x8c, 0xa4, 0x1c, 0x26, 0x80, 0x73, 0x1c, 0xae, 0x40, 0xc1, 0x72, 0x7a, 0xf9, 0x8a, 0x6a, - 0x6f, 0xa1, 0x69, 0x38, 0x48, 0xa9, 0xd8, 0x8e, 0xa5, 0xe9, 0x95, 0x62, 0x69, 0x0b, 0x97, 0xb6, - 0x8b, 0x75, 0x67, 0xf3, 0x42, 0xe6, 0x88, 0xbf, 0x7f, 0xca, 0xe1, 0x2a, 0x85, 0x99, 0x21, 0x20, - 0xeb, 0xce, 0xe6, 0x05, 0xb4, 0x0a, 0xfd, 0x64, 0x32, 0x6a, 0xda, 0x0d, 0x5c, 0xdc, 0x34, 0x2c, - 0xba, 0x35, 0x0e, 0x36, 0x31, 0x4d, 0x3e, 0x09, 0x4e, 0x2e, 0x73, 0x84, 0x45, 0xa3, 0x8c, 0xa7, - 0xbb, 0x57, 0x57, 0x0a, 0x85, 0x59, 0xa5, 0x4f, 0x50, 0xb9, 0x6c, 0x58, 0x44, 0xa1, 0x2a, 0x86, - 0x2b, 0xe0, 0x3e, 0xa6, 0x50, 0x15, 0x43, 0x88, 0xf7, 0x2c, 0x8c, 0x94, 0x4a, 0x6c, 0xcc, 0x5a, - 0xa9, 0xc8, 0x63, 0x2c, 0x3b, 0x93, 0x0e, 0x08, 0xab, 0x54, 0x9a, 0x63, 0x00, 0x5c, 0xc7, 0x6d, - 0xf4, 0x28, 0x1c, 0xf0, 0x84, 0xe5, 0x47, 0x1c, 0x6e, 0x18, 0x65, 0x18, 0xf5, 0x2c, 0x8c, 0x98, - 0xbb, 0x8d, 0x88, 0x28, 0xd0, 0xa3, 0xb9, 0x1b, 0x46, 0x3b, 0x0f, 0xa3, 0xe6, 0x96, 0xd9, 0x88, - 0x77, 0xca, 0x8f, 0x87, 0xcc, 0x2d, 0x33, 0x8c, 0x78, 0x2f, 0x0d, 0xb8, 0x2d, 0x5c, 0x52, 0x1d, - 0x5c, 0xce, 0x1c, 0xf2, 0x83, 0xfb, 0x1a, 0xd0, 0x14, 0xa4, 0x4b, 0xa5, 0x22, 0xd6, 0xd5, 0x8d, - 0x2a, 0x2e, 0xaa, 0x16, 0xd6, 0x55, 0x3b, 0x33, 0xee, 0x07, 0x1e, 0x2c, 0x95, 0x0a, 0xb4, 0x35, - 0x47, 0x1b, 0xd1, 0x29, 0x18, 0x36, 0x36, 0x9e, 0x2b, 0x31, 0x95, 0x2c, 0x9a, 0x16, 0xde, 0xd4, - 0x76, 0x32, 0xf7, 0x50, 0xf9, 0x0e, 0x91, 0x06, 0xaa, 0x90, 0x2b, 0xb4, 0x1a, 0xdd, 0x07, 0xe9, - 0x92, 0xbd, 0xa5, 0x5a, 0x26, 0xb5, 0xc9, 0xb6, 0xa9, 0x96, 0x70, 0xe6, 0x5e, 0x06, 0xca, 0xea, - 0x97, 0x44, 0x35, 0x59, 0x12, 0xf6, 0x75, 0x6d, 0xd3, 0x11, 0x14, 0x4f, 0xb0, 0x25, 0x41, 0xeb, - 0x38, 0xb5, 0x93, 0x90, 0x26, 0xa2, 0x08, 0x74, 0x7c, 0x92, 0x82, 0x0d, 0x9a, 0x5b, 0xa6, 0xbf, - 0xdf, 0xbb, 0x61, 0x80, 0x40, 0x7a, 0x9d, 0xde, 0xc7, 0x1c, 0x32, 0x73, 0xcb, 0xd7, 0xe3, 0x23, - 0x70, 0x90, 0x00, 0xd5, 0xb0, 0xa3, 0x96, 0x55, 0x47, 0xf5, 0x41, 0x3f, 0x40, 0xa1, 0x89, 0xdc, - 0x17, 0x79, 0x63, 0x80, 0x4f, 0xab, 0xbe, 0xb1, 0xeb, 0x6a, 0xd6, 0x69, 0xc6, 0x27, 0xa9, 0x13, - 0xba, 0x75, 0xc7, 0x9c, 0x6e, 0x79, 0x1a, 0xfa, 0xfd, 0x8a, 0x8f, 0x52, 0xc0, 0x54, 0x3f, 0x2d, - 0x11, 0x2f, 0x68, 0x66, 0x79, 0x96, 0xf8, 0x2f, 0xcf, 0x16, 0xd2, 0x31, 0xe2, 0x47, 0x2d, 0xcc, - 0xaf, 0x15, 0x8a, 0xca, 0xfa, 0xd2, 0xda, 0xfc, 0x62, 0x21, 0x1d, 0xf7, 0x39, 0xec, 0x4f, 0x24, - 0x92, 0xc7, 0xd3, 0x27, 0xe4, 0xaf, 0xc6, 0x60, 0x30, 0x18, 0x81, 0xa1, 0x37, 0xc1, 0x21, 0x91, - 0x2e, 0xb1, 0xb1, 0x53, 0xbc, 0xae, 0x59, 0x74, 0x45, 0xd6, 0x54, 0xb6, 0x3b, 0xba, 0x3a, 0x31, - 0xca, 0xa1, 0x56, 0xb1, 0xf3, 0xb4, 0x66, 0x91, 0xf5, 0x56, 0x53, 0x1d, 0xb4, 0x00, 0xe3, 0xba, - 0x51, 0xb4, 0x1d, 0x55, 0x2f, 0xab, 0x56, 0xb9, 0xe8, 0x25, 0xaa, 0x8a, 0x6a, 0xa9, 0x84, 0x6d, - 0xdb, 0x60, 0x3b, 0xa1, 0x4b, 0xe5, 0xa8, 0x6e, 0xac, 0x72, 0x60, 0x6f, 0x8b, 0xc8, 0x71, 0xd0, - 0x90, 0xfe, 0xc6, 0x5b, 0xe9, 0xef, 0x11, 0x48, 0xd5, 0x54, 0xb3, 0x88, 0x75, 0xc7, 0xda, 0xa5, - 0x7e, 0x77, 0x52, 0x49, 0xd6, 0x54, 0xb3, 0x40, 0xca, 0x6f, 0x48, 0xf8, 0xf3, 0x44, 0x22, 0x99, - 0x4c, 0xa7, 0x9e, 0x48, 0x24, 0x53, 0x69, 0x90, 0x5f, 0x8d, 0x43, 0xbf, 0xdf, 0x0f, 0x27, 0x61, - 0x4d, 0x89, 0x6e, 0x59, 0x12, 0x35, 0x6a, 0x77, 0xef, 0xe9, 0xb5, 0x4f, 0xce, 0x90, 0xbd, 0x6c, - 0xba, 0x87, 0x79, 0xc7, 0x0a, 0xc3, 0x24, 0x7e, 0x04, 0x51, 0x36, 0xcc, 0xbc, 0x91, 0xa4, 0xc2, - 0x4b, 0x68, 0x0e, 0x7a, 0x9e, 0xb3, 0x29, 0xed, 0x1e, 0x4a, 0xfb, 0x9e, 0xbd, 0x69, 0x3f, 0xb1, - 0x4a, 0x89, 0xa7, 0x9e, 0x58, 0x2d, 0x2e, 0x2d, 0x2b, 0x8b, 0xb9, 0x05, 0x85, 0xa3, 0xa3, 0xc3, - 0x90, 0xa8, 0xaa, 0x37, 0x76, 0x83, 0xbb, 0x1e, 0xad, 0x6a, 0x77, 0x12, 0x0e, 0x43, 0xe2, 0x3a, - 0x56, 0xb7, 0x83, 0x7b, 0x0d, 0xad, 0xba, 0x83, 0x8b, 0x61, 0x0a, 0xba, 0xa9, 0xbc, 0x10, 0x00, - 0x97, 0x58, 0xba, 0x0b, 0x25, 0x21, 0x31, 0xb3, 0xac, 0x90, 0x05, 0x91, 0x86, 0x7e, 0x56, 0x5b, - 0x5c, 0x99, 0x2f, 0xcc, 0x14, 0xd2, 0x31, 0xf9, 0x2c, 0xf4, 0x30, 0x21, 0x90, 0xc5, 0xe2, 0x8a, - 0x21, 0xdd, 0xc5, 0x8b, 0x9c, 0x86, 0x24, 0x5a, 0xd7, 0x17, 0xf3, 0x05, 0x25, 0x1d, 0x0b, 0x4e, - 0x75, 0x22, 0xdd, 0x2d, 0xdb, 0xd0, 0xef, 0x77, 0xc4, 0xdf, 0x98, 0x20, 0xfb, 0x0b, 0x12, 0xf4, - 0xf9, 0x1c, 0x6b, 0xe2, 0x11, 0xa9, 0xd5, 0xaa, 0x71, 0xbd, 0xa8, 0x56, 0x35, 0xd5, 0xe6, 0xaa, - 0x01, 0xb4, 0x2a, 0x47, 0x6a, 0xda, 0x9d, 0xba, 0x37, 0x68, 0x89, 0x74, 0xa7, 0x7b, 0xe4, 0x8f, - 0x48, 0x90, 0x0e, 0x7b, 0xb6, 0x21, 0x36, 0xa5, 0x1f, 0x27, 0x9b, 0xf2, 0x87, 0x25, 0x18, 0x0c, - 0xba, 0xb3, 0x21, 0xf6, 0xee, 0xfa, 0xb1, 0xb2, 0xf7, 0xcd, 0x18, 0x0c, 0x04, 0x9c, 0xd8, 0x76, - 0xb9, 0x7b, 0x1e, 0x86, 0xb5, 0x32, 0xae, 0x99, 0x86, 0x83, 0xf5, 0xd2, 0x6e, 0xb1, 0x8a, 0xaf, - 0xe1, 0x6a, 0x46, 0xa6, 0x46, 0x63, 0x6a, 0x6f, 0x37, 0x79, 0x72, 0xde, 0xc3, 0x5b, 0x20, 0x68, - 0xd3, 0x23, 0xf3, 0xb3, 0x85, 0xc5, 0x95, 0xe5, 0xb5, 0xc2, 0xd2, 0xcc, 0x5b, 0x8a, 0xeb, 0x4b, - 0x4f, 0x2e, 0x2d, 0x3f, 0xbd, 0xa4, 0xa4, 0xb5, 0x10, 0xd8, 0x1d, 0x5c, 0xf6, 0x2b, 0x90, 0x0e, - 0x33, 0x85, 0x0e, 0x41, 0x33, 0xb6, 0xd2, 0x5d, 0x68, 0x04, 0x86, 0x96, 0x96, 0x8b, 0xab, 0xf3, - 0xb3, 0x85, 0x62, 0xe1, 0xf2, 0xe5, 0xc2, 0xcc, 0xda, 0x2a, 0x4b, 0x7c, 0xb8, 0xd0, 0x6b, 0x81, - 0x05, 0x2e, 0xbf, 0x1c, 0x87, 0x91, 0x26, 0x9c, 0xa0, 0x1c, 0x0f, 0x59, 0x58, 0x14, 0x75, 0xba, - 0x1d, 0xee, 0x27, 0x89, 0xcf, 0xb0, 0xa2, 0x5a, 0x0e, 0x8f, 0x70, 0xee, 0x03, 0x22, 0x25, 0xdd, - 0xd1, 0x36, 0x35, 0x6c, 0xf1, 0x3c, 0x11, 0x8b, 0x63, 0x86, 0xbc, 0x7a, 0x96, 0x2a, 0x7a, 0x00, - 0x90, 0x69, 0xd8, 0x9a, 0xa3, 0x5d, 0xc3, 0x45, 0x4d, 0x17, 0x49, 0x25, 0x12, 0xd7, 0x24, 0x94, - 0xb4, 0x68, 0x99, 0xd7, 0x1d, 0x17, 0x5a, 0xc7, 0x15, 0x35, 0x04, 0x4d, 0x8c, 0x79, 0x5c, 0x49, - 0x8b, 0x16, 0x17, 0xfa, 0x2e, 0xe8, 0x2f, 0x1b, 0x75, 0xe2, 0xec, 0x31, 0x38, 0xb2, 0x77, 0x48, - 0x4a, 0x1f, 0xab, 0x73, 0x41, 0xb8, 0x1b, 0xef, 0x65, 0xb3, 0xfa, 0x95, 0x3e, 0x56, 0xc7, 0x40, - 0x4e, 0xc0, 0x90, 0x5a, 0xa9, 0x58, 0x84, 0xb8, 0x20, 0xc4, 0x02, 0x93, 0x41, 0xb7, 0x9a, 0x02, - 0x66, 0x9f, 0x80, 0xa4, 0x90, 0x03, 0xd9, 0xaa, 0x89, 0x24, 0x8a, 0x26, 0x8b, 0xb6, 0x63, 0x27, - 0x53, 0x4a, 0x52, 0x17, 0x8d, 0x77, 0x41, 0xbf, 0x66, 0x17, 0xbd, 0xe4, 0x7c, 0x6c, 0x22, 0x76, - 0x32, 0xa9, 0xf4, 0x69, 0xb6, 0x9b, 0xd8, 0x94, 0x3f, 0x19, 0x83, 0xc1, 0xe0, 0xe1, 0x02, 0x9a, - 0x85, 0x64, 0xd5, 0x28, 0xa9, 0x54, 0xb5, 0xd8, 0xc9, 0xd6, 0xc9, 0x88, 0xf3, 0x88, 0xc9, 0x05, - 0x0e, 0xaf, 0xb8, 0x98, 0xd9, 0x3f, 0x92, 0x20, 0x29, 0xaa, 0xd1, 0x41, 0x48, 0x98, 0xaa, 0xb3, - 0x45, 0xc9, 0x75, 0xe7, 0x63, 0x69, 0x49, 0xa1, 0x65, 0x52, 0x6f, 0x9b, 0xaa, 0x4e, 0x55, 0x80, - 0xd7, 0x93, 0x32, 0x99, 0xd7, 0x2a, 0x56, 0xcb, 0x34, 0xea, 0x31, 0x6a, 0x35, 0xac, 0x3b, 0xb6, - 0x98, 0x57, 0x5e, 0x3f, 0xc3, 0xab, 0xd1, 0xfd, 0x30, 0xec, 0x58, 0xaa, 0x56, 0x0d, 0xc0, 0x26, - 0x28, 0x6c, 0x5a, 0x34, 0xb8, 0xc0, 0xd3, 0x70, 0x58, 0xd0, 0x2d, 0x63, 0x47, 0x2d, 0x6d, 0xe1, - 0xb2, 0x87, 0xd4, 0x43, 0xb3, 0x1b, 0x87, 0x38, 0xc0, 0x2c, 0x6f, 0x17, 0xb8, 0xf2, 0x57, 0x25, - 0x18, 0x16, 0x71, 0x5a, 0xd9, 0x15, 0xd6, 0x22, 0x80, 0xaa, 0xeb, 0x86, 0xe3, 0x17, 0x57, 0xa3, - 0x2a, 0x37, 0xe0, 0x4d, 0xe6, 0x5c, 0x24, 0xc5, 0x47, 0x20, 0x5b, 0x03, 0xf0, 0x5a, 0x5a, 0x8a, - 0x6d, 0x1c, 0xfa, 0xf8, 0xc9, 0x11, 0x3d, 0x7e, 0x64, 0x91, 0x3d, 0xb0, 0x2a, 0x12, 0xd0, 0xa1, - 0x51, 0xe8, 0xde, 0xc0, 0x15, 0x4d, 0xe7, 0xf9, 0x60, 0x56, 0x10, 0xf9, 0x97, 0x84, 0x9b, 0x7f, - 0xc9, 0xbf, 0x57, 0x82, 0x91, 0x92, 0x51, 0x0b, 0xf3, 0x9b, 0x4f, 0x87, 0xd2, 0x0b, 0xf6, 0x15, - 0xe9, 0xd9, 0xc7, 0x2b, 0x9a, 0xb3, 0x55, 0xdf, 0x98, 0x2c, 0x19, 0xb5, 0xa9, 0x8a, 0x51, 0x55, - 0xf5, 0x8a, 0x77, 0x7e, 0x4a, 0xff, 0x29, 0x9d, 0xae, 0x60, 0xfd, 0x74, 0xc5, 0xf0, 0x9d, 0xa6, - 0x5e, 0xf4, 0xfe, 0xfd, 0x4b, 0x49, 0xfa, 0xf5, 0x58, 0x7c, 0x6e, 0x25, 0xff, 0x4a, 0x2c, 0x3b, - 0xc7, 0xba, 0x5b, 0x11, 0xe2, 0x51, 0xf0, 0x66, 0x15, 0x97, 0xc8, 0x90, 0xe1, 0xbb, 0xf7, 0xc3, - 0x68, 0xc5, 0xa8, 0x18, 0x94, 0xe2, 0x14, 0xf9, 0x8f, 0x9f, 0xc8, 0xa6, 0xdc, 0xda, 0x6c, 0xe4, - 0xf1, 0xed, 0xf4, 0x12, 0x8c, 0x70, 0xe0, 0x22, 0x3d, 0x12, 0x62, 0x81, 0x0d, 0xda, 0x33, 0xad, - 0x96, 0xf9, 0xed, 0x6f, 0xd3, 0x0d, 0x5d, 0x19, 0xe6, 0xa8, 0xa4, 0x8d, 0xc5, 0x3e, 0xd3, 0x0a, - 0x1c, 0x08, 0xd0, 0x63, 0xcb, 0x16, 0x5b, 0x11, 0x14, 0xff, 0x80, 0x53, 0x1c, 0xf1, 0x51, 0x5c, - 0xe5, 0xa8, 0xd3, 0x33, 0x30, 0xd0, 0x09, 0xad, 0x7f, 0xc5, 0x69, 0xf5, 0x63, 0x3f, 0x91, 0x39, - 0x18, 0xa2, 0x44, 0x4a, 0x75, 0xdb, 0x31, 0x6a, 0xd4, 0x26, 0xee, 0x4d, 0xe6, 0x5f, 0x7f, 0x9b, - 0xad, 0xa3, 0x41, 0x82, 0x36, 0xe3, 0x62, 0x4d, 0x4f, 0x03, 0x3d, 0x05, 0x2b, 0xe3, 0x52, 0x35, - 0x82, 0xc2, 0x97, 0x38, 0x23, 0x2e, 0xfc, 0xf4, 0x55, 0x18, 0x25, 0xff, 0x53, 0x93, 0xe5, 0xe7, - 0x24, 0x3a, 0x07, 0x97, 0xf9, 0xea, 0xbb, 0xd9, 0x52, 0x1d, 0x71, 0x09, 0xf8, 0x78, 0xf2, 0xcd, - 0x62, 0x05, 0x3b, 0x0e, 0xb6, 0xec, 0xa2, 0x5a, 0x6d, 0xc6, 0x9e, 0x2f, 0x89, 0x91, 0xf9, 0xb5, - 0xef, 0x05, 0x67, 0x71, 0x8e, 0x61, 0xe6, 0xaa, 0xd5, 0xe9, 0x75, 0x38, 0xd4, 0x44, 0x2b, 0xda, - 0xa0, 0xf9, 0x32, 0xa7, 0x39, 0xda, 0xa0, 0x19, 0x84, 0xec, 0x0a, 0x88, 0x7a, 0x77, 0x2e, 0xdb, - 0xa0, 0xf9, 0x21, 0x4e, 0x13, 0x71, 0x5c, 0x31, 0xa5, 0x84, 0xe2, 0x13, 0x30, 0x7c, 0x0d, 0x5b, - 0x1b, 0x86, 0xcd, 0x13, 0x47, 0x6d, 0x90, 0xfb, 0x30, 0x27, 0x37, 0xc4, 0x11, 0x69, 0x26, 0x89, - 0xd0, 0x7a, 0x14, 0x92, 0x9b, 0x6a, 0x09, 0xb7, 0x41, 0xe2, 0x26, 0x27, 0xd1, 0x4b, 0xe0, 0x09, - 0x6a, 0x0e, 0xfa, 0x2b, 0x06, 0xdf, 0xb5, 0xa2, 0xd1, 0x3f, 0xc2, 0xd1, 0xfb, 0x04, 0x0e, 0x27, - 0x61, 0x1a, 0x66, 0xbd, 0x4a, 0xb6, 0xb4, 0x68, 0x12, 0xff, 0x40, 0x90, 0x10, 0x38, 0x9c, 0x44, - 0x07, 0x62, 0xfd, 0xa8, 0x20, 0x61, 0xfb, 0xe4, 0x79, 0x09, 0xfa, 0x0c, 0xbd, 0xba, 0x6b, 0xe8, - 0xed, 0x30, 0xf1, 0x31, 0x4e, 0x01, 0x38, 0x0a, 0x21, 0x70, 0x11, 0x52, 0xed, 0x4e, 0xc4, 0x3f, - 0xfc, 0x9e, 0x58, 0x1e, 0x62, 0x06, 0xe6, 0x60, 0x48, 0x18, 0x28, 0xcd, 0xd0, 0xdb, 0x20, 0xf1, - 0x8f, 0x38, 0x89, 0x41, 0x1f, 0x1a, 0x1f, 0x86, 0x83, 0x6d, 0xa7, 0x82, 0xdb, 0x21, 0xf2, 0x49, - 0x31, 0x0c, 0x8e, 0xc2, 0x45, 0xb9, 0x81, 0xf5, 0xd2, 0x56, 0x7b, 0x14, 0x3e, 0x25, 0x44, 0x29, - 0x70, 0x08, 0x89, 0x19, 0x18, 0xa8, 0xa9, 0x96, 0xbd, 0xa5, 0x56, 0xdb, 0x9a, 0x8e, 0x7f, 0xcc, - 0x69, 0xf4, 0xbb, 0x48, 0x5c, 0x22, 0x75, 0xbd, 0x13, 0x32, 0xaf, 0x08, 0x89, 0xf8, 0xd0, 0xf8, - 0xd2, 0xb3, 0x1d, 0x9a, 0x65, 0xeb, 0x84, 0xda, 0x3f, 0x11, 0x4b, 0x8f, 0xe1, 0x2e, 0xfa, 0x29, - 0x5e, 0x84, 0x94, 0xad, 0xdd, 0x68, 0x8b, 0xcc, 0x6f, 0x88, 0x99, 0xa6, 0x08, 0x04, 0xf9, 0x2d, - 0x70, 0xb8, 0xe9, 0x36, 0xd1, 0x06, 0xb1, 0xdf, 0xe4, 0xc4, 0x0e, 0x36, 0xd9, 0x2a, 0xb8, 0x49, - 0xe8, 0x94, 0xe4, 0x3f, 0x15, 0x26, 0x01, 0x87, 0x68, 0xad, 0x90, 0x38, 0xc2, 0x56, 0x37, 0x3b, - 0x93, 0xda, 0x6f, 0x09, 0xa9, 0x31, 0xdc, 0x80, 0xd4, 0xd6, 0xe0, 0x20, 0xa7, 0xd8, 0xd9, 0xbc, - 0x7e, 0x5a, 0x18, 0x56, 0x86, 0xbd, 0x1e, 0x9c, 0xdd, 0xb7, 0x42, 0xd6, 0x15, 0xa7, 0x70, 0x58, - 0xed, 0x62, 0x4d, 0x35, 0xdb, 0xa0, 0xfc, 0xdb, 0x9c, 0xb2, 0xb0, 0xf8, 0xae, 0xc7, 0x6b, 0x2f, - 0xaa, 0x26, 0x21, 0xfe, 0x0c, 0x64, 0x04, 0xf1, 0xba, 0x6e, 0xe1, 0x92, 0x51, 0xd1, 0xb5, 0x1b, - 0xb8, 0xdc, 0x06, 0xe9, 0xcf, 0x84, 0xa6, 0x6a, 0xdd, 0x87, 0x4e, 0x28, 0xcf, 0x43, 0xda, 0xf5, - 0x55, 0x8a, 0x5a, 0xcd, 0x34, 0x2c, 0x27, 0x82, 0xe2, 0x67, 0xc5, 0x4c, 0xb9, 0x78, 0xf3, 0x14, - 0x6d, 0xba, 0x00, 0x83, 0xb4, 0xd8, 0xae, 0x4a, 0x7e, 0x8e, 0x13, 0x1a, 0xf0, 0xb0, 0xb8, 0xe1, - 0x28, 0x19, 0x35, 0x53, 0xb5, 0xda, 0xb1, 0x7f, 0xbf, 0x23, 0x0c, 0x07, 0x47, 0xe1, 0x86, 0xc3, - 0xd9, 0x35, 0x31, 0xd9, 0xed, 0xdb, 0xa0, 0xf0, 0x79, 0x61, 0x38, 0x04, 0x0e, 0x27, 0x21, 0x1c, - 0x86, 0x36, 0x48, 0xfc, 0x33, 0x41, 0x42, 0xe0, 0x10, 0x12, 0x4f, 0x79, 0x1b, 0xad, 0x85, 0x2b, - 0x9a, 0xed, 0x58, 0xcc, 0x4d, 0xde, 0x9b, 0xd4, 0x3f, 0xff, 0x5e, 0xd0, 0x09, 0x53, 0x7c, 0xa8, - 0xc4, 0x12, 0xf1, 0xb4, 0x2b, 0x8d, 0xa2, 0xa2, 0x19, 0xfb, 0x5d, 0x61, 0x89, 0x7c, 0x68, 0x84, - 0x37, 0x9f, 0x87, 0x48, 0xc4, 0x5e, 0x22, 0xb1, 0x43, 0x1b, 0xe4, 0xfe, 0x45, 0x88, 0xb9, 0x55, - 0x81, 0x4b, 0x68, 0xfa, 0xfc, 0x9f, 0xba, 0xbe, 0x8d, 0x77, 0xdb, 0xd2, 0xce, 0xdf, 0x0b, 0xf9, - 0x3f, 0xeb, 0x0c, 0x93, 0xd9, 0x90, 0xa1, 0x90, 0x3f, 0x85, 0xa2, 0xee, 0x0f, 0x65, 0x7e, 0xfa, - 0x07, 0x7c, 0xbc, 0x41, 0x77, 0x6a, 0x7a, 0x81, 0x28, 0x79, 0xd0, 0xe9, 0x89, 0x26, 0xf6, 0xee, - 0x1f, 0xb8, 0x7a, 0x1e, 0xf0, 0x79, 0xa6, 0x2f, 0xc3, 0x40, 0xc0, 0xe1, 0x89, 0x26, 0xf5, 0x33, - 0x9c, 0x54, 0xbf, 0xdf, 0xdf, 0x99, 0x3e, 0x0b, 0x09, 0xe2, 0xbc, 0x44, 0xa3, 0xff, 0x2c, 0x47, - 0xa7, 0xe0, 0xd3, 0x8f, 0x41, 0x52, 0x38, 0x2d, 0xd1, 0xa8, 0x3f, 0xc7, 0x51, 0x5d, 0x14, 0x82, - 0x2e, 0x1c, 0x96, 0x68, 0xf4, 0x9f, 0x17, 0xe8, 0x02, 0x85, 0xa0, 0xb7, 0x2f, 0xc2, 0x2f, 0xfc, - 0x62, 0x82, 0x6f, 0x3a, 0x42, 0x76, 0x17, 0xa1, 0x97, 0x7b, 0x2a, 0xd1, 0xd8, 0xbf, 0xc0, 0x3b, - 0x17, 0x18, 0xd3, 0xe7, 0xa1, 0xbb, 0x4d, 0x81, 0xbf, 0x87, 0xa3, 0x32, 0xf8, 0xe9, 0x19, 0xe8, - 0xf3, 0x79, 0x27, 0xd1, 0xe8, 0x7f, 0x9f, 0xa3, 0xfb, 0xb1, 0x08, 0xeb, 0xdc, 0x3b, 0x89, 0x26, - 0xf0, 0x5e, 0xc1, 0x3a, 0xc7, 0x20, 0x62, 0x13, 0x8e, 0x49, 0x34, 0xf6, 0xfb, 0x84, 0xd4, 0x05, - 0xca, 0xf4, 0x25, 0x48, 0xb9, 0x9b, 0x4d, 0x34, 0xfe, 0xfb, 0x39, 0xbe, 0x87, 0x43, 0x24, 0xe0, - 0xdb, 0xec, 0xa2, 0x49, 0x7c, 0x40, 0x48, 0xc0, 0x87, 0x45, 0x96, 0x51, 0xd8, 0x81, 0x89, 0xa6, - 0xf4, 0x4b, 0x62, 0x19, 0x85, 0xfc, 0x17, 0x32, 0x9b, 0xd4, 0xe6, 0x47, 0x93, 0xf8, 0x65, 0x31, - 0x9b, 0x14, 0x9e, 0xb0, 0x11, 0xf6, 0x08, 0xa2, 0x69, 0xfc, 0xaa, 0x60, 0x23, 0xe4, 0x10, 0x4c, - 0xaf, 0x00, 0x6a, 0xf4, 0x06, 0xa2, 0xe9, 0x7d, 0x90, 0xd3, 0x1b, 0x6e, 0x70, 0x06, 0xa6, 0x9f, - 0x86, 0x83, 0xcd, 0x3d, 0x81, 0x68, 0xaa, 0xbf, 0xf6, 0x83, 0x50, 0xec, 0xe6, 0x77, 0x04, 0xa6, - 0xd7, 0xbc, 0x2d, 0xc5, 0xef, 0x05, 0x44, 0x93, 0x7d, 0xf9, 0x07, 0x41, 0xc3, 0xed, 0x77, 0x02, - 0xa6, 0x73, 0x00, 0xde, 0x06, 0x1c, 0x4d, 0xeb, 0xc3, 0x9c, 0x96, 0x0f, 0x89, 0x2c, 0x0d, 0xbe, - 0xff, 0x46, 0xe3, 0xdf, 0x14, 0x4b, 0x83, 0x63, 0x90, 0xa5, 0x21, 0xb6, 0xde, 0x68, 0xec, 0x8f, - 0x88, 0xa5, 0x21, 0x50, 0x88, 0x66, 0xfb, 0x76, 0xb7, 0x68, 0x0a, 0x1f, 0x13, 0x9a, 0xed, 0xc3, - 0x9a, 0x5e, 0x82, 0xe1, 0x86, 0x0d, 0x31, 0x9a, 0xd4, 0xaf, 0x73, 0x52, 0xe9, 0xf0, 0x7e, 0xe8, - 0xdf, 0xbc, 0xf8, 0x66, 0x18, 0x4d, 0xed, 0xe3, 0xa1, 0xcd, 0x8b, 0xef, 0x85, 0xd3, 0x17, 0x21, - 0xa9, 0xd7, 0xab, 0x55, 0xb2, 0x78, 0xd0, 0xde, 0x77, 0xfe, 0x32, 0xff, 0xed, 0x47, 0x5c, 0x3a, - 0x02, 0x61, 0xfa, 0x2c, 0x74, 0xe3, 0xda, 0x06, 0x2e, 0x47, 0x61, 0x7e, 0xf7, 0x47, 0xc2, 0x60, - 0x12, 0xe8, 0xe9, 0x4b, 0x00, 0x2c, 0x35, 0x42, 0x8f, 0x07, 0x23, 0x70, 0xff, 0xfb, 0x8f, 0xf8, - 0x6d, 0x1c, 0x0f, 0xc5, 0x23, 0xc0, 0xee, 0xf6, 0xec, 0x4d, 0xe0, 0x7b, 0x41, 0x02, 0x74, 0x46, - 0x1e, 0x85, 0xde, 0xe7, 0x6c, 0x43, 0x77, 0xd4, 0x4a, 0x14, 0xf6, 0xff, 0xe0, 0xd8, 0x02, 0x9e, - 0x08, 0xac, 0x66, 0x58, 0xd8, 0x51, 0x2b, 0x76, 0x14, 0xee, 0xff, 0xe4, 0xb8, 0x2e, 0x02, 0x41, - 0x2e, 0xa9, 0xb6, 0xd3, 0xce, 0xb8, 0xff, 0x42, 0x20, 0x0b, 0x04, 0xc2, 0x34, 0xf9, 0x7f, 0x1b, - 0xef, 0x46, 0xe1, 0x7e, 0x5f, 0x30, 0xcd, 0xe1, 0xa7, 0x1f, 0x83, 0x14, 0xf9, 0x97, 0x5d, 0xb1, - 0x8b, 0x40, 0xfe, 0x5f, 0x1c, 0xd9, 0xc3, 0x20, 0x3d, 0xdb, 0x4e, 0xd9, 0xd1, 0xa2, 0x85, 0xfd, - 0x1a, 0x9f, 0x69, 0x01, 0x3f, 0x9d, 0x83, 0x3e, 0xdb, 0x29, 0x97, 0xeb, 0xdc, 0x3f, 0x8d, 0x40, - 0xff, 0xdf, 0x3f, 0x72, 0x53, 0x16, 0x2e, 0x0e, 0x99, 0xed, 0xeb, 0xdb, 0x8e, 0x69, 0xd0, 0x23, - 0x90, 0x28, 0x0a, 0x3f, 0xe0, 0x14, 0x7c, 0x28, 0xd3, 0x33, 0xd0, 0x4f, 0xc6, 0x62, 0x61, 0x13, - 0xd3, 0xf3, 0xaa, 0x08, 0x12, 0x3f, 0xe4, 0x02, 0x08, 0x20, 0xe5, 0xdf, 0xf6, 0xa5, 0x57, 0xc7, - 0xa4, 0xaf, 0xbc, 0x3a, 0x26, 0x7d, 0xf3, 0xd5, 0x31, 0xe9, 0x7d, 0xdf, 0x1a, 0xeb, 0xfa, 0xca, - 0xb7, 0xc6, 0xba, 0xbe, 0xfe, 0xad, 0xb1, 0xae, 0xe6, 0x69, 0x63, 0x98, 0x33, 0xe6, 0x0c, 0x96, - 0x30, 0x7e, 0x56, 0x0e, 0xa4, 0x8b, 0x2b, 0x86, 0x97, 0xad, 0x75, 0x83, 0x1c, 0xf8, 0xa1, 0x44, - 0x02, 0xe6, 0x60, 0x2e, 0x57, 0xd5, 0x77, 0x5b, 0xbc, 0xc1, 0xc9, 0x36, 0x4d, 0x0c, 0xcb, 0x6f, - 0x82, 0x78, 0x4e, 0xdf, 0x45, 0x87, 0x99, 0xcd, 0x2b, 0xd6, 0xad, 0x2a, 0xbf, 0xfa, 0xd5, 0x4b, - 0xca, 0xeb, 0x56, 0x15, 0x8d, 0x7a, 0xf7, 0x33, 0xa5, 0x93, 0xfd, 0xfc, 0xd2, 0xe5, 0x74, 0xe2, - 0xfb, 0x1f, 0x1b, 0xef, 0xca, 0x6f, 0x87, 0x47, 0xf8, 0x85, 0xc8, 0x51, 0x26, 0x73, 0xfa, 0x2e, - 0x1d, 0xe4, 0x8a, 0xf4, 0x6c, 0x37, 0xe9, 0xc3, 0x16, 0x89, 0xed, 0xb1, 0x70, 0x62, 0xfb, 0x69, - 0x5c, 0xad, 0x3e, 0xa9, 0x1b, 0xd7, 0xf5, 0x35, 0x02, 0xb6, 0xd1, 0x43, 0x69, 0x3c, 0x0c, 0xef, - 0x8b, 0xc1, 0x78, 0x78, 0xdc, 0x44, 0x71, 0x6c, 0x47, 0xad, 0x99, 0xad, 0x5e, 0x20, 0x5d, 0x84, - 0xd4, 0x9a, 0x80, 0x41, 0x19, 0xe8, 0xb5, 0x71, 0xc9, 0xd0, 0xcb, 0x36, 0x1d, 0x6c, 0x5c, 0x11, - 0x45, 0x32, 0x58, 0x5d, 0xd5, 0x0d, 0x9b, 0x5f, 0x90, 0x64, 0x85, 0xfc, 0xaf, 0x48, 0x9d, 0xcd, - 0xe4, 0xa0, 0xdb, 0x95, 0x18, 0xe9, 0xfd, 0x7b, 0xa5, 0xff, 0xa9, 0x14, 0xbc, 0x21, 0xf8, 0x72, - 0xfd, 0xed, 0x8a, 0xe4, 0x5d, 0x71, 0x38, 0x5c, 0x32, 0xec, 0x9a, 0x61, 0x17, 0xd9, 0x0c, 0xb3, - 0x02, 0x17, 0x46, 0xbf, 0xbf, 0xa9, 0x8d, 0xfc, 0xff, 0x15, 0x18, 0xa4, 0xab, 0x80, 0x66, 0x3e, - 0xa9, 0xe1, 0x89, 0xdc, 0x2b, 0xfe, 0xf0, 0xdf, 0x77, 0x53, 0xad, 0x19, 0x70, 0x11, 0xe9, 0xd5, - 0x8e, 0x35, 0x18, 0xd5, 0x6a, 0x66, 0x15, 0xd3, 0x33, 0xa0, 0xa2, 0xdb, 0x16, 0x4d, 0xef, 0xcb, - 0x9c, 0xde, 0x88, 0x87, 0x3e, 0x2f, 0xb0, 0xa7, 0x17, 0x60, 0x58, 0x2d, 0x95, 0xb0, 0x19, 0x20, - 0x19, 0xb1, 0x42, 0x05, 0x83, 0x69, 0x8e, 0xe9, 0x52, 0xcb, 0x5f, 0x6a, 0x35, 0xb7, 0xcf, 0xde, - 0xeb, 0x9b, 0x34, 0x0b, 0x57, 0xb0, 0x7e, 0x5a, 0xc7, 0xce, 0x75, 0xc3, 0xda, 0xe6, 0xe2, 0x3d, - 0xcd, 0xba, 0x12, 0x93, 0xf0, 0x33, 0x71, 0x18, 0x63, 0x0d, 0x53, 0x1b, 0xaa, 0x8d, 0xa7, 0xae, - 0x3d, 0xb4, 0x81, 0x1d, 0xf5, 0xa1, 0xa9, 0x92, 0xa1, 0xe9, 0x7c, 0x26, 0x46, 0xf8, 0xbc, 0x90, - 0xf6, 0x49, 0xde, 0xde, 0x62, 0x61, 0xce, 0x41, 0x62, 0xc6, 0xd0, 0x74, 0xa2, 0x91, 0x65, 0xac, - 0x1b, 0x35, 0xbe, 0x2c, 0x59, 0x01, 0xdd, 0x0d, 0x3d, 0x6a, 0xcd, 0xa8, 0xeb, 0x0e, 0x3b, 0xbe, - 0xca, 0xf7, 0x7d, 0xe9, 0xd6, 0x78, 0xd7, 0x9f, 0xde, 0x1a, 0x8f, 0xcf, 0xeb, 0x8e, 0xc2, 0x9b, - 0xa6, 0x13, 0xdf, 0xf9, 0xe8, 0xb8, 0x24, 0x3f, 0x01, 0xbd, 0xb3, 0xb8, 0xb4, 0x1f, 0x5a, 0xb3, - 0xb8, 0x14, 0xa2, 0x75, 0x1f, 0x24, 0xe7, 0x75, 0x87, 0xdd, 0x99, 0x3d, 0x06, 0x71, 0x4d, 0x67, - 0xb7, 0xb0, 0x42, 0xfd, 0x93, 0x7a, 0x02, 0x3a, 0x8b, 0x4b, 0x2e, 0x68, 0x19, 0x97, 0xc2, 0xa0, - 0x84, 0x3c, 0xa9, 0xcf, 0xcf, 0x7e, 0xfd, 0xcf, 0xc6, 0xba, 0x5e, 0x78, 0x75, 0xac, 0xab, 0xe5, - 0x4c, 0xf8, 0xcd, 0x21, 0x17, 0x31, 0x9f, 0x02, 0xbb, 0xbc, 0x3d, 0xe5, 0x04, 0xd6, 0xc2, 0xdf, - 0x8b, 0xc1, 0x58, 0x83, 0x8a, 0xf3, 0x8d, 0xa1, 0x95, 0x75, 0x98, 0x86, 0xe4, 0xac, 0xd8, 0x6f, - 0x3a, 0x35, 0x0e, 0xbf, 0xdc, 0xa1, 0x71, 0x18, 0x10, 0x3d, 0x09, 0xdb, 0x70, 0x2a, 0xda, 0x36, - 0x08, 0xfe, 0xf7, 0x61, 0x1a, 0x5e, 0x49, 0xc0, 0x31, 0xfa, 0x28, 0xc4, 0xaa, 0x69, 0xba, 0x33, - 0x55, 0xb2, 0x76, 0x4d, 0x87, 0x6e, 0x27, 0xc6, 0x26, 0x97, 0xc6, 0xb0, 0xd7, 0x3c, 0xc9, 0x9a, - 0x5b, 0xa8, 0xe4, 0x26, 0x74, 0xaf, 0x10, 0x3c, 0x22, 0x08, 0xc7, 0x70, 0xd4, 0x2a, 0x17, 0x10, - 0x2b, 0x90, 0x5a, 0xf6, 0x90, 0x24, 0xc6, 0x6a, 0x35, 0xf1, 0x86, 0xa4, 0x8a, 0xd5, 0x4d, 0x76, - 0x71, 0x37, 0x4e, 0xb7, 0x90, 0x24, 0xa9, 0xa0, 0x77, 0x74, 0x47, 0xa1, 0x5b, 0xad, 0xb3, 0x23, - 0xe7, 0x38, 0xd9, 0x5b, 0x68, 0x41, 0x7e, 0x12, 0x7a, 0xf9, 0x31, 0x17, 0x4a, 0x43, 0x7c, 0x1b, - 0xef, 0xd2, 0x7e, 0xfa, 0x15, 0xf2, 0x2f, 0x9a, 0x84, 0x6e, 0xca, 0x3c, 0x7f, 0x91, 0x90, 0x99, - 0x6c, 0xe0, 0x7e, 0x92, 0x32, 0xa9, 0x30, 0x30, 0xf9, 0x09, 0x48, 0xce, 0x1a, 0x35, 0x4d, 0x37, - 0x82, 0xd4, 0x52, 0x8c, 0x1a, 0xe5, 0xd9, 0xac, 0x73, 0xd5, 0x57, 0x58, 0x01, 0x1d, 0x84, 0x1e, - 0x76, 0x91, 0x9b, 0x1f, 0x9b, 0xf3, 0x92, 0x3c, 0x03, 0xbd, 0x94, 0xf6, 0xb2, 0x89, 0x10, 0x7f, - 0xd9, 0xc3, 0x6f, 0x8c, 0x53, 0x2b, 0xc9, 0xc9, 0xc7, 0x3c, 0x66, 0x11, 0x24, 0xca, 0xaa, 0xa3, - 0xf2, 0x71, 0xd3, 0xff, 0xe5, 0xc7, 0x21, 0xc9, 0x89, 0xd8, 0xe8, 0x0c, 0xc4, 0x0d, 0xd3, 0xe6, - 0x07, 0xdf, 0xd9, 0x56, 0x43, 0x59, 0x36, 0xf3, 0x09, 0xb2, 0x68, 0x14, 0x02, 0x9c, 0x57, 0x5a, - 0xae, 0x92, 0x0b, 0x3e, 0x45, 0xf2, 0x4d, 0xb9, 0xef, 0x5f, 0x36, 0xa5, 0x0d, 0xea, 0xe0, 0x2a, - 0xcb, 0xc7, 0x62, 0x30, 0xe6, 0x6b, 0xbd, 0x86, 0x2d, 0x12, 0xeb, 0xb1, 0x05, 0xc6, 0xb5, 0x05, - 0xf9, 0x98, 0xe4, 0xed, 0x2d, 0xd4, 0xe5, 0x31, 0x88, 0xe7, 0x4c, 0x13, 0x65, 0x21, 0xc9, 0x0e, - 0xb8, 0x0d, 0xa6, 0x2f, 0x09, 0xc5, 0x2d, 0x93, 0x36, 0xdb, 0xd8, 0x74, 0xae, 0xab, 0x96, 0xfb, - 0x84, 0x49, 0x94, 0xe5, 0x47, 0x21, 0x35, 0x63, 0xe8, 0x36, 0xd6, 0xed, 0x3a, 0x5d, 0x7a, 0x1b, - 0x55, 0xa3, 0xb4, 0xcd, 0x29, 0xb0, 0x02, 0x11, 0xb8, 0x6a, 0x9a, 0x14, 0x33, 0xa1, 0x90, 0x7f, - 0x99, 0x99, 0xca, 0xaf, 0xb6, 0x14, 0xd1, 0xa3, 0x9d, 0x8b, 0x88, 0x0f, 0xd2, 0x95, 0xd1, 0xff, - 0x95, 0xe0, 0x68, 0xe3, 0x82, 0xda, 0xc6, 0xbb, 0x76, 0xa7, 0xeb, 0xe9, 0x19, 0x48, 0xad, 0xd0, - 0x77, 0xc4, 0x4f, 0xe2, 0x5d, 0x94, 0x85, 0x5e, 0x5c, 0x3e, 0x73, 0xf6, 0xec, 0x43, 0x8f, 0x32, - 0x6d, 0xbf, 0xd2, 0xa5, 0x88, 0x0a, 0x34, 0x06, 0x29, 0x1b, 0x97, 0xcc, 0x33, 0x67, 0xcf, 0x6d, - 0x3f, 0xc4, 0xd4, 0xeb, 0x4a, 0x97, 0xe2, 0x55, 0x4d, 0x27, 0xc9, 0xa8, 0xbf, 0xf3, 0xb1, 0x71, - 0x29, 0xdf, 0x0d, 0x71, 0xbb, 0x5e, 0xbb, 0xa3, 0x3a, 0xf2, 0x72, 0x37, 0x4c, 0xf8, 0x31, 0xa9, - 0x81, 0xba, 0xa6, 0x56, 0xb5, 0xb2, 0xea, 0xbd, 0x00, 0x4f, 0xfb, 0x64, 0x40, 0x21, 0x9a, 0x8b, - 0x20, 0xbb, 0xa7, 0x24, 0xe5, 0xcf, 0x48, 0xd0, 0x7f, 0x55, 0x50, 0x5e, 0xc5, 0x0e, 0xba, 0x08, - 0xe0, 0xf6, 0x24, 0x96, 0xcd, 0x91, 0xc9, 0x70, 0x5f, 0x93, 0x2e, 0x8e, 0xe2, 0x03, 0x47, 0xe7, - 0xa9, 0x22, 0x9a, 0x86, 0xcd, 0xdf, 0xbf, 0x44, 0xa0, 0xba, 0xc0, 0xe8, 0x01, 0x40, 0xd4, 0xc2, - 0x15, 0xaf, 0x19, 0x8e, 0xa6, 0x57, 0x8a, 0xa6, 0x71, 0x9d, 0x3f, 0x16, 0x8c, 0x2b, 0x69, 0xda, - 0x72, 0x95, 0x36, 0xac, 0x90, 0x7a, 0xc2, 0x74, 0xca, 0xa5, 0x42, 0x76, 0x13, 0xb5, 0x5c, 0xb6, - 0xb0, 0x6d, 0x73, 0x23, 0x26, 0x8a, 0xe8, 0x22, 0xf4, 0x9a, 0xf5, 0x8d, 0xa2, 0xb0, 0x18, 0x7d, - 0x67, 0x8e, 0x36, 0x5b, 0xff, 0x42, 0x3f, 0xb8, 0x05, 0xe8, 0x31, 0xeb, 0x1b, 0x44, 0x5b, 0xee, - 0x82, 0xfe, 0x26, 0xcc, 0xf4, 0x5d, 0xf3, 0xf8, 0xa0, 0xcf, 0xd7, 0xf9, 0x08, 0x8a, 0xa6, 0xa5, - 0x19, 0x96, 0xe6, 0xec, 0xd2, 0xdb, 0x2b, 0x71, 0x25, 0x2d, 0x1a, 0x56, 0x78, 0xbd, 0xbc, 0x0d, - 0x43, 0xab, 0xd4, 0xd5, 0xf2, 0x38, 0x3f, 0xeb, 0xf1, 0x27, 0x45, 0xf3, 0xd7, 0x92, 0xb3, 0x58, - 0x03, 0x67, 0xf9, 0xa7, 0x5a, 0x6a, 0xe7, 0xf9, 0xce, 0xb5, 0x33, 0xb8, 0xf9, 0xff, 0xc5, 0xe1, - 0xc0, 0xe2, 0xe4, 0x9e, 0xb5, 0xcf, 0x7c, 0xb5, 0xab, 0x98, 0x51, 0x11, 0x46, 0x76, 0xef, 0x4d, - 0x35, 0x1b, 0x61, 0x46, 0xb3, 0x91, 0x4b, 0x48, 0x7e, 0x14, 0x06, 0x56, 0x54, 0xcb, 0x59, 0xc5, - 0xce, 0x15, 0xac, 0x96, 0xb1, 0x15, 0xdc, 0x75, 0x07, 0xc4, 0xae, 0x8b, 0x20, 0x41, 0xb7, 0x56, - 0xb6, 0xeb, 0xd0, 0xff, 0xe5, 0x2d, 0x48, 0xd0, 0x1b, 0x6c, 0xee, 0x8e, 0xcc, 0x31, 0xd8, 0x8e, - 0x4c, 0x6c, 0xe9, 0xae, 0x83, 0x6d, 0x11, 0xd0, 0xd1, 0x02, 0x7a, 0x44, 0xec, 0xab, 0xf1, 0xbd, - 0xf7, 0x55, 0xae, 0x88, 0x7c, 0x77, 0xad, 0x42, 0x6f, 0x9e, 0x98, 0xe2, 0xf9, 0x59, 0x97, 0x11, - 0xc9, 0x63, 0x04, 0x2d, 0xc2, 0x90, 0xa9, 0x5a, 0x0e, 0xbd, 0xba, 0xbf, 0x45, 0x47, 0xc1, 0x75, - 0x7d, 0xbc, 0x71, 0xe5, 0x05, 0x06, 0xcb, 0x7b, 0x19, 0x30, 0xfd, 0x95, 0xf2, 0x9f, 0x27, 0xa0, - 0x87, 0x0b, 0xe3, 0x31, 0xe8, 0xe5, 0x62, 0xe5, 0xda, 0x79, 0x6c, 0xb2, 0x71, 0x63, 0x9a, 0x74, - 0x37, 0x10, 0x4e, 0x4f, 0xe0, 0xa0, 0xe3, 0x90, 0x2c, 0x6d, 0xa9, 0x9a, 0x5e, 0xd4, 0xca, 0xc2, - 0xeb, 0x7d, 0xf5, 0xd6, 0x78, 0xef, 0x0c, 0xa9, 0x9b, 0x9f, 0x55, 0x7a, 0x69, 0xe3, 0x7c, 0x99, - 0x78, 0x02, 0x5b, 0x58, 0xab, 0x6c, 0x39, 0x7c, 0x85, 0xf1, 0x12, 0xba, 0x00, 0x09, 0xa2, 0x10, - 0xfc, 0x65, 0x57, 0xb6, 0x21, 0xf6, 0x70, 0x03, 0xc0, 0x7c, 0x92, 0x74, 0xfc, 0xbe, 0x6f, 0x8c, - 0x4b, 0x0a, 0xc5, 0x40, 0x33, 0x30, 0x50, 0x55, 0x6d, 0xa7, 0x48, 0x77, 0x30, 0xd2, 0x7d, 0x37, - 0x25, 0x71, 0xb8, 0x51, 0x20, 0x5c, 0xb0, 0x9c, 0xf5, 0x3e, 0x82, 0xc5, 0xaa, 0xca, 0xe8, 0x24, - 0xa4, 0x29, 0x91, 0x92, 0x51, 0xab, 0x69, 0x0e, 0xf3, 0xad, 0x7a, 0xa8, 0xdc, 0x07, 0x49, 0xfd, - 0x0c, 0xad, 0xa6, 0x1e, 0xd6, 0x11, 0x48, 0xd1, 0xa7, 0x24, 0x14, 0x84, 0x5d, 0x9b, 0x4c, 0x92, - 0x0a, 0xda, 0x78, 0x02, 0x86, 0x3c, 0xfb, 0xc8, 0x40, 0x92, 0x8c, 0x8a, 0x57, 0x4d, 0x01, 0x1f, - 0x84, 0x51, 0x1d, 0xef, 0xd0, 0x8b, 0x9c, 0x01, 0xe8, 0x14, 0x85, 0x46, 0xa4, 0xed, 0x6a, 0x10, - 0xe3, 0x5e, 0x18, 0x2c, 0x09, 0xe1, 0x33, 0x58, 0xa0, 0xb0, 0x03, 0x6e, 0x2d, 0x05, 0x3b, 0x0c, - 0x49, 0xd5, 0x34, 0x19, 0x40, 0x1f, 0xb7, 0x8f, 0xa6, 0x49, 0x9b, 0x4e, 0xc1, 0x30, 0x1d, 0xa3, - 0x85, 0xed, 0x7a, 0xd5, 0xe1, 0x44, 0xfa, 0x29, 0xcc, 0x10, 0x69, 0x50, 0x58, 0x3d, 0x85, 0xbd, - 0x1b, 0x06, 0xf0, 0x35, 0xad, 0x8c, 0xf5, 0x12, 0x66, 0x70, 0x03, 0x14, 0xae, 0x5f, 0x54, 0x52, - 0xa0, 0xfb, 0xc0, 0xb5, 0x7b, 0x45, 0x61, 0x93, 0x07, 0x19, 0x3d, 0x51, 0x9f, 0x63, 0xd5, 0x72, - 0x06, 0x12, 0xb3, 0xaa, 0xa3, 0x12, 0x07, 0xc3, 0xd9, 0x61, 0x1b, 0x4d, 0xbf, 0x42, 0xfe, 0x95, - 0xbf, 0x13, 0x83, 0xc4, 0x55, 0xc3, 0xc1, 0xe8, 0x61, 0x9f, 0x03, 0x38, 0xd8, 0x4c, 0x9f, 0x57, - 0xb5, 0x8a, 0x8e, 0xcb, 0x8b, 0x76, 0xc5, 0xf7, 0x9e, 0xdb, 0x53, 0xa7, 0x58, 0x40, 0x9d, 0x46, - 0xa1, 0xdb, 0x32, 0xea, 0x7a, 0x59, 0xdc, 0x38, 0xa4, 0x05, 0x54, 0x80, 0xa4, 0xab, 0x25, 0x89, - 0x28, 0x2d, 0x19, 0x22, 0x5a, 0x42, 0x74, 0x98, 0x57, 0x28, 0xbd, 0x1b, 0x5c, 0x59, 0xf2, 0x90, - 0x72, 0x8d, 0x17, 0xd7, 0xb6, 0xf6, 0x14, 0xd6, 0x43, 0x23, 0x9b, 0x89, 0x3b, 0xf7, 0xae, 0xf0, - 0x98, 0xc6, 0xa5, 0xdd, 0x06, 0x2e, 0xbd, 0x80, 0x5a, 0xf1, 0xb7, 0xe5, 0xbd, 0x74, 0x5c, 0x9e, - 0x5a, 0xb1, 0xf7, 0xe5, 0x47, 0x21, 0x65, 0x6b, 0x15, 0x5d, 0x75, 0xea, 0x16, 0xe6, 0x9a, 0xe7, - 0x55, 0xc8, 0x5f, 0x90, 0xa0, 0x87, 0x69, 0xb2, 0x4f, 0x6e, 0x52, 0x73, 0xb9, 0xc5, 0x5a, 0xc9, - 0x2d, 0xbe, 0x7f, 0xb9, 0xe5, 0x00, 0x5c, 0x66, 0x6c, 0xfe, 0x36, 0xb8, 0x89, 0xc7, 0xc0, 0x58, - 0x5c, 0xd5, 0x2a, 0x7c, 0xa1, 0xfa, 0x90, 0xe4, 0xff, 0x2c, 0x11, 0x27, 0x96, 0xb7, 0xa3, 0x1c, - 0x0c, 0x08, 0xbe, 0x8a, 0x9b, 0x55, 0xb5, 0xc2, 0x75, 0xe7, 0x58, 0x4b, 0xe6, 0x2e, 0x57, 0xd5, - 0x8a, 0xd2, 0xc7, 0xf9, 0x21, 0x85, 0xe6, 0xf3, 0x10, 0x6b, 0x31, 0x0f, 0x81, 0x89, 0x8f, 0xef, - 0x6f, 0xe2, 0x03, 0x53, 0x94, 0x08, 0x4f, 0xd1, 0x67, 0x63, 0x34, 0x98, 0x31, 0x0d, 0x5b, 0xad, - 0xbe, 0x11, 0x2b, 0xe2, 0x08, 0xa4, 0x4c, 0xa3, 0x5a, 0x64, 0x2d, 0xec, 0x26, 0x6e, 0xd2, 0x34, - 0xaa, 0x4a, 0xc3, 0xb4, 0x77, 0xdf, 0xa6, 0xe5, 0xd2, 0x73, 0x1b, 0xa4, 0xd6, 0x1b, 0x96, 0x9a, - 0x05, 0xfd, 0x4c, 0x14, 0x7c, 0x2f, 0x7b, 0x90, 0xc8, 0x80, 0x6e, 0x8e, 0x52, 0xe3, 0xde, 0xcb, - 0xd8, 0x66, 0x90, 0x0a, 0x87, 0x23, 0x18, 0xcc, 0xf4, 0x37, 0x8b, 0x82, 0xfd, 0x6a, 0xa9, 0x70, - 0x38, 0xf9, 0x57, 0x24, 0x80, 0x05, 0x22, 0x59, 0x3a, 0x5e, 0xb2, 0x0b, 0xd9, 0x94, 0x85, 0x62, - 0xa0, 0xe7, 0xb1, 0x56, 0x93, 0xc6, 0xfb, 0xef, 0xb7, 0xfd, 0x7c, 0xcf, 0xc0, 0x80, 0xa7, 0x8c, - 0x36, 0x16, 0xcc, 0x8c, 0xed, 0xe1, 0x55, 0xaf, 0x62, 0x47, 0xe9, 0xbf, 0xe6, 0x2b, 0xc9, 0xbf, - 0x2f, 0x41, 0x8a, 0xf2, 0xb4, 0x88, 0x1d, 0x35, 0x30, 0x87, 0xd2, 0xfe, 0xe7, 0xf0, 0x18, 0x00, - 0x23, 0x63, 0x6b, 0x37, 0x30, 0xd7, 0xac, 0x14, 0xad, 0x59, 0xd5, 0x6e, 0x60, 0x74, 0xce, 0x15, - 0x78, 0x7c, 0x6f, 0x81, 0x0b, 0xaf, 0x9b, 0x8b, 0xfd, 0x10, 0xf4, 0xd2, 0x4f, 0xe4, 0xec, 0xd8, - 0xdc, 0x91, 0xee, 0xd1, 0xeb, 0xb5, 0xb5, 0x1d, 0x5b, 0x7e, 0x0e, 0x7a, 0xd7, 0x76, 0x58, 0x6e, - 0xe4, 0x08, 0xa4, 0x2c, 0xc3, 0xe0, 0x7b, 0x32, 0xf3, 0x85, 0x92, 0xa4, 0x82, 0x6e, 0x41, 0x22, - 0x1f, 0x10, 0xf3, 0xf2, 0x01, 0x5e, 0x42, 0x23, 0xde, 0x56, 0x42, 0xe3, 0xd4, 0xd7, 0x24, 0xe8, - 0xf3, 0xd9, 0x07, 0xf4, 0x10, 0x1c, 0xc8, 0x2f, 0x2c, 0xcf, 0x3c, 0x59, 0x9c, 0x9f, 0x2d, 0x5e, - 0x5e, 0xc8, 0xcd, 0x79, 0x6f, 0x4d, 0xb2, 0x07, 0x5f, 0xba, 0x39, 0x81, 0x7c, 0xb0, 0xeb, 0xfa, - 0xb6, 0x6e, 0x5c, 0xd7, 0xd1, 0x14, 0x8c, 0x06, 0x51, 0x72, 0xf9, 0xd5, 0xc2, 0xd2, 0x5a, 0x5a, - 0xca, 0x1e, 0x78, 0xe9, 0xe6, 0xc4, 0xb0, 0x0f, 0x23, 0xb7, 0x61, 0x63, 0xdd, 0x69, 0x44, 0x98, - 0x59, 0x5e, 0x5c, 0x9c, 0x5f, 0x4b, 0xc7, 0x1a, 0x10, 0xb8, 0xc1, 0xbe, 0x0f, 0x86, 0x83, 0x08, - 0x4b, 0xf3, 0x0b, 0xe9, 0x78, 0x16, 0xbd, 0x74, 0x73, 0x62, 0xd0, 0x07, 0xbd, 0xa4, 0x55, 0xb3, - 0xc9, 0x17, 0x3f, 0x3e, 0xd6, 0xf5, 0xa9, 0x4f, 0x8c, 0x49, 0x64, 0x64, 0x03, 0x01, 0x1b, 0x81, - 0x1e, 0x80, 0x43, 0xab, 0xf3, 0x73, 0x4b, 0x85, 0xd9, 0xe2, 0xe2, 0xea, 0x5c, 0x91, 0x7d, 0x64, - 0xc3, 0x1d, 0xdd, 0xd0, 0x4b, 0x37, 0x27, 0xfa, 0xf8, 0x90, 0x5a, 0x41, 0xaf, 0x28, 0x85, 0xab, - 0xcb, 0x6b, 0x85, 0xb4, 0xc4, 0xa0, 0x57, 0x2c, 0x7c, 0xcd, 0x70, 0xd8, 0x37, 0xb4, 0x1e, 0x84, - 0xc3, 0x4d, 0xa0, 0xdd, 0x81, 0x0d, 0xbf, 0x74, 0x73, 0x62, 0x60, 0xc5, 0xc2, 0x6c, 0xfd, 0x50, - 0x8c, 0x49, 0xc8, 0x34, 0x62, 0x2c, 0xaf, 0x2c, 0xaf, 0xe6, 0x16, 0xd2, 0x13, 0xd9, 0xf4, 0x4b, - 0x37, 0x27, 0xfa, 0x85, 0x31, 0x24, 0xf0, 0xde, 0xc8, 0xee, 0x64, 0xc4, 0xf3, 0x81, 0x07, 0xe1, - 0x98, 0xed, 0xa8, 0xdb, 0x9a, 0x5e, 0x71, 0x33, 0xce, 0xbc, 0xcc, 0x43, 0x9e, 0x63, 0x55, 0xed, - 0xf9, 0xba, 0x56, 0x16, 0x95, 0xe2, 0xef, 0x9e, 0xe9, 0xe7, 0x6c, 0xeb, 0x93, 0xa5, 0x6c, 0x44, - 0x76, 0x35, 0x3a, 0x74, 0x6a, 0x7d, 0x54, 0x91, 0x8d, 0x48, 0xa0, 0x67, 0xf7, 0x0c, 0xee, 0xe4, - 0xf7, 0x49, 0x30, 0x78, 0x45, 0xb3, 0x1d, 0xc3, 0xd2, 0x4a, 0x6a, 0x95, 0xbe, 0x30, 0x39, 0xd7, - 0xae, 0x6d, 0x0d, 0x2d, 0xf5, 0xcb, 0xd0, 0x73, 0x4d, 0xad, 0x32, 0xa3, 0xc6, 0x1e, 0xf1, 0xec, - 0x29, 0x45, 0xcf, 0xc2, 0x09, 0x3a, 0x0c, 0x5b, 0xfe, 0xad, 0x18, 0x0c, 0xd1, 0x35, 0x61, 0xb3, - 0x2f, 0x21, 0x91, 0x50, 0x2b, 0x0f, 0x09, 0x4b, 0x75, 0x78, 0xee, 0x30, 0x3f, 0xc9, 0xf3, 0xe1, - 0xc7, 0xa3, 0x73, 0xdc, 0x93, 0xb3, 0xb8, 0xa4, 0x50, 0x5c, 0xf4, 0x77, 0x20, 0x59, 0x53, 0x77, - 0x8a, 0x94, 0x0e, 0x0b, 0x60, 0x72, 0x9d, 0xd1, 0x79, 0xed, 0xd6, 0xf8, 0xd0, 0xae, 0x5a, 0xab, - 0x4e, 0xcb, 0x82, 0x8e, 0xac, 0xf4, 0xd6, 0xd4, 0x1d, 0xc2, 0x22, 0x32, 0x61, 0x88, 0xd4, 0x96, - 0xb6, 0x54, 0xbd, 0x82, 0x59, 0x27, 0x34, 0x13, 0x9a, 0xbf, 0xd2, 0x71, 0x27, 0x07, 0xbd, 0x4e, - 0x7c, 0xe4, 0x64, 0x65, 0xa0, 0xa6, 0xee, 0xcc, 0xd0, 0x0a, 0xd2, 0xe3, 0x74, 0xf2, 0x83, 0x1f, - 0x1d, 0xef, 0xa2, 0x67, 0x0c, 0x5f, 0x97, 0x00, 0x3c, 0x89, 0xa1, 0x12, 0xa4, 0x4b, 0x6e, 0x89, - 0xe2, 0xda, 0x7c, 0x2a, 0x27, 0x23, 0xa6, 0x24, 0x24, 0x76, 0xb6, 0x53, 0x7f, 0xe5, 0xd6, 0xb8, - 0xa4, 0x0c, 0x95, 0x42, 0x33, 0xf2, 0x56, 0xe8, 0xab, 0x9b, 0x65, 0xd5, 0xc1, 0x45, 0x1a, 0xd5, - 0xc5, 0x22, 0x77, 0xfd, 0x31, 0x42, 0xeb, 0xb5, 0x5b, 0xe3, 0x88, 0x8d, 0xce, 0x87, 0x2c, 0x53, - 0x5f, 0x00, 0x58, 0x0d, 0x41, 0xf0, 0x0d, 0xed, 0x0f, 0x25, 0xe8, 0x9b, 0xf5, 0xdd, 0xfb, 0xca, - 0x40, 0x6f, 0xcd, 0xd0, 0xb5, 0x6d, 0xae, 0x9d, 0x29, 0x45, 0x14, 0x51, 0x16, 0x92, 0xec, 0x09, - 0x9e, 0xb3, 0x2b, 0x12, 0xa3, 0xa2, 0x4c, 0xb0, 0xae, 0xe3, 0x0d, 0x5b, 0x13, 0x93, 0xa2, 0x88, - 0x22, 0xba, 0x0c, 0x69, 0x1b, 0x97, 0xea, 0x96, 0xe6, 0xec, 0x16, 0x4b, 0x86, 0xee, 0xa8, 0x25, - 0x87, 0x3d, 0xe6, 0xca, 0x1f, 0x79, 0xed, 0xd6, 0xf8, 0x21, 0xc6, 0x6b, 0x18, 0x42, 0x56, 0x86, - 0x44, 0xd5, 0x0c, 0xab, 0x21, 0x3d, 0x94, 0xb1, 0xa3, 0x6a, 0x55, 0x3b, 0xc3, 0x4e, 0xcd, 0x44, - 0xd1, 0x37, 0x96, 0x2f, 0xf6, 0xfa, 0xd3, 0x5c, 0x97, 0x21, 0x6d, 0x98, 0xd8, 0x0a, 0xb8, 0xa5, - 0x52, 0xb8, 0xe7, 0x30, 0x84, 0xac, 0x0c, 0x89, 0x2a, 0xe1, 0xb2, 0x3a, 0x64, 0xb6, 0x45, 0xd8, - 0x68, 0xd6, 0x37, 0xbc, 0xec, 0xd8, 0x68, 0xc3, 0x6c, 0xe4, 0xf4, 0xdd, 0xfc, 0xc3, 0x1e, 0xf5, - 0x30, 0x9e, 0xfc, 0xe5, 0xcf, 0x9d, 0x1e, 0xe5, 0xc6, 0xc5, 0xcb, 0x56, 0x3d, 0x89, 0x77, 0xc9, - 0xf4, 0x73, 0xd0, 0x15, 0x0a, 0x49, 0x9c, 0xd0, 0xe7, 0x54, 0xad, 0x2a, 0x1e, 0x25, 0x2b, 0xbc, - 0x84, 0x72, 0xd0, 0x63, 0x3b, 0xaa, 0x53, 0xb7, 0xf9, 0x27, 0xc0, 0xee, 0x8b, 0xd0, 0xb8, 0xbc, - 0xa1, 0x97, 0x57, 0x29, 0x82, 0xc2, 0x11, 0x89, 0x1d, 0x71, 0x8c, 0x6d, 0xac, 0x73, 0x49, 0x76, - 0xb4, 0xda, 0xe9, 0x59, 0x1e, 0xc3, 0x26, 0x82, 0x29, 0xe3, 0x2a, 0xae, 0x30, 0x5f, 0x6b, 0x4b, - 0x25, 0x21, 0x09, 0xfd, 0x20, 0x58, 0x7e, 0xbe, 0xe3, 0x25, 0xc9, 0x05, 0x16, 0xa6, 0x27, 0x2b, - 0x43, 0x6e, 0xd5, 0x2a, 0xad, 0x41, 0x4a, 0xe0, 0x9e, 0x22, 0xff, 0x6a, 0xde, 0xa9, 0x08, 0x29, - 0xf8, 0x34, 0x5c, 0xe4, 0x2e, 0xfc, 0x97, 0x1d, 0x2f, 0x43, 0xba, 0xae, 0x6f, 0x18, 0x3a, 0x7d, - 0x47, 0xc8, 0x7d, 0x7f, 0x12, 0xfb, 0xc5, 0xfd, 0xaa, 0x12, 0x86, 0x90, 0x95, 0x21, 0xb7, 0xea, - 0x0a, 0x8b, 0x10, 0xca, 0x30, 0xe8, 0x41, 0xd1, 0x65, 0x9b, 0x8a, 0x5c, 0xb6, 0x77, 0xf1, 0x65, - 0x7b, 0x20, 0xdc, 0x8b, 0xb7, 0x72, 0x07, 0xdc, 0x4a, 0x82, 0x86, 0x96, 0x01, 0x3c, 0x63, 0x41, - 0x73, 0x18, 0x7d, 0x91, 0x6a, 0xe0, 0x19, 0x1e, 0x11, 0x12, 0x7a, 0x24, 0xd0, 0x3b, 0x60, 0xa4, - 0xa6, 0xe9, 0x45, 0x1b, 0x57, 0x37, 0x8b, 0x5c, 0xdc, 0x84, 0x32, 0xfd, 0x1c, 0x4c, 0x7e, 0xa1, - 0x33, 0xed, 0x78, 0xed, 0xd6, 0x78, 0x96, 0x9b, 0xd7, 0x46, 0x92, 0xb2, 0x32, 0x5c, 0xd3, 0xf4, - 0x55, 0x5c, 0xdd, 0x9c, 0x75, 0xeb, 0xa6, 0xfb, 0x5f, 0xfc, 0xe8, 0x78, 0x17, 0x5f, 0xc3, 0x5d, - 0xf2, 0x39, 0x9a, 0x5e, 0xe7, 0x6b, 0x0f, 0xdb, 0x24, 0x6c, 0x51, 0x45, 0x81, 0x26, 0x3d, 0x52, - 0x8a, 0x57, 0xc1, 0xd6, 0xfe, 0x0b, 0xff, 0x69, 0x42, 0x92, 0x7f, 0x43, 0x82, 0x9e, 0xd9, 0xab, - 0x2b, 0xaa, 0x66, 0xa1, 0x79, 0x18, 0xf6, 0xf4, 0x28, 0xb8, 0xf2, 0x8f, 0xbe, 0x76, 0x6b, 0x3c, - 0x13, 0x56, 0x35, 0x77, 0xe9, 0x7b, 0xea, 0x2c, 0xd6, 0xfe, 0x7c, 0xab, 0xd8, 0x36, 0x40, 0xaa, - 0x01, 0x44, 0x6e, 0x8c, 0x7c, 0x43, 0xc3, 0x5c, 0x80, 0x5e, 0xc6, 0x2d, 0xfd, 0xf8, 0x85, 0x49, - 0xfe, 0xe1, 0x67, 0x07, 0xf7, 0x46, 0xa9, 0x32, 0x45, 0x73, 0x53, 0x9e, 0x04, 0x53, 0x7e, 0x7f, - 0x0c, 0x60, 0xf6, 0xea, 0xd5, 0x35, 0x4b, 0x33, 0xab, 0xd8, 0xb9, 0x9d, 0x02, 0x58, 0x83, 0x03, - 0xbe, 0x78, 0xca, 0x2a, 0x85, 0x84, 0x30, 0xf1, 0xda, 0xad, 0xf1, 0xa3, 0x61, 0x21, 0xf8, 0xc0, - 0x64, 0x65, 0xc4, 0x8b, 0xac, 0xac, 0x52, 0x53, 0xaa, 0x65, 0xdb, 0x71, 0xa9, 0xc6, 0x5b, 0x53, - 0xf5, 0x81, 0xf9, 0xa9, 0xce, 0xda, 0x4e, 0x73, 0x09, 0x3f, 0x0b, 0x7d, 0x9e, 0x48, 0x6c, 0xf4, - 0x24, 0x24, 0x1d, 0xfe, 0x3f, 0x17, 0xf4, 0x7d, 0x91, 0x82, 0x16, 0xd8, 0x5c, 0xd8, 0x2e, 0x01, - 0xf9, 0x2f, 0x25, 0x00, 0x4f, 0x83, 0x7f, 0x32, 0x15, 0x8e, 0x98, 0x79, 0x6e, 0x94, 0xe3, 0xfb, - 0x72, 0xea, 0x38, 0x76, 0x48, 0xac, 0x1f, 0x88, 0xc1, 0xc8, 0xba, 0x30, 0x47, 0x3f, 0xf1, 0x32, - 0x78, 0x1a, 0x7a, 0xb1, 0xee, 0x58, 0x1a, 0x15, 0x02, 0x99, 0xf4, 0xf3, 0x11, 0x93, 0xde, 0x64, - 0x68, 0xf4, 0x23, 0x39, 0x22, 0x59, 0xcf, 0xa9, 0x85, 0x84, 0xf2, 0xde, 0x38, 0x64, 0x5a, 0x61, - 0xa2, 0x19, 0x18, 0x2a, 0x59, 0x98, 0x56, 0x14, 0xfd, 0x19, 0xc3, 0x7c, 0xd6, 0x73, 0x45, 0x43, - 0x00, 0xb2, 0x32, 0x28, 0x6a, 0xf8, 0xce, 0x52, 0x01, 0xe2, 0x20, 0x12, 0xed, 0x23, 0x50, 0x6d, - 0x7a, 0x84, 0x32, 0xdf, 0x5a, 0x44, 0x27, 0x41, 0x02, 0x6c, 0x6f, 0x19, 0xf4, 0x6a, 0xe9, 0xe6, - 0xf2, 0x3c, 0x0c, 0x69, 0xba, 0xe6, 0x68, 0x6a, 0xb5, 0xb8, 0xa1, 0x56, 0x55, 0xbd, 0xb4, 0x1f, - 0x37, 0x9b, 0xed, 0x03, 0xbc, 0xdb, 0x10, 0x39, 0x59, 0x19, 0xe4, 0x35, 0x79, 0x56, 0x81, 0xae, - 0x40, 0xaf, 0xe8, 0x2a, 0xb1, 0x2f, 0x87, 0x44, 0xa0, 0xfb, 0x5c, 0xc1, 0xf7, 0xc4, 0x61, 0x58, - 0xc1, 0xe5, 0xbf, 0x9d, 0x8a, 0xce, 0xa6, 0x62, 0x11, 0x80, 0xad, 0x7a, 0x62, 0x6e, 0xf7, 0x31, - 0x1b, 0xc4, 0x6e, 0xa4, 0x18, 0x85, 0x59, 0xdb, 0xf1, 0xcd, 0xc7, 0x7f, 0x89, 0x41, 0xbf, 0x7f, - 0x3e, 0xfe, 0x86, 0xee, 0x51, 0x68, 0xc5, 0x33, 0x48, 0x2c, 0x7b, 0xff, 0x60, 0x84, 0x41, 0x6a, - 0x50, 0xe2, 0xbd, 0x2d, 0xd1, 0x6b, 0x31, 0xe8, 0x59, 0x51, 0x2d, 0xb5, 0x66, 0xa3, 0x27, 0x1a, - 0x9c, 0x51, 0x91, 0xbd, 0x6c, 0xf8, 0x3e, 0x34, 0x4f, 0x96, 0xb0, 0x70, 0xf4, 0x83, 0x4d, 0x5c, - 0xce, 0x7b, 0x61, 0x90, 0x44, 0xcb, 0xbe, 0x8b, 0x0e, 0x31, 0x7a, 0x7c, 0x4b, 0x22, 0x66, 0xef, - 0x94, 0x0d, 0x8d, 0x43, 0x1f, 0x01, 0xf3, 0x4c, 0x2e, 0x81, 0x81, 0x9a, 0xba, 0x53, 0x60, 0x35, - 0xe8, 0x34, 0xa0, 0x2d, 0x37, 0x19, 0x52, 0xf4, 0x24, 0x41, 0xe0, 0x86, 0xbd, 0x16, 0x01, 0x7e, - 0x0c, 0x80, 0x70, 0x51, 0x64, 0x37, 0x04, 0x59, 0xdc, 0x97, 0x22, 0x35, 0xb3, 0xf4, 0x96, 0x20, - 0xf7, 0x5b, 0x43, 0xb1, 0x38, 0x8f, 0x41, 0x16, 0x3a, 0x8e, 0x41, 0x7c, 0x7e, 0x6b, 0x88, 0x24, - 0xf3, 0x5b, 0x83, 0xc1, 0xbb, 0x4f, 0xb9, 0x5f, 0x91, 0x00, 0x79, 0x56, 0x5f, 0xc1, 0xb6, 0x49, - 0x82, 0x39, 0xe2, 0xa7, 0xfb, 0xbc, 0x69, 0xa9, 0x2d, 0x3f, 0xdd, 0x23, 0x23, 0xfc, 0x74, 0xdf, - 0x9a, 0x79, 0xd4, 0x33, 0x94, 0x31, 0x3e, 0x95, 0x4d, 0x2e, 0x6f, 0x4e, 0xce, 0x18, 0x9a, 0xc0, - 0x6e, 0xb0, 0x8c, 0x5d, 0xf2, 0x9f, 0x48, 0x70, 0xb8, 0x41, 0xa9, 0x5c, 0x9e, 0x31, 0x20, 0xcb, - 0xd7, 0xc8, 0xbf, 0x18, 0xc7, 0x78, 0xdf, 0xaf, 0xaa, 0x0e, 0x5b, 0x0d, 0x86, 0xf8, 0xf6, 0x99, - 0x7c, 0x76, 0x09, 0xf4, 0xdf, 0x48, 0x30, 0xea, 0xef, 0xde, 0x1d, 0xcf, 0x3a, 0xf4, 0xfb, 0x7b, - 0xe7, 0x23, 0xb9, 0xbf, 0x83, 0x91, 0xf0, 0x41, 0x04, 0xc8, 0xa0, 0x67, 0xbc, 0x65, 0xcc, 0x72, - 0x71, 0x17, 0x3a, 0x95, 0x8d, 0xe0, 0x30, 0xbc, 0x9c, 0x13, 0x74, 0x92, 0xfe, 0x9f, 0x04, 0x89, - 0x15, 0xc3, 0xa8, 0x22, 0x03, 0x86, 0x75, 0xc3, 0x29, 0x12, 0x9d, 0xc7, 0xe5, 0x22, 0x0f, 0xdb, - 0x99, 0x99, 0x9c, 0xe9, 0x4c, 0x64, 0xdf, 0xbd, 0x35, 0xde, 0x48, 0x4a, 0x19, 0xd2, 0x0d, 0x27, - 0x4f, 0x6b, 0xd6, 0x58, 0x50, 0xff, 0x0e, 0x18, 0x08, 0x76, 0xc6, 0x8c, 0xe8, 0xd3, 0x1d, 0x77, - 0x16, 0x24, 0xf3, 0xda, 0xad, 0xf1, 0x51, 0xb6, 0xbc, 0x02, 0xd5, 0xb2, 0xd2, 0xbf, 0xe1, 0xeb, - 0x9d, 0xdd, 0x1a, 0xfb, 0x3e, 0x99, 0xd1, 0xcf, 0x48, 0x30, 0x42, 0x2b, 0xb5, 0x1b, 0x98, 0x46, - 0xfe, 0x0a, 0x2e, 0x19, 0x56, 0x19, 0x0d, 0x42, 0x8c, 0x9f, 0xc3, 0x24, 0x94, 0x98, 0x56, 0x46, - 0xa3, 0xd0, 0x6d, 0x5c, 0xd7, 0xf9, 0x25, 0x8e, 0x94, 0xc2, 0x0a, 0xe8, 0x14, 0x0c, 0xd3, 0x5d, - 0x88, 0x75, 0xc3, 0xed, 0x07, 0xff, 0xde, 0x10, 0x6d, 0xa0, 0xa4, 0x99, 0x15, 0x21, 0xb6, 0xcd, - 0x28, 0xd7, 0xab, 0xb8, 0xa8, 0x96, 0x4a, 0xf4, 0xce, 0x31, 0xfb, 0x82, 0xc9, 0x00, 0xab, 0xcd, - 0xb1, 0x4a, 0x12, 0x88, 0xba, 0xe6, 0x4f, 0x98, 0x22, 0xb7, 0x82, 0xa9, 0xe1, 0xa9, 0xcf, 0x4b, - 0x00, 0x5e, 0xc2, 0x05, 0x3d, 0x00, 0x87, 0xf2, 0xcb, 0x4b, 0xb3, 0xc5, 0xd5, 0xb5, 0xdc, 0xda, - 0xfa, 0x6a, 0x71, 0x7d, 0x69, 0x75, 0xa5, 0x30, 0x33, 0x7f, 0x79, 0xbe, 0x30, 0xeb, 0x1d, 0x15, - 0xd8, 0x26, 0x2e, 0x69, 0x9b, 0x1a, 0x2e, 0xa3, 0xe3, 0x30, 0x1a, 0x84, 0x26, 0xa5, 0xc2, 0x6c, - 0x5a, 0xca, 0xf6, 0xbf, 0x74, 0x73, 0x22, 0xc9, 0xfc, 0x4b, 0x5c, 0x46, 0x27, 0xe1, 0x40, 0x23, - 0xdc, 0xfc, 0xd2, 0x5c, 0x3a, 0x96, 0x1d, 0x78, 0xe9, 0xe6, 0x44, 0xca, 0x75, 0x44, 0x91, 0x0c, - 0xc8, 0x0f, 0xc9, 0xe9, 0xc5, 0xb3, 0xf0, 0xd2, 0xcd, 0x89, 0x1e, 0x36, 0xeb, 0xd9, 0xc4, 0x8b, - 0x1f, 0x1f, 0xeb, 0xca, 0xbf, 0xa5, 0xe5, 0x61, 0xc0, 0x25, 0xdf, 0x84, 0x6b, 0xcf, 0x57, 0xeb, - 0xc4, 0xfc, 0x69, 0x7a, 0x69, 0x8a, 0xa9, 0xbb, 0xe6, 0xec, 0x9e, 0xe6, 0xaa, 0x7e, 0x9a, 0x89, - 0x6b, 0x6a, 0x47, 0xa4, 0xfa, 0x43, 0x87, 0x02, 0x7f, 0x7c, 0x17, 0x64, 0xc2, 0x87, 0x02, 0xce, - 0x4e, 0x7b, 0xe7, 0x01, 0x7b, 0x64, 0xfe, 0x23, 0x33, 0xfb, 0x2d, 0xce, 0x12, 0xf6, 0x9f, 0xef, - 0xdf, 0xfb, 0x68, 0x43, 0xfe, 0x8f, 0x09, 0x40, 0x8b, 0x76, 0x65, 0x86, 0x38, 0x8d, 0xbe, 0xab, - 0x6b, 0xa1, 0xb4, 0x95, 0x74, 0x3b, 0xd2, 0x56, 0x6b, 0x81, 0x44, 0x50, 0x6c, 0x5f, 0x19, 0xe8, - 0xb6, 0xb3, 0x41, 0xf1, 0x37, 0x24, 0x1b, 0xd4, 0xdc, 0x2f, 0x4c, 0xdc, 0xbe, 0x38, 0xb2, 0x7b, - 0xbf, 0xb1, 0x34, 0xcf, 0xfc, 0xf6, 0xec, 0x91, 0xf9, 0xcd, 0xb4, 0x4c, 0xef, 0x72, 0x6c, 0x74, - 0x56, 0x3c, 0x5c, 0xea, 0x6d, 0x6f, 0xff, 0xe6, 0x2f, 0x9b, 0x92, 0x2f, 0x8a, 0xdd, 0xfb, 0x28, - 0x64, 0x1b, 0x95, 0x4b, 0xec, 0x25, 0xf2, 0xcb, 0x71, 0x48, 0x2f, 0xda, 0x95, 0x42, 0x59, 0x73, - 0xee, 0xac, 0xe6, 0x5d, 0x6a, 0x1d, 0xa2, 0xa3, 0xd7, 0x6e, 0x8d, 0x0f, 0x32, 0xd1, 0xee, 0x21, - 0xd0, 0x1a, 0x0c, 0x85, 0xdd, 0x36, 0xa6, 0x60, 0xb3, 0xfb, 0x39, 0xc9, 0x69, 0x70, 0xd7, 0x06, - 0x83, 0xa7, 0x29, 0x68, 0xa7, 0xb9, 0x4e, 0x33, 0xbd, 0xba, 0x72, 0x27, 0xb3, 0x9b, 0xde, 0xd4, - 0x65, 0x21, 0x13, 0x9e, 0x1b, 0x77, 0xe2, 0xfe, 0x5c, 0x82, 0xbe, 0x45, 0x5b, 0xa4, 0x0e, 0xf0, - 0x4f, 0x68, 0x36, 0xe5, 0xbc, 0xfb, 0x2a, 0x27, 0xde, 0x9e, 0xfa, 0x8a, 0x97, 0x3a, 0x9e, 0x10, - 0x0e, 0xc0, 0x88, 0x6f, 0x9c, 0xee, 0xf8, 0xff, 0x28, 0x46, 0x8d, 0x66, 0x1e, 0x57, 0x34, 0xdd, - 0x75, 0x95, 0xf0, 0xdf, 0xd4, 0x20, 0xd1, 0x93, 0x73, 0x62, 0xbf, 0x72, 0xde, 0xa6, 0x76, 0x22, - 0x24, 0x4f, 0xd7, 0x2b, 0x5e, 0x6c, 0x4c, 0x61, 0x48, 0x1d, 0xdc, 0x2a, 0x0a, 0x25, 0x2a, 0xe4, - 0xef, 0x48, 0x30, 0xb0, 0x68, 0x57, 0xd6, 0xf5, 0xf2, 0x5f, 0x7b, 0xfd, 0xdd, 0x84, 0x03, 0x81, - 0x91, 0xde, 0x29, 0x91, 0xfe, 0x7e, 0x0c, 0x86, 0x17, 0xed, 0x4a, 0xc0, 0x03, 0xb6, 0xff, 0x9a, - 0x89, 0x95, 0xac, 0x1e, 0x87, 0x0f, 0xb0, 0xcc, 0x0e, 0xfc, 0x8a, 0xcc, 0x97, 0x4f, 0x84, 0x57, - 0x4f, 0x53, 0x30, 0x59, 0x19, 0x71, 0xeb, 0xa9, 0x80, 0x96, 0x49, 0xad, 0x6f, 0xb2, 0xd6, 0xe0, - 0x70, 0x83, 0x0c, 0xdd, 0x09, 0xf3, 0xb8, 0x96, 0x3a, 0xe2, 0x5a, 0xfe, 0x94, 0x44, 0x0d, 0x39, - 0x59, 0x56, 0xb8, 0xc6, 0xe2, 0x96, 0x4d, 0xf7, 0x74, 0xf2, 0x36, 0xce, 0xd0, 0xf9, 0xc0, 0x1b, - 0xc8, 0x7d, 0x69, 0xab, 0x0c, 0x13, 0xad, 0x38, 0x75, 0x4d, 0xef, 0x07, 0x25, 0x18, 0x23, 0x52, - 0xb2, 0x54, 0xdd, 0xde, 0xc4, 0x56, 0xb3, 0x98, 0xeb, 0x3c, 0x64, 0x84, 0xa0, 0xb9, 0xfc, 0x2d, - 0xda, 0x50, 0x74, 0x23, 0x31, 0x77, 0x1e, 0x7d, 0x68, 0xec, 0xaa, 0xba, 0x4d, 0xaf, 0xb6, 0xf0, - 0xe8, 0x8c, 0x97, 0xe8, 0x37, 0x6e, 0xf1, 0x75, 0x3e, 0xd9, 0xfc, 0x03, 0x01, 0x3a, 0xbe, 0x1e, - 0x9e, 0xbf, 0x93, 0x70, 0x7c, 0x6f, 0xce, 0xc4, 0x20, 0xce, 0xbc, 0x37, 0x09, 0xf1, 0x45, 0xbb, - 0x82, 0x7e, 0x0a, 0x86, 0xc2, 0x8e, 0xf7, 0x43, 0x11, 0x9e, 0x4e, 0xa3, 0x3b, 0x95, 0x7d, 0xb4, - 0x63, 0x14, 0x57, 0xab, 0x76, 0x61, 0x20, 0xe8, 0x7d, 0x4d, 0x45, 0xd3, 0x0a, 0x20, 0x64, 0xcf, - 0x77, 0x88, 0xe0, 0x76, 0xfd, 0x1c, 0x24, 0x5d, 0xff, 0xe1, 0x54, 0x34, 0x11, 0x01, 0x9b, 0x3d, - 0xd3, 0x3e, 0xac, 0xdb, 0xd7, 0x4f, 0xc1, 0x50, 0x78, 0xaf, 0x6e, 0x43, 0xce, 0x21, 0x94, 0x76, - 0xe4, 0xdc, 0x6a, 0x07, 0x33, 0x01, 0x7c, 0xdb, 0xcd, 0x03, 0xd1, 0x84, 0x3c, 0xe8, 0xec, 0x23, - 0x9d, 0x40, 0xbb, 0x3d, 0xbe, 0x03, 0x06, 0x43, 0xd6, 0xf8, 0xc1, 0x68, 0x3a, 0x41, 0x8c, 0xec, - 0x85, 0x4e, 0x31, 0xdc, 0xde, 0x5f, 0x94, 0x58, 0xfe, 0x5c, 0xac, 0x63, 0xd4, 0x86, 0x9a, 0x34, - 0x5d, 0xf7, 0xd9, 0x4b, 0xfb, 0x44, 0x74, 0x59, 0xf9, 0xb8, 0x04, 0x47, 0xf6, 0xb2, 0x16, 0x8f, - 0xb5, 0x31, 0xc8, 0xd6, 0xe8, 0xd9, 0xc2, 0xeb, 0x42, 0x77, 0xd3, 0x6a, 0x6f, 0x40, 0x46, 0xe3, - 0x1b, 0x31, 0x38, 0xe5, 0xcf, 0x15, 0x3c, 0x5f, 0xc7, 0xd6, 0xae, 0x9b, 0x15, 0x30, 0xd5, 0x8a, - 0xa6, 0xfb, 0x5f, 0x78, 0x1f, 0xf6, 0x9b, 0x6f, 0x0a, 0x2b, 0xc6, 0x24, 0xbf, 0x28, 0x41, 0xdf, - 0x8a, 0x5a, 0xc1, 0x0a, 0x7e, 0xbe, 0x8e, 0x6d, 0xa7, 0xc9, 0x13, 0xe3, 0x83, 0xd0, 0x63, 0x6c, - 0x6e, 0x8a, 0x0b, 0xcd, 0x09, 0x85, 0x97, 0xd0, 0x28, 0x74, 0x57, 0xb5, 0x9a, 0xc6, 0xb6, 0xde, - 0x84, 0xc2, 0x0a, 0x68, 0x1c, 0xfa, 0x68, 0xd2, 0xaa, 0xc8, 0x1e, 0x67, 0x25, 0xc4, 0xe7, 0xff, - 0xea, 0xba, 0xb3, 0x46, 0x5f, 0x68, 0x65, 0xa0, 0xd7, 0xc2, 0xd7, 0xb0, 0x65, 0xb3, 0x4f, 0xa0, - 0x27, 0x15, 0x51, 0x94, 0x2f, 0x41, 0x3f, 0xe3, 0x84, 0xcf, 0xf6, 0x61, 0x48, 0xd2, 0x67, 0x36, - 0x1e, 0x3f, 0xbd, 0xa4, 0xfc, 0x24, 0x7b, 0xa8, 0xcc, 0xe8, 0x33, 0x96, 0x58, 0x21, 0x9f, 0x6f, - 0x29, 0xf8, 0x93, 0xd1, 0x31, 0x16, 0x93, 0xa1, 0x2b, 0xe1, 0x3f, 0xe8, 0x86, 0x03, 0x3c, 0xbf, - 0xa3, 0x9a, 0xda, 0xd4, 0x96, 0xe3, 0x88, 0x8f, 0x69, 0x00, 0x77, 0xaa, 0x54, 0x53, 0x93, 0x77, - 0x21, 0x71, 0xc5, 0x71, 0x4c, 0x74, 0x0a, 0xba, 0xad, 0x7a, 0x15, 0x8b, 0xf3, 0x7d, 0x37, 0x46, - 0x57, 0x4d, 0x6d, 0x92, 0x00, 0x28, 0xf5, 0x2a, 0x56, 0x18, 0x08, 0x2a, 0xc0, 0xf8, 0x66, 0xbd, - 0x5a, 0xdd, 0x2d, 0x96, 0x31, 0xfd, 0xad, 0x56, 0xf7, 0x67, 0xd1, 0xf0, 0x8e, 0xa9, 0xea, 0x6e, - 0x3e, 0x25, 0xa9, 0x1c, 0xa5, 0x60, 0xb3, 0x14, 0x4a, 0xfc, 0x24, 0x5a, 0x41, 0xc0, 0xc8, 0x7f, - 0x1a, 0x83, 0xa4, 0x20, 0x4d, 0x5f, 0x0e, 0xe3, 0x2a, 0x2e, 0x39, 0x86, 0xb8, 0x3b, 0xe7, 0x96, - 0x11, 0x82, 0x78, 0x85, 0x4f, 0x5e, 0xea, 0x4a, 0x97, 0x42, 0x0a, 0xa4, 0xce, 0x7d, 0xcf, 0x4d, - 0xea, 0xcc, 0x3a, 0x99, 0xcf, 0x84, 0x69, 0x88, 0xa3, 0xb7, 0x2b, 0x5d, 0x0a, 0x2d, 0xa1, 0x0c, - 0xf4, 0x10, 0x7b, 0xe4, 0xb0, 0xd9, 0x22, 0xf5, 0xbc, 0x8c, 0x0e, 0x42, 0xb7, 0xa9, 0x3a, 0x25, - 0xf6, 0xd4, 0x8a, 0x34, 0xb0, 0x22, 0x71, 0x1e, 0xd8, 0x87, 0x82, 0xc2, 0x3f, 0x84, 0x48, 0x84, - 0xc1, 0xbe, 0xc8, 0x4c, 0xf8, 0x5e, 0x51, 0x1d, 0x07, 0x5b, 0x3a, 0x21, 0xc8, 0xc0, 0x11, 0x82, - 0xc4, 0x86, 0x51, 0xde, 0xe5, 0x3f, 0xce, 0x48, 0xff, 0xe7, 0x3f, 0x1b, 0x47, 0xf5, 0xa1, 0x48, - 0x1b, 0xd9, 0x6f, 0xd2, 0xf6, 0x8b, 0xca, 0x3c, 0x01, 0x2a, 0xc0, 0x88, 0x5a, 0x2e, 0x6b, 0x44, - 0xe1, 0xd5, 0x6a, 0x71, 0x43, 0xa3, 0x29, 0x48, 0x9b, 0xfe, 0xe2, 0x70, 0xab, 0xb9, 0x40, 0x1e, - 0x42, 0x9e, 0xc3, 0xe7, 0x53, 0xd0, 0x6b, 0x32, 0xa6, 0xe4, 0x8b, 0x30, 0xdc, 0xc0, 0x29, 0xe1, - 0x6f, 0x5b, 0xd3, 0xcb, 0xe2, 0x91, 0x3b, 0xf9, 0x9f, 0xd4, 0xd1, 0xaf, 0xaa, 0x33, 0x27, 0x83, - 0xfe, 0x9f, 0x7f, 0x57, 0xeb, 0x4f, 0x20, 0x0c, 0xfa, 0x3e, 0x81, 0xa0, 0x9a, 0x5a, 0x3e, 0x45, - 0xe9, 0xf3, 0x2f, 0x1f, 0xe4, 0x78, 0x03, 0xfb, 0xea, 0xc1, 0xa4, 0x61, 0x55, 0xa6, 0x2a, 0x58, - 0x17, 0xf9, 0x43, 0xd2, 0xa4, 0x9a, 0x9a, 0x4d, 0xd5, 0xd1, 0xfb, 0xca, 0xbb, 0x7d, 0xd1, 0xf7, - 0x3f, 0xfd, 0x20, 0x42, 0x62, 0x2e, 0xb7, 0x32, 0xef, 0xea, 0xf1, 0x17, 0x63, 0x70, 0xd4, 0xa7, - 0xc7, 0x3e, 0xe0, 0x46, 0x75, 0xce, 0x36, 0xd7, 0xf8, 0x36, 0xbe, 0x91, 0xf2, 0x24, 0x24, 0x08, - 0x3c, 0x8a, 0xf8, 0x51, 0xb7, 0xcc, 0xa7, 0xbf, 0xfc, 0x2f, 0xe5, 0x60, 0x16, 0x2b, 0x30, 0x2b, - 0x94, 0x48, 0xfe, 0xe7, 0xda, 0x97, 0x5f, 0xda, 0xfb, 0xc0, 0xbd, 0x7d, 0xfb, 0xc4, 0x18, 0x96, - 0xe1, 0xff, 0x99, 0x83, 0x23, 0xe1, 0xcc, 0x2b, 0xb3, 0xa2, 0x6d, 0xa5, 0x90, 0x3b, 0xb0, 0xd4, - 0xad, 0xde, 0x85, 0xef, 0x35, 0x83, 0x11, 0x59, 0xe1, 0xa8, 0xa4, 0xb2, 0xbc, 0x03, 0x07, 0x9f, - 0x22, 0x4c, 0x79, 0x87, 0xa9, 0x62, 0x2f, 0x38, 0xe8, 0x5e, 0xf8, 0x94, 0xb8, 0x0f, 0x2d, 0x6e, - 0x71, 0x82, 0xc7, 0x38, 0x0f, 0x11, 0x8e, 0x4f, 0xb6, 0xdc, 0x63, 0x26, 0x7d, 0xfb, 0x8b, 0xe2, - 0xc3, 0x94, 0x3f, 0x23, 0xc1, 0xa1, 0x86, 0xae, 0xb9, 0xf1, 0x5f, 0x6a, 0xf2, 0xb6, 0xbd, 0xd3, - 0x5b, 0xe7, 0xfe, 0xe7, 0xee, 0x73, 0x4d, 0x78, 0x3e, 0x11, 0xc9, 0x33, 0x63, 0x26, 0xc0, 0xf4, - 0xe3, 0x70, 0x20, 0xc8, 0xb3, 0x90, 0xd6, 0xbd, 0x30, 0x18, 0x8c, 0x59, 0xb9, 0xd4, 0x06, 0x02, - 0x51, 0xab, 0xbc, 0x19, 0x16, 0xb7, 0x3b, 0xe4, 0x05, 0xff, 0x31, 0x0f, 0x8b, 0x0c, 0x3b, 0x1d, - 0xb1, 0x47, 0x40, 0x7e, 0xbf, 0x04, 0x13, 0xc1, 0x8e, 0xbc, 0xd4, 0xa0, 0xdd, 0x19, 0xcf, 0xb7, - 0x6d, 0xc2, 0xbf, 0x2f, 0xc1, 0x5d, 0x7b, 0xf0, 0xc4, 0xe5, 0xf0, 0xd3, 0x12, 0x8c, 0xfa, 0xce, - 0x81, 0x85, 0xa9, 0x17, 0x5a, 0xf0, 0x50, 0xdb, 0xe7, 0xd8, 0xae, 0x47, 0x76, 0x84, 0x08, 0xe7, - 0x95, 0x6f, 0x8c, 0x8f, 0x34, 0xb6, 0xd9, 0xca, 0x48, 0xe3, 0xd9, 0xed, 0x6d, 0x54, 0x97, 0x97, - 0x25, 0xb8, 0x2f, 0x38, 0xe4, 0x26, 0xb7, 0xb5, 0x7e, 0x5c, 0xf3, 0xf1, 0x4d, 0x09, 0x4e, 0xb5, - 0xc3, 0x1c, 0x9f, 0x18, 0x0d, 0x46, 0xbc, 0x6b, 0x1d, 0xe1, 0x69, 0x39, 0xd3, 0xf9, 0xf5, 0x36, - 0xae, 0xb4, 0xc8, 0x25, 0x7a, 0x07, 0xe4, 0x6f, 0xf2, 0xe5, 0xe6, 0x9f, 0x79, 0x57, 0xd6, 0xc1, - 0x64, 0x88, 0x90, 0x75, 0x20, 0x1d, 0xd2, 0x64, 0x4a, 0x62, 0x4d, 0xa6, 0xc4, 0x97, 0x3a, 0x78, - 0x27, 0x37, 0x6a, 0x4d, 0xae, 0x65, 0x6c, 0xc0, 0x48, 0x13, 0xc5, 0xe6, 0x6b, 0xbd, 0x73, 0xbd, - 0x56, 0x50, 0xa3, 0xea, 0xca, 0xbb, 0x30, 0x4e, 0xbb, 0x6f, 0x22, 0xef, 0x3b, 0x3d, 0x72, 0x87, - 0x5b, 0x9c, 0xa6, 0x5d, 0x73, 0x11, 0xac, 0x40, 0x0f, 0x9b, 0x6e, 0x3e, 0xea, 0xfd, 0xab, 0x0d, - 0xa7, 0x23, 0x7f, 0x48, 0x18, 0xba, 0x59, 0xc1, 0x7d, 0xf3, 0x85, 0xd5, 0xce, 0x90, 0x6f, 0xd3, - 0xc2, 0xf2, 0xc9, 0xe4, 0xeb, 0xc2, 0xe4, 0x35, 0xe7, 0xce, 0x4d, 0xa0, 0xdc, 0x66, 0x8b, 0xc7, - 0x44, 0x74, 0x67, 0x4d, 0xdb, 0x27, 0x84, 0x69, 0x73, 0x87, 0x16, 0x61, 0xda, 0x7e, 0x3c, 0x33, - 0xe0, 0x1a, 0xb9, 0x08, 0x36, 0xff, 0x0a, 0x1b, 0xb9, 0xef, 0x4b, 0x70, 0x98, 0x0e, 0xd1, 0x7f, - 0xd7, 0xa7, 0x53, 0xc9, 0x3f, 0x00, 0xc8, 0xb6, 0x4a, 0xc5, 0xa6, 0x4b, 0x3e, 0x6d, 0x5b, 0xa5, - 0xab, 0x81, 0x2d, 0xe8, 0x01, 0x40, 0x65, 0xdb, 0x09, 0x43, 0xb3, 0x84, 0x6a, 0xba, 0x6c, 0x3b, - 0x57, 0xf7, 0xd8, 0xb0, 0x12, 0xb7, 0x61, 0x56, 0xbf, 0x26, 0x41, 0xb6, 0xd9, 0x90, 0xdd, 0x24, - 0xdd, 0xc1, 0xc0, 0x65, 0xb2, 0xf0, 0x44, 0x3e, 0xdc, 0xc1, 0xa5, 0xa9, 0xd0, 0xa2, 0x3a, 0x60, - 0xe1, 0x3b, 0xed, 0x31, 0x8c, 0x07, 0xf5, 0xb5, 0xd1, 0x33, 0xff, 0xb1, 0x2d, 0xa6, 0xdf, 0x6b, - 0x30, 0xb6, 0x7f, 0x95, 0x7c, 0xf7, 0x1d, 0x18, 0x6b, 0xc1, 0xfc, 0x9d, 0xde, 0x1a, 0x8d, 0x96, - 0x73, 0x7a, 0x87, 0xdc, 0xff, 0x47, 0xf8, 0xf2, 0x08, 0x3e, 0x00, 0xf6, 0x45, 0x76, 0xcd, 0xbe, - 0x20, 0x22, 0xff, 0x5d, 0x38, 0xd2, 0x14, 0x8b, 0xb3, 0x98, 0x83, 0xc4, 0x96, 0x66, 0x8b, 0x63, - 0xab, 0xd3, 0x11, 0xdc, 0x85, 0x88, 0x50, 0x54, 0x19, 0x41, 0x9a, 0xf6, 0xb0, 0x62, 0x18, 0x55, - 0xce, 0x8d, 0xac, 0xc0, 0xb0, 0xaf, 0x8e, 0xf7, 0xf5, 0x18, 0x24, 0x4c, 0x83, 0x7f, 0x24, 0xaf, - 0xef, 0xcc, 0xdd, 0x11, 0x7d, 0x11, 0x54, 0x2e, 0x04, 0x8a, 0x26, 0x8f, 0x02, 0x62, 0x34, 0xe9, - 0x8d, 0x64, 0xd1, 0xd3, 0xb3, 0x30, 0x12, 0xa8, 0xe5, 0x7d, 0xcd, 0x40, 0x8f, 0x49, 0x6b, 0x78, - 0x6f, 0x51, 0x0f, 0xa1, 0x18, 0xba, 0xfb, 0x11, 0x32, 0x5a, 0x92, 0xcf, 0xc2, 0xdd, 0x94, 0x76, - 0x93, 0xd4, 0x70, 0x7e, 0x77, 0xbe, 0x2c, 0x44, 0x1f, 0xba, 0x45, 0x28, 0xef, 0xc0, 0x3d, 0x7b, - 0xa3, 0x79, 0x8e, 0x13, 0x3b, 0xfa, 0x6a, 0xd3, 0x71, 0x6a, 0x46, 0x8f, 0x33, 0xcc, 0xe8, 0xc8, - 0x8f, 0xc3, 0xf1, 0xd6, 0x3d, 0xd3, 0x0b, 0x8a, 0x82, 0xe7, 0xa6, 0x5f, 0x4a, 0x95, 0xdf, 0x0e, - 0x27, 0x22, 0xf1, 0xef, 0x18, 0xf3, 0x8f, 0xc1, 0xbd, 0xad, 0x3a, 0xb7, 0x97, 0xaf, 0xeb, 0xb8, - 0xec, 0xe3, 0x9d, 0x1d, 0xf6, 0x49, 0xbe, 0x5b, 0x9a, 0xf2, 0x3b, 0x5a, 0x8f, 0x5d, 0xa0, 0x73, - 0xd6, 0x15, 0xe8, 0x65, 0x5d, 0xb6, 0xeb, 0x03, 0xb4, 0xe6, 0x5d, 0x10, 0x92, 0xef, 0xe5, 0xaa, - 0x92, 0xab, 0x56, 0x9b, 0x31, 0x20, 0xb4, 0xf5, 0x06, 0x57, 0x8d, 0x96, 0x60, 0x77, 0x90, 0xc5, - 0x13, 0x5c, 0xbe, 0x0b, 0xaa, 0xed, 0xac, 0x35, 0x3b, 0x61, 0x15, 0x4c, 0x5e, 0xe0, 0x92, 0xdc, - 0x03, 0x90, 0xb3, 0x19, 0xd6, 0xfc, 0x13, 0xee, 0x14, 0x3a, 0x6a, 0x70, 0x80, 0xe5, 0x9c, 0x6d, - 0x63, 0xc7, 0x95, 0x43, 0xd1, 0x9d, 0xac, 0x96, 0x80, 0xbc, 0x0b, 0xf7, 0x92, 0x9b, 0xd4, 0xc9, - 0x25, 0xb7, 0x33, 0x9f, 0x1d, 0x87, 0x6e, 0xda, 0x03, 0xfa, 0xa4, 0x04, 0xe0, 0x7b, 0x55, 0x70, - 0x36, 0x42, 0x90, 0xcd, 0x13, 0x67, 0xd9, 0x73, 0x9d, 0xa2, 0xf1, 0xd8, 0xed, 0xd4, 0xbb, 0xfe, - 0xed, 0xb7, 0x7f, 0x29, 0x76, 0x0f, 0x92, 0xc5, 0x21, 0x45, 0x38, 0xb3, 0xe7, 0xdb, 0x14, 0x7f, - 0x27, 0xf0, 0x61, 0xc5, 0x47, 0x3a, 0xea, 0x51, 0xf0, 0x79, 0xb6, 0x43, 0x2c, 0xce, 0xe6, 0x45, - 0xca, 0xe6, 0x59, 0xf4, 0x70, 0x34, 0x9b, 0x53, 0x6f, 0x0f, 0xee, 0x93, 0xef, 0x44, 0xaf, 0x4a, - 0x30, 0xda, 0x2c, 0xfd, 0x83, 0x2e, 0x75, 0xc4, 0x4c, 0x63, 0x84, 0x91, 0x7d, 0xf3, 0xfe, 0x09, - 0xf0, 0x81, 0xcd, 0xd1, 0x81, 0xe5, 0xd0, 0xa5, 0x7d, 0x0c, 0x6c, 0xca, 0xe7, 0x86, 0xa2, 0x9f, - 0x8f, 0xc1, 0xb1, 0x3d, 0x73, 0x2a, 0xe8, 0x4a, 0x47, 0xcc, 0xee, 0x11, 0x58, 0x65, 0xe7, 0x6f, - 0x03, 0x25, 0x3e, 0xfe, 0xa7, 0xe8, 0xf8, 0x9f, 0x44, 0xf3, 0xfb, 0x19, 0xbf, 0x17, 0x35, 0xf9, - 0x25, 0xf1, 0xef, 0x82, 0xef, 0x55, 0xdb, 0xd2, 0xb8, 0x86, 0x8c, 0x45, 0x7b, 0x0b, 0xaa, 0x31, - 0x0c, 0x96, 0x9f, 0xa1, 0x03, 0x52, 0xd0, 0xca, 0xeb, 0x9c, 0xd0, 0xa9, 0xb7, 0x07, 0xbd, 0xc2, - 0x77, 0xa2, 0x9f, 0x6d, 0xf1, 0x18, 0xf5, 0xf1, 0x76, 0x38, 0x6d, 0x9d, 0x9b, 0xc9, 0x5e, 0xda, - 0x37, 0x3e, 0x1f, 0x72, 0x8d, 0x0e, 0xb9, 0x82, 0xf0, 0xed, 0x1e, 0x72, 0xd3, 0x09, 0x46, 0x5f, - 0x93, 0x60, 0xb4, 0x59, 0x6a, 0xa3, 0xbd, 0xe5, 0xbc, 0x47, 0xca, 0xa6, 0xbd, 0xe5, 0xbc, 0x57, - 0x56, 0x45, 0x7e, 0x13, 0x15, 0xc5, 0x39, 0xf4, 0x48, 0x2b, 0x51, 0xec, 0x39, 0xc3, 0x64, 0x0d, - 0xef, 0x99, 0x32, 0x68, 0x6f, 0x0d, 0xb7, 0x93, 0x1c, 0x69, 0x6f, 0x0d, 0xb7, 0x95, 0xbf, 0x88, - 0x5e, 0xc3, 0xee, 0x38, 0xdb, 0x9c, 0x62, 0x1b, 0xfd, 0xb1, 0x04, 0x03, 0x81, 0x30, 0x1b, 0x5d, - 0x68, 0x87, 0xdf, 0x66, 0xc9, 0x88, 0xc8, 0x8b, 0x37, 0xad, 0x63, 0x7a, 0x79, 0x9e, 0x8e, 0x6c, - 0x06, 0xe5, 0xf6, 0x33, 0x32, 0x2b, 0xc0, 0xff, 0x2d, 0x09, 0x46, 0x9a, 0x44, 0xb0, 0xed, 0xad, - 0xde, 0xd6, 0x71, 0x79, 0xf6, 0xd2, 0xbe, 0xf1, 0xf9, 0x18, 0x2f, 0xd3, 0x31, 0xbe, 0x19, 0x3d, - 0xbe, 0x9f, 0x31, 0xfa, 0xbc, 0x83, 0xef, 0x79, 0xef, 0x02, 0x7d, 0xfd, 0x44, 0x5e, 0x90, 0xd9, - 0x3b, 0x3a, 0xce, 0x3e, 0xbe, 0x5f, 0x74, 0x3e, 0xba, 0xa7, 0xe9, 0xe8, 0x9e, 0x42, 0xcb, 0xaf, - 0x6f, 0x74, 0x8d, 0x4e, 0xc5, 0x17, 0x1b, 0x3f, 0x75, 0xd5, 0x96, 0xa2, 0x35, 0x8d, 0x8e, 0xb3, - 0xd3, 0xfb, 0x41, 0xe5, 0x43, 0xbc, 0x40, 0x87, 0x78, 0x06, 0x3d, 0xd8, 0x6a, 0x88, 0xbe, 0x47, - 0xa8, 0x9a, 0xbe, 0x69, 0x4c, 0xbd, 0x9d, 0x85, 0xde, 0xef, 0x44, 0xef, 0x15, 0x0f, 0xef, 0xa6, - 0xda, 0xe9, 0xde, 0x17, 0x3f, 0x67, 0x1f, 0x6c, 0x1f, 0x81, 0x73, 0x79, 0x0f, 0xe5, 0x72, 0x0c, - 0x1d, 0x6d, 0xc5, 0x25, 0x89, 0xa1, 0xd1, 0xaf, 0x4a, 0xee, 0x8b, 0xde, 0x87, 0xda, 0xea, 0xc2, - 0x1f, 0x6b, 0x47, 0x5e, 0xee, 0x6b, 0x12, 0x88, 0xcb, 0xc7, 0x29, 0x5f, 0x13, 0x68, 0xac, 0x25, - 0x5f, 0x8c, 0x9d, 0x4f, 0x48, 0x70, 0xa8, 0x45, 0xc0, 0x8c, 0xf2, 0xed, 0xf4, 0xbb, 0x77, 0x90, - 0x9e, 0x9d, 0x79, 0x5d, 0x34, 0xf8, 0x60, 0xba, 0xd0, 0x6f, 0x4a, 0x90, 0x6d, 0x1d, 0x1d, 0xa3, - 0xc2, 0xbe, 0x7b, 0xf1, 0x47, 0xe7, 0xd9, 0xcb, 0xaf, 0x97, 0x8c, 0xcb, 0xef, 0x2b, 0x12, 0x1c, - 0x6e, 0x19, 0x11, 0xa3, 0xd9, 0x7d, 0xf6, 0x13, 0x88, 0xc7, 0xb3, 0x85, 0xd7, 0x49, 0xc5, 0x65, - 0x96, 0xe8, 0x40, 0x8b, 0xc8, 0xb8, 0x3d, 0x1d, 0xd8, 0x3b, 0xfa, 0x6e, 0x4f, 0x07, 0x22, 0x42, - 0x73, 0x2e, 0xd3, 0x96, 0xb1, 0x71, 0x7b, 0x32, 0x8d, 0x8a, 0xc1, 0xdb, 0x93, 0x69, 0x64, 0x80, - 0xee, 0x2a, 0x40, 0x8b, 0x28, 0xbb, 0x5d, 0x05, 0xd8, 0x3b, 0x9a, 0x6f, 0x57, 0x01, 0x22, 0x42, - 0x7d, 0xf9, 0x0d, 0x79, 0x39, 0xfa, 0xc3, 0x9e, 0xc6, 0x9b, 0x3f, 0x6a, 0xdd, 0xd9, 0xba, 0xf1, - 0xba, 0x3e, 0x26, 0xb9, 0xef, 0x07, 0xa0, 0xf2, 0x9f, 0xc5, 0x01, 0xad, 0x3a, 0xea, 0x36, 0xce, - 0xd5, 0x9d, 0x2d, 0xc3, 0xd2, 0x6e, 0x30, 0x27, 0x1c, 0x03, 0xd4, 0xd4, 0x1d, 0xff, 0x1b, 0xed, - 0x3d, 0x73, 0x1f, 0xf7, 0xbf, 0xf2, 0x8d, 0xf1, 0x13, 0x6d, 0xbc, 0x3a, 0x23, 0xc0, 0x4a, 0xaa, - 0xa6, 0xee, 0xf0, 0x8b, 0xbf, 0x6f, 0x03, 0x50, 0xab, 0x55, 0xe3, 0x7a, 0xb1, 0xaa, 0xd9, 0xe2, - 0x69, 0xc0, 0x9b, 0x22, 0x66, 0xb3, 0x91, 0xdb, 0x49, 0xdf, 0xb7, 0xd1, 0xbb, 0x94, 0x14, 0xa5, - 0xb8, 0xa0, 0xd9, 0x0e, 0x7a, 0x2b, 0xa4, 0xca, 0x58, 0xdf, 0x65, 0xd4, 0xe3, 0xb7, 0x85, 0x7a, - 0x92, 0x10, 0xa4, 0xc4, 0x8b, 0x80, 0x54, 0x3f, 0x1c, 0xfd, 0x25, 0x2f, 0xfe, 0x21, 0xbb, 0xa8, - 0xfd, 0x33, 0xd0, 0x01, 0xfd, 0x5a, 0xf3, 0xb0, 0x1a, 0xae, 0xca, 0x1e, 0x0f, 0x24, 0x8e, 0x02, - 0x3f, 0x74, 0x11, 0x3f, 0x99, 0x72, 0x7f, 0xe8, 0x62, 0x7a, 0xf8, 0x4f, 0x3e, 0x77, 0x7a, 0x20, - 0x40, 0x31, 0xdf, 0xef, 0x3f, 0x2f, 0x39, 0xf5, 0x11, 0x09, 0x86, 0x1b, 0x7a, 0x44, 0x32, 0x8c, - 0xe5, 0xd6, 0xd7, 0xae, 0x2c, 0x2b, 0xf3, 0xcf, 0xe6, 0xd6, 0xe6, 0x97, 0x97, 0xc4, 0xe7, 0x5f, - 0x7d, 0xef, 0xba, 0xd1, 0x38, 0x1c, 0x69, 0x02, 0x33, 0x5b, 0x58, 0x28, 0xcc, 0xe5, 0xd6, 0x0a, - 0x69, 0x09, 0xdd, 0x05, 0xc7, 0x9a, 0x12, 0x71, 0x41, 0x62, 0x2d, 0x40, 0x94, 0x82, 0x0b, 0x12, - 0x7f, 0x23, 0xd6, 0xdd, 0x7f, 0x48, 0x35, 0x7e, 0xc6, 0xb5, 0x82, 0x75, 0x6c, 0x6b, 0xf6, 0xeb, - 0x59, 0x79, 0x11, 0xef, 0xa7, 0x3f, 0xdd, 0x0b, 0xfd, 0x73, 0xac, 0x97, 0x55, 0x47, 0x75, 0x6e, - 0xcf, 0xb9, 0x00, 0xb2, 0xf9, 0xaf, 0x13, 0xb0, 0x1f, 0x4d, 0xf1, 0x7e, 0x06, 0xa4, 0xbf, 0xa3, - 0x6f, 0x15, 0xb2, 0x17, 0xa0, 0xfc, 0x7b, 0x80, 0x61, 0x7a, 0x32, 0xfb, 0xa1, 0x03, 0x6a, 0x34, - 0xd9, 0xcf, 0x9d, 0xfc, 0xa2, 0x04, 0x07, 0x28, 0x94, 0xe7, 0x29, 0x53, 0x48, 0xf1, 0x31, 0xaa, - 0x28, 0x7f, 0x8e, 0x6c, 0x16, 0xae, 0x3a, 0xb3, 0xdf, 0x29, 0xb9, 0x87, 0x7f, 0x47, 0xe8, 0xa8, - 0x8f, 0x87, 0x30, 0x75, 0x59, 0x19, 0xa9, 0x36, 0x60, 0xda, 0xa1, 0x03, 0xc1, 0xc4, 0xeb, 0x3e, - 0x10, 0x7c, 0x0a, 0xfa, 0x7c, 0xd1, 0x5c, 0xa6, 0xbb, 0xbd, 0x8f, 0xaa, 0x85, 0x8f, 0xe4, 0xfd, - 0x34, 0xd0, 0x7b, 0x24, 0x38, 0xd0, 0x34, 0xfa, 0xcd, 0xf4, 0xec, 0xfb, 0xe4, 0x3f, 0x24, 0xb1, - 0xa6, 0xe4, 0x65, 0x65, 0xb4, 0xde, 0x2c, 0xb7, 0xf0, 0x34, 0x0c, 0x04, 0x42, 0xd6, 0x4c, 0x2f, - 0x65, 0x63, 0x1f, 0x9f, 0x0f, 0x09, 0xd2, 0x41, 0x59, 0x48, 0xe2, 0x1d, 0xd3, 0xb0, 0x1c, 0x5c, - 0xa6, 0x17, 0xb4, 0x93, 0x8a, 0x5b, 0x46, 0x3a, 0x1c, 0x6c, 0xfa, 0xda, 0xca, 0xce, 0xa4, 0x5e, - 0xe7, 0xb9, 0xc2, 0xa8, 0xd3, 0xcc, 0x4d, 0x7b, 0x33, 0x1c, 0xe3, 0xaa, 0xdc, 0xe2, 0x89, 0x17, - 0xd0, 0xc3, 0x82, 0xc3, 0xd5, 0x56, 0xae, 0x8b, 0xbc, 0x04, 0xa8, 0x51, 0x55, 0xc3, 0x3f, 0x33, - 0xe4, 0x59, 0x5f, 0x34, 0x0a, 0xdd, 0xfe, 0x1f, 0xe2, 0x61, 0x05, 0xef, 0x9c, 0xf6, 0x0d, 0xb0, - 0x6d, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x80, 0x5b, 0xaf, 0xd0, 0x34, 0xa8, 0x00, 0x00, + // 10431 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0x8e, 0xd9, 0x5d, 0x00, 0xbb, 0x0f, 0x5f, 0x8b, 0x06, 0xee, 0x6e, 0x6f, 0xef, 0x0e, + 0x00, 0x87, 0xe4, 0xdd, 0xf1, 0xc8, 0x03, 0xc8, 0x23, 0xef, 0x83, 0x38, 0x91, 0xa7, 0x5d, 0x60, + 0x0f, 0x07, 0x12, 0x5f, 0x1c, 0x00, 0x47, 0x8a, 0xfe, 0xa9, 0xf6, 0x37, 0xd8, 0x6d, 0x2c, 0x86, + 0xd8, 0x9d, 0x19, 0xce, 0xcc, 0xde, 0x01, 0x27, 0xa9, 0x4c, 0x4b, 0xb6, 0x4c, 0xd3, 0x51, 0xf4, + 0x61, 0x97, 0x2d, 0x53, 0x3a, 0x45, 0xb2, 0x94, 0x48, 0x61, 0xec, 0x58, 0x96, 0x64, 0x25, 0x8e, + 0xf3, 0x87, 0xe4, 0x2a, 0x27, 0xb2, 0xaa, 0x62, 0x4b, 0x4e, 0x25, 0x52, 0x9c, 0xe4, 0x24, 0x53, + 0x8a, 0xa2, 0x28, 0x4a, 0xac, 0x30, 0x52, 0xc5, 0x55, 0xaa, 0x54, 0x52, 0xfd, 0x35, 0x5f, 0xbb, + 0x8b, 0xd9, 0x05, 0xef, 0x28, 0xd9, 0xce, 0x5f, 0x40, 0x77, 0xbf, 0xf7, 0xfa, 0xf5, 0xeb, 0xd7, + 0xaf, 0xdf, 0x7b, 0xdd, 0x3d, 0x0b, 0x1f, 0xba, 0x08, 0x13, 0x15, 0xc3, 0xa8, 0x54, 0xf1, 0x94, + 0x69, 0x19, 0x8e, 0xb1, 0x51, 0xdf, 0x9c, 0x2a, 0x63, 0xbb, 0x64, 0x69, 0xa6, 0x63, 0x58, 0x93, + 0xb4, 0x0e, 0x0d, 0x31, 0x88, 0x49, 0x01, 0x21, 0x2f, 0xc2, 0xf0, 0x65, 0xad, 0x8a, 0x67, 0x5d, + 0xc0, 0x55, 0xec, 0xa0, 0x0b, 0x90, 0xd8, 0xd4, 0xaa, 0x38, 0x23, 0x4d, 0xc4, 0x4f, 0xf6, 0x9d, + 0xb9, 0x67, 0x32, 0x84, 0x34, 0x19, 0xc4, 0x58, 0x21, 0xd5, 0x0a, 0xc5, 0x90, 0xbf, 0x9d, 0x80, + 0x91, 0x26, 0xad, 0x08, 0x41, 0x42, 0x57, 0x6b, 0x84, 0xa2, 0x74, 0x32, 0xa5, 0xd0, 0xff, 0x51, + 0x06, 0x7a, 0x4d, 0xb5, 0xb4, 0xad, 0x56, 0x70, 0x26, 0x46, 0xab, 0x45, 0x11, 0x8d, 0x01, 0x94, + 0xb1, 0x89, 0xf5, 0x32, 0xd6, 0x4b, 0xbb, 0x99, 0xf8, 0x44, 0xfc, 0x64, 0x4a, 0xf1, 0xd5, 0xa0, + 0xfb, 0x61, 0xd8, 0xac, 0x6f, 0x54, 0xb5, 0x52, 0xd1, 0x07, 0x06, 0x13, 0xf1, 0x93, 0xdd, 0x4a, + 0x9a, 0x35, 0xcc, 0x7a, 0xc0, 0x27, 0x60, 0xe8, 0x3a, 0x56, 0xb7, 0xfd, 0xa0, 0x7d, 0x14, 0x74, + 0x90, 0x54, 0xfb, 0x00, 0x67, 0xa0, 0xbf, 0x86, 0x6d, 0x5b, 0xad, 0xe0, 0xa2, 0xb3, 0x6b, 0xe2, + 0x4c, 0x82, 0x8e, 0x7e, 0xa2, 0x61, 0xf4, 0xe1, 0x91, 0xf7, 0x71, 0xac, 0xb5, 0x5d, 0x13, 0xa3, + 0x1c, 0xa4, 0xb0, 0x5e, 0xaf, 0x31, 0x0a, 0xdd, 0x2d, 0xe4, 0x57, 0xd0, 0xeb, 0xb5, 0x30, 0x95, + 0x24, 0x41, 0xe3, 0x24, 0x7a, 0x6d, 0x6c, 0x5d, 0xd3, 0x4a, 0x38, 0xd3, 0x43, 0x09, 0x9c, 0x68, + 0x20, 0xb0, 0xca, 0xda, 0xc3, 0x34, 0x04, 0x1e, 0x9a, 0x81, 0x14, 0xde, 0x71, 0xb0, 0x6e, 0x6b, + 0x86, 0x9e, 0xe9, 0xa5, 0x44, 0xee, 0x6d, 0x32, 0x8b, 0xb8, 0x5a, 0x0e, 0x93, 0xf0, 0xf0, 0xd0, + 0x39, 0xe8, 0x35, 0x4c, 0x47, 0x33, 0x74, 0x3b, 0x93, 0x9c, 0x90, 0x4e, 0xf6, 0x9d, 0x39, 0xda, + 0x54, 0x11, 0x96, 0x19, 0x8c, 0x22, 0x80, 0xd1, 0x3c, 0xa4, 0x6d, 0xa3, 0x6e, 0x95, 0x70, 0xb1, + 0x64, 0x94, 0x71, 0x51, 0xd3, 0x37, 0x8d, 0x4c, 0x8a, 0x12, 0x18, 0x6f, 0x1c, 0x08, 0x05, 0x9c, + 0x31, 0xca, 0x78, 0x5e, 0xdf, 0x34, 0x94, 0x41, 0x3b, 0x50, 0x46, 0x07, 0xa1, 0xc7, 0xde, 0xd5, + 0x1d, 0x75, 0x27, 0xd3, 0x4f, 0x35, 0x84, 0x97, 0xe4, 0xdf, 0xef, 0x81, 0xa1, 0x76, 0x54, 0xec, + 0x22, 0x74, 0x6f, 0x92, 0x51, 0x66, 0x62, 0x9d, 0xc8, 0x80, 0xe1, 0x04, 0x85, 0xd8, 0xb3, 0x4f, + 0x21, 0xe6, 0xa0, 0x4f, 0xc7, 0xb6, 0x83, 0xcb, 0x4c, 0x23, 0xe2, 0x6d, 0xea, 0x14, 0x30, 0xa4, + 0x46, 0x95, 0x4a, 0xec, 0x4b, 0xa5, 0x9e, 0x81, 0x21, 0x97, 0xa5, 0xa2, 0xa5, 0xea, 0x15, 0xa1, + 0x9b, 0x53, 0x51, 0x9c, 0x4c, 0x16, 0x04, 0x9e, 0x42, 0xd0, 0x94, 0x41, 0x1c, 0x28, 0xa3, 0x59, + 0x00, 0x43, 0xc7, 0xc6, 0x66, 0xb1, 0x8c, 0x4b, 0xd5, 0x4c, 0xb2, 0x85, 0x94, 0x96, 0x09, 0x48, + 0x83, 0x94, 0x0c, 0x56, 0x5b, 0xaa, 0xa2, 0x47, 0x3d, 0x55, 0xeb, 0x6d, 0xa1, 0x29, 0x8b, 0x6c, + 0x91, 0x35, 0x68, 0xdb, 0x3a, 0x0c, 0x5a, 0x98, 0xe8, 0x3d, 0x2e, 0xf3, 0x91, 0xa5, 0x28, 0x13, + 0x93, 0x91, 0x23, 0x53, 0x38, 0x1a, 0x1b, 0xd8, 0x80, 0xe5, 0x2f, 0xa2, 0xbb, 0xc1, 0xad, 0x28, + 0x52, 0xb5, 0x02, 0x6a, 0x85, 0xfa, 0x45, 0xe5, 0x92, 0x5a, 0xc3, 0xd9, 0x1b, 0x30, 0x18, 0x14, + 0x0f, 0x1a, 0x85, 0x6e, 0xdb, 0x51, 0x2d, 0x87, 0x6a, 0x61, 0xb7, 0xc2, 0x0a, 0x28, 0x0d, 0x71, + 0xac, 0x97, 0xa9, 0x95, 0xeb, 0x56, 0xc8, 0xbf, 0xe8, 0xcd, 0xde, 0x80, 0xe3, 0x74, 0xc0, 0xc7, + 0x1b, 0x67, 0x34, 0x40, 0x39, 0x3c, 0xee, 0xec, 0x79, 0x18, 0x08, 0x0c, 0xa0, 0xdd, 0xae, 0xe5, + 0xb7, 0xc3, 0x81, 0xa6, 0xa4, 0xd1, 0x33, 0x30, 0x5a, 0xd7, 0x35, 0xdd, 0xc1, 0x96, 0x69, 0x61, + 0xa2, 0xb1, 0xac, 0xab, 0xcc, 0x7f, 0xee, 0x6d, 0xa1, 0x73, 0xeb, 0x7e, 0x68, 0x46, 0x45, 0x19, + 0xa9, 0x37, 0x56, 0x9e, 0x4a, 0x25, 0xbf, 0xdb, 0x9b, 0x7e, 0xe1, 0x85, 0x17, 0x5e, 0x88, 0xc9, + 0x1f, 0xec, 0x81, 0xd1, 0x66, 0x6b, 0xa6, 0xe9, 0xf2, 0x3d, 0x08, 0x3d, 0x7a, 0xbd, 0xb6, 0x81, + 0x2d, 0x2a, 0xa4, 0x6e, 0x85, 0x97, 0x50, 0x0e, 0xba, 0xab, 0xea, 0x06, 0xae, 0x66, 0x12, 0x13, + 0xd2, 0xc9, 0xc1, 0x33, 0xf7, 0xb7, 0xb5, 0x2a, 0x27, 0x17, 0x08, 0x8a, 0xc2, 0x30, 0xd1, 0xe3, + 0x90, 0xe0, 0x26, 0x9a, 0x50, 0x38, 0xd5, 0x1e, 0x05, 0xb2, 0x96, 0x14, 0x8a, 0x87, 0x8e, 0x40, + 0x8a, 0xfc, 0x65, 0xba, 0xd1, 0x43, 0x79, 0x4e, 0x92, 0x0a, 0xa2, 0x17, 0x28, 0x0b, 0x49, 0xba, + 0x4c, 0xca, 0x58, 0x6c, 0x6d, 0x6e, 0x99, 0x28, 0x56, 0x19, 0x6f, 0xaa, 0xf5, 0xaa, 0x53, 0xbc, + 0xa6, 0x56, 0xeb, 0x98, 0x2a, 0x7c, 0x4a, 0xe9, 0xe7, 0x95, 0x57, 0x49, 0x1d, 0x1a, 0x87, 0x3e, + 0xb6, 0xaa, 0x34, 0xbd, 0x8c, 0x77, 0xa8, 0xf5, 0xec, 0x56, 0xd8, 0x42, 0x9b, 0x27, 0x35, 0xa4, + 0xfb, 0xe7, 0x6c, 0x43, 0x17, 0xaa, 0x49, 0xbb, 0x20, 0x15, 0xb4, 0xfb, 0xf3, 0x61, 0xc3, 0x7d, + 0xac, 0xf9, 0xf0, 0xc2, 0x3a, 0x25, 0x7f, 0x3e, 0x06, 0x09, 0x6a, 0x2f, 0x86, 0xa0, 0x6f, 0xed, + 0x2d, 0x2b, 0x85, 0xe2, 0xec, 0xf2, 0x7a, 0x7e, 0xa1, 0x90, 0x96, 0xd0, 0x20, 0x00, 0xad, 0xb8, + 0xbc, 0xb0, 0x9c, 0x5b, 0x4b, 0xc7, 0xdc, 0xf2, 0xfc, 0xd2, 0xda, 0xb9, 0x47, 0xd2, 0x71, 0x17, + 0x61, 0x9d, 0x55, 0x24, 0xfc, 0x00, 0x0f, 0x9f, 0x49, 0x77, 0xa3, 0x34, 0xf4, 0x33, 0x02, 0xf3, + 0xcf, 0x14, 0x66, 0xcf, 0x3d, 0x92, 0xee, 0x09, 0xd6, 0x3c, 0x7c, 0x26, 0xdd, 0x8b, 0x06, 0x20, + 0x45, 0x6b, 0xf2, 0xcb, 0xcb, 0x0b, 0xe9, 0xa4, 0x4b, 0x73, 0x75, 0x4d, 0x99, 0x5f, 0x9a, 0x4b, + 0xa7, 0x5c, 0x9a, 0x73, 0xca, 0xf2, 0xfa, 0x4a, 0x1a, 0x5c, 0x0a, 0x8b, 0x85, 0xd5, 0xd5, 0xdc, + 0x5c, 0x21, 0xdd, 0xe7, 0x42, 0xe4, 0xdf, 0xb2, 0x56, 0x58, 0x4d, 0xf7, 0x07, 0xd8, 0x7a, 0xf8, + 0x4c, 0x7a, 0xc0, 0xed, 0xa2, 0xb0, 0xb4, 0xbe, 0x98, 0x1e, 0x44, 0xc3, 0x30, 0xc0, 0xba, 0x10, + 0x4c, 0x0c, 0x85, 0xaa, 0xce, 0x3d, 0x92, 0x4e, 0x7b, 0x8c, 0x30, 0x2a, 0xc3, 0x81, 0x8a, 0x73, + 0x8f, 0xa4, 0x91, 0x3c, 0x03, 0xdd, 0x54, 0xbb, 0x10, 0x82, 0xc1, 0x85, 0x5c, 0xbe, 0xb0, 0x50, + 0x5c, 0x5e, 0x59, 0x9b, 0x5f, 0x5e, 0xca, 0x2d, 0xa4, 0x25, 0xaf, 0x4e, 0x29, 0x3c, 0xb5, 0x3e, + 0xaf, 0x14, 0x66, 0xd3, 0x31, 0x7f, 0xdd, 0x4a, 0x21, 0xb7, 0x56, 0x98, 0x4d, 0xc7, 0xe5, 0x12, + 0x8c, 0x36, 0xb3, 0x93, 0x4d, 0x57, 0x86, 0x6f, 0x8a, 0x63, 0x2d, 0xa6, 0x98, 0xd2, 0x6a, 0x98, + 0xe2, 0x6f, 0xc5, 0x60, 0xa4, 0xc9, 0x5e, 0xd1, 0xb4, 0x93, 0x4b, 0xd0, 0xcd, 0x54, 0x94, 0xed, + 0x9e, 0xf7, 0x35, 0xdd, 0x74, 0xa8, 0xc2, 0x36, 0xec, 0xa0, 0x14, 0xcf, 0xef, 0x41, 0xc4, 0x5b, + 0x78, 0x10, 0x84, 0x44, 0x83, 0x4d, 0x7f, 0x6b, 0x83, 0x4d, 0x67, 0xdb, 0xde, 0xb9, 0x76, 0xb6, + 0x3d, 0x5a, 0xd7, 0x99, 0x6d, 0xef, 0x6e, 0x62, 0xdb, 0x2f, 0xc2, 0x70, 0x03, 0xa1, 0xb6, 0x6d, + 0xec, 0xbb, 0x24, 0xc8, 0xb4, 0x12, 0x4e, 0x84, 0xa5, 0x8b, 0x05, 0x2c, 0xdd, 0xc5, 0xb0, 0x04, + 0xef, 0x6a, 0x3d, 0x09, 0x0d, 0x73, 0xfd, 0x49, 0x09, 0x0e, 0x36, 0xf7, 0x14, 0x9b, 0xf2, 0xf0, + 0x38, 0xf4, 0xd4, 0xb0, 0xb3, 0x65, 0x08, 0x6f, 0xe9, 0x78, 0x93, 0x3d, 0x98, 0x34, 0x87, 0x27, + 0x9b, 0x63, 0xf9, 0x37, 0xf1, 0x78, 0x2b, 0x77, 0x8f, 0x71, 0xd3, 0xc0, 0xe9, 0x2f, 0xc5, 0xe0, + 0x40, 0x53, 0xe2, 0x4d, 0x19, 0x3d, 0x06, 0xa0, 0xe9, 0x66, 0xdd, 0x61, 0x1e, 0x11, 0x33, 0xb0, + 0x29, 0x5a, 0x43, 0x8d, 0x17, 0x31, 0x9e, 0x75, 0xc7, 0x6d, 0x8f, 0xd3, 0x76, 0x60, 0x55, 0x14, + 0xe0, 0x82, 0xc7, 0x68, 0x82, 0x32, 0x3a, 0xd6, 0x62, 0xa4, 0x0d, 0x8a, 0xf9, 0x20, 0xa4, 0x4b, + 0x55, 0x0d, 0xeb, 0x4e, 0xd1, 0x76, 0x2c, 0xac, 0xd6, 0x34, 0xbd, 0x42, 0x77, 0x90, 0xe4, 0x74, + 0xf7, 0xa6, 0x5a, 0xb5, 0xb1, 0x32, 0xc4, 0x9a, 0x57, 0x45, 0x2b, 0xc1, 0xa0, 0x0a, 0x64, 0xf9, + 0x30, 0x7a, 0x02, 0x18, 0xac, 0xd9, 0xc5, 0x90, 0x3f, 0x90, 0x82, 0x3e, 0x9f, 0x5f, 0x8d, 0xee, + 0x82, 0xfe, 0xe7, 0xd4, 0x6b, 0x6a, 0x51, 0xc4, 0x4a, 0x4c, 0x12, 0x7d, 0xa4, 0x6e, 0x85, 0xc7, + 0x4b, 0x0f, 0xc2, 0x28, 0x05, 0x31, 0xea, 0x0e, 0xb6, 0x8a, 0xa5, 0xaa, 0x6a, 0xdb, 0x54, 0x68, + 0x49, 0x0a, 0x8a, 0x48, 0xdb, 0x32, 0x69, 0x9a, 0x11, 0x2d, 0xe8, 0x2c, 0x8c, 0x50, 0x8c, 0x5a, + 0xbd, 0xea, 0x68, 0x66, 0x15, 0x17, 0x49, 0xf4, 0x66, 0xd3, 0x9d, 0xc4, 0xe5, 0x6c, 0x98, 0x40, + 0x2c, 0x72, 0x00, 0xc2, 0x91, 0x8d, 0x66, 0xe1, 0x18, 0x45, 0xab, 0x60, 0x1d, 0x5b, 0xaa, 0x83, + 0x8b, 0xf8, 0xf9, 0xba, 0x5a, 0xb5, 0x8b, 0xaa, 0x5e, 0x2e, 0x6e, 0xa9, 0xf6, 0x56, 0x66, 0x94, + 0x10, 0xc8, 0xc7, 0x32, 0x92, 0x72, 0x98, 0x00, 0xce, 0x71, 0xb8, 0x02, 0x05, 0xcb, 0xe9, 0xe5, + 0x2b, 0xaa, 0xbd, 0x85, 0xa6, 0xe1, 0x20, 0xa5, 0x62, 0x3b, 0x96, 0xa6, 0x57, 0x8a, 0xa5, 0x2d, + 0x5c, 0xda, 0x2e, 0xd6, 0x9d, 0xcd, 0x0b, 0x99, 0x23, 0xfe, 0xfe, 0x29, 0x87, 0xab, 0x14, 0x66, + 0x86, 0x80, 0xac, 0x3b, 0x9b, 0x17, 0xd0, 0x2a, 0xf4, 0x93, 0xc9, 0xa8, 0x69, 0x37, 0x70, 0x71, + 0xd3, 0xb0, 0xe8, 0xd6, 0x38, 0xd8, 0xc4, 0x34, 0xf9, 0x24, 0x38, 0xb9, 0xcc, 0x11, 0x16, 0x8d, + 0x32, 0x9e, 0xee, 0x5e, 0x5d, 0x29, 0x14, 0x66, 0x95, 0x3e, 0x41, 0xe5, 0xb2, 0x61, 0x11, 0x85, + 0xaa, 0x18, 0xae, 0x80, 0xfb, 0x98, 0x42, 0x55, 0x0c, 0x21, 0xde, 0xb3, 0x30, 0x52, 0x2a, 0xb1, + 0x31, 0x6b, 0xa5, 0x22, 0x8f, 0xb1, 0xec, 0x4c, 0x3a, 0x20, 0xac, 0x52, 0x69, 0x8e, 0x01, 0x70, + 0x1d, 0xb7, 0xd1, 0xa3, 0x70, 0xc0, 0x13, 0x96, 0x1f, 0x71, 0xb8, 0x61, 0x94, 0x61, 0xd4, 0xb3, + 0x30, 0x62, 0xee, 0x36, 0x22, 0xa2, 0x40, 0x8f, 0xe6, 0x6e, 0x18, 0xed, 0x3c, 0x8c, 0x9a, 0x5b, + 0x66, 0x23, 0xde, 0x29, 0x3f, 0x1e, 0x32, 0xb7, 0xcc, 0x30, 0xe2, 0xbd, 0x34, 0xe0, 0xb6, 0x70, + 0x49, 0x75, 0x70, 0x39, 0x73, 0xc8, 0x0f, 0xee, 0x6b, 0x40, 0x53, 0x90, 0x2e, 0x95, 0x8a, 0x58, + 0x57, 0x37, 0xaa, 0xb8, 0xa8, 0x5a, 0x58, 0x57, 0xed, 0xcc, 0xb8, 0x1f, 0x78, 0xb0, 0x54, 0x2a, + 0xd0, 0xd6, 0x1c, 0x6d, 0x44, 0xa7, 0x60, 0xd8, 0xd8, 0x78, 0xae, 0xc4, 0x54, 0xb2, 0x68, 0x5a, + 0x78, 0x53, 0xdb, 0xc9, 0xdc, 0x43, 0xe5, 0x3b, 0x44, 0x1a, 0xa8, 0x42, 0xae, 0xd0, 0x6a, 0x74, + 0x1f, 0xa4, 0x4b, 0xf6, 0x96, 0x6a, 0x99, 0xd4, 0x26, 0xdb, 0xa6, 0x5a, 0xc2, 0x99, 0x7b, 0x19, + 0x28, 0xab, 0x5f, 0x12, 0xd5, 0x64, 0x49, 0xd8, 0xd7, 0xb5, 0x4d, 0x47, 0x50, 0x3c, 0xc1, 0x96, + 0x04, 0xad, 0xe3, 0xd4, 0x4e, 0x42, 0x9a, 0x88, 0x22, 0xd0, 0xf1, 0x49, 0x0a, 0x36, 0x68, 0x6e, + 0x99, 0xfe, 0x7e, 0xef, 0x86, 0x01, 0x02, 0xe9, 0x75, 0x7a, 0x1f, 0x73, 0xc8, 0xcc, 0x2d, 0x5f, + 0x8f, 0x8f, 0xc0, 0x41, 0x02, 0x54, 0xc3, 0x8e, 0x5a, 0x56, 0x1d, 0xd5, 0x07, 0xfd, 0x00, 0x85, + 0x26, 0x72, 0x5f, 0xe4, 0x8d, 0x01, 0x3e, 0xad, 0xfa, 0xc6, 0xae, 0xab, 0x59, 0xa7, 0x19, 0x9f, + 0xa4, 0x4e, 0xe8, 0xd6, 0x1d, 0x73, 0xba, 0xe5, 0x69, 0xe8, 0xf7, 0x2b, 0x3e, 0x4a, 0x01, 0x53, + 0xfd, 0xb4, 0x44, 0xbc, 0xa0, 0x99, 0xe5, 0x59, 0xe2, 0xbf, 0x3c, 0x5b, 0x48, 0xc7, 0x88, 0x1f, + 0xb5, 0x30, 0xbf, 0x56, 0x28, 0x2a, 0xeb, 0x4b, 0x6b, 0xf3, 0x8b, 0x85, 0x74, 0xdc, 0xe7, 0xb0, + 0x3f, 0x91, 0x48, 0x1e, 0x4f, 0x9f, 0x90, 0xbf, 0x1a, 0x83, 0xc1, 0x60, 0x04, 0x86, 0xde, 0x04, + 0x87, 0x44, 0xba, 0xc4, 0xc6, 0x4e, 0xf1, 0xba, 0x66, 0xd1, 0x15, 0x59, 0x53, 0xd9, 0xee, 0xe8, + 0xea, 0xc4, 0x28, 0x87, 0x5a, 0xc5, 0xce, 0xd3, 0x9a, 0x45, 0xd6, 0x5b, 0x4d, 0x75, 0xd0, 0x02, + 0x8c, 0xeb, 0x46, 0xd1, 0x76, 0x54, 0xbd, 0xac, 0x5a, 0xe5, 0xa2, 0x97, 0xa8, 0x2a, 0xaa, 0xa5, + 0x12, 0xb6, 0x6d, 0x83, 0xed, 0x84, 0x2e, 0x95, 0xa3, 0xba, 0xb1, 0xca, 0x81, 0xbd, 0x2d, 0x22, + 0xc7, 0x41, 0x43, 0xfa, 0x1b, 0x6f, 0xa5, 0xbf, 0x47, 0x20, 0x55, 0x53, 0xcd, 0x22, 0xd6, 0x1d, + 0x6b, 0x97, 0xfa, 0xdd, 0x49, 0x25, 0x59, 0x53, 0xcd, 0x02, 0x29, 0xbf, 0x21, 0xe1, 0xcf, 0x13, + 0x89, 0x64, 0x32, 0x9d, 0x7a, 0x22, 0x91, 0x4c, 0xa5, 0x41, 0x7e, 0x35, 0x0e, 0xfd, 0x7e, 0x3f, + 0x9c, 0x84, 0x35, 0x25, 0xba, 0x65, 0x49, 0xd4, 0xa8, 0xdd, 0xbd, 0xa7, 0xd7, 0x3e, 0x39, 0x43, + 0xf6, 0xb2, 0xe9, 0x1e, 0xe6, 0x1d, 0x2b, 0x0c, 0x93, 0xf8, 0x11, 0x44, 0xd9, 0x30, 0xf3, 0x46, + 0x92, 0x0a, 0x2f, 0xa1, 0x39, 0xe8, 0x79, 0xce, 0xa6, 0xb4, 0x7b, 0x28, 0xed, 0x7b, 0xf6, 0xa6, + 0xfd, 0xc4, 0x2a, 0x25, 0x9e, 0x7a, 0x62, 0xb5, 0xb8, 0xb4, 0xac, 0x2c, 0xe6, 0x16, 0x14, 0x8e, + 0x8e, 0x0e, 0x43, 0xa2, 0xaa, 0xde, 0xd8, 0x0d, 0xee, 0x7a, 0xb4, 0xaa, 0xdd, 0x49, 0x38, 0x0c, + 0x89, 0xeb, 0x58, 0xdd, 0x0e, 0xee, 0x35, 0xb4, 0xea, 0x0e, 0x2e, 0x86, 0x29, 0xe8, 0xa6, 0xf2, + 0x42, 0x00, 0x5c, 0x62, 0xe9, 0x2e, 0x94, 0x84, 0xc4, 0xcc, 0xb2, 0x42, 0x16, 0x44, 0x1a, 0xfa, + 0x59, 0x6d, 0x71, 0x65, 0xbe, 0x30, 0x53, 0x48, 0xc7, 0xe4, 0xb3, 0xd0, 0xc3, 0x84, 0x40, 0x16, + 0x8b, 0x2b, 0x86, 0x74, 0x17, 0x2f, 0x72, 0x1a, 0x92, 0x68, 0x5d, 0x5f, 0xcc, 0x17, 0x94, 0x74, + 0x2c, 0x38, 0xd5, 0x89, 0x74, 0xb7, 0x6c, 0x43, 0xbf, 0xdf, 0x11, 0x7f, 0x63, 0x82, 0xec, 0x2f, + 0x48, 0xd0, 0xe7, 0x73, 0xac, 0x89, 0x47, 0xa4, 0x56, 0xab, 0xc6, 0xf5, 0xa2, 0x5a, 0xd5, 0x54, + 0x9b, 0xab, 0x06, 0xd0, 0xaa, 0x1c, 0xa9, 0x69, 0x77, 0xea, 0xde, 0xa0, 0x25, 0xd2, 0x9d, 0xee, + 0x91, 0x3f, 0x22, 0x41, 0x3a, 0xec, 0xd9, 0x86, 0xd8, 0x94, 0x7e, 0x92, 0x6c, 0xca, 0x1f, 0x96, + 0x60, 0x30, 0xe8, 0xce, 0x86, 0xd8, 0xbb, 0xeb, 0x27, 0xca, 0xde, 0x37, 0x63, 0x30, 0x10, 0x70, + 0x62, 0xdb, 0xe5, 0xee, 0x79, 0x18, 0xd6, 0xca, 0xb8, 0x66, 0x1a, 0x0e, 0xd6, 0x4b, 0xbb, 0xc5, + 0x2a, 0xbe, 0x86, 0xab, 0x19, 0x99, 0x1a, 0x8d, 0xa9, 0xbd, 0xdd, 0xe4, 0xc9, 0x79, 0x0f, 0x6f, + 0x81, 0xa0, 0x4d, 0x8f, 0xcc, 0xcf, 0x16, 0x16, 0x57, 0x96, 0xd7, 0x0a, 0x4b, 0x33, 0x6f, 0x29, + 0xae, 0x2f, 0x3d, 0xb9, 0xb4, 0xfc, 0xf4, 0x92, 0x92, 0xd6, 0x42, 0x60, 0x77, 0x70, 0xd9, 0xaf, + 0x40, 0x3a, 0xcc, 0x14, 0x3a, 0x04, 0xcd, 0xd8, 0x4a, 0x77, 0xa1, 0x11, 0x18, 0x5a, 0x5a, 0x2e, + 0xae, 0xce, 0xcf, 0x16, 0x8a, 0x85, 0xcb, 0x97, 0x0b, 0x33, 0x6b, 0xab, 0x2c, 0xf1, 0xe1, 0x42, + 0xaf, 0x05, 0x16, 0xb8, 0xfc, 0x72, 0x1c, 0x46, 0x9a, 0x70, 0x82, 0x72, 0x3c, 0x64, 0x61, 0x51, + 0xd4, 0xe9, 0x76, 0xb8, 0x9f, 0x24, 0x3e, 0xc3, 0x8a, 0x6a, 0x39, 0x3c, 0xc2, 0xb9, 0x0f, 0x88, + 0x94, 0x74, 0x47, 0xdb, 0xd4, 0xb0, 0xc5, 0xf3, 0x44, 0x2c, 0x8e, 0x19, 0xf2, 0xea, 0x59, 0xaa, + 0xe8, 0x01, 0x40, 0xa6, 0x61, 0x6b, 0x8e, 0x76, 0x0d, 0x17, 0x35, 0x5d, 0x24, 0x95, 0x48, 0x5c, + 0x93, 0x50, 0xd2, 0xa2, 0x65, 0x5e, 0x77, 0x5c, 0x68, 0x1d, 0x57, 0xd4, 0x10, 0x34, 0x31, 0xe6, + 0x71, 0x25, 0x2d, 0x5a, 0x5c, 0xe8, 0xbb, 0xa0, 0xbf, 0x6c, 0xd4, 0x89, 0xb3, 0xc7, 0xe0, 0xc8, + 0xde, 0x21, 0x29, 0x7d, 0xac, 0xce, 0x05, 0xe1, 0x6e, 0xbc, 0x97, 0xcd, 0xea, 0x57, 0xfa, 0x58, + 0x1d, 0x03, 0x39, 0x01, 0x43, 0x6a, 0xa5, 0x62, 0x11, 0xe2, 0x82, 0x10, 0x0b, 0x4c, 0x06, 0xdd, + 0x6a, 0x0a, 0x98, 0x7d, 0x02, 0x92, 0x42, 0x0e, 0x64, 0xab, 0x26, 0x92, 0x28, 0x9a, 0x2c, 0xda, + 0x8e, 0x9d, 0x4c, 0x29, 0x49, 0x5d, 0x34, 0xde, 0x05, 0xfd, 0x9a, 0x5d, 0xf4, 0x92, 0xf3, 0xb1, + 0x89, 0xd8, 0xc9, 0xa4, 0xd2, 0xa7, 0xd9, 0x6e, 0x62, 0x53, 0xfe, 0x64, 0x0c, 0x06, 0x83, 0x87, + 0x0b, 0x68, 0x16, 0x92, 0x55, 0xa3, 0xa4, 0x52, 0xd5, 0x62, 0x27, 0x5b, 0x27, 0x23, 0xce, 0x23, + 0x26, 0x17, 0x38, 0xbc, 0xe2, 0x62, 0x66, 0xff, 0x44, 0x82, 0xa4, 0xa8, 0x46, 0x07, 0x21, 0x61, + 0xaa, 0xce, 0x16, 0x25, 0xd7, 0x9d, 0x8f, 0xa5, 0x25, 0x85, 0x96, 0x49, 0xbd, 0x6d, 0xaa, 0x3a, + 0x55, 0x01, 0x5e, 0x4f, 0xca, 0x64, 0x5e, 0xab, 0x58, 0x2d, 0xd3, 0xa8, 0xc7, 0xa8, 0xd5, 0xb0, + 0xee, 0xd8, 0x62, 0x5e, 0x79, 0xfd, 0x0c, 0xaf, 0x46, 0xf7, 0xc3, 0xb0, 0x63, 0xa9, 0x5a, 0x35, + 0x00, 0x9b, 0xa0, 0xb0, 0x69, 0xd1, 0xe0, 0x02, 0x4f, 0xc3, 0x61, 0x41, 0xb7, 0x8c, 0x1d, 0xb5, + 0xb4, 0x85, 0xcb, 0x1e, 0x52, 0x0f, 0xcd, 0x6e, 0x1c, 0xe2, 0x00, 0xb3, 0xbc, 0x5d, 0xe0, 0xca, + 0x5f, 0x95, 0x60, 0x58, 0xc4, 0x69, 0x65, 0x57, 0x58, 0x8b, 0x00, 0xaa, 0xae, 0x1b, 0x8e, 0x5f, + 0x5c, 0x8d, 0xaa, 0xdc, 0x80, 0x37, 0x99, 0x73, 0x91, 0x14, 0x1f, 0x81, 0x6c, 0x0d, 0xc0, 0x6b, + 0x69, 0x29, 0xb6, 0x71, 0xe8, 0xe3, 0x27, 0x47, 0xf4, 0xf8, 0x91, 0x45, 0xf6, 0xc0, 0xaa, 0x48, + 0x40, 0x87, 0x46, 0xa1, 0x7b, 0x03, 0x57, 0x34, 0x9d, 0xe7, 0x83, 0x59, 0x41, 0xe4, 0x5f, 0x12, + 0x6e, 0xfe, 0x25, 0xff, 0x5e, 0x09, 0x46, 0x4a, 0x46, 0x2d, 0xcc, 0x6f, 0x3e, 0x1d, 0x4a, 0x2f, + 0xd8, 0x57, 0xa4, 0x67, 0x1f, 0xaf, 0x68, 0xce, 0x56, 0x7d, 0x63, 0xb2, 0x64, 0xd4, 0xa6, 0x2a, + 0x46, 0x55, 0xd5, 0x2b, 0xde, 0xf9, 0x29, 0xfd, 0xa7, 0x74, 0xba, 0x82, 0xf5, 0xd3, 0x15, 0xc3, + 0x77, 0x9a, 0x7a, 0xd1, 0xfb, 0xf7, 0xaf, 0x24, 0xe9, 0x37, 0x63, 0xf1, 0xb9, 0x95, 0xfc, 0x2b, + 0xb1, 0xec, 0x1c, 0xeb, 0x6e, 0x45, 0x88, 0x47, 0xc1, 0x9b, 0x55, 0x5c, 0x22, 0x43, 0x86, 0xef, + 0xdd, 0x0f, 0xa3, 0x15, 0xa3, 0x62, 0x50, 0x8a, 0x53, 0xe4, 0x3f, 0x7e, 0x22, 0x9b, 0x72, 0x6b, + 0xb3, 0x91, 0xc7, 0xb7, 0xd3, 0x4b, 0x30, 0xc2, 0x81, 0x8b, 0xf4, 0x48, 0x88, 0x05, 0x36, 0x68, + 0xcf, 0xb4, 0x5a, 0xe6, 0x77, 0xbf, 0x4d, 0x37, 0x74, 0x65, 0x98, 0xa3, 0x92, 0x36, 0x16, 0xfb, + 0x4c, 0x2b, 0x70, 0x20, 0x40, 0x8f, 0x2d, 0x5b, 0x6c, 0x45, 0x50, 0xfc, 0x23, 0x4e, 0x71, 0xc4, + 0x47, 0x71, 0x95, 0xa3, 0x4e, 0xcf, 0xc0, 0x40, 0x27, 0xb4, 0xfe, 0x05, 0xa7, 0xd5, 0x8f, 0xfd, + 0x44, 0xe6, 0x60, 0x88, 0x12, 0x29, 0xd5, 0x6d, 0xc7, 0xa8, 0x51, 0x9b, 0xb8, 0x37, 0x99, 0x7f, + 0xf9, 0x6d, 0xb6, 0x8e, 0x06, 0x09, 0xda, 0x8c, 0x8b, 0x35, 0x3d, 0x0d, 0xf4, 0x14, 0xac, 0x8c, + 0x4b, 0xd5, 0x08, 0x0a, 0x5f, 0xe2, 0x8c, 0xb8, 0xf0, 0xd3, 0x57, 0x61, 0x94, 0xfc, 0x4f, 0x4d, + 0x96, 0x9f, 0x93, 0xe8, 0x1c, 0x5c, 0xe6, 0xab, 0xef, 0x62, 0x4b, 0x75, 0xc4, 0x25, 0xe0, 0xe3, + 0xc9, 0x37, 0x8b, 0x15, 0xec, 0x38, 0xd8, 0xb2, 0x8b, 0x6a, 0xb5, 0x19, 0x7b, 0xbe, 0x24, 0x46, + 0xe6, 0x37, 0xbe, 0x1f, 0x9c, 0xc5, 0x39, 0x86, 0x99, 0xab, 0x56, 0xa7, 0xd7, 0xe1, 0x50, 0x13, + 0xad, 0x68, 0x83, 0xe6, 0xcb, 0x9c, 0xe6, 0x68, 0x83, 0x66, 0x10, 0xb2, 0x2b, 0x20, 0xea, 0xdd, + 0xb9, 0x6c, 0x83, 0xe6, 0x87, 0x38, 0x4d, 0xc4, 0x71, 0xc5, 0x94, 0x12, 0x8a, 0x4f, 0xc0, 0xf0, + 0x35, 0x6c, 0x6d, 0x18, 0x36, 0x4f, 0x1c, 0xb5, 0x41, 0xee, 0xc3, 0x9c, 0xdc, 0x10, 0x47, 0xa4, + 0x99, 0x24, 0x42, 0xeb, 0x51, 0x48, 0x6e, 0xaa, 0x25, 0xdc, 0x06, 0x89, 0x9b, 0x9c, 0x44, 0x2f, + 0x81, 0x27, 0xa8, 0x39, 0xe8, 0xaf, 0x18, 0x7c, 0xd7, 0x8a, 0x46, 0xff, 0x08, 0x47, 0xef, 0x13, + 0x38, 0x9c, 0x84, 0x69, 0x98, 0xf5, 0x2a, 0xd9, 0xd2, 0xa2, 0x49, 0xfc, 0x3d, 0x41, 0x42, 0xe0, + 0x70, 0x12, 0x1d, 0x88, 0xf5, 0xa3, 0x82, 0x84, 0xed, 0x93, 0xe7, 0x25, 0xe8, 0x33, 0xf4, 0xea, + 0xae, 0xa1, 0xb7, 0xc3, 0xc4, 0xc7, 0x38, 0x05, 0xe0, 0x28, 0x84, 0xc0, 0x45, 0x48, 0xb5, 0x3b, + 0x11, 0x7f, 0xff, 0xfb, 0x62, 0x79, 0x88, 0x19, 0x98, 0x83, 0x21, 0x61, 0xa0, 0x34, 0x43, 0x6f, + 0x83, 0xc4, 0x3f, 0xe0, 0x24, 0x06, 0x7d, 0x68, 0x7c, 0x18, 0x0e, 0xb6, 0x9d, 0x0a, 0x6e, 0x87, + 0xc8, 0x27, 0xc5, 0x30, 0x38, 0x0a, 0x17, 0xe5, 0x06, 0xd6, 0x4b, 0x5b, 0xed, 0x51, 0xf8, 0x94, + 0x10, 0xa5, 0xc0, 0x21, 0x24, 0x66, 0x60, 0xa0, 0xa6, 0x5a, 0xf6, 0x96, 0x5a, 0x6d, 0x6b, 0x3a, + 0xfe, 0x21, 0xa7, 0xd1, 0xef, 0x22, 0x71, 0x89, 0xd4, 0xf5, 0x4e, 0xc8, 0xbc, 0x22, 0x24, 0xe2, + 0x43, 0xe3, 0x4b, 0xcf, 0x76, 0x68, 0x96, 0xad, 0x13, 0x6a, 0xff, 0x48, 0x2c, 0x3d, 0x86, 0xbb, + 0xe8, 0xa7, 0x78, 0x11, 0x52, 0xb6, 0x76, 0xa3, 0x2d, 0x32, 0xbf, 0x25, 0x66, 0x9a, 0x22, 0x10, + 0xe4, 0xb7, 0xc0, 0xe1, 0xa6, 0xdb, 0x44, 0x1b, 0xc4, 0x7e, 0x9b, 0x13, 0x3b, 0xd8, 0x64, 0xab, + 0xe0, 0x26, 0xa1, 0x53, 0x92, 0xff, 0x58, 0x98, 0x04, 0x1c, 0xa2, 0xb5, 0x42, 0xe2, 0x08, 0x5b, + 0xdd, 0xec, 0x4c, 0x6a, 0xbf, 0x23, 0xa4, 0xc6, 0x70, 0x03, 0x52, 0x5b, 0x83, 0x83, 0x9c, 0x62, + 0x67, 0xf3, 0xfa, 0x69, 0x61, 0x58, 0x19, 0xf6, 0x7a, 0x70, 0x76, 0x7f, 0x06, 0xb2, 0xae, 0x38, + 0x85, 0xc3, 0x6a, 0x17, 0x6b, 0xaa, 0xd9, 0x06, 0xe5, 0xdf, 0xe5, 0x94, 0x85, 0xc5, 0x77, 0x3d, + 0x5e, 0x7b, 0x51, 0x35, 0x09, 0xf1, 0x67, 0x20, 0x23, 0x88, 0xd7, 0x75, 0x0b, 0x97, 0x8c, 0x8a, + 0xae, 0xdd, 0xc0, 0xe5, 0x36, 0x48, 0x7f, 0x26, 0x34, 0x55, 0xeb, 0x3e, 0x74, 0x42, 0x79, 0x1e, + 0xd2, 0xae, 0xaf, 0x52, 0xd4, 0x6a, 0xa6, 0x61, 0x39, 0x11, 0x14, 0x3f, 0x2b, 0x66, 0xca, 0xc5, + 0x9b, 0xa7, 0x68, 0xd3, 0x05, 0x18, 0xa4, 0xc5, 0x76, 0x55, 0xf2, 0x73, 0x9c, 0xd0, 0x80, 0x87, + 0xc5, 0x0d, 0x47, 0xc9, 0xa8, 0x99, 0xaa, 0xd5, 0x8e, 0xfd, 0xfb, 0x3d, 0x61, 0x38, 0x38, 0x0a, + 0x37, 0x1c, 0xce, 0xae, 0x89, 0xc9, 0x6e, 0xdf, 0x06, 0x85, 0xcf, 0x0b, 0xc3, 0x21, 0x70, 0x38, + 0x09, 0xe1, 0x30, 0xb4, 0x41, 0xe2, 0x9f, 0x08, 0x12, 0x02, 0x87, 0x90, 0x78, 0xca, 0xdb, 0x68, + 0x2d, 0x5c, 0xd1, 0x6c, 0xc7, 0x62, 0x6e, 0xf2, 0xde, 0xa4, 0xfe, 0xe9, 0xf7, 0x83, 0x4e, 0x98, + 0xe2, 0x43, 0x25, 0x96, 0x88, 0xa7, 0x5d, 0x69, 0x14, 0x15, 0xcd, 0xd8, 0xef, 0x0b, 0x4b, 0xe4, + 0x43, 0x23, 0xbc, 0xf9, 0x3c, 0x44, 0x22, 0xf6, 0x12, 0x89, 0x1d, 0xda, 0x20, 0xf7, 0xcf, 0x42, + 0xcc, 0xad, 0x0a, 0x5c, 0x42, 0xd3, 0xe7, 0xff, 0xd4, 0xf5, 0x6d, 0xbc, 0xdb, 0x96, 0x76, 0xfe, + 0x41, 0xc8, 0xff, 0x59, 0x67, 0x98, 0xcc, 0x86, 0x0c, 0x85, 0xfc, 0x29, 0x14, 0x75, 0x7f, 0x28, + 0xf3, 0x73, 0x3f, 0xe4, 0xe3, 0x0d, 0xba, 0x53, 0xd3, 0x0b, 0x44, 0xc9, 0x83, 0x4e, 0x4f, 0x34, + 0xb1, 0x77, 0xfd, 0xd0, 0xd5, 0xf3, 0x80, 0xcf, 0x33, 0x7d, 0x19, 0x06, 0x02, 0x0e, 0x4f, 0x34, + 0xa9, 0x9f, 0xe7, 0xa4, 0xfa, 0xfd, 0xfe, 0xce, 0xf4, 0x59, 0x48, 0x10, 0xe7, 0x25, 0x1a, 0xfd, + 0x17, 0x38, 0x3a, 0x05, 0x9f, 0x7e, 0x0c, 0x92, 0xc2, 0x69, 0x89, 0x46, 0x7d, 0x37, 0x47, 0x75, + 0x51, 0x08, 0xba, 0x70, 0x58, 0xa2, 0xd1, 0x7f, 0x51, 0xa0, 0x0b, 0x14, 0x82, 0xde, 0xbe, 0x08, + 0xbf, 0xf0, 0xcb, 0x09, 0xbe, 0xe9, 0x08, 0xd9, 0x5d, 0x84, 0x5e, 0xee, 0xa9, 0x44, 0x63, 0xff, + 0x12, 0xef, 0x5c, 0x60, 0x4c, 0x9f, 0x87, 0xee, 0x36, 0x05, 0xfe, 0x1e, 0x8e, 0xca, 0xe0, 0xa7, + 0x67, 0xa0, 0xcf, 0xe7, 0x9d, 0x44, 0xa3, 0xff, 0x5d, 0x8e, 0xee, 0xc7, 0x22, 0xac, 0x73, 0xef, + 0x24, 0x9a, 0xc0, 0x7b, 0x05, 0xeb, 0x1c, 0x83, 0x88, 0x4d, 0x38, 0x26, 0xd1, 0xd8, 0xef, 0x13, + 0x52, 0x17, 0x28, 0xd3, 0x97, 0x20, 0xe5, 0x6e, 0x36, 0xd1, 0xf8, 0xef, 0xe7, 0xf8, 0x1e, 0x0e, + 0x91, 0x80, 0x6f, 0xb3, 0x8b, 0x26, 0xf1, 0x01, 0x21, 0x01, 0x1f, 0x16, 0x59, 0x46, 0x61, 0x07, + 0x26, 0x9a, 0xd2, 0xaf, 0x88, 0x65, 0x14, 0xf2, 0x5f, 0xc8, 0x6c, 0x52, 0x9b, 0x1f, 0x4d, 0xe2, + 0x57, 0xc5, 0x6c, 0x52, 0x78, 0xc2, 0x46, 0xd8, 0x23, 0x88, 0xa6, 0xf1, 0xeb, 0x82, 0x8d, 0x90, + 0x43, 0x30, 0xbd, 0x02, 0xa8, 0xd1, 0x1b, 0x88, 0xa6, 0xf7, 0x41, 0x4e, 0x6f, 0xb8, 0xc1, 0x19, + 0x98, 0x7e, 0x1a, 0x0e, 0x36, 0xf7, 0x04, 0xa2, 0xa9, 0xfe, 0xc6, 0x0f, 0x43, 0xb1, 0x9b, 0xdf, + 0x11, 0x98, 0x5e, 0xf3, 0xb6, 0x14, 0xbf, 0x17, 0x10, 0x4d, 0xf6, 0xe5, 0x1f, 0x06, 0x0d, 0xb7, + 0xdf, 0x09, 0x98, 0xce, 0x01, 0x78, 0x1b, 0x70, 0x34, 0xad, 0x0f, 0x73, 0x5a, 0x3e, 0x24, 0xb2, + 0x34, 0xf8, 0xfe, 0x1b, 0x8d, 0x7f, 0x53, 0x2c, 0x0d, 0x8e, 0x41, 0x96, 0x86, 0xd8, 0x7a, 0xa3, + 0xb1, 0x3f, 0x22, 0x96, 0x86, 0x40, 0x21, 0x9a, 0xed, 0xdb, 0xdd, 0xa2, 0x29, 0x7c, 0x4c, 0x68, + 0xb6, 0x0f, 0x6b, 0x7a, 0x09, 0x86, 0x1b, 0x36, 0xc4, 0x68, 0x52, 0xbf, 0xc9, 0x49, 0xa5, 0xc3, + 0xfb, 0xa1, 0x7f, 0xf3, 0xe2, 0x9b, 0x61, 0x34, 0xb5, 0x8f, 0x87, 0x36, 0x2f, 0xbe, 0x17, 0x4e, + 0x5f, 0x84, 0xa4, 0x5e, 0xaf, 0x56, 0xc9, 0xe2, 0x41, 0x7b, 0xdf, 0xf9, 0xcb, 0xfc, 0x97, 0x1f, + 0x73, 0xe9, 0x08, 0x84, 0xe9, 0xb3, 0xd0, 0x8d, 0x6b, 0x1b, 0xb8, 0x1c, 0x85, 0xf9, 0xbd, 0x1f, + 0x0b, 0x83, 0x49, 0xa0, 0xa7, 0x2f, 0x01, 0xb0, 0xd4, 0x08, 0x3d, 0x1e, 0x8c, 0xc0, 0xfd, 0xaf, + 0x3f, 0xe6, 0xb7, 0x71, 0x3c, 0x14, 0x8f, 0x00, 0xbb, 0xdb, 0xb3, 0x37, 0x81, 0xef, 0x07, 0x09, + 0xd0, 0x19, 0x79, 0x14, 0x7a, 0x9f, 0xb3, 0x0d, 0xdd, 0x51, 0x2b, 0x51, 0xd8, 0xff, 0x8d, 0x63, + 0x0b, 0x78, 0x22, 0xb0, 0x9a, 0x61, 0x61, 0x47, 0xad, 0xd8, 0x51, 0xb8, 0xff, 0x9d, 0xe3, 0xba, + 0x08, 0x04, 0xb9, 0xa4, 0xda, 0x4e, 0x3b, 0xe3, 0xfe, 0x4b, 0x81, 0x2c, 0x10, 0x08, 0xd3, 0xe4, + 0xff, 0x6d, 0xbc, 0x1b, 0x85, 0xfb, 0x03, 0xc1, 0x34, 0x87, 0x9f, 0x7e, 0x0c, 0x52, 0xe4, 0x5f, + 0x76, 0xc5, 0x2e, 0x02, 0xf9, 0x7f, 0x70, 0x64, 0x0f, 0x83, 0xf4, 0x6c, 0x3b, 0x65, 0x47, 0x8b, + 0x16, 0xf6, 0x6b, 0x7c, 0xa6, 0x05, 0xfc, 0x74, 0x0e, 0xfa, 0x6c, 0xa7, 0x5c, 0xae, 0x73, 0xff, + 0x34, 0x02, 0xfd, 0x7f, 0xfe, 0xd8, 0x4d, 0x59, 0xb8, 0x38, 0x64, 0xb6, 0xaf, 0x6f, 0x3b, 0xa6, + 0x41, 0x8f, 0x40, 0xa2, 0x28, 0xfc, 0x90, 0x53, 0xf0, 0xa1, 0x4c, 0xcf, 0x40, 0x3f, 0x19, 0x8b, + 0x85, 0x4d, 0x4c, 0xcf, 0xab, 0x22, 0x48, 0xfc, 0x88, 0x0b, 0x20, 0x80, 0x94, 0x7f, 0xeb, 0x97, + 0x5e, 0x1d, 0x93, 0xbe, 0xf2, 0xea, 0x98, 0xf4, 0xcd, 0x57, 0xc7, 0xa4, 0xf7, 0x7d, 0x6b, 0xac, + 0xeb, 0x2b, 0xdf, 0x1a, 0xeb, 0xfa, 0xfa, 0xb7, 0xc6, 0xba, 0x9a, 0xa7, 0x8d, 0x61, 0xce, 0x98, + 0x33, 0x58, 0xc2, 0xf8, 0x59, 0x39, 0x90, 0x2e, 0xae, 0x18, 0x5e, 0xb6, 0xd6, 0x0d, 0x72, 0xe0, + 0x47, 0x12, 0x09, 0x98, 0x83, 0xb9, 0x5c, 0x55, 0xdf, 0x6d, 0xf1, 0x06, 0x27, 0xdb, 0x34, 0x31, + 0x2c, 0xbf, 0x09, 0xe2, 0x39, 0x7d, 0x17, 0x1d, 0x66, 0x36, 0xaf, 0x58, 0xb7, 0xaa, 0xfc, 0xea, + 0x57, 0x2f, 0x29, 0xaf, 0x5b, 0x55, 0x34, 0xea, 0xdd, 0xcf, 0x94, 0x4e, 0xf6, 0xf3, 0x4b, 0x97, + 0xd3, 0x89, 0x1f, 0x7c, 0x6c, 0xbc, 0x2b, 0xbf, 0x1d, 0x1e, 0xe1, 0x17, 0x22, 0x47, 0x99, 0xcc, + 0xe9, 0xbb, 0x74, 0x90, 0x2b, 0xd2, 0xb3, 0xdd, 0xa4, 0x0f, 0x5b, 0x24, 0xb6, 0xc7, 0xc2, 0x89, + 0xed, 0xa7, 0x71, 0xb5, 0xfa, 0xa4, 0x6e, 0x5c, 0xd7, 0xd7, 0x08, 0xd8, 0x46, 0x0f, 0xa5, 0xf1, + 0x30, 0xbc, 0x2f, 0x06, 0xe3, 0xe1, 0x71, 0x13, 0xc5, 0xb1, 0x1d, 0xb5, 0x66, 0xb6, 0x7a, 0x81, + 0x74, 0x11, 0x52, 0x6b, 0x02, 0x06, 0x65, 0xa0, 0xd7, 0xc6, 0x25, 0x43, 0x2f, 0xdb, 0x74, 0xb0, + 0x71, 0x45, 0x14, 0xc9, 0x60, 0x75, 0x55, 0x37, 0x6c, 0x7e, 0x41, 0x92, 0x15, 0xf2, 0xbf, 0x26, + 0x75, 0x36, 0x93, 0x83, 0x6e, 0x57, 0x62, 0xa4, 0xf7, 0xef, 0x95, 0xfe, 0xa7, 0x52, 0xf0, 0x86, + 0xe0, 0xcb, 0xf5, 0xb7, 0x2b, 0x92, 0x77, 0xc6, 0xe1, 0x70, 0xc9, 0xb0, 0x6b, 0x86, 0x5d, 0x64, + 0x33, 0xcc, 0x0a, 0x5c, 0x18, 0xfd, 0xfe, 0xa6, 0x36, 0xf2, 0xff, 0x57, 0x60, 0x90, 0xae, 0x02, + 0x9a, 0xf9, 0xa4, 0x86, 0x27, 0x72, 0xaf, 0xf8, 0xe3, 0x7f, 0xdb, 0x4d, 0xb5, 0x66, 0xc0, 0x45, + 0xa4, 0x57, 0x3b, 0xd6, 0x60, 0x54, 0xab, 0x99, 0x55, 0x4c, 0xcf, 0x80, 0x8a, 0x6e, 0x5b, 0x34, + 0xbd, 0x2f, 0x73, 0x7a, 0x23, 0x1e, 0xfa, 0xbc, 0xc0, 0x9e, 0x5e, 0x80, 0x61, 0xb5, 0x54, 0xc2, + 0x66, 0x80, 0x64, 0xc4, 0x0a, 0x15, 0x0c, 0xa6, 0x39, 0xa6, 0x4b, 0x2d, 0x7f, 0xa9, 0xd5, 0xdc, + 0x3e, 0x7b, 0xaf, 0x6f, 0xd2, 0x2c, 0x5c, 0xc1, 0xfa, 0x69, 0x1d, 0x3b, 0xd7, 0x0d, 0x6b, 0x9b, + 0x8b, 0xf7, 0x34, 0xeb, 0x4a, 0x4c, 0xc2, 0xcf, 0xc7, 0x61, 0x8c, 0x35, 0x4c, 0x6d, 0xa8, 0x36, + 0x9e, 0xba, 0xf6, 0xd0, 0x06, 0x76, 0xd4, 0x87, 0xa6, 0x4a, 0x86, 0xa6, 0xf3, 0x99, 0x18, 0xe1, + 0xf3, 0x42, 0xda, 0x27, 0x79, 0x7b, 0x8b, 0x85, 0x39, 0x07, 0x89, 0x19, 0x43, 0xd3, 0x89, 0x46, + 0x96, 0xb1, 0x6e, 0xd4, 0xf8, 0xb2, 0x64, 0x05, 0x74, 0x37, 0xf4, 0xa8, 0x35, 0xa3, 0xae, 0x3b, + 0xec, 0xf8, 0x2a, 0xdf, 0xf7, 0xa5, 0x5b, 0xe3, 0x5d, 0x7f, 0x7e, 0x6b, 0x3c, 0x3e, 0xaf, 0x3b, + 0x0a, 0x6f, 0x9a, 0x4e, 0x7c, 0xf7, 0xa3, 0xe3, 0x92, 0xfc, 0x04, 0xf4, 0xce, 0xe2, 0xd2, 0x7e, + 0x68, 0xcd, 0xe2, 0x52, 0x88, 0xd6, 0x7d, 0x90, 0x9c, 0xd7, 0x1d, 0x76, 0x67, 0xf6, 0x18, 0xc4, + 0x35, 0x9d, 0xdd, 0xc2, 0x0a, 0xf5, 0x4f, 0xea, 0x09, 0xe8, 0x2c, 0x2e, 0xb9, 0xa0, 0x65, 0x5c, + 0x0a, 0x83, 0x12, 0xf2, 0xa4, 0x3e, 0x3f, 0xfb, 0xf5, 0xbf, 0x18, 0xeb, 0x7a, 0xe1, 0xd5, 0xb1, + 0xae, 0x96, 0x33, 0xe1, 0x37, 0x87, 0x5c, 0xc4, 0x7c, 0x0a, 0xec, 0xf2, 0xf6, 0x94, 0x13, 0x58, + 0x0b, 0x7f, 0x27, 0x06, 0x63, 0x0d, 0x2a, 0xce, 0x37, 0x86, 0x56, 0xd6, 0x61, 0x1a, 0x92, 0xb3, + 0x62, 0xbf, 0xe9, 0xd4, 0x38, 0xfc, 0x6a, 0x87, 0xc6, 0x61, 0x40, 0xf4, 0x24, 0x6c, 0xc3, 0xa9, + 0x68, 0xdb, 0x20, 0xf8, 0xdf, 0x87, 0x69, 0x78, 0x25, 0x01, 0xc7, 0xe8, 0xa3, 0x10, 0xab, 0xa6, + 0xe9, 0xce, 0x54, 0xc9, 0xda, 0x35, 0x1d, 0xba, 0x9d, 0x18, 0x9b, 0x5c, 0x1a, 0xc3, 0x5e, 0xf3, + 0x24, 0x6b, 0x6e, 0xa1, 0x92, 0x9b, 0xd0, 0xbd, 0x42, 0xf0, 0x88, 0x20, 0x1c, 0xc3, 0x51, 0xab, + 0x5c, 0x40, 0xac, 0x40, 0x6a, 0xd9, 0x43, 0x92, 0x18, 0xab, 0xd5, 0xc4, 0x1b, 0x92, 0x2a, 0x56, + 0x37, 0xd9, 0xc5, 0xdd, 0x38, 0xdd, 0x42, 0x92, 0xa4, 0x82, 0xde, 0xd1, 0x1d, 0x85, 0x6e, 0xb5, + 0xce, 0x8e, 0x9c, 0xe3, 0x64, 0x6f, 0xa1, 0x05, 0xf9, 0x49, 0xe8, 0xe5, 0xc7, 0x5c, 0x28, 0x0d, + 0xf1, 0x6d, 0xbc, 0x4b, 0xfb, 0xe9, 0x57, 0xc8, 0xbf, 0x68, 0x12, 0xba, 0x29, 0xf3, 0xfc, 0x45, + 0x42, 0x66, 0xb2, 0x81, 0xfb, 0x49, 0xca, 0xa4, 0xc2, 0xc0, 0xe4, 0x27, 0x20, 0x39, 0x6b, 0xd4, + 0x34, 0xdd, 0x08, 0x52, 0x4b, 0x31, 0x6a, 0x94, 0x67, 0xb3, 0xce, 0x55, 0x5f, 0x61, 0x05, 0x74, + 0x10, 0x7a, 0xd8, 0x45, 0x6e, 0x7e, 0x6c, 0xce, 0x4b, 0xf2, 0x0c, 0xf4, 0x52, 0xda, 0xcb, 0x26, + 0x42, 0xfc, 0x65, 0x0f, 0xbf, 0x31, 0x4e, 0xad, 0x24, 0x27, 0x1f, 0xf3, 0x98, 0x45, 0x90, 0x28, + 0xab, 0x8e, 0xca, 0xc7, 0x4d, 0xff, 0x97, 0x1f, 0x87, 0x24, 0x27, 0x62, 0xa3, 0x33, 0x10, 0x37, + 0x4c, 0x9b, 0x1f, 0x7c, 0x67, 0x5b, 0x0d, 0x65, 0xd9, 0xcc, 0x27, 0xc8, 0xa2, 0x51, 0x08, 0x70, + 0x5e, 0x69, 0xb9, 0x4a, 0x2e, 0xf8, 0x14, 0xc9, 0x37, 0xe5, 0xbe, 0x7f, 0xd9, 0x94, 0x36, 0xa8, + 0x83, 0xab, 0x2c, 0x1f, 0x8b, 0xc1, 0x98, 0xaf, 0xf5, 0x1a, 0xb6, 0x48, 0xac, 0xc7, 0x16, 0x18, + 0xd7, 0x16, 0xe4, 0x63, 0x92, 0xb7, 0xb7, 0x50, 0x97, 0xc7, 0x20, 0x9e, 0x33, 0x4d, 0x94, 0x85, + 0x24, 0x3b, 0xe0, 0x36, 0x98, 0xbe, 0x24, 0x14, 0xb7, 0x4c, 0xda, 0x6c, 0x63, 0xd3, 0xb9, 0xae, + 0x5a, 0xee, 0x13, 0x26, 0x51, 0x96, 0x1f, 0x85, 0xd4, 0x8c, 0xa1, 0xdb, 0x58, 0xb7, 0xeb, 0x74, + 0xe9, 0x6d, 0x54, 0x8d, 0xd2, 0x36, 0xa7, 0xc0, 0x0a, 0x44, 0xe0, 0xaa, 0x69, 0x52, 0xcc, 0x84, + 0x42, 0xfe, 0x65, 0x66, 0x2a, 0xbf, 0xda, 0x52, 0x44, 0x8f, 0x76, 0x2e, 0x22, 0x3e, 0x48, 0x57, + 0x46, 0xff, 0x5b, 0x82, 0xa3, 0x8d, 0x0b, 0x6a, 0x1b, 0xef, 0xda, 0x9d, 0xae, 0xa7, 0x67, 0x20, + 0xb5, 0x42, 0xdf, 0x11, 0x3f, 0x89, 0x77, 0x51, 0x16, 0x7a, 0x71, 0xf9, 0xcc, 0xd9, 0xb3, 0x0f, + 0x3d, 0xca, 0xb4, 0xfd, 0x4a, 0x97, 0x22, 0x2a, 0xd0, 0x18, 0xa4, 0x6c, 0x5c, 0x32, 0xcf, 0x9c, + 0x3d, 0xb7, 0xfd, 0x10, 0x53, 0xaf, 0x2b, 0x5d, 0x8a, 0x57, 0x35, 0x9d, 0x24, 0xa3, 0xfe, 0xee, + 0xc7, 0xc6, 0xa5, 0x7c, 0x37, 0xc4, 0xed, 0x7a, 0xed, 0x8e, 0xea, 0xc8, 0xcb, 0xdd, 0x30, 0xe1, + 0xc7, 0xa4, 0x06, 0xea, 0x9a, 0x5a, 0xd5, 0xca, 0xaa, 0xf7, 0x02, 0x3c, 0xed, 0x93, 0x01, 0x85, + 0x68, 0x2e, 0x82, 0xec, 0x9e, 0x92, 0x94, 0x3f, 0x23, 0x41, 0xff, 0x55, 0x41, 0x79, 0x15, 0x3b, + 0xe8, 0x22, 0x80, 0xdb, 0x93, 0x58, 0x36, 0x47, 0x26, 0xc3, 0x7d, 0x4d, 0xba, 0x38, 0x8a, 0x0f, + 0x1c, 0x9d, 0xa7, 0x8a, 0x68, 0x1a, 0x36, 0x7f, 0xff, 0x12, 0x81, 0xea, 0x02, 0xa3, 0x07, 0x00, + 0x51, 0x0b, 0x57, 0xbc, 0x66, 0x38, 0x9a, 0x5e, 0x29, 0x9a, 0xc6, 0x75, 0xfe, 0x58, 0x30, 0xae, + 0xa4, 0x69, 0xcb, 0x55, 0xda, 0xb0, 0x42, 0xea, 0x09, 0xd3, 0x29, 0x97, 0x0a, 0xd9, 0x4d, 0xd4, + 0x72, 0xd9, 0xc2, 0xb6, 0xcd, 0x8d, 0x98, 0x28, 0xa2, 0x8b, 0xd0, 0x6b, 0xd6, 0x37, 0x8a, 0xc2, + 0x62, 0xf4, 0x9d, 0x39, 0xda, 0x6c, 0xfd, 0x0b, 0xfd, 0xe0, 0x16, 0xa0, 0xc7, 0xac, 0x6f, 0x10, + 0x6d, 0xb9, 0x0b, 0xfa, 0x9b, 0x30, 0xd3, 0x77, 0xcd, 0xe3, 0x83, 0x3e, 0x5f, 0xe7, 0x23, 0x28, + 0x9a, 0x96, 0x66, 0x58, 0x9a, 0xb3, 0x4b, 0x6f, 0xaf, 0xc4, 0x95, 0xb4, 0x68, 0x58, 0xe1, 0xf5, + 0xf2, 0x36, 0x0c, 0xad, 0x52, 0x57, 0xcb, 0xe3, 0xfc, 0xac, 0xc7, 0x9f, 0x14, 0xcd, 0x5f, 0x4b, + 0xce, 0x62, 0x0d, 0x9c, 0xe5, 0x9f, 0x6a, 0xa9, 0x9d, 0xe7, 0x3b, 0xd7, 0xce, 0xe0, 0xe6, 0xff, + 0x97, 0x87, 0x03, 0x8b, 0x93, 0x7b, 0xd6, 0x3e, 0xf3, 0xd5, 0xae, 0x62, 0x46, 0x45, 0x18, 0xd9, + 0xbd, 0x37, 0xd5, 0x6c, 0x84, 0x19, 0xcd, 0x46, 0x2e, 0x21, 0xf9, 0x51, 0x18, 0x58, 0x51, 0x2d, + 0x67, 0x15, 0x3b, 0x57, 0xb0, 0x5a, 0xc6, 0x56, 0x70, 0xd7, 0x1d, 0x10, 0xbb, 0x2e, 0x82, 0x04, + 0xdd, 0x5a, 0xd9, 0xae, 0x43, 0xff, 0x97, 0xb7, 0x20, 0x41, 0x6f, 0xb0, 0xb9, 0x3b, 0x32, 0xc7, + 0x60, 0x3b, 0x32, 0xb1, 0xa5, 0xbb, 0x0e, 0xb6, 0x45, 0x40, 0x47, 0x0b, 0xe8, 0x11, 0xb1, 0xaf, + 0xc6, 0xf7, 0xde, 0x57, 0xb9, 0x22, 0xf2, 0xdd, 0xb5, 0x0a, 0xbd, 0x79, 0x62, 0x8a, 0xe7, 0x67, + 0x5d, 0x46, 0x24, 0x8f, 0x11, 0xb4, 0x08, 0x43, 0xa6, 0x6a, 0x39, 0xf4, 0xea, 0xfe, 0x16, 0x1d, + 0x05, 0xd7, 0xf5, 0xf1, 0xc6, 0x95, 0x17, 0x18, 0x2c, 0xef, 0x65, 0xc0, 0xf4, 0x57, 0xca, 0xdf, + 0x49, 0x40, 0x0f, 0x17, 0xc6, 0x63, 0xd0, 0xcb, 0xc5, 0xca, 0xb5, 0xf3, 0xd8, 0x64, 0xe3, 0xc6, + 0x34, 0xe9, 0x6e, 0x20, 0x9c, 0x9e, 0xc0, 0x41, 0xc7, 0x21, 0x59, 0xda, 0x52, 0x35, 0xbd, 0xa8, + 0x95, 0x85, 0xd7, 0xfb, 0xea, 0xad, 0xf1, 0xde, 0x19, 0x52, 0x37, 0x3f, 0xab, 0xf4, 0xd2, 0xc6, + 0xf9, 0x32, 0xf1, 0x04, 0xb6, 0xb0, 0x56, 0xd9, 0x72, 0xf8, 0x0a, 0xe3, 0x25, 0x74, 0x01, 0x12, + 0x44, 0x21, 0xf8, 0xcb, 0xae, 0x6c, 0x43, 0xec, 0xe1, 0x06, 0x80, 0xf9, 0x24, 0xe9, 0xf8, 0x7d, + 0xdf, 0x18, 0x97, 0x14, 0x8a, 0x81, 0x66, 0x60, 0xa0, 0xaa, 0xda, 0x4e, 0x91, 0xee, 0x60, 0xa4, + 0xfb, 0x6e, 0x4a, 0xe2, 0x70, 0xa3, 0x40, 0xb8, 0x60, 0x39, 0xeb, 0x7d, 0x04, 0x8b, 0x55, 0x95, + 0xd1, 0x49, 0x48, 0x53, 0x22, 0x25, 0xa3, 0x56, 0xd3, 0x1c, 0xe6, 0x5b, 0xf5, 0x50, 0xb9, 0x0f, + 0x92, 0xfa, 0x19, 0x5a, 0x4d, 0x3d, 0xac, 0x23, 0x90, 0xa2, 0x4f, 0x49, 0x28, 0x08, 0xbb, 0x36, + 0x99, 0x24, 0x15, 0xb4, 0xf1, 0x04, 0x0c, 0x79, 0xf6, 0x91, 0x81, 0x24, 0x19, 0x15, 0xaf, 0x9a, + 0x02, 0x3e, 0x08, 0xa3, 0x3a, 0xde, 0xa1, 0x17, 0x39, 0x03, 0xd0, 0x29, 0x0a, 0x8d, 0x48, 0xdb, + 0xd5, 0x20, 0xc6, 0xbd, 0x30, 0x58, 0x12, 0xc2, 0x67, 0xb0, 0x40, 0x61, 0x07, 0xdc, 0x5a, 0x0a, + 0x76, 0x18, 0x92, 0xaa, 0x69, 0x32, 0x80, 0x3e, 0x6e, 0x1f, 0x4d, 0x93, 0x36, 0x9d, 0x82, 0x61, + 0x3a, 0x46, 0x0b, 0xdb, 0xf5, 0xaa, 0xc3, 0x89, 0xf4, 0x53, 0x98, 0x21, 0xd2, 0xa0, 0xb0, 0x7a, + 0x0a, 0x7b, 0x37, 0x0c, 0xe0, 0x6b, 0x5a, 0x19, 0xeb, 0x25, 0xcc, 0xe0, 0x06, 0x28, 0x5c, 0xbf, + 0xa8, 0xa4, 0x40, 0xf7, 0x81, 0x6b, 0xf7, 0x8a, 0xc2, 0x26, 0x0f, 0x32, 0x7a, 0xa2, 0x3e, 0xc7, + 0xaa, 0xe5, 0x0c, 0x24, 0x66, 0x55, 0x47, 0x25, 0x0e, 0x86, 0xb3, 0xc3, 0x36, 0x9a, 0x7e, 0x85, + 0xfc, 0x2b, 0x7f, 0x37, 0x06, 0x89, 0xab, 0x86, 0x83, 0xd1, 0xc3, 0x3e, 0x07, 0x70, 0xb0, 0x99, + 0x3e, 0xaf, 0x6a, 0x15, 0x1d, 0x97, 0x17, 0xed, 0x8a, 0xef, 0x3d, 0xb7, 0xa7, 0x4e, 0xb1, 0x80, + 0x3a, 0x8d, 0x42, 0xb7, 0x65, 0xd4, 0xf5, 0xb2, 0xb8, 0x71, 0x48, 0x0b, 0xa8, 0x00, 0x49, 0x57, + 0x4b, 0x12, 0x51, 0x5a, 0x32, 0x44, 0xb4, 0x84, 0xe8, 0x30, 0xaf, 0x50, 0x7a, 0x37, 0xb8, 0xb2, + 0xe4, 0x21, 0xe5, 0x1a, 0x2f, 0xae, 0x6d, 0xed, 0x29, 0xac, 0x87, 0x46, 0x36, 0x13, 0x77, 0xee, + 0x5d, 0xe1, 0x31, 0x8d, 0x4b, 0xbb, 0x0d, 0x5c, 0x7a, 0x01, 0xb5, 0xe2, 0x6f, 0xcb, 0x7b, 0xe9, + 0xb8, 0x3c, 0xb5, 0x62, 0xef, 0xcb, 0x8f, 0x42, 0xca, 0xd6, 0x2a, 0xba, 0xea, 0xd4, 0x2d, 0xcc, + 0x35, 0xcf, 0xab, 0x90, 0xbf, 0x20, 0x41, 0x0f, 0xd3, 0x64, 0x9f, 0xdc, 0xa4, 0xe6, 0x72, 0x8b, + 0xb5, 0x92, 0x5b, 0x7c, 0xff, 0x72, 0xcb, 0x01, 0xb8, 0xcc, 0xd8, 0xfc, 0x6d, 0x70, 0x13, 0x8f, + 0x81, 0xb1, 0xb8, 0xaa, 0x55, 0xf8, 0x42, 0xf5, 0x21, 0xc9, 0xff, 0x51, 0x22, 0x4e, 0x2c, 0x6f, + 0x47, 0x39, 0x18, 0x10, 0x7c, 0x15, 0x37, 0xab, 0x6a, 0x85, 0xeb, 0xce, 0xb1, 0x96, 0xcc, 0x5d, + 0xae, 0xaa, 0x15, 0xa5, 0x8f, 0xf3, 0x43, 0x0a, 0xcd, 0xe7, 0x21, 0xd6, 0x62, 0x1e, 0x02, 0x13, + 0x1f, 0xdf, 0xdf, 0xc4, 0x07, 0xa6, 0x28, 0x11, 0x9e, 0xa2, 0xcf, 0xc6, 0x68, 0x30, 0x63, 0x1a, + 0xb6, 0x5a, 0x7d, 0x23, 0x56, 0xc4, 0x11, 0x48, 0x99, 0x46, 0xb5, 0xc8, 0x5a, 0xd8, 0x4d, 0xdc, + 0xa4, 0x69, 0x54, 0x95, 0x86, 0x69, 0xef, 0xbe, 0x4d, 0xcb, 0xa5, 0xe7, 0x36, 0x48, 0xad, 0x37, + 0x2c, 0x35, 0x0b, 0xfa, 0x99, 0x28, 0xf8, 0x5e, 0xf6, 0x20, 0x91, 0x01, 0xdd, 0x1c, 0xa5, 0xc6, + 0xbd, 0x97, 0xb1, 0xcd, 0x20, 0x15, 0x0e, 0x47, 0x30, 0x98, 0xe9, 0x6f, 0x16, 0x05, 0xfb, 0xd5, + 0x52, 0xe1, 0x70, 0xf2, 0xaf, 0x49, 0x00, 0x0b, 0x44, 0xb2, 0x74, 0xbc, 0x64, 0x17, 0xb2, 0x29, + 0x0b, 0xc5, 0x40, 0xcf, 0x63, 0xad, 0x26, 0x8d, 0xf7, 0xdf, 0x6f, 0xfb, 0xf9, 0x9e, 0x81, 0x01, + 0x4f, 0x19, 0x6d, 0x2c, 0x98, 0x19, 0xdb, 0xc3, 0xab, 0x5e, 0xc5, 0x8e, 0xd2, 0x7f, 0xcd, 0x57, + 0x92, 0xff, 0x50, 0x82, 0x14, 0xe5, 0x69, 0x11, 0x3b, 0x6a, 0x60, 0x0e, 0xa5, 0xfd, 0xcf, 0xe1, + 0x31, 0x00, 0x46, 0xc6, 0xd6, 0x6e, 0x60, 0xae, 0x59, 0x29, 0x5a, 0xb3, 0xaa, 0xdd, 0xc0, 0xe8, + 0x9c, 0x2b, 0xf0, 0xf8, 0xde, 0x02, 0x17, 0x5e, 0x37, 0x17, 0xfb, 0x21, 0xe8, 0xa5, 0x9f, 0xc8, + 0xd9, 0xb1, 0xb9, 0x23, 0xdd, 0xa3, 0xd7, 0x6b, 0x6b, 0x3b, 0xb6, 0xfc, 0x1c, 0xf4, 0xae, 0xed, + 0xb0, 0xdc, 0xc8, 0x11, 0x48, 0x59, 0x86, 0xc1, 0xf7, 0x64, 0xe6, 0x0b, 0x25, 0x49, 0x05, 0xdd, + 0x82, 0x44, 0x3e, 0x20, 0xe6, 0xe5, 0x03, 0xbc, 0x84, 0x46, 0xbc, 0xad, 0x84, 0xc6, 0xa9, 0xaf, + 0x49, 0xd0, 0xe7, 0xb3, 0x0f, 0xe8, 0x21, 0x38, 0x90, 0x5f, 0x58, 0x9e, 0x79, 0xb2, 0x38, 0x3f, + 0x5b, 0xbc, 0xbc, 0x90, 0x9b, 0xf3, 0xde, 0x9a, 0x64, 0x0f, 0xbe, 0x74, 0x73, 0x02, 0xf9, 0x60, + 0xd7, 0xf5, 0x6d, 0xdd, 0xb8, 0xae, 0xa3, 0x29, 0x18, 0x0d, 0xa2, 0xe4, 0xf2, 0xab, 0x85, 0xa5, + 0xb5, 0xb4, 0x94, 0x3d, 0xf0, 0xd2, 0xcd, 0x89, 0x61, 0x1f, 0x46, 0x6e, 0xc3, 0xc6, 0xba, 0xd3, + 0x88, 0x30, 0xb3, 0xbc, 0xb8, 0x38, 0xbf, 0x96, 0x8e, 0x35, 0x20, 0x70, 0x83, 0x7d, 0x1f, 0x0c, + 0x07, 0x11, 0x96, 0xe6, 0x17, 0xd2, 0xf1, 0x2c, 0x7a, 0xe9, 0xe6, 0xc4, 0xa0, 0x0f, 0x7a, 0x49, + 0xab, 0x66, 0x93, 0x2f, 0x7e, 0x7c, 0xac, 0xeb, 0x53, 0x9f, 0x18, 0x93, 0xc8, 0xc8, 0x06, 0x02, + 0x36, 0x02, 0x3d, 0x00, 0x87, 0x56, 0xe7, 0xe7, 0x96, 0x0a, 0xb3, 0xc5, 0xc5, 0xd5, 0xb9, 0x22, + 0xfb, 0xc8, 0x86, 0x3b, 0xba, 0xa1, 0x97, 0x6e, 0x4e, 0xf4, 0xf1, 0x21, 0xb5, 0x82, 0x5e, 0x51, + 0x0a, 0x57, 0x97, 0xd7, 0x0a, 0x69, 0x89, 0x41, 0xaf, 0x58, 0xf8, 0x9a, 0xe1, 0xb0, 0x6f, 0x68, + 0x3d, 0x08, 0x87, 0x9b, 0x40, 0xbb, 0x03, 0x1b, 0x7e, 0xe9, 0xe6, 0xc4, 0xc0, 0x8a, 0x85, 0xd9, + 0xfa, 0xa1, 0x18, 0x93, 0x90, 0x69, 0xc4, 0x58, 0x5e, 0x59, 0x5e, 0xcd, 0x2d, 0xa4, 0x27, 0xb2, + 0xe9, 0x97, 0x6e, 0x4e, 0xf4, 0x0b, 0x63, 0x48, 0xe0, 0xbd, 0x91, 0xdd, 0xc9, 0x88, 0xe7, 0x3b, + 0x53, 0x70, 0xcc, 0x76, 0xd4, 0x6d, 0x4d, 0xaf, 0xb8, 0x19, 0x67, 0x5e, 0xe6, 0x21, 0xcf, 0xb1, + 0xaa, 0xf6, 0x7c, 0x5d, 0x2b, 0x8b, 0x4a, 0xf1, 0x77, 0xcf, 0xf4, 0x73, 0xb6, 0xf5, 0xc9, 0x52, + 0x36, 0x22, 0xbb, 0x1a, 0x1d, 0x3a, 0xb5, 0x3e, 0xaa, 0xc8, 0x46, 0x24, 0xd0, 0xb3, 0x7b, 0x06, + 0x77, 0xf2, 0xfb, 0x24, 0x18, 0xbc, 0xa2, 0xd9, 0x8e, 0x61, 0x69, 0x25, 0xb5, 0x4a, 0x5f, 0x98, + 0x9c, 0x6b, 0xd7, 0xb6, 0x86, 0x96, 0xfa, 0x65, 0xe8, 0xb9, 0xa6, 0x56, 0x99, 0x51, 0x63, 0x8f, + 0x78, 0xf6, 0x94, 0xa2, 0x67, 0xe1, 0x04, 0x1d, 0x86, 0x2d, 0xff, 0x4e, 0x0c, 0x86, 0xe8, 0x9a, + 0xb0, 0xd9, 0x97, 0x90, 0x48, 0xa8, 0x95, 0x87, 0x84, 0xa5, 0x3a, 0x3c, 0x77, 0x98, 0x9f, 0xe4, + 0xf9, 0xf0, 0xe3, 0xd1, 0x39, 0xee, 0xc9, 0x59, 0x5c, 0x52, 0x28, 0x2e, 0xfa, 0xff, 0x20, 0x59, + 0x53, 0x77, 0x8a, 0x94, 0x0e, 0x0b, 0x60, 0x72, 0x9d, 0xd1, 0x79, 0xed, 0xd6, 0xf8, 0xd0, 0xae, + 0x5a, 0xab, 0x4e, 0xcb, 0x82, 0x8e, 0xac, 0xf4, 0xd6, 0xd4, 0x1d, 0xc2, 0x22, 0x32, 0x61, 0x88, + 0xd4, 0x96, 0xb6, 0x54, 0xbd, 0x82, 0x59, 0x27, 0x34, 0x13, 0x9a, 0xbf, 0xd2, 0x71, 0x27, 0x07, + 0xbd, 0x4e, 0x7c, 0xe4, 0x64, 0x65, 0xa0, 0xa6, 0xee, 0xcc, 0xd0, 0x0a, 0xd2, 0xe3, 0x74, 0xf2, + 0x83, 0x1f, 0x1d, 0xef, 0xa2, 0x67, 0x0c, 0x5f, 0x97, 0x00, 0x3c, 0x89, 0xa1, 0x12, 0xa4, 0x4b, + 0x6e, 0x89, 0xe2, 0xda, 0x7c, 0x2a, 0x27, 0x23, 0xa6, 0x24, 0x24, 0x76, 0xb6, 0x53, 0x7f, 0xe5, + 0xd6, 0xb8, 0xa4, 0x0c, 0x95, 0x42, 0x33, 0xf2, 0x33, 0xd0, 0x57, 0x37, 0xcb, 0xaa, 0x83, 0x8b, + 0x34, 0xaa, 0x8b, 0x45, 0xee, 0xfa, 0x63, 0x84, 0xd6, 0x6b, 0xb7, 0xc6, 0x11, 0x1b, 0x9d, 0x0f, + 0x59, 0xa6, 0xbe, 0x00, 0xb0, 0x1a, 0x82, 0xe0, 0x1b, 0xda, 0x1f, 0x4b, 0xd0, 0x37, 0xeb, 0xbb, + 0xf7, 0x95, 0x81, 0xde, 0x9a, 0xa1, 0x6b, 0xdb, 0x5c, 0x3b, 0x53, 0x8a, 0x28, 0xa2, 0x2c, 0x24, + 0xd9, 0x13, 0x3c, 0x67, 0x57, 0x24, 0x46, 0x45, 0x99, 0x60, 0x5d, 0xc7, 0x1b, 0xb6, 0x26, 0x26, + 0x45, 0x11, 0x45, 0x74, 0x19, 0xd2, 0x36, 0x2e, 0xd5, 0x2d, 0xcd, 0xd9, 0x2d, 0x96, 0x0c, 0xdd, + 0x51, 0x4b, 0x0e, 0x7b, 0xcc, 0x95, 0x3f, 0xf2, 0xda, 0xad, 0xf1, 0x43, 0x8c, 0xd7, 0x30, 0x84, + 0xac, 0x0c, 0x89, 0xaa, 0x19, 0x56, 0x43, 0x7a, 0x28, 0x63, 0x47, 0xd5, 0xaa, 0x76, 0x86, 0x9d, + 0x9a, 0x89, 0xa2, 0x6f, 0x2c, 0x5f, 0xec, 0xf5, 0xa7, 0xb9, 0x2e, 0x43, 0xda, 0x30, 0xb1, 0x15, + 0x70, 0x4b, 0xa5, 0x70, 0xcf, 0x61, 0x08, 0x59, 0x19, 0x12, 0x55, 0xc2, 0x65, 0x75, 0xc8, 0x6c, + 0x8b, 0xb0, 0xd1, 0xac, 0x6f, 0x78, 0xd9, 0xb1, 0xd1, 0x86, 0xd9, 0xc8, 0xe9, 0xbb, 0xf9, 0x87, + 0x3d, 0xea, 0x61, 0x3c, 0xf9, 0xcb, 0x9f, 0x3b, 0x3d, 0xca, 0x8d, 0x8b, 0x97, 0xad, 0x7a, 0x12, + 0xef, 0x92, 0xe9, 0xe7, 0xa0, 0x2b, 0x14, 0x92, 0x38, 0xa1, 0xcf, 0xa9, 0x5a, 0x55, 0x3c, 0x4a, + 0x56, 0x78, 0x09, 0xe5, 0xa0, 0xc7, 0x76, 0x54, 0xa7, 0x6e, 0xf3, 0x4f, 0x80, 0xdd, 0x17, 0xa1, + 0x71, 0x79, 0x43, 0x2f, 0xaf, 0x52, 0x04, 0x85, 0x23, 0x12, 0x3b, 0xe2, 0x18, 0xdb, 0x58, 0xe7, + 0x92, 0xec, 0x68, 0xb5, 0xd3, 0xb3, 0x3c, 0x86, 0x4d, 0x04, 0x53, 0xc6, 0x55, 0x5c, 0x61, 0xbe, + 0xd6, 0x96, 0x4a, 0x42, 0x12, 0xfa, 0x41, 0xb0, 0xfc, 0x7c, 0xc7, 0x4b, 0x92, 0x0b, 0x2c, 0x4c, + 0x4f, 0x56, 0x86, 0xdc, 0xaa, 0x55, 0x5a, 0x83, 0x94, 0xc0, 0x3d, 0x45, 0xfe, 0xd5, 0xbc, 0x53, + 0x11, 0x52, 0xf0, 0x69, 0xb8, 0xc8, 0x5d, 0xf8, 0x2f, 0x3b, 0x5e, 0x86, 0x74, 0x5d, 0xdf, 0x30, + 0x74, 0xfa, 0x8e, 0x90, 0xfb, 0xfe, 0x24, 0xf6, 0x8b, 0xfb, 0x55, 0x25, 0x0c, 0x21, 0x2b, 0x43, + 0x6e, 0xd5, 0x15, 0x16, 0x21, 0x94, 0x61, 0xd0, 0x83, 0xa2, 0xcb, 0x36, 0x15, 0xb9, 0x6c, 0xef, + 0xe2, 0xcb, 0xf6, 0x40, 0xb8, 0x17, 0x6f, 0xe5, 0x0e, 0xb8, 0x95, 0x04, 0x0d, 0x2d, 0x03, 0x78, + 0xc6, 0x82, 0xe6, 0x30, 0xfa, 0x22, 0xd5, 0xc0, 0x33, 0x3c, 0x22, 0x24, 0xf4, 0x48, 0xa0, 0xb7, + 0xc3, 0x48, 0x4d, 0xd3, 0x8b, 0x36, 0xae, 0x6e, 0x16, 0xb9, 0xb8, 0x09, 0x65, 0xfa, 0x39, 0x98, + 0xfc, 0x42, 0x67, 0xda, 0xf1, 0xda, 0xad, 0xf1, 0x2c, 0x37, 0xaf, 0x8d, 0x24, 0x65, 0x65, 0xb8, + 0xa6, 0xe9, 0xab, 0xb8, 0xba, 0x39, 0xeb, 0xd6, 0x4d, 0xf7, 0xbf, 0xf8, 0xd1, 0xf1, 0x2e, 0xbe, + 0x86, 0xbb, 0xe4, 0x73, 0x34, 0xbd, 0xce, 0xd7, 0x1e, 0xb6, 0x49, 0xd8, 0xa2, 0x8a, 0x02, 0x4d, + 0x7a, 0xa4, 0x14, 0xaf, 0x82, 0xad, 0xfd, 0x17, 0xfe, 0xc3, 0x84, 0x24, 0xff, 0x96, 0x04, 0x3d, + 0xb3, 0x57, 0x57, 0x54, 0xcd, 0x42, 0xf3, 0x30, 0xec, 0xe9, 0x51, 0x70, 0xe5, 0x1f, 0x7d, 0xed, + 0xd6, 0x78, 0x26, 0xac, 0x6a, 0xee, 0xd2, 0xf7, 0xd4, 0x59, 0xac, 0xfd, 0xf9, 0x56, 0xb1, 0x6d, + 0x80, 0x54, 0x03, 0x88, 0xdc, 0x18, 0xf9, 0x86, 0x86, 0xb9, 0x00, 0xbd, 0x8c, 0x5b, 0xfa, 0xf1, + 0x0b, 0x93, 0xfc, 0xc3, 0xcf, 0x0e, 0xee, 0x8d, 0x52, 0x65, 0x8a, 0xe6, 0xa6, 0x3c, 0x09, 0xa6, + 0xfc, 0xfe, 0x18, 0xc0, 0xec, 0xd5, 0xab, 0x6b, 0x96, 0x66, 0x56, 0xb1, 0x73, 0x3b, 0x05, 0xb0, + 0x06, 0x07, 0x7c, 0xf1, 0x94, 0x55, 0x0a, 0x09, 0x61, 0xe2, 0xb5, 0x5b, 0xe3, 0x47, 0xc3, 0x42, + 0xf0, 0x81, 0xc9, 0xca, 0x88, 0x17, 0x59, 0x59, 0xa5, 0xa6, 0x54, 0xcb, 0xb6, 0xe3, 0x52, 0x8d, + 0xb7, 0xa6, 0xea, 0x03, 0xf3, 0x53, 0x9d, 0xb5, 0x9d, 0xe6, 0x12, 0x7e, 0x16, 0xfa, 0x3c, 0x91, + 0xd8, 0xe8, 0x49, 0x48, 0x3a, 0xfc, 0x7f, 0x2e, 0xe8, 0xfb, 0x22, 0x05, 0x2d, 0xb0, 0xb9, 0xb0, + 0x5d, 0x02, 0xf2, 0x5f, 0x49, 0x00, 0x9e, 0x06, 0xff, 0x74, 0x2a, 0x1c, 0x31, 0xf3, 0xdc, 0x28, + 0xc7, 0xf7, 0xe5, 0xd4, 0x71, 0xec, 0x90, 0x58, 0x3f, 0x10, 0x83, 0x91, 0x75, 0x61, 0x8e, 0x7e, + 0xea, 0x65, 0xf0, 0x34, 0xf4, 0x62, 0xdd, 0xb1, 0x34, 0x2a, 0x04, 0x32, 0xe9, 0xe7, 0x23, 0x26, + 0xbd, 0xc9, 0xd0, 0xe8, 0x47, 0x72, 0x44, 0xb2, 0x9e, 0x53, 0x0b, 0x09, 0xe5, 0xbd, 0x71, 0xc8, + 0xb4, 0xc2, 0x44, 0x33, 0x30, 0x54, 0xb2, 0x30, 0xad, 0x28, 0xfa, 0x33, 0x86, 0xf9, 0xac, 0xe7, + 0x8a, 0x86, 0x00, 0x64, 0x65, 0x50, 0xd4, 0xf0, 0x9d, 0xa5, 0x02, 0xc4, 0x41, 0x24, 0xda, 0x47, + 0xa0, 0xda, 0xf4, 0x08, 0x65, 0xbe, 0xb5, 0x88, 0x4e, 0x82, 0x04, 0xd8, 0xde, 0x32, 0xe8, 0xd5, + 0xd2, 0xcd, 0xe5, 0x79, 0x18, 0xd2, 0x74, 0xcd, 0xd1, 0xd4, 0x6a, 0x71, 0x43, 0xad, 0xaa, 0x7a, + 0x69, 0x3f, 0x6e, 0x36, 0xdb, 0x07, 0x78, 0xb7, 0x21, 0x72, 0xb2, 0x32, 0xc8, 0x6b, 0xf2, 0xac, + 0x02, 0x5d, 0x81, 0x5e, 0xd1, 0x55, 0x62, 0x5f, 0x0e, 0x89, 0x40, 0xf7, 0xb9, 0x82, 0xef, 0x89, + 0xc3, 0xb0, 0x82, 0xcb, 0xff, 0x6f, 0x2a, 0x3a, 0x9b, 0x8a, 0x45, 0x00, 0xb6, 0xea, 0x89, 0xb9, + 0xdd, 0xc7, 0x6c, 0x10, 0xbb, 0x91, 0x62, 0x14, 0x66, 0x6d, 0xc7, 0x37, 0x1f, 0xff, 0x29, 0x06, + 0xfd, 0xfe, 0xf9, 0xf8, 0x5b, 0xba, 0x47, 0xa1, 0x15, 0xcf, 0x20, 0xb1, 0xec, 0xfd, 0x83, 0x11, + 0x06, 0xa9, 0x41, 0x89, 0xf7, 0xb6, 0x44, 0xaf, 0xc5, 0xa0, 0x67, 0x45, 0xb5, 0xd4, 0x9a, 0x8d, + 0x9e, 0x68, 0x70, 0x46, 0x45, 0xf6, 0xb2, 0xe1, 0xfb, 0xd0, 0x3c, 0x59, 0xc2, 0xc2, 0xd1, 0x0f, + 0x36, 0x71, 0x39, 0xef, 0x85, 0x41, 0x12, 0x2d, 0xfb, 0x2e, 0x3a, 0xc4, 0xe8, 0xf1, 0x2d, 0x89, + 0x98, 0xbd, 0x53, 0x36, 0x34, 0x0e, 0x7d, 0x04, 0xcc, 0x33, 0xb9, 0x04, 0x06, 0x6a, 0xea, 0x4e, + 0x81, 0xd5, 0xa0, 0xd3, 0x80, 0xb6, 0xdc, 0x64, 0x48, 0xd1, 0x93, 0x04, 0x81, 0x1b, 0xf6, 0x5a, + 0x04, 0xf8, 0x31, 0x00, 0xc2, 0x45, 0x91, 0xdd, 0x10, 0x64, 0x71, 0x5f, 0x8a, 0xd4, 0xcc, 0xd2, + 0x5b, 0x82, 0xdc, 0x6f, 0x0d, 0xc5, 0xe2, 0x3c, 0x06, 0x59, 0xe8, 0x38, 0x06, 0xf1, 0xf9, 0xad, + 0x21, 0x92, 0xcc, 0x6f, 0x0d, 0x06, 0xef, 0x3e, 0xe5, 0x7e, 0x45, 0x02, 0xe4, 0x59, 0x7d, 0x05, + 0xdb, 0x26, 0x09, 0xe6, 0x88, 0x9f, 0xee, 0xf3, 0xa6, 0xa5, 0xb6, 0xfc, 0x74, 0x8f, 0x8c, 0xf0, + 0xd3, 0x7d, 0x6b, 0xe6, 0x51, 0xcf, 0x50, 0xc6, 0xf8, 0x54, 0x36, 0xb9, 0xbc, 0x39, 0x39, 0x63, + 0x68, 0x02, 0xbb, 0xc1, 0x32, 0x76, 0xc9, 0x7f, 0x26, 0xc1, 0xe1, 0x06, 0xa5, 0x72, 0x79, 0xc6, + 0x80, 0x2c, 0x5f, 0x23, 0xff, 0x62, 0x1c, 0xe3, 0x7d, 0xbf, 0xaa, 0x3a, 0x6c, 0x35, 0x18, 0xe2, + 0xdb, 0x67, 0xf2, 0xd9, 0x25, 0xd0, 0x7f, 0x25, 0xc1, 0xa8, 0xbf, 0x7b, 0x77, 0x3c, 0xeb, 0xd0, + 0xef, 0xef, 0x9d, 0x8f, 0xe4, 0xfe, 0x0e, 0x46, 0xc2, 0x07, 0x11, 0x20, 0x83, 0x9e, 0xf1, 0x96, + 0x31, 0xcb, 0xc5, 0x5d, 0xe8, 0x54, 0x36, 0x82, 0xc3, 0xf0, 0x72, 0x4e, 0xd0, 0x49, 0xfa, 0x3f, + 0x12, 0x24, 0x56, 0x0c, 0xa3, 0x8a, 0x0c, 0x18, 0xd6, 0x0d, 0xa7, 0x48, 0x74, 0x1e, 0x97, 0x8b, + 0x3c, 0x6c, 0x67, 0x66, 0x72, 0xa6, 0x33, 0x91, 0x7d, 0xef, 0xd6, 0x78, 0x23, 0x29, 0x65, 0x48, + 0x37, 0x9c, 0x3c, 0xad, 0x59, 0x63, 0x41, 0xfd, 0xdb, 0x61, 0x20, 0xd8, 0x19, 0x33, 0xa2, 0x4f, + 0x77, 0xdc, 0x59, 0x90, 0xcc, 0x6b, 0xb7, 0xc6, 0x47, 0xd9, 0xf2, 0x0a, 0x54, 0xcb, 0x4a, 0xff, + 0x86, 0xaf, 0x77, 0x76, 0x6b, 0xec, 0x07, 0x64, 0x46, 0xdf, 0x2d, 0xc1, 0x08, 0xad, 0xd4, 0x6e, + 0x60, 0x1a, 0xf9, 0x2b, 0xb8, 0x64, 0x58, 0x65, 0x34, 0x08, 0x31, 0x7e, 0x0e, 0x93, 0x50, 0x62, + 0x5a, 0x19, 0x8d, 0x42, 0xb7, 0x71, 0x5d, 0xe7, 0x97, 0x38, 0x52, 0x0a, 0x2b, 0x50, 0x7b, 0x65, + 0x94, 0xeb, 0x55, 0x5c, 0x54, 0x4b, 0x25, 0x7a, 0x8f, 0x98, 0xa5, 0xa5, 0x06, 0x58, 0x6d, 0x8e, + 0x55, 0x92, 0xe0, 0xd2, 0x35, 0x69, 0xfc, 0x13, 0x43, 0x5e, 0x05, 0x53, 0xad, 0x53, 0x9f, 0x97, + 0x00, 0xbc, 0x24, 0x0a, 0x7a, 0x00, 0x0e, 0xe5, 0x97, 0x97, 0x66, 0x8b, 0xab, 0x6b, 0xb9, 0xb5, + 0xf5, 0xd5, 0xe2, 0xfa, 0xd2, 0xea, 0x4a, 0x61, 0x66, 0xfe, 0xf2, 0x7c, 0x61, 0xd6, 0x4b, 0xff, + 0xdb, 0x26, 0x2e, 0x69, 0x9b, 0x1a, 0x2e, 0xa3, 0xe3, 0x30, 0x1a, 0x84, 0x26, 0xa5, 0xc2, 0x6c, + 0x5a, 0xca, 0xf6, 0xbf, 0x74, 0x73, 0x22, 0xc9, 0x7c, 0x46, 0x5c, 0x46, 0x27, 0xe1, 0x40, 0x23, + 0xdc, 0xfc, 0xd2, 0x5c, 0x3a, 0x96, 0x1d, 0x78, 0xe9, 0xe6, 0x44, 0xca, 0x75, 0x2e, 0x91, 0x0c, + 0xc8, 0x0f, 0xc9, 0xe9, 0xc5, 0xb3, 0xf0, 0xd2, 0xcd, 0x89, 0x1e, 0x36, 0x93, 0xd9, 0xc4, 0x8b, + 0x1f, 0x1f, 0xeb, 0xca, 0xbf, 0xa5, 0x65, 0x82, 0xff, 0x92, 0x6f, 0x12, 0xb5, 0xe7, 0xab, 0x75, + 0x62, 0xd2, 0x34, 0xbd, 0x34, 0xc5, 0x54, 0x58, 0x73, 0x76, 0x4f, 0x73, 0xf5, 0x3d, 0xcd, 0xc4, + 0x35, 0xb5, 0x23, 0xd2, 0xf7, 0xa1, 0x44, 0xff, 0x9f, 0xde, 0x05, 0x99, 0x70, 0xa2, 0xdf, 0xd9, + 0x69, 0x2f, 0xc7, 0xbf, 0x47, 0x36, 0x3f, 0x32, 0x5b, 0xdf, 0xe2, 0x7c, 0x60, 0xff, 0x39, 0xfc, + 0xbd, 0x8f, 0x2b, 0xe4, 0x7f, 0x9f, 0x00, 0xb4, 0x68, 0x57, 0x66, 0x88, 0x23, 0xe8, 0xbb, 0x8e, + 0x16, 0x4a, 0x45, 0x49, 0xb7, 0x23, 0x15, 0xb5, 0x16, 0x48, 0xee, 0xc4, 0xf6, 0x95, 0x55, 0x6e, + 0x3b, 0xc3, 0x13, 0x7f, 0x43, 0x32, 0x3c, 0xcd, 0x7d, 0xbd, 0xc4, 0xed, 0x8b, 0x0d, 0xbb, 0xf7, + 0x1b, 0x1f, 0xf3, 0x6c, 0x6e, 0xcf, 0x1e, 0xd9, 0xdc, 0x4c, 0xcb, 0x94, 0x2d, 0xc7, 0x46, 0x67, + 0xc5, 0x63, 0xa4, 0xde, 0xf6, 0xf6, 0x64, 0xfe, 0x5a, 0x29, 0xf9, 0xa2, 0xd8, 0x91, 0x8f, 0x42, + 0xb6, 0x51, 0xb9, 0xc4, 0xfe, 0x20, 0xbf, 0x1c, 0x87, 0xf4, 0xa2, 0x5d, 0x29, 0x94, 0x35, 0xe7, + 0xce, 0x6a, 0xde, 0xa5, 0xd6, 0x61, 0x37, 0x7a, 0xed, 0xd6, 0xf8, 0x20, 0x13, 0xed, 0x1e, 0x02, + 0xad, 0xc1, 0x50, 0xd8, 0x15, 0x63, 0x0a, 0x36, 0xbb, 0x9f, 0xd3, 0x99, 0x06, 0x17, 0x6c, 0x30, + 0x78, 0x42, 0x82, 0x76, 0x9a, 0xeb, 0x34, 0xd3, 0xab, 0x2b, 0x77, 0x32, 0x63, 0xe9, 0x4d, 0x5d, + 0x16, 0x32, 0xe1, 0xb9, 0x71, 0x27, 0xee, 0x3b, 0x12, 0xf4, 0x2d, 0xda, 0x22, 0x1d, 0x80, 0x7f, + 0x4a, 0x33, 0x24, 0xe7, 0xdd, 0x97, 0x36, 0xf1, 0xf6, 0xd4, 0x57, 0xbc, 0xbe, 0xf1, 0x84, 0x70, + 0x00, 0x46, 0x7c, 0xe3, 0x74, 0xc7, 0xff, 0x27, 0x31, 0x6a, 0x34, 0xf3, 0xb8, 0xa2, 0xe9, 0xae, + 0xfb, 0x83, 0xff, 0xb6, 0x06, 0x7e, 0x9e, 0x9c, 0x13, 0xfb, 0x95, 0xf3, 0x36, 0xb5, 0x13, 0x21, + 0x79, 0xba, 0x9e, 0xee, 0x62, 0x63, 0x5a, 0x42, 0xea, 0xe0, 0xa6, 0x50, 0x28, 0xf9, 0x20, 0x7f, + 0x57, 0x82, 0x81, 0x45, 0xbb, 0xb2, 0xae, 0x97, 0xff, 0xc6, 0xeb, 0xef, 0x26, 0x1c, 0x08, 0x8c, + 0xf4, 0x4e, 0x89, 0xf4, 0x0f, 0x63, 0x30, 0xbc, 0x68, 0x57, 0x02, 0x5e, 0xad, 0xfd, 0x37, 0x4c, + 0xac, 0x64, 0xf5, 0x38, 0x7c, 0x80, 0x65, 0x76, 0x88, 0x57, 0x64, 0xfe, 0x79, 0x22, 0xbc, 0x7a, + 0x9a, 0x82, 0xc9, 0xca, 0x88, 0x5b, 0x4f, 0x05, 0xb4, 0x4c, 0x6a, 0x7d, 0x93, 0xb5, 0x06, 0x87, + 0x1b, 0x64, 0xe8, 0x4e, 0x98, 0xc7, 0xb5, 0xd4, 0x11, 0xd7, 0xf2, 0xa7, 0x24, 0x6a, 0xc8, 0xc9, + 0xb2, 0xc2, 0x35, 0x16, 0x8b, 0x6c, 0xba, 0x27, 0x8e, 0xb7, 0x71, 0x86, 0xce, 0x07, 0xde, 0x35, + 0xee, 0x4b, 0x5b, 0x65, 0x98, 0x68, 0xc5, 0xa9, 0x6b, 0x7a, 0x3f, 0x28, 0xc1, 0x18, 0x91, 0x92, + 0xa5, 0xea, 0xf6, 0x26, 0xb6, 0x9a, 0xc5, 0x51, 0xe7, 0x21, 0x23, 0x04, 0xcd, 0xe5, 0x6f, 0xd1, + 0x86, 0xa2, 0x1b, 0x5d, 0xb9, 0xf3, 0xe8, 0x43, 0x63, 0xd7, 0xcf, 0x6d, 0x7a, 0x5d, 0x85, 0x47, + 0x5c, 0xbc, 0x44, 0xbf, 0x5b, 0x8b, 0xaf, 0xf3, 0xc9, 0xe6, 0x8f, 0xfe, 0x75, 0x7c, 0x3d, 0x3c, + 0x7f, 0x27, 0xe1, 0xf8, 0xde, 0x9c, 0x89, 0x41, 0x9c, 0x79, 0x6f, 0x12, 0xe2, 0x8b, 0x76, 0x05, + 0xfd, 0x2c, 0x0c, 0x85, 0x1d, 0xef, 0x87, 0x22, 0x3c, 0x9d, 0x46, 0x77, 0x2a, 0xfb, 0x68, 0xc7, + 0x28, 0xae, 0x56, 0xed, 0xc2, 0x40, 0xd0, 0xfb, 0x9a, 0x8a, 0xa6, 0x15, 0x40, 0xc8, 0x9e, 0xef, + 0x10, 0xc1, 0xed, 0xfa, 0x39, 0x48, 0xba, 0xfe, 0xc3, 0xa9, 0x68, 0x22, 0x02, 0x36, 0x7b, 0xa6, + 0x7d, 0x58, 0xb7, 0xaf, 0x9f, 0x85, 0xa1, 0xf0, 0x5e, 0xdd, 0x86, 0x9c, 0x43, 0x28, 0xed, 0xc8, + 0xb9, 0xd5, 0x0e, 0x66, 0x02, 0xf8, 0xb6, 0x9b, 0x07, 0xa2, 0x09, 0x79, 0xd0, 0xd9, 0x47, 0x3a, + 0x81, 0x76, 0x7b, 0x7c, 0x3b, 0x0c, 0x86, 0xac, 0xf1, 0x83, 0xd1, 0x74, 0x82, 0x18, 0xd9, 0x0b, + 0x9d, 0x62, 0xb8, 0xbd, 0xbf, 0x28, 0xb1, 0x9c, 0xb8, 0x58, 0xc7, 0xa8, 0x0d, 0x35, 0x69, 0xba, + 0xee, 0xb3, 0x97, 0xf6, 0x89, 0xe8, 0xb2, 0xf2, 0x71, 0x09, 0x8e, 0xec, 0x65, 0x2d, 0x1e, 0x6b, + 0x63, 0x90, 0xad, 0xd1, 0xb3, 0x85, 0xd7, 0x85, 0xee, 0xa6, 0xca, 0xde, 0x80, 0x8c, 0xc6, 0x37, + 0x62, 0x70, 0xca, 0x9f, 0x2b, 0x78, 0xbe, 0x8e, 0xad, 0x5d, 0x37, 0x2b, 0x60, 0xaa, 0x15, 0x4d, + 0xf7, 0xbf, 0xda, 0x3e, 0xec, 0x37, 0xdf, 0x14, 0x56, 0x8c, 0x49, 0x7e, 0x51, 0x82, 0xbe, 0x15, + 0xb5, 0x82, 0x15, 0xfc, 0x7c, 0x1d, 0xdb, 0x4e, 0x93, 0x67, 0xc3, 0x07, 0xa1, 0xc7, 0xd8, 0xdc, + 0x14, 0x97, 0x94, 0x13, 0x0a, 0x2f, 0xa1, 0x51, 0xe8, 0xae, 0x6a, 0x35, 0x8d, 0x6d, 0xbd, 0x09, + 0x85, 0x15, 0xd0, 0x38, 0xf4, 0xd1, 0xa4, 0x55, 0x91, 0x3d, 0xb8, 0x4a, 0x88, 0x4f, 0xfa, 0xd5, + 0x75, 0x67, 0x8d, 0xbe, 0xba, 0xca, 0x40, 0xaf, 0x85, 0xaf, 0x61, 0xcb, 0x66, 0x9f, 0x35, 0x4f, + 0x2a, 0xa2, 0x28, 0x5f, 0x82, 0x7e, 0xc6, 0x09, 0x9f, 0xed, 0xc3, 0x90, 0xa4, 0x4f, 0x67, 0x3c, + 0x7e, 0x7a, 0x49, 0xf9, 0x49, 0xf6, 0xf8, 0x98, 0xd1, 0x67, 0x2c, 0xb1, 0x42, 0x3e, 0xdf, 0x52, + 0xf0, 0x27, 0xa3, 0x63, 0x2c, 0x26, 0x43, 0x57, 0xc2, 0x7f, 0xd4, 0x0d, 0x07, 0x78, 0x7e, 0x47, + 0x35, 0xb5, 0xa9, 0x2d, 0xc7, 0x11, 0x1f, 0xc8, 0x00, 0xee, 0x54, 0xa9, 0xa6, 0x26, 0xef, 0x42, + 0xe2, 0x8a, 0xe3, 0x98, 0xe8, 0x14, 0x74, 0x5b, 0xf5, 0x2a, 0x16, 0x67, 0xf6, 0x6e, 0x8c, 0xae, + 0x9a, 0xda, 0x24, 0x01, 0x50, 0xea, 0x55, 0xac, 0x30, 0x10, 0x54, 0x80, 0xf1, 0xcd, 0x7a, 0xb5, + 0xba, 0x5b, 0x2c, 0x63, 0xfa, 0xfb, 0xab, 0xee, 0x4f, 0x9d, 0xe1, 0x1d, 0x53, 0xd5, 0xdd, 0x7c, + 0x4a, 0x52, 0x39, 0x4a, 0xc1, 0x66, 0x29, 0x94, 0xf8, 0x99, 0xb3, 0x82, 0x80, 0x91, 0xff, 0x3c, + 0x06, 0x49, 0x41, 0x9a, 0xbe, 0x06, 0xc6, 0x55, 0x5c, 0x72, 0x0c, 0x71, 0x1f, 0xce, 0x2d, 0x23, + 0x04, 0xf1, 0x0a, 0x9f, 0xbc, 0xd4, 0x95, 0x2e, 0x85, 0x14, 0x48, 0x9d, 0xfb, 0x46, 0x9b, 0xd4, + 0x99, 0x75, 0x32, 0x9f, 0x09, 0xd3, 0x10, 0xc7, 0x69, 0x57, 0xba, 0x14, 0x5a, 0x42, 0x19, 0xe8, + 0x21, 0xf6, 0xc8, 0x61, 0xb3, 0x45, 0xea, 0x79, 0x19, 0x1d, 0x84, 0x6e, 0x53, 0x75, 0x4a, 0xec, + 0xf9, 0x14, 0x69, 0x60, 0x45, 0xe2, 0x3c, 0xb0, 0x8f, 0xff, 0x84, 0x7f, 0xdc, 0x90, 0x08, 0x83, + 0x7d, 0x65, 0x99, 0xf0, 0xbd, 0xa2, 0x3a, 0x0e, 0xb6, 0x74, 0x42, 0x90, 0x81, 0x23, 0x04, 0x89, + 0x0d, 0xa3, 0xbc, 0xcb, 0x7f, 0x70, 0x91, 0xfe, 0xcf, 0x7f, 0x0a, 0x8e, 0xea, 0x43, 0x91, 0x36, + 0xb2, 0xdf, 0x99, 0xed, 0x17, 0x95, 0x79, 0x02, 0x54, 0x80, 0x11, 0xb5, 0x5c, 0xd6, 0x88, 0xc2, + 0xab, 0xd5, 0xe2, 0x86, 0x46, 0x53, 0x90, 0x36, 0xfd, 0x15, 0xe1, 0x56, 0x73, 0x81, 0x3c, 0x84, + 0x3c, 0x87, 0xcf, 0xa7, 0xa0, 0xd7, 0x64, 0x4c, 0xc9, 0x17, 0x61, 0xb8, 0x81, 0x53, 0xc2, 0xdf, + 0xb6, 0xa6, 0x97, 0xc5, 0xc3, 0x75, 0xf2, 0x3f, 0xa9, 0xa3, 0x5f, 0x4a, 0x67, 0x4e, 0x06, 0xfd, + 0x3f, 0xff, 0xce, 0xd6, 0x9f, 0x35, 0x18, 0xf4, 0x7d, 0xd6, 0x40, 0x35, 0xb5, 0x7c, 0x8a, 0xd2, + 0xe7, 0x5f, 0x33, 0xc8, 0xf1, 0x06, 0xf6, 0x25, 0x83, 0x49, 0xc3, 0xaa, 0x4c, 0x55, 0xb0, 0x2e, + 0xf2, 0x87, 0xa4, 0x49, 0x35, 0x35, 0x9b, 0xaa, 0xa3, 0xf7, 0xe5, 0x76, 0xfb, 0xa2, 0xef, 0x7f, + 0xfa, 0x91, 0x83, 0xc4, 0x5c, 0x6e, 0x65, 0xde, 0xd5, 0xe3, 0x2f, 0xc6, 0xe0, 0xa8, 0x4f, 0x8f, + 0x7d, 0xc0, 0x8d, 0xea, 0x9c, 0x6d, 0xae, 0xf1, 0x6d, 0x7c, 0xf7, 0xe4, 0x49, 0x48, 0x10, 0x78, + 0x14, 0xf1, 0x43, 0x6d, 0x99, 0x4f, 0x7f, 0xf9, 0x9f, 0xcb, 0xc1, 0x2c, 0x56, 0x60, 0x56, 0x28, + 0x91, 0xfc, 0xbb, 0xdb, 0x97, 0x5f, 0xda, 0xfb, 0x68, 0xbd, 0x7d, 0xfb, 0xc4, 0x18, 0x96, 0xe1, + 0xff, 0x9a, 0x83, 0x23, 0xe1, 0xcc, 0x2b, 0xb3, 0xa2, 0x6d, 0xa5, 0x90, 0x3b, 0xb0, 0xd4, 0xad, + 0xde, 0x7a, 0xef, 0x35, 0x83, 0x11, 0x59, 0xe1, 0xa8, 0xa4, 0xb2, 0xbc, 0x03, 0x07, 0x9f, 0x22, + 0x4c, 0x79, 0x07, 0xa4, 0x62, 0x2f, 0x38, 0xe8, 0x5e, 0xe2, 0x94, 0xb8, 0x0f, 0x2d, 0x6e, 0x66, + 0x82, 0xc7, 0x38, 0x0f, 0x11, 0x8e, 0x4f, 0xb6, 0xdc, 0x63, 0x26, 0x7d, 0xfb, 0x8b, 0xe2, 0xc3, + 0x94, 0x3f, 0x23, 0xc1, 0xa1, 0x86, 0xae, 0xb9, 0xf1, 0x5f, 0x6a, 0xf2, 0x5e, 0xbd, 0xd3, 0x9b, + 0xe4, 0xfe, 0x27, 0xec, 0x73, 0x4d, 0x78, 0x3e, 0x11, 0xc9, 0x33, 0x63, 0x26, 0xc0, 0xf4, 0xe3, + 0x70, 0x20, 0xc8, 0xb3, 0x90, 0xd6, 0xbd, 0x30, 0x18, 0x8c, 0x59, 0xb9, 0xd4, 0x06, 0x02, 0x51, + 0xab, 0xbc, 0x19, 0x16, 0xb7, 0x3b, 0xe4, 0x05, 0xff, 0x31, 0x0f, 0x8b, 0x0c, 0x3b, 0x1d, 0xb1, + 0x47, 0x40, 0x7e, 0xbf, 0x04, 0x13, 0xc1, 0x8e, 0xbc, 0xd4, 0xa0, 0xdd, 0x19, 0xcf, 0xb7, 0x6d, + 0xc2, 0x7f, 0x20, 0xc1, 0x5d, 0x7b, 0xf0, 0xc4, 0xe5, 0xf0, 0x73, 0x12, 0x8c, 0xfa, 0xce, 0x76, + 0x85, 0xa9, 0x17, 0x5a, 0xf0, 0x50, 0xdb, 0x67, 0xd3, 0xae, 0x47, 0x76, 0x84, 0x08, 0xe7, 0x95, + 0x6f, 0x8c, 0x8f, 0x34, 0xb6, 0xd9, 0xca, 0x48, 0xe3, 0x79, 0xec, 0x6d, 0x54, 0x97, 0x97, 0x25, + 0xb8, 0x2f, 0x38, 0xe4, 0x26, 0x37, 0xb0, 0x7e, 0x52, 0xf3, 0xf1, 0x4d, 0x09, 0x4e, 0xb5, 0xc3, + 0x1c, 0x9f, 0x18, 0x0d, 0x46, 0xbc, 0xab, 0x1a, 0xe1, 0x69, 0x39, 0xd3, 0xf9, 0x95, 0x35, 0xae, + 0xb4, 0xc8, 0x25, 0x7a, 0x07, 0xe4, 0x6f, 0xf2, 0xe5, 0xe6, 0x9f, 0x79, 0x57, 0xd6, 0xc1, 0x64, + 0x88, 0x90, 0x75, 0x20, 0x1d, 0xd2, 0x64, 0x4a, 0x62, 0x4d, 0xa6, 0xc4, 0x97, 0x3a, 0x78, 0x07, + 0x37, 0x6a, 0x4d, 0xae, 0x5a, 0x6c, 0xc0, 0x48, 0x13, 0xc5, 0xe6, 0x6b, 0xbd, 0x73, 0xbd, 0x56, + 0x50, 0xa3, 0xea, 0xca, 0xbb, 0x30, 0x4e, 0xbb, 0x6f, 0x22, 0xef, 0x3b, 0x3d, 0x72, 0x87, 0x5b, + 0x9c, 0xa6, 0x5d, 0x73, 0x11, 0xac, 0x40, 0x0f, 0x9b, 0x6e, 0x3e, 0xea, 0xfd, 0xab, 0x0d, 0xa7, + 0x23, 0x7f, 0x48, 0x18, 0xba, 0x59, 0xc1, 0x7d, 0xf3, 0x85, 0xd5, 0xce, 0x90, 0x6f, 0xd3, 0xc2, + 0xf2, 0xc9, 0xe4, 0xeb, 0xc2, 0xe4, 0x35, 0xe7, 0xce, 0x4d, 0xa0, 0xdc, 0x66, 0x8b, 0xc7, 0x44, + 0x74, 0x67, 0x4d, 0xdb, 0x27, 0x84, 0x69, 0x73, 0x87, 0x16, 0x61, 0xda, 0x7e, 0x32, 0x33, 0xe0, + 0x1a, 0xb9, 0x08, 0x36, 0xff, 0x1a, 0x1b, 0xb9, 0x1f, 0x48, 0x70, 0x98, 0x0e, 0xd1, 0x7f, 0x7f, + 0xa7, 0x53, 0xc9, 0x3f, 0x00, 0xc8, 0xb6, 0x4a, 0xc5, 0xa6, 0x4b, 0x3e, 0x6d, 0x5b, 0xa5, 0xab, + 0x81, 0x2d, 0xe8, 0x01, 0x40, 0x65, 0xdb, 0x09, 0x43, 0xb3, 0x84, 0x6a, 0xba, 0x6c, 0x3b, 0x57, + 0xf7, 0xd8, 0xb0, 0x12, 0xb7, 0x61, 0x56, 0xbf, 0x26, 0x41, 0xb6, 0xd9, 0x90, 0xdd, 0x24, 0xdd, + 0xc1, 0xc0, 0x05, 0xb1, 0xf0, 0x44, 0x3e, 0xdc, 0xc1, 0x45, 0xa8, 0xd0, 0xa2, 0x3a, 0x60, 0xe1, + 0x3b, 0xed, 0x31, 0x8c, 0x07, 0xf5, 0xb5, 0xd1, 0x33, 0xff, 0x89, 0x2d, 0xa6, 0x3f, 0x68, 0x30, + 0xb6, 0x7f, 0x9d, 0x7c, 0xf7, 0x1d, 0x18, 0x6b, 0xc1, 0xfc, 0x9d, 0xde, 0x1a, 0x8d, 0x96, 0x73, + 0x7a, 0x87, 0xdc, 0xff, 0x47, 0xf8, 0xf2, 0x08, 0x3e, 0xea, 0xf5, 0x45, 0x76, 0xcd, 0xbe, 0x0a, + 0x22, 0xff, 0xff, 0x70, 0xa4, 0x29, 0x16, 0x67, 0x31, 0x07, 0x89, 0x2d, 0xcd, 0x16, 0xc7, 0x56, + 0xa7, 0x23, 0xb8, 0x0b, 0x11, 0xa1, 0xa8, 0x32, 0x82, 0x34, 0xed, 0x61, 0xc5, 0x30, 0xaa, 0x9c, + 0x1b, 0x59, 0x81, 0x61, 0x5f, 0x1d, 0xef, 0xeb, 0x31, 0x48, 0x98, 0x06, 0xff, 0xf0, 0x5d, 0xdf, + 0x99, 0xbb, 0x23, 0xfa, 0x22, 0xa8, 0x5c, 0x08, 0x14, 0x4d, 0x1e, 0x05, 0xc4, 0x68, 0xd2, 0x5b, + 0xc6, 0xa2, 0xa7, 0x67, 0x61, 0x24, 0x50, 0xcb, 0xfb, 0x9a, 0x81, 0x1e, 0x93, 0xd6, 0xf0, 0xde, + 0xa2, 0x1e, 0x37, 0x31, 0x74, 0xf7, 0xc3, 0x62, 0xb4, 0x24, 0x9f, 0x85, 0xbb, 0x29, 0xed, 0x26, + 0xa9, 0xe1, 0xfc, 0xee, 0x7c, 0x59, 0x88, 0x3e, 0x74, 0x33, 0x50, 0xde, 0x81, 0x7b, 0xf6, 0x46, + 0xf3, 0x1c, 0x27, 0x76, 0xf4, 0xd5, 0xa6, 0xe3, 0xd4, 0x8c, 0x1e, 0x67, 0x98, 0xd1, 0x91, 0x1f, + 0x87, 0xe3, 0xad, 0x7b, 0xa6, 0x57, 0x97, 0x05, 0xcf, 0x4d, 0xbf, 0x7e, 0x2a, 0xbf, 0x0d, 0x4e, + 0x44, 0xe2, 0xdf, 0x31, 0xe6, 0x1f, 0x83, 0x7b, 0x5b, 0x75, 0x6e, 0x2f, 0x5f, 0xd7, 0x71, 0xd9, + 0xc7, 0x3b, 0x3b, 0xec, 0x93, 0x7c, 0x37, 0x2f, 0xe5, 0xb7, 0xb7, 0x1e, 0xbb, 0x40, 0xe7, 0xac, + 0x2b, 0xd0, 0xcb, 0xba, 0x6c, 0xd7, 0x07, 0x68, 0xcd, 0xbb, 0x20, 0x24, 0xdf, 0xcb, 0x55, 0x25, + 0x57, 0xad, 0x36, 0x63, 0x40, 0x68, 0xeb, 0x0d, 0xae, 0x1a, 0x2d, 0xc1, 0xee, 0x20, 0x8b, 0x27, + 0xb8, 0x7c, 0x17, 0x54, 0xdb, 0x59, 0x6b, 0x76, 0xc2, 0x2a, 0x98, 0xbc, 0xc0, 0x25, 0xb9, 0x07, + 0x20, 0x67, 0x33, 0xac, 0xf9, 0x27, 0xdc, 0x29, 0x74, 0xd4, 0xe0, 0x00, 0xcb, 0x39, 0xdb, 0xc6, + 0x8e, 0x2b, 0x87, 0xa2, 0x3b, 0x59, 0x2d, 0x01, 0x79, 0x17, 0xee, 0x25, 0x37, 0xa9, 0x93, 0x4b, + 0x6e, 0x67, 0x3e, 0x3b, 0x0e, 0xdd, 0xb4, 0x07, 0xf4, 0x49, 0x09, 0xc0, 0xf7, 0x52, 0xe0, 0x6c, + 0x84, 0x20, 0x9b, 0x27, 0xce, 0xb2, 0xe7, 0x3a, 0x45, 0xe3, 0xb1, 0xdb, 0xa9, 0x77, 0xfe, 0xeb, + 0x6f, 0xff, 0x4a, 0xec, 0x1e, 0x24, 0x8b, 0x43, 0x8a, 0x70, 0x66, 0xcf, 0xb7, 0x29, 0xfe, 0x5e, + 0xe0, 0x63, 0x89, 0x8f, 0x74, 0xd4, 0xa3, 0xe0, 0xf3, 0x6c, 0x87, 0x58, 0x9c, 0xcd, 0x8b, 0x94, + 0xcd, 0xb3, 0xe8, 0xe1, 0x68, 0x36, 0xa7, 0xde, 0x16, 0xdc, 0x27, 0xdf, 0x81, 0x5e, 0x95, 0x60, + 0xb4, 0x59, 0xfa, 0x07, 0x5d, 0xea, 0x88, 0x99, 0xc6, 0x08, 0x23, 0xfb, 0xe6, 0xfd, 0x13, 0xe0, + 0x03, 0x9b, 0xa3, 0x03, 0xcb, 0xa1, 0x4b, 0xfb, 0x18, 0xd8, 0x94, 0xcf, 0x0d, 0x45, 0xbf, 0x18, + 0x83, 0x63, 0x7b, 0xe6, 0x54, 0xd0, 0x95, 0x8e, 0x98, 0xdd, 0x23, 0xb0, 0xca, 0xce, 0xdf, 0x06, + 0x4a, 0x7c, 0xfc, 0x4f, 0xd1, 0xf1, 0x3f, 0x89, 0xe6, 0xf7, 0x33, 0x7e, 0x2f, 0x6a, 0xf2, 0x4b, + 0xe2, 0xdf, 0x04, 0xdf, 0xa0, 0xb6, 0xa5, 0x71, 0x0d, 0x19, 0x8b, 0xf6, 0x16, 0x54, 0x63, 0x18, + 0x2c, 0x3f, 0x43, 0x07, 0xa4, 0xa0, 0x95, 0xd7, 0x39, 0xa1, 0x53, 0x6f, 0x0b, 0x7a, 0x85, 0xef, + 0x40, 0xbf, 0xd0, 0xe2, 0x81, 0xe9, 0xe3, 0xed, 0x70, 0xda, 0x3a, 0x37, 0x93, 0xbd, 0xb4, 0x6f, + 0x7c, 0x3e, 0xe4, 0x1a, 0x1d, 0x72, 0x05, 0xe1, 0xdb, 0x3d, 0xe4, 0xa6, 0x13, 0x8c, 0xbe, 0x26, + 0xc1, 0x68, 0xb3, 0xd4, 0x46, 0x7b, 0xcb, 0x79, 0x8f, 0x94, 0x4d, 0x7b, 0xcb, 0x79, 0xaf, 0xac, + 0x8a, 0xfc, 0x26, 0x2a, 0x8a, 0x73, 0xe8, 0x91, 0x56, 0xa2, 0xd8, 0x73, 0x86, 0xc9, 0x1a, 0xde, + 0x33, 0x65, 0xd0, 0xde, 0x1a, 0x6e, 0x27, 0x39, 0xd2, 0xde, 0x1a, 0x6e, 0x2b, 0x7f, 0x11, 0xbd, + 0x86, 0xdd, 0x71, 0xb6, 0x39, 0xc5, 0x36, 0xfa, 0x53, 0x09, 0x06, 0x02, 0x61, 0x36, 0xba, 0xd0, + 0x0e, 0xbf, 0xcd, 0x92, 0x11, 0x91, 0x17, 0x6f, 0x5a, 0xc7, 0xf4, 0xf2, 0x3c, 0x1d, 0xd9, 0x0c, + 0xca, 0xed, 0x67, 0x64, 0x56, 0x80, 0xff, 0x5b, 0x12, 0x8c, 0x34, 0x89, 0x60, 0xdb, 0x5b, 0xbd, + 0xad, 0xe3, 0xf2, 0xec, 0xa5, 0x7d, 0xe3, 0xf3, 0x31, 0x5e, 0xa6, 0x63, 0x7c, 0x33, 0x7a, 0x7c, + 0x3f, 0x63, 0xf4, 0x79, 0x07, 0xdf, 0xf7, 0xde, 0xfa, 0xf9, 0xfa, 0x89, 0xbc, 0x20, 0xb3, 0x77, + 0x74, 0x9c, 0x7d, 0x7c, 0xbf, 0xe8, 0x7c, 0x74, 0x4f, 0xd3, 0xd1, 0x3d, 0x85, 0x96, 0x5f, 0xdf, + 0xe8, 0x1a, 0x9d, 0x8a, 0x2f, 0x36, 0x7e, 0xbe, 0xaa, 0x2d, 0x45, 0x6b, 0x1a, 0x1d, 0x67, 0xa7, + 0xf7, 0x83, 0xca, 0x87, 0x78, 0x81, 0x0e, 0xf1, 0x0c, 0x7a, 0xb0, 0xd5, 0x10, 0x7d, 0x0f, 0x4b, + 0x35, 0x7d, 0xd3, 0x98, 0x7a, 0x1b, 0x0b, 0xbd, 0xdf, 0x81, 0xde, 0x2b, 0x1e, 0xd3, 0x4d, 0xb5, + 0xd3, 0xbd, 0x2f, 0x7e, 0xce, 0x3e, 0xd8, 0x3e, 0x02, 0xe7, 0xf2, 0x1e, 0xca, 0xe5, 0x18, 0x3a, + 0xda, 0x8a, 0x4b, 0x12, 0x43, 0xa3, 0x5f, 0x97, 0xdc, 0x57, 0xba, 0x0f, 0xb5, 0xd5, 0x85, 0x3f, + 0xd6, 0x8e, 0xbc, 0xdc, 0xd7, 0x24, 0x10, 0x97, 0x8f, 0x53, 0xbe, 0x26, 0xd0, 0x58, 0x4b, 0xbe, + 0x18, 0x3b, 0x9f, 0x90, 0xe0, 0x50, 0x8b, 0x80, 0x19, 0xe5, 0xdb, 0xe9, 0x77, 0xef, 0x20, 0x3d, + 0x3b, 0xf3, 0xba, 0x68, 0xf0, 0xc1, 0x74, 0xa1, 0xdf, 0x96, 0x20, 0xdb, 0x3a, 0x3a, 0x46, 0x85, + 0x7d, 0xf7, 0xe2, 0x8f, 0xce, 0xb3, 0x97, 0x5f, 0x2f, 0x19, 0x97, 0xdf, 0x57, 0x24, 0x38, 0xdc, + 0x32, 0x22, 0x46, 0xb3, 0xfb, 0xec, 0x27, 0x10, 0x8f, 0x67, 0x0b, 0xaf, 0x93, 0x8a, 0xcb, 0x2c, + 0xd1, 0x81, 0x16, 0x91, 0x71, 0x7b, 0x3a, 0xb0, 0x77, 0xf4, 0xdd, 0x9e, 0x0e, 0x44, 0x84, 0xe6, + 0x5c, 0xa6, 0x2d, 0x63, 0xe3, 0xf6, 0x64, 0x1a, 0x15, 0x83, 0xb7, 0x27, 0xd3, 0xc8, 0x00, 0xdd, + 0x55, 0x80, 0x16, 0x51, 0x76, 0xbb, 0x0a, 0xb0, 0x77, 0x34, 0xdf, 0xae, 0x02, 0x44, 0x84, 0xfa, + 0xf2, 0x1b, 0xf2, 0x72, 0xf4, 0x47, 0x3d, 0x8d, 0x37, 0x7f, 0xd4, 0xba, 0xb3, 0x75, 0xe3, 0x75, + 0x7d, 0x20, 0x72, 0xdf, 0x0f, 0x40, 0xe5, 0xbf, 0x88, 0x03, 0x5a, 0x75, 0xd4, 0x6d, 0x9c, 0xab, + 0x3b, 0x5b, 0x86, 0xa5, 0xdd, 0x60, 0x4e, 0x38, 0x06, 0xa8, 0xa9, 0x3b, 0xfe, 0x77, 0xd7, 0x7b, + 0xe6, 0x3e, 0xee, 0x7f, 0xe5, 0x1b, 0xe3, 0x27, 0xda, 0x78, 0x75, 0x46, 0x80, 0x95, 0x54, 0x4d, + 0xdd, 0xe1, 0x17, 0x7f, 0xdf, 0x0a, 0xa0, 0x56, 0xab, 0xc6, 0xf5, 0x62, 0x55, 0xb3, 0xc5, 0xd3, + 0x80, 0x37, 0x45, 0xcc, 0x66, 0x23, 0xb7, 0x93, 0xbe, 0xef, 0x9d, 0x77, 0x29, 0x29, 0x4a, 0x71, + 0x41, 0xb3, 0x1d, 0xf4, 0x33, 0x90, 0x2a, 0x63, 0x7d, 0x97, 0x51, 0x8f, 0xdf, 0x16, 0xea, 0x49, + 0x42, 0x90, 0x12, 0x2f, 0x02, 0x52, 0xfd, 0x70, 0xf4, 0xd7, 0xb9, 0xf8, 0xc7, 0xe9, 0xa2, 0xf6, + 0xcf, 0x40, 0x07, 0xf4, 0x0b, 0xcc, 0xc3, 0x6a, 0xb8, 0x2a, 0x7b, 0x3c, 0x90, 0x38, 0x0a, 0xfc, + 0x78, 0x45, 0xfc, 0x64, 0xca, 0xfd, 0xf1, 0x8a, 0xe9, 0xe1, 0x3f, 0xfb, 0xdc, 0xe9, 0x81, 0x00, + 0xc5, 0x7c, 0xbf, 0xff, 0xbc, 0xe4, 0xd4, 0x47, 0x24, 0x18, 0x6e, 0xe8, 0x11, 0xc9, 0x30, 0x96, + 0x5b, 0x5f, 0xbb, 0xb2, 0xac, 0xcc, 0x3f, 0x9b, 0x5b, 0x9b, 0x5f, 0x5e, 0x12, 0x9f, 0x74, 0xf5, + 0xbd, 0xeb, 0x46, 0xe3, 0x70, 0xa4, 0x09, 0xcc, 0x6c, 0x61, 0xa1, 0x30, 0x97, 0x5b, 0x2b, 0xa4, + 0x25, 0x74, 0x17, 0x1c, 0x6b, 0x4a, 0xc4, 0x05, 0x89, 0xb5, 0x00, 0x51, 0x0a, 0x2e, 0x48, 0xfc, + 0x8d, 0x58, 0x77, 0xff, 0x2e, 0xd5, 0xf8, 0x69, 0xd6, 0x0a, 0xd6, 0xb1, 0xad, 0xd9, 0xaf, 0x67, + 0xe5, 0x45, 0xbc, 0x9f, 0xfe, 0x74, 0x2f, 0xf4, 0xcf, 0xb1, 0x5e, 0x56, 0x1d, 0xd5, 0xb9, 0x3d, + 0xe7, 0x02, 0xc8, 0xe6, 0xbf, 0x38, 0xc0, 0x7e, 0x08, 0xc5, 0xfb, 0x69, 0x8f, 0xfe, 0x8e, 0xbe, + 0x3f, 0xc8, 0x5e, 0x80, 0xf2, 0x6f, 0xfc, 0x85, 0xe9, 0xc9, 0xec, 0xc7, 0x0b, 0xa8, 0xd1, 0x64, + 0x3f, 0x61, 0xf2, 0xcb, 0x12, 0x1c, 0xa0, 0x50, 0x9e, 0xa7, 0x4c, 0x21, 0xc5, 0x07, 0xa6, 0xa2, + 0xfc, 0x39, 0xb2, 0x59, 0xb8, 0xea, 0xcc, 0x7e, 0x7b, 0xe4, 0x1e, 0xfe, 0x6d, 0xa0, 0xa3, 0x3e, + 0x1e, 0xc2, 0xd4, 0x65, 0x65, 0xa4, 0xda, 0x80, 0x69, 0x87, 0x0e, 0x04, 0x13, 0xaf, 0xfb, 0x40, + 0xf0, 0x29, 0xe8, 0xf3, 0x45, 0x73, 0x99, 0xee, 0xf6, 0x3e, 0x94, 0x16, 0x3e, 0x92, 0xf7, 0xd3, + 0x40, 0xef, 0x91, 0xe0, 0x40, 0xd3, 0xe8, 0x37, 0xd3, 0xb3, 0xef, 0x93, 0xff, 0x90, 0xc4, 0x9a, + 0x92, 0x97, 0x95, 0xd1, 0x7a, 0xb3, 0xdc, 0xc2, 0xd3, 0x30, 0x10, 0x08, 0x59, 0x33, 0xbd, 0x94, + 0x8d, 0x7d, 0x7c, 0x12, 0x24, 0x48, 0x07, 0x65, 0x21, 0x89, 0x77, 0x4c, 0xc3, 0x72, 0x70, 0x99, + 0x5e, 0xd0, 0x4e, 0x2a, 0x6e, 0x19, 0xe9, 0x70, 0xb0, 0xe9, 0x6b, 0x2b, 0x3b, 0x93, 0x7a, 0x9d, + 0xe7, 0x0a, 0xa3, 0x4e, 0x33, 0x37, 0xed, 0xcd, 0x70, 0x8c, 0xab, 0x72, 0x8b, 0x27, 0x5e, 0x40, + 0x0f, 0x0b, 0x0e, 0x57, 0x5b, 0xb9, 0x2e, 0xf2, 0x12, 0xa0, 0x46, 0x55, 0x0d, 0xff, 0x74, 0x90, + 0x67, 0x7d, 0xd1, 0x28, 0x74, 0xfb, 0x7f, 0x5c, 0x87, 0x15, 0xbc, 0x73, 0xda, 0x37, 0xc0, 0xb6, + 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa8, 0x86, 0x13, 0xc9, 0x08, 0xa8, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2290,9 +2280,6 @@ func (this *TokenizeShareRecord) Equal(that interface{}) bool { if this.Owner != that1.Owner { return false } - if this.ShareTokenDenom != that1.ShareTokenDenom { - return false - } if this.ModuleAccount != that1.ModuleAccount { return false } @@ -3339,20 +3326,13 @@ func (m *TokenizeShareRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Validator) i = encodeVarintStaking(dAtA, i, uint64(len(m.Validator))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } if len(m.ModuleAccount) > 0 { i -= len(m.ModuleAccount) copy(dAtA[i:], m.ModuleAccount) i = encodeVarintStaking(dAtA, i, uint64(len(m.ModuleAccount))) i-- - dAtA[i] = 0x22 - } - if len(m.ShareTokenDenom) > 0 { - i -= len(m.ShareTokenDenom) - copy(dAtA[i:], m.ShareTokenDenom) - i = encodeVarintStaking(dAtA, i, uint64(len(m.ShareTokenDenom))) - i-- dAtA[i] = 0x1a } if len(m.Owner) > 0 { @@ -3776,10 +3756,6 @@ func (m *TokenizeShareRecord) Size() (n int) { if l > 0 { n += 1 + l + sovStaking(uint64(l)) } - l = len(m.ShareTokenDenom) - if l > 0 { - n += 1 + l + sovStaking(uint64(l)) - } l = len(m.ModuleAccount) if l > 0 { n += 1 + l + sovStaking(uint64(l)) @@ -6928,38 +6904,6 @@ func (m *TokenizeShareRecord) Unmarshal(dAtA []byte) error { m.Owner = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShareTokenDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStaking - } - 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 ErrInvalidLengthStaking - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthStaking - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ShareTokenDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ModuleAccount", wireType) } @@ -6991,7 +6935,7 @@ func (m *TokenizeShareRecord) Unmarshal(dAtA []byte) error { } m.ModuleAccount = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) } diff --git a/x/staking/types/tokenize_share_record.go b/x/staking/types/tokenize_share_record.go index 9d0e16be..27f96714 100644 --- a/x/staking/types/tokenize_share_record.go +++ b/x/staking/types/tokenize_share_record.go @@ -1,6 +1,8 @@ package types import ( + "strconv" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -8,3 +10,7 @@ import ( func (r TokenizeShareRecord) GetModuleAddress() sdk.AccAddress { return authtypes.NewModuleAddress(r.ModuleAccount) } + +func (r TokenizeShareRecord) GetShareTokenDenom() string { + return r.Validator + strconv.Itoa(int(r.Id)) +} From d065df0506beecda3ad8f578640219b3c70ebcec Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 3 May 2022 23:59:55 +1000 Subject: [PATCH 15/57] update spec --- x/staking/spec/01_state.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x/staking/spec/01_state.md b/x/staking/spec/01_state.md index e966123e..219b0be0 100644 --- a/x/staking/spec/01_state.md +++ b/x/staking/spec/01_state.md @@ -236,3 +236,9 @@ There are helper queues to manage the tokenize share records by owner and by sha `0x62 | owner | id -> TokenizeShareRecordId` `0x63 | denom -> TokenizeShareRecordId` + +## LastTokenizeShareRecordIdKey + +LastTokenizeShareRecordIdKey is used to maintain unique id of tokenize share record. + +It is stored on `0x64 -> LastTokenizeShareRecordId` From e50f7c54a9344752327082d53445d923351c6ed9 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 4 May 2022 13:10:23 +1000 Subject: [PATCH 16/57] use MustLengthPrefix for keys --- x/staking/types/keys.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index a95fb50d..f7c56bfc 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -360,12 +360,12 @@ func GetTokenizeShareRecordByIndexKey(id uint64) []byte { // GetTokenizeShareRecordIdsByOwnerPrefix returns the key of the specified owner. Intended for querying all tokenizeShareRecords of an owner func GetTokenizeShareRecordIdsByOwnerPrefix(owner sdk.AccAddress) []byte { - return append(TokenizeShareRecordIdByOwnerPrefix, owner.Bytes()...) + return append(TokenizeShareRecordIdByOwnerPrefix, address.MustLengthPrefix(owner)...) } // GetTokenizeShareRecordIdByOwnerAndIdKey returns the key of the specified owner and id. Intended for setting tokenizeShareRecord of an owner func GetTokenizeShareRecordIdByOwnerAndIdKey(owner sdk.AccAddress, id uint64) []byte { - return append(append(TokenizeShareRecordIdByOwnerPrefix, owner.Bytes()...), sdk.Uint64ToBigEndian(id)...) + return append(append(TokenizeShareRecordIdByOwnerPrefix, address.MustLengthPrefix(owner)...), sdk.Uint64ToBigEndian(id)...) } func GetTokenizeShareRecordIdByDenomKey(denom string) []byte { From e7acfb3779c609cae1321277e918cdf71d4ebb44 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 4 May 2022 13:26:20 +1000 Subject: [PATCH 17/57] update tokenize share slashing risk spec document --- x/staking/spec/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x/staking/spec/README.md b/x/staking/spec/README.md index 685d055c..70a921d7 100644 --- a/x/staking/spec/README.md +++ b/x/staking/spec/README.md @@ -23,6 +23,8 @@ network. This module has been extended with a liquid staking implementation to enable the creation of nonfungible tokenized staking shares to be used to be synthetic staked assets. The governing philosphy of this design is that it optimizes for allowing a smooth upgrade path from the existing cosmos staking module at the expense of the usability of the native staking token. It is anticipated that DAOs will form that accept these assets and issue a more usable underlying asset. +When a user receive tokenized shares, the user is taking on slashing risk while holding the token based on validator's performance. + ## Contents 1. **[State](01_state.md)** From d99fef88c1ee6bf80650ecde2fe48805b6139b0b Mon Sep 17 00:00:00 2001 From: junkai121 Date: Fri, 22 Apr 2022 02:15:50 +1000 Subject: [PATCH 18/57] add withdraw-tokenizeshare-record split --- proto/distribution/v1beta1/tx.proto | 17 +- x/distribution/client/cli/tx.go | 51 ++- x/distribution/handler.go | 3 + x/distribution/keeper/delegation_test.go | 4 +- x/distribution/keeper/keeper.go | 54 ++- x/distribution/keeper/msg_server.go | 38 +- x/distribution/simulation/operations.go | 2 +- x/distribution/types/codec.go | 2 + x/distribution/types/errors.go | 35 +- x/distribution/types/msg.go | 46 ++- x/distribution/types/tx.pb.go | 481 ++++++++++++++++++++--- 11 files changed, 648 insertions(+), 85 deletions(-) diff --git a/proto/distribution/v1beta1/tx.proto b/proto/distribution/v1beta1/tx.proto index ea93c166..42020000 100644 --- a/proto/distribution/v1beta1/tx.proto +++ b/proto/distribution/v1beta1/tx.proto @@ -21,11 +21,14 @@ service Msg { // full commission to the validator address. rpc WithdrawValidatorCommission(MsgWithdrawValidatorCommission) returns (MsgWithdrawValidatorCommissionResponse); - // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for - // owning TokenizeShareRecord + // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for an owning TokenizeShareRecord rpc WithdrawTokenizeShareRecordReward(MsgWithdrawTokenizeShareRecordReward) returns (MsgWithdrawTokenizeShareRecordRewardResponse); + // WithdrawAllTokenizeShareRecordReward defines a method to withdraw reward for all owning TokenizeShareRecord + rpc WithdrawAllTokenizeShareRecordReward(MsgWithdrawAllTokenizeShareRecordReward) + returns (MsgWithdrawAllTokenizeShareRecordRewardResponse); + // FundCommunityPool defines a method to allow an account to directly // fund the community pool. rpc FundCommunityPool(MsgFundCommunityPool) returns (MsgFundCommunityPoolResponse); @@ -74,10 +77,20 @@ message MsgWithdrawTokenizeShareRecordReward { option (gogoproto.goproto_getters) = false; string owner_address = 1 [ (gogoproto.moretags) = "yaml:\"owner_address\"" ]; + uint64 record_id = 2; } message MsgWithdrawTokenizeShareRecordRewardResponse {} +message MsgWithdrawAllTokenizeShareRecordReward { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string owner_address = 1 [ (gogoproto.moretags) = "yaml:\"owner_address\"" ]; +} + +message MsgWithdrawAllTokenizeShareRecordRewardResponse {} + // MsgFundCommunityPool allows an account to directly // fund the community pool. message MsgFundCommunityPool { diff --git a/x/distribution/client/cli/tx.go b/x/distribution/client/cli/tx.go index 286da7b2..ab0e1eae 100644 --- a/x/distribution/client/cli/tx.go +++ b/x/distribution/client/cli/tx.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "strconv" "strings" "github.com/spf13/cobra" @@ -42,6 +43,7 @@ func NewTxCmd() *cobra.Command { NewSetWithdrawAddrCmd(), NewFundCommunityPoolCmd(), NewWithdrawTokenizeShareRecordRewardCmd(), + NewWithdrawAllTokenizeShareRecordRewardCmd(), ) return distTxCmd @@ -331,14 +333,14 @@ Where proposal.json contains: return cmd } -// WithdrawTokenizeShareRecordReward defines a method to withdraw reward for owning TokenizeShareRecord -func NewWithdrawTokenizeShareRecordRewardCmd() *cobra.Command { +// WithdrawAllTokenizeShareRecordReward defines a method to withdraw reward for all owning TokenizeShareRecord +func NewWithdrawAllTokenizeShareRecordRewardCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "withdraw-tokenize-share-rewards", + Use: "withdraw-all-tokenize-share-rewards", Args: cobra.ExactArgs(0), - Short: "Withdraw reward for owning TokenizeShareRecord", + Short: "Withdraw reward for all owning TokenizeShareRecord", Long: strings.TrimSpace( - fmt.Sprintf(`Withdraw reward for owned TokenizeShareRecord + fmt.Sprintf(`Withdraw reward for all owned TokenizeShareRecord Example: $ %s tx distribution withdraw-tokenize-share-rewards --from mykey @@ -352,7 +354,44 @@ $ %s tx distribution withdraw-tokenize-share-rewards --from mykey return err } - msg := types.NewMsgWithdrawTokenizeShareRecordReward(clientCtx.GetFromAddress()) + msg := types.NewMsgWithdrawAllTokenizeShareRecordReward(clientCtx.GetFromAddress()) + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +// WithdrawTokenizeShareRecordReward defines a method to withdraw reward for an owning TokenizeShareRecord +func NewWithdrawTokenizeShareRecordRewardCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "withdraw-tokenize-share-rewards", + Args: cobra.ExactArgs(1), + Short: "Withdraw reward for an owning TokenizeShareRecord", + Long: strings.TrimSpace( + fmt.Sprintf(`Withdraw reward for an owned TokenizeShareRecord + +Example: +$ %s tx distribution withdraw-tokenize-share-rewards 1 --from mykey +`, + version.AppName, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + recordId, err := strconv.Atoi(args[0]) + if err != nil { + return err + } + + msg := types.NewMsgWithdrawTokenizeShareRecordReward(clientCtx.GetFromAddress(), uint64(recordId)) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, diff --git a/x/distribution/handler.go b/x/distribution/handler.go index 23907562..5c7c2ef2 100644 --- a/x/distribution/handler.go +++ b/x/distribution/handler.go @@ -33,6 +33,9 @@ func NewHandler(k keeper.Keeper) sdk.Handler { case *types.MsgWithdrawTokenizeShareRecordReward: res, err := msgServer.WithdrawTokenizeShareRecordReward(sdk.WrapSDKContext(ctx), msg) return sdk.WrapServiceResult(ctx, res, err) + case *types.MsgWithdrawAllTokenizeShareRecordReward: + res, err := msgServer.WithdrawAllTokenizeShareRecordReward(sdk.WrapSDKContext(ctx), msg) + return sdk.WrapServiceResult(ctx, res, err) default: return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized distribution message type: %T", msg) } diff --git a/x/distribution/keeper/delegation_test.go b/x/distribution/keeper/delegation_test.go index 25c7d1aa..f9362f85 100644 --- a/x/distribution/keeper/delegation_test.go +++ b/x/distribution/keeper/delegation_test.go @@ -140,7 +140,7 @@ func TestWithdrawTokenizeShareRecordReward(t *testing.T) { }) // try withdrawing rewards before no reward is allocated - coins, err = app.DistrKeeper.WithdrawTokenizeShareRecordReward(ctx, sdk.AccAddress(valAddrs[1])) + coins, err = app.DistrKeeper.WithdrawAllTokenizeShareRecordReward(ctx, sdk.AccAddress(valAddrs[1])) require.Nil(t, err) require.Equal(t, coins, sdk.Coins{}) @@ -160,7 +160,7 @@ func TestWithdrawTokenizeShareRecordReward(t *testing.T) { beforeBalance := app.BankKeeper.GetBalance(ctx, sdk.AccAddress(valAddrs[1]), sdk.DefaultBondDenom) // withdraw rewards - coins, err = app.DistrKeeper.WithdrawTokenizeShareRecordReward(ctx, sdk.AccAddress(valAddrs[1])) + coins, err = app.DistrKeeper.WithdrawAllTokenizeShareRecordReward(ctx, sdk.AccAddress(valAddrs[1])) require.Nil(t, err) // check return value diff --git a/x/distribution/keeper/keeper.go b/x/distribution/keeper/keeper.go index 58f74a6d..cb68db69 100644 --- a/x/distribution/keeper/keeper.go +++ b/x/distribution/keeper/keeper.go @@ -231,7 +231,59 @@ func (k Keeper) WithdrawSingleShareRecordReward(ctx sdk.Context, recordId uint64 } // withdraw reward for owning TokenizeShareRecord -func (k Keeper) WithdrawTokenizeShareRecordReward(ctx sdk.Context, ownerAddr sdk.AccAddress) (sdk.Coins, error) { +func (k Keeper) WithdrawTokenizeShareRecordReward(ctx sdk.Context, ownerAddr sdk.AccAddress, recordId uint64) (sdk.Coins, error) { + record, err := k.stakingKeeper.GetTokenizeShareRecord(ctx, recordId) + if err != nil { + return nil, err + } + + if record.Owner != ownerAddr.String() { + return nil, types.ErrNotTokenizeShareRecordOwner + } + + valAddr, err := sdk.ValAddressFromBech32(record.Validator) + if err != nil { + return nil, err + } + + val := k.stakingKeeper.Validator(ctx, valAddr) + if val == nil { + return nil, err + } + + del := k.stakingKeeper.Delegation(ctx, record.GetModuleAddress(), valAddr) + if del == nil { + return nil, err + } + + // withdraw rewards into reward module account and send it to reward owner + _, err = k.WithdrawDelegationRewards(ctx, record.GetModuleAddress(), valAddr) + if err != nil { + return nil, err + } + + // apply changes when the module account has positive balance + rewards := k.bankKeeper.GetAllBalances(ctx, record.GetModuleAddress()) + if !rewards.Empty() { + err = k.bankKeeper.SendCoins(ctx, record.GetModuleAddress(), ownerAddr, rewards) + if err != nil { + return nil, err + } + } + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeWithdrawTokenizeShareReward, + sdk.NewAttribute(types.AttributeKeyWithdrawAddress, ownerAddr.String()), + sdk.NewAttribute(sdk.AttributeKeyAmount, rewards.String()), + ), + ) + + return rewards, nil +} + +// withdraw reward for all owning TokenizeShareRecord +func (k Keeper) WithdrawAllTokenizeShareRecordReward(ctx sdk.Context, ownerAddr sdk.AccAddress) (sdk.Coins, error) { totalRewards := sdk.Coins{} records := k.stakingKeeper.GetTokenizeShareRecordsByOwner(ctx, ownerAddr) diff --git a/x/distribution/keeper/msg_server.go b/x/distribution/keeper/msg_server.go index 8ef5cd13..89571d5f 100644 --- a/x/distribution/keeper/msg_server.go +++ b/x/distribution/keeper/msg_server.go @@ -130,7 +130,7 @@ func (k msgServer) WithdrawTokenizeShareRecordReward(goCtx context.Context, msg if err != nil { return nil, err } - amount, err := k.Keeper.WithdrawTokenizeShareRecordReward(ctx, ownerAddr) + amount, err := k.Keeper.WithdrawTokenizeShareRecordReward(ctx, ownerAddr, msg.RecordId) if err != nil { return nil, err } @@ -158,6 +158,42 @@ func (k msgServer) WithdrawTokenizeShareRecordReward(goCtx context.Context, msg return &types.MsgWithdrawTokenizeShareRecordRewardResponse{}, nil } +// WithdrawAllTokenizeShareRecordReward defines a method to withdraw reward for owning TokenizeShareRecord +func (k msgServer) WithdrawAllTokenizeShareRecordReward(goCtx context.Context, msg *types.MsgWithdrawAllTokenizeShareRecordReward) (*types.MsgWithdrawAllTokenizeShareRecordRewardResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + ownerAddr, err := sdk.AccAddressFromBech32(msg.OwnerAddress) + if err != nil { + return nil, err + } + amount, err := k.Keeper.WithdrawAllTokenizeShareRecordReward(ctx, ownerAddr) + if err != nil { + return nil, err + } + + defer func() { + for _, a := range amount { + if a.Amount.IsInt64() { + telemetry.SetGaugeWithLabels( + []string{"tx", "msg", "withdraw_tokenize_share_reward"}, + float32(a.Amount.Int64()), + []metrics.Label{telemetry.NewLabel("denom", a.Denom)}, + ) + } + } + }() + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + sdk.NewAttribute(sdk.AttributeKeySender, msg.OwnerAddress), + ), + ) + + return &types.MsgWithdrawAllTokenizeShareRecordRewardResponse{}, nil +} + func (k msgServer) FundCommunityPool(goCtx context.Context, msg *types.MsgFundCommunityPool) (*types.MsgFundCommunityPoolResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) diff --git a/x/distribution/simulation/operations.go b/x/distribution/simulation/operations.go index 5855b21b..64af0e64 100644 --- a/x/distribution/simulation/operations.go +++ b/x/distribution/simulation/operations.go @@ -287,7 +287,7 @@ func SimulateMsgWithdrawTokenizeShareRecordReward(ak types.AccountKeeper, bk typ return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgWithdrawTokenizeShareRecordReward, "account private key is nil"), nil, nil } - msg := types.NewMsgWithdrawTokenizeShareRecordReward(rewardOwner.Address) + msg := types.NewMsgWithdrawAllTokenizeShareRecordReward(rewardOwner.Address) account := ak.GetAccount(ctx, rewardOwner.Address) spendable := bk.SpendableCoins(ctx, account.GetAddress()) diff --git a/x/distribution/types/codec.go b/x/distribution/types/codec.go index 9c5d8456..41073b5a 100644 --- a/x/distribution/types/codec.go +++ b/x/distribution/types/codec.go @@ -18,6 +18,7 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { // cdc.RegisterConcrete(&MsgFundCommunityPool{}, "cosmos-sdk/MsgFundCommunityPool", nil) // cdc.RegisterConcrete(&CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil) cdc.RegisterConcrete(&MsgWithdrawTokenizeShareRecordReward{}, "cosmos-sdk/MsgWithdrawTokenizeShareRecordReward", nil) + cdc.RegisterConcrete(&MsgWithdrawAllTokenizeShareRecordReward{}, "cosmos-sdk/MsgWithdrawAllTokenizeShareRecordReward", nil) } func RegisterInterfaces(registry types.InterfaceRegistry) { @@ -28,6 +29,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &MsgSetWithdrawAddress{}, &MsgFundCommunityPool{}, &MsgWithdrawTokenizeShareRecordReward{}, + &MsgWithdrawAllTokenizeShareRecordReward{}, ) registry.RegisterImplementations( (*govtypes.Content)(nil), diff --git a/x/distribution/types/errors.go b/x/distribution/types/errors.go index ff400459..5f96eec5 100644 --- a/x/distribution/types/errors.go +++ b/x/distribution/types/errors.go @@ -1,21 +1,22 @@ package types -// import ( -// sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -// ) +import ( + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) // x/distribution module sentinel errors -// var ( -// ErrEmptyDelegatorAddr = sdkerrors.Register(ModuleName, 2, "delegator address is empty") -// ErrEmptyWithdrawAddr = sdkerrors.Register(ModuleName, 3, "withdraw address is empty") -// ErrEmptyValidatorAddr = sdkerrors.Register(ModuleName, 4, "validator address is empty") -// ErrEmptyDelegationDistInfo = sdkerrors.Register(ModuleName, 5, "no delegation distribution info") -// ErrNoValidatorDistInfo = sdkerrors.Register(ModuleName, 6, "no validator distribution info") -// ErrNoValidatorCommission = sdkerrors.Register(ModuleName, 7, "no validator commission to withdraw") -// ErrSetWithdrawAddrDisabled = sdkerrors.Register(ModuleName, 8, "set withdraw address disabled") -// ErrBadDistribution = sdkerrors.Register(ModuleName, 9, "community pool does not have sufficient coins to distribute") -// ErrInvalidProposalAmount = sdkerrors.Register(ModuleName, 10, "invalid community pool spend proposal amount") -// ErrEmptyProposalRecipient = sdkerrors.Register(ModuleName, 11, "invalid community pool spend proposal recipient") -// ErrNoValidatorExists = sdkerrors.Register(ModuleName, 12, "validator does not exist") -// ErrNoDelegationExists = sdkerrors.Register(ModuleName, 13, "delegation does not exist") -// ) +var ( + // ErrEmptyDelegatorAddr = sdkerrors.Register(ModuleName, 2, "delegator address is empty") + // ErrEmptyWithdrawAddr = sdkerrors.Register(ModuleName, 3, "withdraw address is empty") + // ErrEmptyValidatorAddr = sdkerrors.Register(ModuleName, 4, "validator address is empty") + // ErrEmptyDelegationDistInfo = sdkerrors.Register(ModuleName, 5, "no delegation distribution info") + // ErrNoValidatorDistInfo = sdkerrors.Register(ModuleName, 6, "no validator distribution info") + // ErrNoValidatorCommission = sdkerrors.Register(ModuleName, 7, "no validator commission to withdraw") + // ErrSetWithdrawAddrDisabled = sdkerrors.Register(ModuleName, 8, "set withdraw address disabled") + // ErrBadDistribution = sdkerrors.Register(ModuleName, 9, "community pool does not have sufficient coins to distribute") + // ErrInvalidProposalAmount = sdkerrors.Register(ModuleName, 10, "invalid community pool spend proposal amount") + // ErrEmptyProposalRecipient = sdkerrors.Register(ModuleName, 11, "invalid community pool spend proposal recipient") + // ErrNoValidatorExists = sdkerrors.Register(ModuleName, 12, "validator does not exist") + // ErrNoDelegationExists = sdkerrors.Register(ModuleName, 13, "delegation does not exist") + ErrNotTokenizeShareRecordOwner = sdkerrors.Register(ModuleName, 44, "not tokenize share record owner") +) diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 25701f81..5f374afb 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -8,16 +8,18 @@ import ( // distribution message types const ( - TypeMsgSetWithdrawAddress = "set_withdraw_address" - TypeMsgWithdrawDelegatorReward = "withdraw_delegator_reward" - TypeMsgWithdrawValidatorCommission = "withdraw_validator_commission" - TypeMsgFundCommunityPool = "fund_community_pool" - TypeMsgWithdrawTokenizeShareRecordReward = "withdraw_tokenize_share_record_reward" + TypeMsgSetWithdrawAddress = "set_withdraw_address" + TypeMsgWithdrawDelegatorReward = "withdraw_delegator_reward" + TypeMsgWithdrawValidatorCommission = "withdraw_validator_commission" + TypeMsgFundCommunityPool = "fund_community_pool" + TypeMsgWithdrawTokenizeShareRecordReward = "withdraw_tokenize_share_record_reward" + TypeMsgWithdrawAllTokenizeShareRecordReward = "withdraw_all_tokenize_share_record_reward" ) // Verify interface at compile time var _, _, _ sdk.Msg = &MsgSetWithdrawAddress{}, &MsgWithdrawDelegatorReward{}, &MsgWithdrawValidatorCommission{} var _ sdk.Msg = &MsgWithdrawTokenizeShareRecordReward{} +var _ sdk.Msg = &MsgWithdrawAllTokenizeShareRecordReward{} func NewMsgSetWithdrawAddress(delAddr, withdrawAddr sdk.AccAddress) *MsgSetWithdrawAddress { return &MsgSetWithdrawAddress{ @@ -155,9 +157,10 @@ func (msg MsgFundCommunityPool) ValidateBasic() error { return nil } -func NewMsgWithdrawTokenizeShareRecordReward(ownerAddr sdk.AccAddress) *MsgWithdrawTokenizeShareRecordReward { +func NewMsgWithdrawTokenizeShareRecordReward(ownerAddr sdk.AccAddress, recordId uint64) *MsgWithdrawTokenizeShareRecordReward { return &MsgWithdrawTokenizeShareRecordReward{ OwnerAddress: ownerAddr.String(), + RecordId: recordId, } } @@ -185,3 +188,34 @@ func (msg MsgWithdrawTokenizeShareRecordReward) ValidateBasic() error { } return nil } + +func NewMsgWithdrawAllTokenizeShareRecordReward(ownerAddr sdk.AccAddress) *MsgWithdrawAllTokenizeShareRecordReward { + return &MsgWithdrawAllTokenizeShareRecordReward{ + OwnerAddress: ownerAddr.String(), + } +} + +func (msg MsgWithdrawAllTokenizeShareRecordReward) Route() string { return ModuleName } +func (msg MsgWithdrawAllTokenizeShareRecordReward) Type() string { + return TypeMsgWithdrawAllTokenizeShareRecordReward +} + +// Return address that must sign over msg.GetSignBytes() +func (msg MsgWithdrawAllTokenizeShareRecordReward) GetSigners() []sdk.AccAddress { + owner, _ := sdk.AccAddressFromBech32(msg.OwnerAddress) + return []sdk.AccAddress{owner} +} + +// get the bytes for the message signer to sign on +func (msg MsgWithdrawAllTokenizeShareRecordReward) GetSignBytes() []byte { + bz := legacy.Cdc.MustMarshalJSON(&msg) + return sdk.MustSortJSON(bz) +} + +// quick validity check +func (msg MsgWithdrawAllTokenizeShareRecordReward) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.OwnerAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid owner address: %s", err) + } + return nil +} diff --git a/x/distribution/types/tx.pb.go b/x/distribution/types/tx.pb.go index 080b8efd..a38ea59f 100644 --- a/x/distribution/types/tx.pb.go +++ b/x/distribution/types/tx.pb.go @@ -264,6 +264,7 @@ var xxx_messageInfo_MsgWithdrawValidatorCommissionResponse proto.InternalMessage type MsgWithdrawTokenizeShareRecordReward struct { OwnerAddress string `protobuf:"bytes,1,opt,name=owner_address,json=ownerAddress,proto3" json:"owner_address,omitempty" yaml:"owner_address"` + RecordId uint64 `protobuf:"varint,2,opt,name=record_id,json=recordId,proto3" json:"record_id,omitempty"` } func (m *MsgWithdrawTokenizeShareRecordReward) Reset() { *m = MsgWithdrawTokenizeShareRecordReward{} } @@ -339,6 +340,85 @@ func (m *MsgWithdrawTokenizeShareRecordRewardResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWithdrawTokenizeShareRecordRewardResponse proto.InternalMessageInfo +type MsgWithdrawAllTokenizeShareRecordReward struct { + OwnerAddress string `protobuf:"bytes,1,opt,name=owner_address,json=ownerAddress,proto3" json:"owner_address,omitempty" yaml:"owner_address"` +} + +func (m *MsgWithdrawAllTokenizeShareRecordReward) Reset() { + *m = MsgWithdrawAllTokenizeShareRecordReward{} +} +func (m *MsgWithdrawAllTokenizeShareRecordReward) String() string { return proto.CompactTextString(m) } +func (*MsgWithdrawAllTokenizeShareRecordReward) ProtoMessage() {} +func (*MsgWithdrawAllTokenizeShareRecordReward) Descriptor() ([]byte, []int) { + return fileDescriptor_f0452d52deb0ca76, []int{8} +} +func (m *MsgWithdrawAllTokenizeShareRecordReward) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgWithdrawAllTokenizeShareRecordReward) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgWithdrawAllTokenizeShareRecordReward.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 *MsgWithdrawAllTokenizeShareRecordReward) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithdrawAllTokenizeShareRecordReward.Merge(m, src) +} +func (m *MsgWithdrawAllTokenizeShareRecordReward) XXX_Size() int { + return m.Size() +} +func (m *MsgWithdrawAllTokenizeShareRecordReward) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithdrawAllTokenizeShareRecordReward.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithdrawAllTokenizeShareRecordReward proto.InternalMessageInfo + +type MsgWithdrawAllTokenizeShareRecordRewardResponse struct { +} + +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) Reset() { + *m = MsgWithdrawAllTokenizeShareRecordRewardResponse{} +} +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) String() string { + return proto.CompactTextString(m) +} +func (*MsgWithdrawAllTokenizeShareRecordRewardResponse) ProtoMessage() {} +func (*MsgWithdrawAllTokenizeShareRecordRewardResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f0452d52deb0ca76, []int{9} +} +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgWithdrawAllTokenizeShareRecordRewardResponse.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 *MsgWithdrawAllTokenizeShareRecordRewardResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithdrawAllTokenizeShareRecordRewardResponse.Merge(m, src) +} +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithdrawAllTokenizeShareRecordRewardResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithdrawAllTokenizeShareRecordRewardResponse proto.InternalMessageInfo + // MsgFundCommunityPool allows an account to directly // fund the community pool. type MsgFundCommunityPool struct { @@ -350,7 +430,7 @@ func (m *MsgFundCommunityPool) Reset() { *m = MsgFundCommunityPool{} } func (m *MsgFundCommunityPool) String() string { return proto.CompactTextString(m) } func (*MsgFundCommunityPool) ProtoMessage() {} func (*MsgFundCommunityPool) Descriptor() ([]byte, []int) { - return fileDescriptor_f0452d52deb0ca76, []int{8} + return fileDescriptor_f0452d52deb0ca76, []int{10} } func (m *MsgFundCommunityPool) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -387,7 +467,7 @@ func (m *MsgFundCommunityPoolResponse) Reset() { *m = MsgFundCommunityPo func (m *MsgFundCommunityPoolResponse) String() string { return proto.CompactTextString(m) } func (*MsgFundCommunityPoolResponse) ProtoMessage() {} func (*MsgFundCommunityPoolResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f0452d52deb0ca76, []int{9} + return fileDescriptor_f0452d52deb0ca76, []int{11} } func (m *MsgFundCommunityPoolResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -425,6 +505,8 @@ func init() { proto.RegisterType((*MsgWithdrawValidatorCommissionResponse)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawValidatorCommissionResponse") proto.RegisterType((*MsgWithdrawTokenizeShareRecordReward)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawTokenizeShareRecordReward") proto.RegisterType((*MsgWithdrawTokenizeShareRecordRewardResponse)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawTokenizeShareRecordRewardResponse") + proto.RegisterType((*MsgWithdrawAllTokenizeShareRecordReward)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawAllTokenizeShareRecordReward") + proto.RegisterType((*MsgWithdrawAllTokenizeShareRecordRewardResponse)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawAllTokenizeShareRecordRewardResponse") proto.RegisterType((*MsgFundCommunityPool)(nil), "liquidstaking.distribution.v1beta1.MsgFundCommunityPool") proto.RegisterType((*MsgFundCommunityPoolResponse)(nil), "liquidstaking.distribution.v1beta1.MsgFundCommunityPoolResponse") } @@ -432,49 +514,53 @@ func init() { func init() { proto.RegisterFile("distribution/v1beta1/tx.proto", fileDescriptor_f0452d52deb0ca76) } var fileDescriptor_f0452d52deb0ca76 = []byte{ - // 661 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0x4f, 0x6b, 0x13, 0x41, - 0x18, 0xc6, 0x33, 0x2d, 0x14, 0x3b, 0x2a, 0xb6, 0x4b, 0xa5, 0x71, 0xdb, 0xee, 0xd6, 0xa5, 0x48, - 0x0e, 0x76, 0xd7, 0xd6, 0x8b, 0x16, 0x14, 0x9b, 0x96, 0x62, 0x85, 0x40, 0xd9, 0x8a, 0x82, 0x17, - 0xd9, 0x64, 0x86, 0xed, 0xd0, 0xdd, 0x79, 0xd3, 0x9d, 0xd9, 0xa6, 0xf1, 0x13, 0x78, 0x53, 0xfc, - 0x04, 0x15, 0x2f, 0x22, 0x78, 0xf3, 0x28, 0x08, 0x9e, 0x7a, 0xec, 0xd1, 0x53, 0x94, 0xf4, 0xe2, - 0xb9, 0x9f, 0x40, 0xb2, 0x9b, 0x5d, 0x93, 0x66, 0xd3, 0xff, 0xa7, 0x24, 0xef, 0x3c, 0xef, 0xf3, - 0xfe, 0x5e, 0x36, 0xcf, 0x0e, 0x9e, 0x22, 0x4c, 0xc8, 0x80, 0x95, 0x43, 0xc9, 0x80, 0x5b, 0xdb, - 0x73, 0x65, 0x2a, 0x9d, 0x39, 0x4b, 0xee, 0x98, 0xd5, 0x00, 0x24, 0x28, 0x86, 0xc7, 0xb6, 0x42, - 0x46, 0x84, 0x74, 0x36, 0x19, 0x77, 0xcd, 0x4e, 0xb1, 0xd9, 0x16, 0xab, 0x63, 0x2e, 0xb8, 0x10, - 0xc9, 0xad, 0xd6, 0xb7, 0xb8, 0x53, 0xd5, 0x2a, 0x20, 0x7c, 0x10, 0x56, 0xd9, 0x11, 0x34, 0xf5, - 0xad, 0x00, 0xe3, 0xf1, 0xb9, 0xf1, 0x0d, 0xe1, 0x9b, 0x25, 0xe1, 0xae, 0x53, 0xf9, 0x92, 0xc9, - 0x0d, 0x12, 0x38, 0xb5, 0x45, 0x42, 0x02, 0x2a, 0x84, 0xb2, 0x8a, 0x47, 0x09, 0xf5, 0xa8, 0xeb, - 0x48, 0x08, 0x5e, 0x3b, 0x71, 0x31, 0x8f, 0xa6, 0x51, 0x61, 0xb8, 0x38, 0x79, 0xd8, 0xd0, 0xf3, - 0x75, 0xc7, 0xf7, 0x16, 0x8c, 0x1e, 0x89, 0x61, 0x8f, 0xa4, 0xb5, 0xc4, 0x6a, 0x05, 0x8f, 0xd4, - 0xda, 0xee, 0xa9, 0xd3, 0x40, 0xe4, 0x34, 0x71, 0xd8, 0xd0, 0xc7, 0x63, 0xa7, 0xa3, 0x0a, 0xc3, - 0xbe, 0x51, 0xeb, 0x46, 0x5a, 0xb8, 0xf2, 0x76, 0x57, 0xcf, 0xfd, 0xdd, 0xd5, 0x73, 0x86, 0x8e, - 0xa7, 0x32, 0xa9, 0x6d, 0x2a, 0xaa, 0xc0, 0x05, 0x35, 0xbe, 0x23, 0xac, 0x96, 0x84, 0x9b, 0x1c, - 0x2f, 0x27, 0x48, 0x36, 0xad, 0x39, 0x01, 0xb9, 0xcc, 0xe5, 0x56, 0xf1, 0xe8, 0xb6, 0xe3, 0x31, - 0xd2, 0x65, 0x35, 0x70, 0xd4, 0xaa, 0x47, 0x62, 0xd8, 0x23, 0x69, 0xad, 0x77, 0xbf, 0x19, 0x6c, - 0xf4, 0xa7, 0x4f, 0x97, 0x0c, 0xb1, 0xd6, 0xa1, 0x7a, 0x91, 0xd8, 0x2d, 0x81, 0xef, 0x33, 0x21, - 0x18, 0xf0, 0x6c, 0x38, 0x74, 0x41, 0xb8, 0x02, 0xbe, 0x73, 0xfc, 0xd8, 0x14, 0x10, 0xf0, 0x4c, - 0x87, 0xf2, 0x39, 0x6c, 0x52, 0xce, 0xde, 0xd0, 0xf5, 0x0d, 0x27, 0xa0, 0x36, 0xad, 0x40, 0x6b, - 0x95, 0xe8, 0x71, 0x3c, 0xc2, 0xd7, 0xa1, 0xc6, 0xe9, 0x51, 0xc4, 0xfc, 0x61, 0x43, 0x1f, 0x8b, - 0x11, 0xbb, 0x8e, 0x0d, 0xfb, 0x5a, 0xf4, 0xbb, 0x17, 0xcd, 0xc4, 0x77, 0x4f, 0x33, 0x30, 0x05, - 0xfc, 0x84, 0xf0, 0x58, 0x49, 0xb8, 0x2b, 0x21, 0x27, 0x2d, 0xfc, 0x90, 0x33, 0x59, 0x5f, 0x03, - 0xf0, 0x94, 0x0a, 0x1e, 0x72, 0x7c, 0x08, 0xb9, 0xcc, 0xa3, 0xe9, 0xc1, 0xc2, 0xd5, 0xf9, 0x5b, - 0x66, 0x1c, 0x24, 0xb3, 0x15, 0xa4, 0x24, 0x73, 0xe6, 0x12, 0x30, 0x5e, 0xbc, 0xb7, 0xd7, 0xd0, - 0x73, 0x5f, 0x7e, 0xeb, 0x05, 0x97, 0xc9, 0x8d, 0xb0, 0x6c, 0x56, 0xc0, 0xb7, 0xda, 0xa9, 0x8b, - 0x3f, 0x66, 0x05, 0xd9, 0xb4, 0x64, 0xbd, 0x4a, 0x45, 0xd4, 0x20, 0xec, 0xb6, 0xb5, 0x32, 0x89, - 0x87, 0x09, 0xad, 0x82, 0x60, 0x12, 0x82, 0xf8, 0x2f, 0x63, 0xff, 0x2f, 0x74, 0x6c, 0xa5, 0xe1, - 0xc9, 0x2c, 0xc8, 0x64, 0x8b, 0xf9, 0x9f, 0x43, 0x78, 0xb0, 0x24, 0x5c, 0xe5, 0x03, 0xc2, 0x4a, - 0x46, 0x92, 0x1f, 0x9a, 0x27, 0xbf, 0x3e, 0xcc, 0xcc, 0x38, 0xa9, 0x8b, 0xe7, 0x6e, 0x4d, 0xe0, - 0x94, 0x8f, 0x08, 0x8f, 0xf7, 0x8b, 0xe1, 0xe3, 0x53, 0xda, 0xf7, 0xe9, 0x57, 0x57, 0x2e, 0xd6, - 0x9f, 0x32, 0x7e, 0x45, 0x78, 0xe2, 0xb8, 0x18, 0x15, 0xcf, 0x38, 0x27, 0xc3, 0x43, 0x7d, 0x76, - 0x71, 0x8f, 0x94, 0xf7, 0x07, 0xc2, 0xb7, 0x4f, 0x4e, 0xd5, 0xd3, 0x33, 0x4e, 0xec, 0xeb, 0xa4, - 0xae, 0x5d, 0x96, 0x53, 0xba, 0xc1, 0x3b, 0x84, 0x47, 0x7b, 0x53, 0xf7, 0xe0, 0x94, 0x73, 0x7a, - 0x3a, 0xd5, 0x27, 0xe7, 0xed, 0x4c, 0x88, 0x8a, 0xe5, 0xcf, 0x4d, 0x0d, 0xed, 0x35, 0x35, 0xb4, - 0xdf, 0xd4, 0xd0, 0x9f, 0xa6, 0x86, 0xde, 0x1f, 0x68, 0xb9, 0xfd, 0x03, 0x2d, 0xf7, 0xeb, 0x40, - 0xcb, 0xbd, 0x5a, 0xee, 0x08, 0x37, 0xdb, 0xf2, 0xc2, 0xd6, 0xe3, 0x60, 0xbc, 0x62, 0xc5, 0x53, - 0x99, 0xac, 0xcf, 0xb6, 0x27, 0xcf, 0xfa, 0x40, 0x42, 0x8f, 0x5a, 0x3b, 0x56, 0xd7, 0x95, 0x1e, - 0xc5, 0xbf, 0x3c, 0x14, 0x5d, 0xba, 0xf7, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x51, 0xe1, 0x6d, - 0x36, 0xef, 0x07, 0x00, 0x00, + // 722 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x96, 0x4f, 0x4f, 0x13, 0x5d, + 0x14, 0xc6, 0x7b, 0xe1, 0x0d, 0x81, 0xf3, 0x6a, 0x84, 0x09, 0x86, 0x3a, 0xc0, 0x0c, 0x4e, 0x88, + 0x76, 0x21, 0x33, 0x82, 0x1b, 0x25, 0xd1, 0x48, 0x21, 0x44, 0x34, 0x4d, 0xc8, 0x60, 0x34, 0x71, + 0x43, 0xa6, 0xbd, 0x37, 0xc3, 0x0d, 0x33, 0x73, 0xcb, 0xdc, 0x3b, 0x94, 0xfa, 0x09, 0x5c, 0x68, + 0x34, 0x7e, 0x02, 0x8c, 0x1b, 0x63, 0xe2, 0xce, 0xa5, 0x89, 0x5b, 0x96, 0x2c, 0x5d, 0x55, 0x53, + 0x36, 0xae, 0xf9, 0x04, 0xa6, 0x33, 0x9d, 0x71, 0x4a, 0x5b, 0x28, 0x7f, 0x5c, 0xb5, 0x3d, 0xf7, + 0x9c, 0xe7, 0xfc, 0x9e, 0xde, 0xc9, 0x93, 0x81, 0x49, 0x4c, 0xb9, 0xf0, 0x69, 0x31, 0x10, 0x94, + 0x79, 0xc6, 0xf6, 0x6c, 0x91, 0x08, 0x6b, 0xd6, 0x10, 0x3b, 0x7a, 0xd9, 0x67, 0x82, 0x49, 0x9a, + 0x43, 0xb7, 0x02, 0x8a, 0xb9, 0xb0, 0x36, 0xa9, 0x67, 0xeb, 0xe9, 0x66, 0xbd, 0xd9, 0x2c, 0x8f, + 0xda, 0xcc, 0x66, 0x61, 0xbb, 0xd1, 0xf8, 0x16, 0x4d, 0xca, 0x4a, 0x89, 0x71, 0x97, 0x71, 0xa3, + 0x68, 0x71, 0x92, 0xe8, 0x96, 0x18, 0xf5, 0xa2, 0x73, 0xed, 0x2b, 0x82, 0xab, 0x05, 0x6e, 0xaf, + 0x11, 0xf1, 0x9c, 0x8a, 0x0d, 0xec, 0x5b, 0x95, 0x05, 0x8c, 0x7d, 0xc2, 0xb9, 0xb4, 0x02, 0x23, + 0x98, 0x38, 0xc4, 0xb6, 0x04, 0xf3, 0xd7, 0xad, 0xa8, 0x98, 0x45, 0x53, 0x28, 0x37, 0x94, 0x9f, + 0x38, 0xac, 0xa9, 0xd9, 0xaa, 0xe5, 0x3a, 0xf3, 0x5a, 0x5b, 0x8b, 0x66, 0x0e, 0x27, 0xb5, 0x58, + 0x6a, 0x19, 0x86, 0x2b, 0x4d, 0xf5, 0x44, 0xa9, 0x2f, 0x54, 0x1a, 0x3f, 0xac, 0xa9, 0x63, 0x91, + 0xd2, 0xd1, 0x0e, 0xcd, 0xbc, 0x52, 0x69, 0x45, 0x9a, 0x1f, 0x7c, 0xb5, 0xab, 0x66, 0x7e, 0xef, + 0xaa, 0x19, 0x4d, 0x85, 0xc9, 0x8e, 0xd4, 0x26, 0xe1, 0x65, 0xe6, 0x71, 0xa2, 0x7d, 0x43, 0x20, + 0x17, 0xb8, 0x1d, 0x1f, 0x2f, 0xc5, 0x48, 0x26, 0xa9, 0x58, 0x3e, 0xbe, 0x48, 0x73, 0x2b, 0x30, + 0xb2, 0x6d, 0x39, 0x14, 0xb7, 0x48, 0xf5, 0x1d, 0x95, 0x6a, 0x6b, 0xd1, 0xcc, 0xe1, 0xa4, 0xd6, + 0xee, 0x6f, 0x1a, 0xb4, 0xee, 0xf4, 0x89, 0xc9, 0x00, 0x94, 0x54, 0xd7, 0xb3, 0x58, 0x6e, 0x91, + 0xb9, 0x2e, 0xe5, 0x9c, 0x32, 0xaf, 0x33, 0x1c, 0x3a, 0x27, 0x5c, 0x0e, 0x6e, 0x1c, 0xbf, 0x36, + 0x01, 0x7c, 0x8d, 0x60, 0x3a, 0xd5, 0xfa, 0x94, 0x6d, 0x12, 0x8f, 0xbe, 0x24, 0x6b, 0x1b, 0x96, + 0x4f, 0x4c, 0x52, 0x62, 0x0d, 0x2f, 0xe1, 0x7d, 0xdc, 0x87, 0xcb, 0xac, 0xe2, 0x91, 0xa3, 0x8c, + 0xd9, 0xc3, 0x9a, 0x3a, 0x1a, 0x31, 0xb6, 0x1c, 0x6b, 0xe6, 0xa5, 0xf0, 0x77, 0x7c, 0x07, 0xe3, + 0x30, 0xe4, 0x87, 0x72, 0xeb, 0x14, 0x87, 0xff, 0xfd, 0x7f, 0xe6, 0x60, 0x54, 0x58, 0xc1, 0x29, + 0x70, 0x1d, 0x6e, 0xf5, 0x42, 0x93, 0xe0, 0xfb, 0x70, 0x33, 0xd5, 0xbf, 0xe0, 0x38, 0xff, 0xca, + 0x40, 0x8a, 0x71, 0x16, 0x8c, 0x1e, 0x77, 0x26, 0x98, 0x1f, 0x11, 0x8c, 0x16, 0xb8, 0xbd, 0x1c, + 0x78, 0xb8, 0x71, 0x07, 0x81, 0x47, 0x45, 0x75, 0x95, 0x31, 0x47, 0x2a, 0xc1, 0x80, 0xe5, 0xb2, + 0xc0, 0x13, 0x59, 0x34, 0xd5, 0x9f, 0xfb, 0x7f, 0xee, 0x9a, 0x1e, 0xa5, 0x81, 0xde, 0x48, 0x83, + 0x38, 0x38, 0xf4, 0x45, 0x46, 0xbd, 0xfc, 0xed, 0xbd, 0x9a, 0x9a, 0xf9, 0xfc, 0x53, 0xcd, 0xd9, + 0x54, 0x6c, 0x04, 0x45, 0xbd, 0xc4, 0x5c, 0xa3, 0x19, 0x1d, 0xd1, 0xc7, 0x0c, 0xc7, 0x9b, 0x86, + 0xa8, 0x96, 0x09, 0x0f, 0x07, 0xb8, 0xd9, 0x94, 0x96, 0x26, 0x60, 0x08, 0x93, 0x32, 0xe3, 0x54, + 0x30, 0x3f, 0x7a, 0xee, 0xcd, 0xbf, 0x85, 0x94, 0x31, 0x05, 0x26, 0x3a, 0x41, 0xc6, 0x2e, 0xe6, + 0xde, 0x0c, 0x42, 0x7f, 0x81, 0xdb, 0xd2, 0x7b, 0x04, 0x52, 0x87, 0x38, 0xba, 0xa7, 0x9f, 0x9c, + 0x81, 0x7a, 0xc7, 0x4c, 0x90, 0x17, 0xce, 0x3c, 0x1a, 0xc3, 0x49, 0x1f, 0x10, 0x8c, 0x75, 0xcb, + 0x92, 0x07, 0x3d, 0xca, 0x77, 0x99, 0x97, 0x97, 0xcf, 0x37, 0x9f, 0x30, 0x7e, 0x41, 0x30, 0x7e, + 0x5c, 0x16, 0xe4, 0x4f, 0xb9, 0xa7, 0x83, 0x86, 0xfc, 0xf8, 0xfc, 0x1a, 0x09, 0xef, 0x77, 0x04, + 0xd7, 0x4f, 0x4e, 0x86, 0x47, 0xa7, 0xdc, 0xd8, 0x55, 0x49, 0x5e, 0xbd, 0x28, 0xa5, 0xc4, 0xc1, + 0x1e, 0x82, 0xe9, 0x9e, 0xd2, 0xe1, 0xc9, 0x29, 0x57, 0x1f, 0x27, 0x26, 0xaf, 0x5d, 0xa0, 0x58, + 0x62, 0xe5, 0x2d, 0x82, 0x91, 0xf6, 0x00, 0xb9, 0xdb, 0xe3, 0xaa, 0xb6, 0x49, 0xf9, 0xe1, 0x59, + 0x27, 0x63, 0xa2, 0x7c, 0xf1, 0x53, 0x5d, 0x41, 0x7b, 0x75, 0x05, 0xed, 0xd7, 0x15, 0xf4, 0xab, + 0xae, 0xa0, 0x77, 0x07, 0x4a, 0x66, 0xff, 0x40, 0xc9, 0xfc, 0x38, 0x50, 0x32, 0x2f, 0x96, 0x52, + 0x39, 0x45, 0xb7, 0x9c, 0xa0, 0xf1, 0x64, 0x51, 0xaf, 0x64, 0x44, 0x5b, 0xa9, 0xa8, 0xce, 0x34, + 0x37, 0xcf, 0xb8, 0x0c, 0x07, 0x0e, 0x31, 0x76, 0x8c, 0x96, 0x57, 0xac, 0x30, 0xc9, 0x8a, 0x03, + 0xe1, 0x4b, 0xd0, 0x9d, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd9, 0x37, 0xe9, 0xea, 0x7f, 0x09, + 0x00, 0x00, } func (this *MsgSetWithdrawAddressResponse) Equal(that interface{}) bool { @@ -561,6 +647,27 @@ func (this *MsgWithdrawTokenizeShareRecordRewardResponse) Equal(that interface{} } return true } +func (this *MsgWithdrawAllTokenizeShareRecordRewardResponse) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*MsgWithdrawAllTokenizeShareRecordRewardResponse) + if !ok { + that2, ok := that.(MsgWithdrawAllTokenizeShareRecordRewardResponse) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + return true +} func (this *MsgFundCommunityPoolResponse) Equal(that interface{}) bool { if that == nil { return this == nil @@ -604,9 +711,10 @@ type MsgClient interface { // WithdrawValidatorCommission defines a method to withdraw the // full commission to the validator address. WithdrawValidatorCommission(ctx context.Context, in *MsgWithdrawValidatorCommission, opts ...grpc.CallOption) (*MsgWithdrawValidatorCommissionResponse, error) - // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for - // owning TokenizeShareRecord + // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for an owning TokenizeShareRecord WithdrawTokenizeShareRecordReward(ctx context.Context, in *MsgWithdrawTokenizeShareRecordReward, opts ...grpc.CallOption) (*MsgWithdrawTokenizeShareRecordRewardResponse, error) + // WithdrawAllTokenizeShareRecordReward defines a method to withdraw reward for all owning TokenizeShareRecord + WithdrawAllTokenizeShareRecordReward(ctx context.Context, in *MsgWithdrawAllTokenizeShareRecordReward, opts ...grpc.CallOption) (*MsgWithdrawAllTokenizeShareRecordRewardResponse, error) // FundCommunityPool defines a method to allow an account to directly // fund the community pool. FundCommunityPool(ctx context.Context, in *MsgFundCommunityPool, opts ...grpc.CallOption) (*MsgFundCommunityPoolResponse, error) @@ -656,6 +764,15 @@ func (c *msgClient) WithdrawTokenizeShareRecordReward(ctx context.Context, in *M return out, nil } +func (c *msgClient) WithdrawAllTokenizeShareRecordReward(ctx context.Context, in *MsgWithdrawAllTokenizeShareRecordReward, opts ...grpc.CallOption) (*MsgWithdrawAllTokenizeShareRecordRewardResponse, error) { + out := new(MsgWithdrawAllTokenizeShareRecordRewardResponse) + err := c.cc.Invoke(ctx, "/liquidstaking.distribution.v1beta1.Msg/WithdrawAllTokenizeShareRecordReward", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *msgClient) FundCommunityPool(ctx context.Context, in *MsgFundCommunityPool, opts ...grpc.CallOption) (*MsgFundCommunityPoolResponse, error) { out := new(MsgFundCommunityPoolResponse) err := c.cc.Invoke(ctx, "/liquidstaking.distribution.v1beta1.Msg/FundCommunityPool", in, out, opts...) @@ -676,9 +793,10 @@ type MsgServer interface { // WithdrawValidatorCommission defines a method to withdraw the // full commission to the validator address. WithdrawValidatorCommission(context.Context, *MsgWithdrawValidatorCommission) (*MsgWithdrawValidatorCommissionResponse, error) - // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for - // owning TokenizeShareRecord + // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for an owning TokenizeShareRecord WithdrawTokenizeShareRecordReward(context.Context, *MsgWithdrawTokenizeShareRecordReward) (*MsgWithdrawTokenizeShareRecordRewardResponse, error) + // WithdrawAllTokenizeShareRecordReward defines a method to withdraw reward for all owning TokenizeShareRecord + WithdrawAllTokenizeShareRecordReward(context.Context, *MsgWithdrawAllTokenizeShareRecordReward) (*MsgWithdrawAllTokenizeShareRecordRewardResponse, error) // FundCommunityPool defines a method to allow an account to directly // fund the community pool. FundCommunityPool(context.Context, *MsgFundCommunityPool) (*MsgFundCommunityPoolResponse, error) @@ -700,6 +818,9 @@ func (*UnimplementedMsgServer) WithdrawValidatorCommission(ctx context.Context, func (*UnimplementedMsgServer) WithdrawTokenizeShareRecordReward(ctx context.Context, req *MsgWithdrawTokenizeShareRecordReward) (*MsgWithdrawTokenizeShareRecordRewardResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method WithdrawTokenizeShareRecordReward not implemented") } +func (*UnimplementedMsgServer) WithdrawAllTokenizeShareRecordReward(ctx context.Context, req *MsgWithdrawAllTokenizeShareRecordReward) (*MsgWithdrawAllTokenizeShareRecordRewardResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WithdrawAllTokenizeShareRecordReward not implemented") +} func (*UnimplementedMsgServer) FundCommunityPool(ctx context.Context, req *MsgFundCommunityPool) (*MsgFundCommunityPoolResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FundCommunityPool not implemented") } @@ -780,6 +901,24 @@ func _Msg_WithdrawTokenizeShareRecordReward_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } +func _Msg_WithdrawAllTokenizeShareRecordReward_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgWithdrawAllTokenizeShareRecordReward) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).WithdrawAllTokenizeShareRecordReward(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/liquidstaking.distribution.v1beta1.Msg/WithdrawAllTokenizeShareRecordReward", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).WithdrawAllTokenizeShareRecordReward(ctx, req.(*MsgWithdrawAllTokenizeShareRecordReward)) + } + return interceptor(ctx, in, info, handler) +} + func _Msg_FundCommunityPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MsgFundCommunityPool) if err := dec(in); err != nil { @@ -818,6 +957,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "WithdrawTokenizeShareRecordReward", Handler: _Msg_WithdrawTokenizeShareRecordReward_Handler, }, + { + MethodName: "WithdrawAllTokenizeShareRecordReward", + Handler: _Msg_WithdrawAllTokenizeShareRecordReward_Handler, + }, { MethodName: "FundCommunityPool", Handler: _Msg_FundCommunityPool_Handler, @@ -1020,6 +1163,11 @@ func (m *MsgWithdrawTokenizeShareRecordReward) MarshalToSizedBuffer(dAtA []byte) _ = i var l int _ = l + if m.RecordId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.RecordId)) + i-- + dAtA[i] = 0x10 + } if len(m.OwnerAddress) > 0 { i -= len(m.OwnerAddress) copy(dAtA[i:], m.OwnerAddress) @@ -1053,6 +1201,59 @@ func (m *MsgWithdrawTokenizeShareRecordRewardResponse) MarshalToSizedBuffer(dAtA return len(dAtA) - i, nil } +func (m *MsgWithdrawAllTokenizeShareRecordReward) 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 *MsgWithdrawAllTokenizeShareRecordReward) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgWithdrawAllTokenizeShareRecordReward) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OwnerAddress) > 0 { + i -= len(m.OwnerAddress) + copy(dAtA[i:], m.OwnerAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.OwnerAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) 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 *MsgWithdrawAllTokenizeShareRecordRewardResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *MsgFundCommunityPool) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1215,6 +1416,9 @@ func (m *MsgWithdrawTokenizeShareRecordReward) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } + if m.RecordId != 0 { + n += 1 + sovTx(uint64(m.RecordId)) + } return n } @@ -1227,6 +1431,28 @@ func (m *MsgWithdrawTokenizeShareRecordRewardResponse) Size() (n int) { return n } +func (m *MsgWithdrawAllTokenizeShareRecordReward) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OwnerAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgWithdrawAllTokenizeShareRecordRewardResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *MsgFundCommunityPool) Size() (n int) { if m == nil { return 0 @@ -1800,6 +2026,25 @@ func (m *MsgWithdrawTokenizeShareRecordReward) Unmarshal(dAtA []byte) error { } m.OwnerAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RecordId", wireType) + } + m.RecordId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RecordId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) @@ -1877,6 +2122,144 @@ func (m *MsgWithdrawTokenizeShareRecordRewardResponse) Unmarshal(dAtA []byte) er } return nil } +func (m *MsgWithdrawAllTokenizeShareRecordReward) 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: MsgWithdrawAllTokenizeShareRecordReward: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgWithdrawAllTokenizeShareRecordReward: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OwnerAddress", 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.OwnerAddress = 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 *MsgWithdrawAllTokenizeShareRecordRewardResponse) 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: MsgWithdrawAllTokenizeShareRecordRewardResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgWithdrawAllTokenizeShareRecordRewardResponse: 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 *MsgFundCommunityPool) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From abe0e1b067b4558d5e09e6e2bb0b92830bd0ce4b Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 26 Apr 2022 03:16:22 +1000 Subject: [PATCH 19/57] error return value checks --- x/distribution/module.go | 5 ++++- x/distribution/types/msg.go | 20 ++++++++++++++++---- x/slashing/module.go | 5 ++++- x/staking/genesis.go | 5 ++++- x/staking/keeper/msg_server.go | 16 ++++++++++++++-- x/staking/module.go | 10 ++++++++-- x/staking/types/msg.go | 30 ++++++++++++++++++++++++------ 7 files changed, 74 insertions(+), 17 deletions(-) diff --git a/x/distribution/module.go b/x/distribution/module.go index bb3b3783..4666256e 100644 --- a/x/distribution/module.go +++ b/x/distribution/module.go @@ -143,7 +143,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterQueryServer(cfg.QueryServer(), am.keeper) m := keeper.NewMigrator(am.keeper) - cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) + err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) + if err != nil { + panic(err) + } } // InitGenesis performs genesis initialization for the distribution module. It returns diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 25701f81..8891b4d6 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -31,7 +31,10 @@ func (msg MsgSetWithdrawAddress) Type() string { return TypeMsgSetWithdrawAddre // Return address that must sign over msg.GetSignBytes() func (msg MsgSetWithdrawAddress) GetSigners() []sdk.AccAddress { - delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + delegator, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{delegator} } @@ -65,7 +68,10 @@ func (msg MsgWithdrawDelegatorReward) Type() string { return TypeMsgWithdrawDel // Return address that must sign over msg.GetSignBytes() func (msg MsgWithdrawDelegatorReward) GetSigners() []sdk.AccAddress { - delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + delegator, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{delegator} } @@ -133,7 +139,10 @@ func (msg MsgFundCommunityPool) Type() string { return TypeMsgFundCommunityPool // GetSigners returns the signer addresses that are expected to sign the result // of GetSignBytes. func (msg MsgFundCommunityPool) GetSigners() []sdk.AccAddress { - depositor, _ := sdk.AccAddressFromBech32(msg.Depositor) + depositor, err := sdk.AccAddressFromBech32(msg.Depositor) + if err != nil { + panic(err) + } return []sdk.AccAddress{depositor} } @@ -168,7 +177,10 @@ func (msg MsgWithdrawTokenizeShareRecordReward) Type() string { // Return address that must sign over msg.GetSignBytes() func (msg MsgWithdrawTokenizeShareRecordReward) GetSigners() []sdk.AccAddress { - owner, _ := sdk.AccAddressFromBech32(msg.OwnerAddress) + owner, err := sdk.AccAddressFromBech32(msg.OwnerAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{owner} } diff --git a/x/slashing/module.go b/x/slashing/module.go index 16a811a8..93b27951 100644 --- a/x/slashing/module.go +++ b/x/slashing/module.go @@ -140,7 +140,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterQueryServer(cfg.QueryServer(), am.keeper) m := keeper.NewMigrator(am.keeper) - cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) + err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) + if err != nil { + panic(err) + } } // InitGenesis performs genesis initialization for the slashing module. It returns diff --git a/x/staking/genesis.go b/x/staking/genesis.go index 8b9147f1..d768c2b4 100644 --- a/x/staking/genesis.go +++ b/x/staking/genesis.go @@ -40,7 +40,10 @@ func InitGenesis( keeper.SetValidator(ctx, validator) // Manually set indices for the first time - keeper.SetValidatorByConsAddr(ctx, validator) + err := keeper.SetValidatorByConsAddr(ctx, validator) + if err != nil { + panic(err) + } keeper.SetValidatorByPowerIndex(ctx, validator) // Call the creation hook if not exported diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 2b7f6fb7..7db623e7 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -102,7 +102,10 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa validator.MinSelfDelegation = msg.MinSelfDelegation k.SetValidator(ctx, validator) - k.SetValidatorByConsAddr(ctx, validator) + err = k.SetValidatorByConsAddr(ctx, validator) + if err != nil { + return nil, err + } k.SetNewValidatorByPowerIndex(ctx, validator) // call the after-creation hook @@ -466,6 +469,9 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS shares, err := k.ValidateUnbondAmount( ctx, delegatorAddress, valAddr, msg.Amount.Amount, ) + if err != nil { + return nil, err + } returnAmount, err := k.Unbond(ctx, delegatorAddress, valAddr, shares) if err != nil { @@ -556,7 +562,10 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken k.hooks.BeforeTokenizeShareRecordRemoved(ctx, record.Id) } - k.DeleteTokenizeShareRecord(ctx, record.Id) + err = k.DeleteTokenizeShareRecord(ctx, record.Id) + if err != nil { + return nil, err + } } // send share tokens to NotBondedPool and burn @@ -605,6 +614,9 @@ func (k msgServer) TransferTokenizeShareRecord(goCtx context.Context, msg *types // Remove old account reference oldOwner, err := sdk.AccAddressFromBech32(record.Owner) + if err != nil { + return nil, sdkerrors.ErrInvalidAddress + } k.deleteTokenizeShareRecordWithOwner(ctx, oldOwner, record.Id) record.Owner = msg.NewOwner diff --git a/x/staking/module.go b/x/staking/module.go index 3bdeba6e..0116406c 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -144,8 +144,14 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterQueryServer(cfg.QueryServer(), querier) m := keeper.NewMigrator(am.keeper) - cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) - cfg.RegisterMigration(types.ModuleName, 2, m.Migrate2to3) + err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) + if err != nil { + panic(err) + } + err = cfg.RegisterMigration(types.ModuleName, 2, m.Migrate2to3) + if err != nil { + panic(err) + } } // InitGenesis performs genesis initialization for the staking module. It returns diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index dc214fb5..18e31d41 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -216,7 +216,10 @@ func (msg MsgDelegate) Type() string { return TypeMsgDelegate } // GetSigners implements the sdk.Msg interface. func (msg MsgDelegate) GetSigners() []sdk.AccAddress { - delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + delegator, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{delegator} } @@ -266,7 +269,10 @@ func (msg MsgBeginRedelegate) Type() string { return TypeMsgBeginRedelegate } // GetSigners implements the sdk.Msg interface func (msg MsgBeginRedelegate) GetSigners() []sdk.AccAddress { - delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + delegator, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{delegator} } @@ -316,7 +322,10 @@ func (msg MsgUndelegate) Type() string { return TypeMsgUndelegate } // GetSigners implements the sdk.Msg interface. func (msg MsgUndelegate) GetSigners() []sdk.AccAddress { - delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + delegator, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{delegator} } @@ -349,7 +358,10 @@ func (msg MsgUndelegate) ValidateBasic() error { func (msg MsgTokenizeShares) Type() string { return TypeMsgTokenizeShares } func (msg MsgTokenizeShares) GetSigners() []sdk.AccAddress { - delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + delegator, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{delegator} } @@ -383,7 +395,10 @@ func (msg MsgTokenizeShares) ValidateBasic() error { func (msg MsgRedeemTokensforShares) Type() string { return TypeMsgRedeemTokensforShares } func (msg MsgRedeemTokensforShares) GetSigners() []sdk.AccAddress { - delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + delegator, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{delegator} } @@ -411,7 +426,10 @@ func (msg MsgRedeemTokensforShares) ValidateBasic() error { func (msg MsgTransferTokenizeShareRecord) Type() string { return TypeMsgTransferTokenizeShareRecord } func (msg MsgTransferTokenizeShareRecord) GetSigners() []sdk.AccAddress { - sender, _ := sdk.AccAddressFromBech32(msg.Sender) + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } return []sdk.AccAddress{sender} } From 87bd146a024d2a27910fb1b6132fe28df465d3a8 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 26 Apr 2022 03:40:01 +1000 Subject: [PATCH 20/57] conside auto withdrawn moduleBalance along with operations test fix --- x/distribution/keeper/grpc_query.go | 38 +++++++++++--------- x/distribution/simulation/operations.go | 4 +-- x/distribution/simulation/operations_test.go | 2 +- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/x/distribution/keeper/grpc_query.go b/x/distribution/keeper/grpc_query.go index a96d471b..4347e328 100644 --- a/x/distribution/keeper/grpc_query.go +++ b/x/distribution/keeper/grpc_query.go @@ -268,25 +268,29 @@ func (k Keeper) TokenizeShareRecordReward(c context.Context, req *types.QueryTok return nil, err } - val := k.stakingKeeper.Validator(ctx, valAddr) - if val == nil { - continue - } + moduleAddr := record.GetModuleAddress() + moduleBalance := k.bankKeeper.GetAllBalances(ctx, moduleAddr) + moduleBalanceDecCoins := sdk.NewDecCoinsFromCoins(moduleBalance...) - del := k.stakingKeeper.Delegation(ctx, record.GetModuleAddress(), valAddr) - if del == nil { - continue + val := k.stakingKeeper.Validator(ctx, valAddr) + del := k.stakingKeeper.Delegation(ctx, moduleAddr, valAddr) + if val != nil && del != nil { + // withdraw rewards + endingPeriod := k.IncrementValidatorPeriod(ctx, val) + recordReward := k.CalculateDelegationRewards(ctx, val, del, endingPeriod) + + rewards = append(rewards, types.TokenizeShareRecordReward{ + RecordId: record.Id, + Reward: recordReward.Add(moduleBalanceDecCoins...), + }) + totalRewards = totalRewards.Add(recordReward...) + } else if !moduleBalance.IsZero() { + rewards = append(rewards, types.TokenizeShareRecordReward{ + RecordId: record.Id, + Reward: moduleBalanceDecCoins, + }) + totalRewards = totalRewards.Add(moduleBalanceDecCoins...) } - - // withdraw rewards - endingPeriod := k.IncrementValidatorPeriod(ctx, val) - recordReward := k.CalculateDelegationRewards(ctx, val, del, endingPeriod) - - rewards = append(rewards, types.TokenizeShareRecordReward{ - RecordId: record.Id, - Reward: recordReward, - }) - totalRewards = totalRewards.Add(recordReward...) } return &types.QueryTokenizeShareRecordRewardResponse{ diff --git a/x/distribution/simulation/operations.go b/x/distribution/simulation/operations.go index 5855b21b..e1eec5c2 100644 --- a/x/distribution/simulation/operations.go +++ b/x/distribution/simulation/operations.go @@ -15,7 +15,7 @@ import ( stakingkeeper "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" ) -const DefaultWeightMsgWithdrawTokenizeShareRecordReward int = 50 +const DefaultWeightMsgWithdrawAllTokenizeShareRecordReward int = 50 // Simulation operation weights constants const ( @@ -63,7 +63,7 @@ func WeightedOperations( var weightMsgWithdrawTokenizeShareRecordReward int appParams.GetOrGenerate(cdc, OpWeightMsgWithdrawTokenizeShareRecordReward, &weightMsgWithdrawTokenizeShareRecordReward, nil, func(_ *rand.Rand) { - weightMsgWithdrawTokenizeShareRecordReward = DefaultWeightMsgWithdrawTokenizeShareRecordReward + weightMsgWithdrawTokenizeShareRecordReward = DefaultWeightMsgWithdrawAllTokenizeShareRecordReward }, ) diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index 37794480..9e423f42 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -44,7 +44,7 @@ func (suite *SimTestSuite) TestWeightedOperations() { {simappparams.DefaultWeightMsgWithdrawDelegationReward, types.ModuleName, types.TypeMsgWithdrawDelegatorReward}, {simappparams.DefaultWeightMsgWithdrawValidatorCommission, types.ModuleName, types.TypeMsgWithdrawValidatorCommission}, {simappparams.DefaultWeightMsgFundCommunityPool, types.ModuleName, types.TypeMsgFundCommunityPool}, - {simulation.DefaultWeightMsgWithdrawTokenizeShareRecordReward, types.ModuleName, types.TypeMsgWithdrawTokenizeShareRecordReward}, + {simulation.DefaultWeightMsgWithdrawAllTokenizeShareRecordReward, types.ModuleName, types.TypeMsgWithdrawAllTokenizeShareRecordReward}, } for i, w := range weightesOps { From 8bef264ad0d738ada722a60e9a1478cf5b450ae8 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 26 Apr 2022 03:46:26 +1000 Subject: [PATCH 21/57] get sharedenom from lowercased validator address --- x/staking/keeper/msg_server.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 2b7f6fb7..b2da4873 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "strconv" + "strings" "time" metrics "github.com/armon/go-metrics" @@ -388,7 +389,7 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( } func getShareTokenDenom(validatorAddress string, tokenizeShareRecordId uint64) string { - return validatorAddress + strconv.Itoa(int(tokenizeShareRecordId)) + return strings.ToLower(validatorAddress) + strconv.Itoa(int(tokenizeShareRecordId)) } func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeShares) (*types.MsgTokenizeSharesResponse, error) { From 09a1c69648ee1ce6f558c17194e93da43bc7af08 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Mon, 9 May 2022 19:26:21 +1000 Subject: [PATCH 22/57] add error check for owner address --- x/distribution/types/msg.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 5f374afb..96bb7b32 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -202,7 +202,10 @@ func (msg MsgWithdrawAllTokenizeShareRecordReward) Type() string { // Return address that must sign over msg.GetSignBytes() func (msg MsgWithdrawAllTokenizeShareRecordReward) GetSigners() []sdk.AccAddress { - owner, _ := sdk.AccAddressFromBech32(msg.OwnerAddress) + owner, err := sdk.AccAddressFromBech32(msg.OwnerAddress) + if err != nil { + panic(err) + } return []sdk.AccAddress{owner} } From 4ffe0f209529d1a0257749b40b917e5cf90f54e0 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Sat, 21 May 2022 03:38:14 +1000 Subject: [PATCH 23/57] redeem share tokens response --- proto/staking/v1beta1/tx.proto | 4 +- x/staking/keeper/msg_server.go | 6 + x/staking/types/staking.pb.go | 657 +++++++++++++++++++++++++++++++++ x/staking/types/tx.pb.go | 197 ++++++---- 4 files changed, 791 insertions(+), 73 deletions(-) diff --git a/proto/staking/v1beta1/tx.proto b/proto/staking/v1beta1/tx.proto index f097f929..5a39d25b 100644 --- a/proto/staking/v1beta1/tx.proto +++ b/proto/staking/v1beta1/tx.proto @@ -164,7 +164,9 @@ message MsgRedeemTokensforShares { cosmos.base.v1beta1.Coin amount = 2 [ (gogoproto.nullable) = false ]; } -message MsgRedeemTokensforSharesResponse {} +message MsgRedeemTokensforSharesResponse { + cosmos.base.v1beta1.Coin amount = 1 [ (gogoproto.nullable) = false ]; +} message MsgTransferTokenizeShareRecord { option (gogoproto.equal) = false; diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 6b112f1c..7fe1c66f 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -608,6 +608,7 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken return nil, err } +<<<<<<< Updated upstream ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeRedeemShares, @@ -618,6 +619,11 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken ) return &types.MsgRedeemTokensforSharesResponse{}, nil +======= + return &types.MsgRedeemTokensforSharesResponse{ + Amount: returnCoin, + }, nil +>>>>>>> Stashed changes } func (k msgServer) TransferTokenizeShareRecord(goCtx context.Context, msg *types.MsgTransferTokenizeShareRecord) (*types.MsgTransferTokenizeShareRecordResponse, error) { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index df7f16d7..430b4c37 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1335,6 +1335,7 @@ 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{ +<<<<<<< Updated upstream // 10431 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, 0x75, 0x18, 0x8e, 0xd9, 0x5d, 0x00, 0xbb, 0x0f, 0x5f, 0x8b, 0x06, 0xee, 0x6e, 0x6f, 0xef, 0x0e, @@ -1988,6 +1989,662 @@ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descri 0x0f, 0x0b, 0x0e, 0x57, 0x5b, 0xb9, 0x2e, 0xf2, 0x12, 0xa0, 0x46, 0x55, 0x0d, 0xff, 0x74, 0x90, 0x67, 0x7d, 0xd1, 0x28, 0x74, 0xfb, 0x7f, 0x5c, 0x87, 0x15, 0xbc, 0x73, 0xda, 0x37, 0xc0, 0xb6, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa8, 0x86, 0x13, 0xc9, 0x08, 0xa8, 0x00, 0x00, +======= + // 10447 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0x66, 0x77, 0x01, 0xec, 0x3e, 0x7c, 0x2d, 0x1a, 0xb8, 0xbb, 0xbd, 0xbd, 0x3b, 0x00, + 0x1c, 0x92, 0x77, 0xc7, 0x23, 0x0f, 0x20, 0x8f, 0xbc, 0x0f, 0xe2, 0x44, 0x9e, 0x76, 0x81, 0x3d, + 0x1c, 0x48, 0x7c, 0x71, 0x00, 0x1c, 0x29, 0x2a, 0xae, 0xcd, 0x60, 0xb7, 0xb1, 0x18, 0x62, 0x77, + 0x66, 0x38, 0x33, 0x7b, 0x07, 0x9c, 0xa4, 0x32, 0xfd, 0x4d, 0xd3, 0x51, 0xf4, 0x61, 0x97, 0x2d, + 0x53, 0x3a, 0x45, 0xb2, 0x94, 0x48, 0x61, 0xec, 0x58, 0x96, 0x64, 0x25, 0x8e, 0xf3, 0x43, 0x72, + 0x95, 0x13, 0x59, 0x55, 0x71, 0x24, 0xa7, 0x12, 0x29, 0x4e, 0x72, 0x92, 0x29, 0xc5, 0x51, 0x14, + 0x25, 0x56, 0x18, 0xa9, 0xe2, 0x2a, 0x55, 0x2a, 0xa9, 0xfe, 0x9a, 0xaf, 0xdd, 0xc5, 0xec, 0xe2, + 0xee, 0x28, 0xd9, 0xce, 0x2f, 0xa0, 0xbb, 0xdf, 0x7b, 0xfd, 0xfa, 0xf5, 0xeb, 0xd7, 0xef, 0xbd, + 0xee, 0x9e, 0x85, 0x0f, 0x5e, 0x84, 0x89, 0x8a, 0x61, 0x54, 0xaa, 0x78, 0xca, 0xb4, 0x0c, 0xc7, + 0xd8, 0xa8, 0x6f, 0x4e, 0x95, 0xb1, 0x5d, 0xb2, 0x34, 0xd3, 0x31, 0xac, 0x49, 0x5a, 0x87, 0x86, + 0x18, 0xc4, 0xa4, 0x80, 0x90, 0x17, 0x61, 0xf8, 0xb2, 0x56, 0xc5, 0xb3, 0x2e, 0xe0, 0x2a, 0x76, + 0xd0, 0x05, 0x48, 0x6c, 0x6a, 0x55, 0x9c, 0x91, 0x26, 0xe2, 0x27, 0xfb, 0xce, 0xdc, 0x37, 0x19, + 0x42, 0x9a, 0x0c, 0x62, 0xac, 0x90, 0x6a, 0x85, 0x62, 0xc8, 0xdf, 0x4a, 0xc0, 0x48, 0x93, 0x56, + 0x84, 0x20, 0xa1, 0xab, 0x35, 0x42, 0x51, 0x3a, 0x99, 0x52, 0xe8, 0xff, 0x28, 0x03, 0xbd, 0xa6, + 0x5a, 0xda, 0x56, 0x2b, 0x38, 0x13, 0xa3, 0xd5, 0xa2, 0x88, 0xc6, 0x00, 0xca, 0xd8, 0xc4, 0x7a, + 0x19, 0xeb, 0xa5, 0xdd, 0x4c, 0x7c, 0x22, 0x7e, 0x32, 0xa5, 0xf8, 0x6a, 0xd0, 0x83, 0x30, 0x6c, + 0xd6, 0x37, 0xaa, 0x5a, 0xa9, 0xe8, 0x03, 0x83, 0x89, 0xf8, 0xc9, 0x6e, 0x25, 0xcd, 0x1a, 0x66, + 0x3d, 0xe0, 0x13, 0x30, 0x74, 0x1d, 0xab, 0xdb, 0x7e, 0xd0, 0x3e, 0x0a, 0x3a, 0x48, 0xaa, 0x7d, + 0x80, 0x33, 0xd0, 0x5f, 0xc3, 0xb6, 0xad, 0x56, 0x70, 0xd1, 0xd9, 0x35, 0x71, 0x26, 0x41, 0x47, + 0x3f, 0xd1, 0x30, 0xfa, 0xf0, 0xc8, 0xfb, 0x38, 0xd6, 0xda, 0xae, 0x89, 0x51, 0x0e, 0x52, 0x58, + 0xaf, 0xd7, 0x18, 0x85, 0xee, 0x16, 0xf2, 0x2b, 0xe8, 0xf5, 0x5a, 0x98, 0x4a, 0x92, 0xa0, 0x71, + 0x12, 0xbd, 0x36, 0xb6, 0xae, 0x69, 0x25, 0x9c, 0xe9, 0xa1, 0x04, 0x4e, 0x34, 0x10, 0x58, 0x65, + 0xed, 0x61, 0x1a, 0x02, 0x0f, 0xcd, 0x40, 0x0a, 0xef, 0x38, 0x58, 0xb7, 0x35, 0x43, 0xcf, 0xf4, + 0x52, 0x22, 0xf7, 0x37, 0x99, 0x45, 0x5c, 0x2d, 0x87, 0x49, 0x78, 0x78, 0xe8, 0x1c, 0xf4, 0x1a, + 0xa6, 0xa3, 0x19, 0xba, 0x9d, 0x49, 0x4e, 0x48, 0x27, 0xfb, 0xce, 0x1c, 0x6d, 0xaa, 0x08, 0xcb, + 0x0c, 0x46, 0x11, 0xc0, 0x68, 0x1e, 0xd2, 0xb6, 0x51, 0xb7, 0x4a, 0xb8, 0x58, 0x32, 0xca, 0xb8, + 0xa8, 0xe9, 0x9b, 0x46, 0x26, 0x45, 0x09, 0x8c, 0x37, 0x0e, 0x84, 0x02, 0xce, 0x18, 0x65, 0x3c, + 0xaf, 0x6f, 0x1a, 0xca, 0xa0, 0x1d, 0x28, 0xa3, 0x83, 0xd0, 0x63, 0xef, 0xea, 0x8e, 0xba, 0x93, + 0xe9, 0xa7, 0x1a, 0xc2, 0x4b, 0xf2, 0xef, 0xf5, 0xc0, 0x50, 0x3b, 0x2a, 0x76, 0x11, 0xba, 0x37, + 0xc9, 0x28, 0x33, 0xb1, 0x4e, 0x64, 0xc0, 0x70, 0x82, 0x42, 0xec, 0xd9, 0xa7, 0x10, 0x73, 0xd0, + 0xa7, 0x63, 0xdb, 0xc1, 0x65, 0xa6, 0x11, 0xf1, 0x36, 0x75, 0x0a, 0x18, 0x52, 0xa3, 0x4a, 0x25, + 0xf6, 0xa5, 0x52, 0xcf, 0xc1, 0x90, 0xcb, 0x52, 0xd1, 0x52, 0xf5, 0x8a, 0xd0, 0xcd, 0xa9, 0x28, + 0x4e, 0x26, 0x0b, 0x02, 0x4f, 0x21, 0x68, 0xca, 0x20, 0x0e, 0x94, 0xd1, 0x2c, 0x80, 0xa1, 0x63, + 0x63, 0xb3, 0x58, 0xc6, 0xa5, 0x6a, 0x26, 0xd9, 0x42, 0x4a, 0xcb, 0x04, 0xa4, 0x41, 0x4a, 0x06, + 0xab, 0x2d, 0x55, 0xd1, 0xe3, 0x9e, 0xaa, 0xf5, 0xb6, 0xd0, 0x94, 0x45, 0xb6, 0xc8, 0x1a, 0xb4, + 0x6d, 0x1d, 0x06, 0x2d, 0x4c, 0xf4, 0x1e, 0x97, 0xf9, 0xc8, 0x52, 0x94, 0x89, 0xc9, 0xc8, 0x91, + 0x29, 0x1c, 0x8d, 0x0d, 0x6c, 0xc0, 0xf2, 0x17, 0xd1, 0xbd, 0xe0, 0x56, 0x14, 0xa9, 0x5a, 0x01, + 0xb5, 0x42, 0xfd, 0xa2, 0x72, 0x49, 0xad, 0xe1, 0xec, 0x0d, 0x18, 0x0c, 0x8a, 0x07, 0x8d, 0x42, + 0xb7, 0xed, 0xa8, 0x96, 0x43, 0xb5, 0xb0, 0x5b, 0x61, 0x05, 0x94, 0x86, 0x38, 0xd6, 0xcb, 0xd4, + 0xca, 0x75, 0x2b, 0xe4, 0x5f, 0xf4, 0x56, 0x6f, 0xc0, 0x71, 0x3a, 0xe0, 0xe3, 0x8d, 0x33, 0x1a, + 0xa0, 0x1c, 0x1e, 0x77, 0xf6, 0x3c, 0x0c, 0x04, 0x06, 0xd0, 0x6e, 0xd7, 0xf2, 0x3b, 0xe1, 0x40, + 0x53, 0xd2, 0xe8, 0x39, 0x18, 0xad, 0xeb, 0x9a, 0xee, 0x60, 0xcb, 0xb4, 0x30, 0xd1, 0x58, 0xd6, + 0x55, 0xe6, 0xbf, 0xf4, 0xb6, 0xd0, 0xb9, 0x75, 0x3f, 0x34, 0xa3, 0xa2, 0x8c, 0xd4, 0x1b, 0x2b, + 0x4f, 0xa5, 0x92, 0xdf, 0xee, 0x4d, 0xbf, 0xf4, 0xd2, 0x4b, 0x2f, 0xc5, 0xe4, 0x0f, 0xf4, 0xc0, + 0x68, 0xb3, 0x35, 0xd3, 0x74, 0xf9, 0x1e, 0x84, 0x1e, 0xbd, 0x5e, 0xdb, 0xc0, 0x16, 0x15, 0x52, + 0xb7, 0xc2, 0x4b, 0x28, 0x07, 0xdd, 0x55, 0x75, 0x03, 0x57, 0x33, 0x89, 0x09, 0xe9, 0xe4, 0xe0, + 0x99, 0x07, 0xdb, 0x5a, 0x95, 0x93, 0x0b, 0x04, 0x45, 0x61, 0x98, 0xe8, 0x49, 0x48, 0x70, 0x13, + 0x4d, 0x28, 0x9c, 0x6a, 0x8f, 0x02, 0x59, 0x4b, 0x0a, 0xc5, 0x43, 0x47, 0x20, 0x45, 0xfe, 0x32, + 0xdd, 0xe8, 0xa1, 0x3c, 0x27, 0x49, 0x05, 0xd1, 0x0b, 0x94, 0x85, 0x24, 0x5d, 0x26, 0x65, 0x2c, + 0xb6, 0x36, 0xb7, 0x4c, 0x14, 0xab, 0x8c, 0x37, 0xd5, 0x7a, 0xd5, 0x29, 0x5e, 0x53, 0xab, 0x75, + 0x4c, 0x15, 0x3e, 0xa5, 0xf4, 0xf3, 0xca, 0xab, 0xa4, 0x0e, 0x8d, 0x43, 0x1f, 0x5b, 0x55, 0x9a, + 0x5e, 0xc6, 0x3b, 0xd4, 0x7a, 0x76, 0x2b, 0x6c, 0xa1, 0xcd, 0x93, 0x1a, 0xd2, 0xfd, 0x0b, 0xb6, + 0xa1, 0x0b, 0xd5, 0xa4, 0x5d, 0x90, 0x0a, 0xda, 0xfd, 0xf9, 0xb0, 0xe1, 0x3e, 0xd6, 0x7c, 0x78, + 0x61, 0x9d, 0x92, 0x3f, 0x17, 0x83, 0x04, 0xb5, 0x17, 0x43, 0xd0, 0xb7, 0xf6, 0xb6, 0x95, 0x42, + 0x71, 0x76, 0x79, 0x3d, 0xbf, 0x50, 0x48, 0x4b, 0x68, 0x10, 0x80, 0x56, 0x5c, 0x5e, 0x58, 0xce, + 0xad, 0xa5, 0x63, 0x6e, 0x79, 0x7e, 0x69, 0xed, 0xdc, 0x63, 0xe9, 0xb8, 0x8b, 0xb0, 0xce, 0x2a, + 0x12, 0x7e, 0x80, 0x47, 0xcf, 0xa4, 0xbb, 0x51, 0x1a, 0xfa, 0x19, 0x81, 0xf9, 0xe7, 0x0a, 0xb3, + 0xe7, 0x1e, 0x4b, 0xf7, 0x04, 0x6b, 0x1e, 0x3d, 0x93, 0xee, 0x45, 0x03, 0x90, 0xa2, 0x35, 0xf9, + 0xe5, 0xe5, 0x85, 0x74, 0xd2, 0xa5, 0xb9, 0xba, 0xa6, 0xcc, 0x2f, 0xcd, 0xa5, 0x53, 0x2e, 0xcd, + 0x39, 0x65, 0x79, 0x7d, 0x25, 0x0d, 0x2e, 0x85, 0xc5, 0xc2, 0xea, 0x6a, 0x6e, 0xae, 0x90, 0xee, + 0x73, 0x21, 0xf2, 0x6f, 0x5b, 0x2b, 0xac, 0xa6, 0xfb, 0x03, 0x6c, 0x3d, 0x7a, 0x26, 0x3d, 0xe0, + 0x76, 0x51, 0x58, 0x5a, 0x5f, 0x4c, 0x0f, 0xa2, 0x61, 0x18, 0x60, 0x5d, 0x08, 0x26, 0x86, 0x42, + 0x55, 0xe7, 0x1e, 0x4b, 0xa7, 0x3d, 0x46, 0x18, 0x95, 0xe1, 0x40, 0xc5, 0xb9, 0xc7, 0xd2, 0x48, + 0x9e, 0x81, 0x6e, 0xaa, 0x5d, 0x08, 0xc1, 0xe0, 0x42, 0x2e, 0x5f, 0x58, 0x28, 0x2e, 0xaf, 0xac, + 0xcd, 0x2f, 0x2f, 0xe5, 0x16, 0xd2, 0x92, 0x57, 0xa7, 0x14, 0x9e, 0x59, 0x9f, 0x57, 0x0a, 0xb3, + 0xe9, 0x98, 0xbf, 0x6e, 0xa5, 0x90, 0x5b, 0x2b, 0xcc, 0xa6, 0xe3, 0x72, 0x09, 0x46, 0x9b, 0xd9, + 0xc9, 0xa6, 0x2b, 0xc3, 0x37, 0xc5, 0xb1, 0x16, 0x53, 0x4c, 0x69, 0x35, 0x4c, 0xf1, 0x37, 0x63, + 0x30, 0xd2, 0x64, 0xaf, 0x68, 0xda, 0xc9, 0x25, 0xe8, 0x66, 0x2a, 0xca, 0x76, 0xcf, 0x07, 0x9a, + 0x6e, 0x3a, 0x54, 0x61, 0x1b, 0x76, 0x50, 0x8a, 0xe7, 0xf7, 0x20, 0xe2, 0x2d, 0x3c, 0x08, 0x42, + 0xa2, 0xc1, 0xa6, 0xff, 0x44, 0x83, 0x4d, 0x67, 0xdb, 0xde, 0xb9, 0x76, 0xb6, 0x3d, 0x5a, 0xd7, + 0x99, 0x6d, 0xef, 0x6e, 0x62, 0xdb, 0x2f, 0xc2, 0x70, 0x03, 0xa1, 0xb6, 0x6d, 0xec, 0xcf, 0x48, + 0x90, 0x69, 0x25, 0x9c, 0x08, 0x4b, 0x17, 0x0b, 0x58, 0xba, 0x8b, 0x61, 0x09, 0xde, 0xd3, 0x7a, + 0x12, 0x1a, 0xe6, 0xfa, 0x13, 0x12, 0x1c, 0x6c, 0xee, 0x29, 0x36, 0xe5, 0xe1, 0x49, 0xe8, 0xa9, + 0x61, 0x67, 0xcb, 0x10, 0xde, 0xd2, 0xf1, 0x26, 0x7b, 0x30, 0x69, 0x0e, 0x4f, 0x36, 0xc7, 0xf2, + 0x6f, 0xe2, 0xf1, 0x56, 0xee, 0x1e, 0xe3, 0xa6, 0x81, 0xd3, 0x5f, 0x8c, 0xc1, 0x81, 0xa6, 0xc4, + 0x9b, 0x32, 0x7a, 0x0c, 0x40, 0xd3, 0xcd, 0xba, 0xc3, 0x3c, 0x22, 0x66, 0x60, 0x53, 0xb4, 0x86, + 0x1a, 0x2f, 0x62, 0x3c, 0xeb, 0x8e, 0xdb, 0x1e, 0xa7, 0xed, 0xc0, 0xaa, 0x28, 0xc0, 0x05, 0x8f, + 0xd1, 0x04, 0x65, 0x74, 0xac, 0xc5, 0x48, 0x1b, 0x14, 0xf3, 0x61, 0x48, 0x97, 0xaa, 0x1a, 0xd6, + 0x9d, 0xa2, 0xed, 0x58, 0x58, 0xad, 0x69, 0x7a, 0x85, 0xee, 0x20, 0xc9, 0xe9, 0xee, 0x4d, 0xb5, + 0x6a, 0x63, 0x65, 0x88, 0x35, 0xaf, 0x8a, 0x56, 0x82, 0x41, 0x15, 0xc8, 0xf2, 0x61, 0xf4, 0x04, + 0x30, 0x58, 0xb3, 0x8b, 0x21, 0xbf, 0x3f, 0x05, 0x7d, 0x3e, 0xbf, 0x1a, 0xdd, 0x03, 0xfd, 0x2f, + 0xa8, 0xd7, 0xd4, 0xa2, 0x88, 0x95, 0x98, 0x24, 0xfa, 0x48, 0xdd, 0x0a, 0x8f, 0x97, 0x1e, 0x86, + 0x51, 0x0a, 0x62, 0xd4, 0x1d, 0x6c, 0x15, 0x4b, 0x55, 0xd5, 0xb6, 0xa9, 0xd0, 0x92, 0x14, 0x14, + 0x91, 0xb6, 0x65, 0xd2, 0x34, 0x23, 0x5a, 0xd0, 0x59, 0x18, 0xa1, 0x18, 0xb5, 0x7a, 0xd5, 0xd1, + 0xcc, 0x2a, 0x2e, 0x92, 0xe8, 0xcd, 0xa6, 0x3b, 0x89, 0xcb, 0xd9, 0x30, 0x81, 0x58, 0xe4, 0x00, + 0x84, 0x23, 0x1b, 0xcd, 0xc2, 0x31, 0x8a, 0x56, 0xc1, 0x3a, 0xb6, 0x54, 0x07, 0x17, 0xf1, 0x8b, + 0x75, 0xb5, 0x6a, 0x17, 0x55, 0xbd, 0x5c, 0xdc, 0x52, 0xed, 0xad, 0xcc, 0x28, 0x21, 0x90, 0x8f, + 0x65, 0x24, 0xe5, 0x30, 0x01, 0x9c, 0xe3, 0x70, 0x05, 0x0a, 0x96, 0xd3, 0xcb, 0x57, 0x54, 0x7b, + 0x0b, 0x4d, 0xc3, 0x41, 0x4a, 0xc5, 0x76, 0x2c, 0x4d, 0xaf, 0x14, 0x4b, 0x5b, 0xb8, 0xb4, 0x5d, + 0xac, 0x3b, 0x9b, 0x17, 0x32, 0x47, 0xfc, 0xfd, 0x53, 0x0e, 0x57, 0x29, 0xcc, 0x0c, 0x01, 0x59, + 0x77, 0x36, 0x2f, 0xa0, 0x55, 0xe8, 0x27, 0x93, 0x51, 0xd3, 0x6e, 0xe0, 0xe2, 0xa6, 0x61, 0xd1, + 0xad, 0x71, 0xb0, 0x89, 0x69, 0xf2, 0x49, 0x70, 0x72, 0x99, 0x23, 0x2c, 0x1a, 0x65, 0x3c, 0xdd, + 0xbd, 0xba, 0x52, 0x28, 0xcc, 0x2a, 0x7d, 0x82, 0xca, 0x65, 0xc3, 0x22, 0x0a, 0x55, 0x31, 0x5c, + 0x01, 0xf7, 0x31, 0x85, 0xaa, 0x18, 0x42, 0xbc, 0x67, 0x61, 0xa4, 0x54, 0x62, 0x63, 0xd6, 0x4a, + 0x45, 0x1e, 0x63, 0xd9, 0x99, 0x74, 0x40, 0x58, 0xa5, 0xd2, 0x1c, 0x03, 0xe0, 0x3a, 0x6e, 0xa3, + 0xc7, 0xe1, 0x80, 0x27, 0x2c, 0x3f, 0xe2, 0x70, 0xc3, 0x28, 0xc3, 0xa8, 0x67, 0x61, 0xc4, 0xdc, + 0x6d, 0x44, 0x44, 0x81, 0x1e, 0xcd, 0xdd, 0x30, 0xda, 0x79, 0x18, 0x35, 0xb7, 0xcc, 0x46, 0xbc, + 0x53, 0x7e, 0x3c, 0x64, 0x6e, 0x99, 0x61, 0xc4, 0xfb, 0x69, 0xc0, 0x6d, 0xe1, 0x92, 0xea, 0xe0, + 0x72, 0xe6, 0x90, 0x1f, 0xdc, 0xd7, 0x80, 0xa6, 0x20, 0x5d, 0x2a, 0x15, 0xb1, 0xae, 0x6e, 0x54, + 0x71, 0x51, 0xb5, 0xb0, 0xae, 0xda, 0x99, 0x71, 0x3f, 0xf0, 0x60, 0xa9, 0x54, 0xa0, 0xad, 0x39, + 0xda, 0x88, 0x4e, 0xc1, 0xb0, 0xb1, 0xf1, 0x42, 0x89, 0xa9, 0x64, 0xd1, 0xb4, 0xf0, 0xa6, 0xb6, + 0x93, 0xb9, 0x8f, 0xca, 0x77, 0x88, 0x34, 0x50, 0x85, 0x5c, 0xa1, 0xd5, 0xe8, 0x01, 0x48, 0x97, + 0xec, 0x2d, 0xd5, 0x32, 0xa9, 0x4d, 0xb6, 0x4d, 0xb5, 0x84, 0x33, 0xf7, 0x33, 0x50, 0x56, 0xbf, + 0x24, 0xaa, 0xc9, 0x92, 0xb0, 0xaf, 0x6b, 0x9b, 0x8e, 0xa0, 0x78, 0x82, 0x2d, 0x09, 0x5a, 0xc7, + 0xa9, 0x9d, 0x84, 0x34, 0x11, 0x45, 0xa0, 0xe3, 0x93, 0x14, 0x6c, 0xd0, 0xdc, 0x32, 0xfd, 0xfd, + 0xde, 0x0b, 0x03, 0x04, 0xd2, 0xeb, 0xf4, 0x01, 0xe6, 0x90, 0x99, 0x5b, 0xbe, 0x1e, 0x1f, 0x83, + 0x83, 0x04, 0xa8, 0x86, 0x1d, 0xb5, 0xac, 0x3a, 0xaa, 0x0f, 0xfa, 0x21, 0x0a, 0x4d, 0xe4, 0xbe, + 0xc8, 0x1b, 0x03, 0x7c, 0x5a, 0xf5, 0x8d, 0x5d, 0x57, 0xb3, 0x4e, 0x33, 0x3e, 0x49, 0x9d, 0xd0, + 0xad, 0xbb, 0xe6, 0x74, 0xcb, 0xd3, 0xd0, 0xef, 0x57, 0x7c, 0x94, 0x02, 0xa6, 0xfa, 0x69, 0x89, + 0x78, 0x41, 0x33, 0xcb, 0xb3, 0xc4, 0x7f, 0x79, 0xbe, 0x90, 0x8e, 0x11, 0x3f, 0x6a, 0x61, 0x7e, + 0xad, 0x50, 0x54, 0xd6, 0x97, 0xd6, 0xe6, 0x17, 0x0b, 0xe9, 0xb8, 0xcf, 0x61, 0x7f, 0x2a, 0x91, + 0x3c, 0x9e, 0x3e, 0x21, 0x7f, 0x25, 0x06, 0x83, 0xc1, 0x08, 0x0c, 0xbd, 0x05, 0x0e, 0x89, 0x74, + 0x89, 0x8d, 0x9d, 0xe2, 0x75, 0xcd, 0xa2, 0x2b, 0xb2, 0xa6, 0xb2, 0xdd, 0xd1, 0xd5, 0x89, 0x51, + 0x0e, 0xb5, 0x8a, 0x9d, 0x67, 0x35, 0x8b, 0xac, 0xb7, 0x9a, 0xea, 0xa0, 0x05, 0x18, 0xd7, 0x8d, + 0xa2, 0xed, 0xa8, 0x7a, 0x59, 0xb5, 0xca, 0x45, 0x2f, 0x51, 0x55, 0x54, 0x4b, 0x25, 0x6c, 0xdb, + 0x06, 0xdb, 0x09, 0x5d, 0x2a, 0x47, 0x75, 0x63, 0x95, 0x03, 0x7b, 0x5b, 0x44, 0x8e, 0x83, 0x86, + 0xf4, 0x37, 0xde, 0x4a, 0x7f, 0x8f, 0x40, 0xaa, 0xa6, 0x9a, 0x45, 0xac, 0x3b, 0xd6, 0x2e, 0xf5, + 0xbb, 0x93, 0x4a, 0xb2, 0xa6, 0x9a, 0x05, 0x52, 0x7e, 0x53, 0xc2, 0x9f, 0xa7, 0x12, 0xc9, 0x64, + 0x3a, 0xf5, 0x54, 0x22, 0x99, 0x4a, 0x83, 0xfc, 0x7a, 0x1c, 0xfa, 0xfd, 0x7e, 0x38, 0x09, 0x6b, + 0x4a, 0x74, 0xcb, 0x92, 0xa8, 0x51, 0xbb, 0x77, 0x4f, 0xaf, 0x7d, 0x72, 0x86, 0xec, 0x65, 0xd3, + 0x3d, 0xcc, 0x3b, 0x56, 0x18, 0x26, 0xf1, 0x23, 0x88, 0xb2, 0x61, 0xe6, 0x8d, 0x24, 0x15, 0x5e, + 0x42, 0x73, 0xd0, 0xf3, 0x82, 0x4d, 0x69, 0xf7, 0x50, 0xda, 0xf7, 0xed, 0x4d, 0xfb, 0xa9, 0x55, + 0x4a, 0x3c, 0xf5, 0xd4, 0x6a, 0x71, 0x69, 0x59, 0x59, 0xcc, 0x2d, 0x28, 0x1c, 0x1d, 0x1d, 0x86, + 0x44, 0x55, 0xbd, 0xb1, 0x1b, 0xdc, 0xf5, 0x68, 0x55, 0xbb, 0x93, 0x70, 0x18, 0x12, 0xd7, 0xb1, + 0xba, 0x1d, 0xdc, 0x6b, 0x68, 0xd5, 0x5d, 0x5c, 0x0c, 0x53, 0xd0, 0x4d, 0xe5, 0x85, 0x00, 0xb8, + 0xc4, 0xd2, 0x5d, 0x28, 0x09, 0x89, 0x99, 0x65, 0x85, 0x2c, 0x88, 0x34, 0xf4, 0xb3, 0xda, 0xe2, + 0xca, 0x7c, 0x61, 0xa6, 0x90, 0x8e, 0xc9, 0x67, 0xa1, 0x87, 0x09, 0x81, 0x2c, 0x16, 0x57, 0x0c, + 0xe9, 0x2e, 0x5e, 0xe4, 0x34, 0x24, 0xd1, 0xba, 0xbe, 0x98, 0x2f, 0x28, 0xe9, 0x58, 0x70, 0xaa, + 0x13, 0xe9, 0x6e, 0xd9, 0x86, 0x7e, 0xbf, 0x23, 0xfe, 0xe6, 0x04, 0xd9, 0x9f, 0x97, 0xa0, 0xcf, + 0xe7, 0x58, 0x13, 0x8f, 0x48, 0xad, 0x56, 0x8d, 0xeb, 0x45, 0xb5, 0xaa, 0xa9, 0x36, 0x57, 0x0d, + 0xa0, 0x55, 0x39, 0x52, 0xd3, 0xee, 0xd4, 0xbd, 0x49, 0x4b, 0xa4, 0x3b, 0xdd, 0x23, 0x7f, 0x58, + 0x82, 0x74, 0xd8, 0xb3, 0x0d, 0xb1, 0x29, 0xfd, 0x28, 0xd9, 0x94, 0x3f, 0x24, 0xc1, 0x60, 0xd0, + 0x9d, 0x0d, 0xb1, 0x77, 0xcf, 0x8f, 0x94, 0xbd, 0x6f, 0xc4, 0x60, 0x20, 0xe0, 0xc4, 0xb6, 0xcb, + 0xdd, 0x8b, 0x30, 0xac, 0x95, 0x71, 0xcd, 0x34, 0x1c, 0xac, 0x97, 0x76, 0x8b, 0x55, 0x7c, 0x0d, + 0x57, 0x33, 0x32, 0x35, 0x1a, 0x53, 0x7b, 0xbb, 0xc9, 0x93, 0xf3, 0x1e, 0xde, 0x02, 0x41, 0x9b, + 0x1e, 0x99, 0x9f, 0x2d, 0x2c, 0xae, 0x2c, 0xaf, 0x15, 0x96, 0x66, 0xde, 0x56, 0x5c, 0x5f, 0x7a, + 0x7a, 0x69, 0xf9, 0xd9, 0x25, 0x25, 0xad, 0x85, 0xc0, 0xee, 0xe2, 0xb2, 0x5f, 0x81, 0x74, 0x98, + 0x29, 0x74, 0x08, 0x9a, 0xb1, 0x95, 0xee, 0x42, 0x23, 0x30, 0xb4, 0xb4, 0x5c, 0x5c, 0x9d, 0x9f, + 0x2d, 0x14, 0x0b, 0x97, 0x2f, 0x17, 0x66, 0xd6, 0x56, 0x59, 0xe2, 0xc3, 0x85, 0x5e, 0x0b, 0x2c, + 0x70, 0xf9, 0xd5, 0x38, 0x8c, 0x34, 0xe1, 0x04, 0xe5, 0x78, 0xc8, 0xc2, 0xa2, 0xa8, 0xd3, 0xed, + 0x70, 0x3f, 0x49, 0x7c, 0x86, 0x15, 0xd5, 0x72, 0x78, 0x84, 0xf3, 0x00, 0x10, 0x29, 0xe9, 0x8e, + 0xb6, 0xa9, 0x61, 0x8b, 0xe7, 0x89, 0x58, 0x1c, 0x33, 0xe4, 0xd5, 0xb3, 0x54, 0xd1, 0x43, 0x80, + 0x4c, 0xc3, 0xd6, 0x1c, 0xed, 0x1a, 0x2e, 0x6a, 0xba, 0x48, 0x2a, 0x91, 0xb8, 0x26, 0xa1, 0xa4, + 0x45, 0xcb, 0xbc, 0xee, 0xb8, 0xd0, 0x3a, 0xae, 0xa8, 0x21, 0x68, 0x62, 0xcc, 0xe3, 0x4a, 0x5a, + 0xb4, 0xb8, 0xd0, 0xf7, 0x40, 0x7f, 0xd9, 0xa8, 0x13, 0x67, 0x8f, 0xc1, 0x91, 0xbd, 0x43, 0x52, + 0xfa, 0x58, 0x9d, 0x0b, 0xc2, 0xdd, 0x78, 0x2f, 0x9b, 0xd5, 0xaf, 0xf4, 0xb1, 0x3a, 0x06, 0x72, + 0x02, 0x86, 0xd4, 0x4a, 0xc5, 0x22, 0xc4, 0x05, 0x21, 0x16, 0x98, 0x0c, 0xba, 0xd5, 0x14, 0x30, + 0xfb, 0x14, 0x24, 0x85, 0x1c, 0xc8, 0x56, 0x4d, 0x24, 0x51, 0x34, 0x59, 0xb4, 0x1d, 0x3b, 0x99, + 0x52, 0x92, 0xba, 0x68, 0xbc, 0x07, 0xfa, 0x35, 0xbb, 0xe8, 0x25, 0xe7, 0x63, 0x13, 0xb1, 0x93, + 0x49, 0xa5, 0x4f, 0xb3, 0xdd, 0xc4, 0xa6, 0xfc, 0x89, 0x18, 0x0c, 0x06, 0x0f, 0x17, 0xd0, 0x2c, + 0x24, 0xab, 0x46, 0x49, 0xa5, 0xaa, 0xc5, 0x4e, 0xb6, 0x4e, 0x46, 0x9c, 0x47, 0x4c, 0x2e, 0x70, + 0x78, 0xc5, 0xc5, 0xcc, 0xfe, 0xb1, 0x04, 0x49, 0x51, 0x8d, 0x0e, 0x42, 0xc2, 0x54, 0x9d, 0x2d, + 0x4a, 0xae, 0x3b, 0x1f, 0x4b, 0x4b, 0x0a, 0x2d, 0x93, 0x7a, 0xdb, 0x54, 0x75, 0xaa, 0x02, 0xbc, + 0x9e, 0x94, 0xc9, 0xbc, 0x56, 0xb1, 0x5a, 0xa6, 0x51, 0x8f, 0x51, 0xab, 0x61, 0xdd, 0xb1, 0xc5, + 0xbc, 0xf2, 0xfa, 0x19, 0x5e, 0x8d, 0x1e, 0x84, 0x61, 0xc7, 0x52, 0xb5, 0x6a, 0x00, 0x36, 0x41, + 0x61, 0xd3, 0xa2, 0xc1, 0x05, 0x9e, 0x86, 0xc3, 0x82, 0x6e, 0x19, 0x3b, 0x6a, 0x69, 0x0b, 0x97, + 0x3d, 0xa4, 0x1e, 0x9a, 0xdd, 0x38, 0xc4, 0x01, 0x66, 0x79, 0xbb, 0xc0, 0x95, 0xbf, 0x22, 0xc1, + 0xb0, 0x88, 0xd3, 0xca, 0xae, 0xb0, 0x16, 0x01, 0x54, 0x5d, 0x37, 0x1c, 0xbf, 0xb8, 0x1a, 0x55, + 0xb9, 0x01, 0x6f, 0x32, 0xe7, 0x22, 0x29, 0x3e, 0x02, 0xd9, 0x1a, 0x80, 0xd7, 0xd2, 0x52, 0x6c, + 0xe3, 0xd0, 0xc7, 0x4f, 0x8e, 0xe8, 0xf1, 0x23, 0x8b, 0xec, 0x81, 0x55, 0x91, 0x80, 0x0e, 0x8d, + 0x42, 0xf7, 0x06, 0xae, 0x68, 0x3a, 0xcf, 0x07, 0xb3, 0x82, 0xc8, 0xbf, 0x24, 0xdc, 0xfc, 0x4b, + 0xfe, 0x3d, 0x12, 0x8c, 0x94, 0x8c, 0x5a, 0x98, 0xdf, 0x7c, 0x3a, 0x94, 0x5e, 0xb0, 0xaf, 0x48, + 0xcf, 0x3f, 0x59, 0xd1, 0x9c, 0xad, 0xfa, 0xc6, 0x64, 0xc9, 0xa8, 0x4d, 0x55, 0x8c, 0xaa, 0xaa, + 0x57, 0xbc, 0xf3, 0x53, 0xfa, 0x4f, 0xe9, 0x74, 0x05, 0xeb, 0xa7, 0x2b, 0x86, 0xef, 0x34, 0xf5, + 0xa2, 0xf7, 0xef, 0x5f, 0x4a, 0xd2, 0x6f, 0xc4, 0xe2, 0x73, 0x2b, 0xf9, 0xd7, 0x62, 0xd9, 0x39, + 0xd6, 0xdd, 0x8a, 0x10, 0x8f, 0x82, 0x37, 0xab, 0xb8, 0x44, 0x86, 0x0c, 0xdf, 0x79, 0x10, 0x46, + 0x2b, 0x46, 0xc5, 0xa0, 0x14, 0xa7, 0xc8, 0x7f, 0xfc, 0x44, 0x36, 0xe5, 0xd6, 0x66, 0x23, 0x8f, + 0x6f, 0xa7, 0x97, 0x60, 0x84, 0x03, 0x17, 0xe9, 0x91, 0x10, 0x0b, 0x6c, 0xd0, 0x9e, 0x69, 0xb5, + 0xcc, 0xef, 0x7c, 0x8b, 0x6e, 0xe8, 0xca, 0x30, 0x47, 0x25, 0x6d, 0x2c, 0xf6, 0x99, 0x56, 0xe0, + 0x40, 0x80, 0x1e, 0x5b, 0xb6, 0xd8, 0x8a, 0xa0, 0xf8, 0x87, 0x9c, 0xe2, 0x88, 0x8f, 0xe2, 0x2a, + 0x47, 0x9d, 0x9e, 0x81, 0x81, 0x4e, 0x68, 0xfd, 0x0b, 0x4e, 0xab, 0x1f, 0xfb, 0x89, 0xcc, 0xc1, + 0x10, 0x25, 0x52, 0xaa, 0xdb, 0x8e, 0x51, 0xa3, 0x36, 0x71, 0x6f, 0x32, 0xff, 0xf2, 0x5b, 0x6c, + 0x1d, 0x0d, 0x12, 0xb4, 0x19, 0x17, 0x6b, 0x7a, 0x1a, 0xe8, 0x29, 0x58, 0x19, 0x97, 0xaa, 0x11, + 0x14, 0xbe, 0xc8, 0x19, 0x71, 0xe1, 0xa7, 0xaf, 0xc2, 0x28, 0xf9, 0x9f, 0x9a, 0x2c, 0x3f, 0x27, + 0xd1, 0x39, 0xb8, 0xcc, 0x57, 0x7e, 0x86, 0x2d, 0xd5, 0x11, 0x97, 0x80, 0x8f, 0x27, 0xdf, 0x2c, + 0x56, 0xb0, 0xe3, 0x60, 0xcb, 0x2e, 0xaa, 0xd5, 0x66, 0xec, 0xf9, 0x92, 0x18, 0x99, 0x5f, 0xff, + 0x6e, 0x70, 0x16, 0xe7, 0x18, 0x66, 0xae, 0x5a, 0x9d, 0x5e, 0x87, 0x43, 0x4d, 0xb4, 0xa2, 0x0d, + 0x9a, 0xaf, 0x72, 0x9a, 0xa3, 0x0d, 0x9a, 0x41, 0xc8, 0xae, 0x80, 0xa8, 0x77, 0xe7, 0xb2, 0x0d, + 0x9a, 0x1f, 0xe4, 0x34, 0x11, 0xc7, 0x15, 0x53, 0x4a, 0x28, 0x3e, 0x05, 0xc3, 0xd7, 0xb0, 0xb5, + 0x61, 0xd8, 0x3c, 0x71, 0xd4, 0x06, 0xb9, 0x0f, 0x71, 0x72, 0x43, 0x1c, 0x91, 0x66, 0x92, 0x08, + 0xad, 0xc7, 0x21, 0xb9, 0xa9, 0x96, 0x70, 0x1b, 0x24, 0x6e, 0x72, 0x12, 0xbd, 0x04, 0x9e, 0xa0, + 0xe6, 0xa0, 0xbf, 0x62, 0xf0, 0x5d, 0x2b, 0x1a, 0xfd, 0xc3, 0x1c, 0xbd, 0x4f, 0xe0, 0x70, 0x12, + 0xa6, 0x61, 0xd6, 0xab, 0x64, 0x4b, 0x8b, 0x26, 0xf1, 0xf7, 0x04, 0x09, 0x81, 0xc3, 0x49, 0x74, + 0x20, 0xd6, 0x8f, 0x08, 0x12, 0xb6, 0x4f, 0x9e, 0x97, 0xa0, 0xcf, 0xd0, 0xab, 0xbb, 0x86, 0xde, + 0x0e, 0x13, 0x1f, 0xe5, 0x14, 0x80, 0xa3, 0x10, 0x02, 0x17, 0x21, 0xd5, 0xee, 0x44, 0xfc, 0xfd, + 0xef, 0x8a, 0xe5, 0x21, 0x66, 0x60, 0x0e, 0x86, 0x84, 0x81, 0xd2, 0x0c, 0xbd, 0x0d, 0x12, 0xff, + 0x80, 0x93, 0x18, 0xf4, 0xa1, 0xf1, 0x61, 0x38, 0xd8, 0x76, 0x2a, 0xb8, 0x1d, 0x22, 0x9f, 0x10, + 0xc3, 0xe0, 0x28, 0x5c, 0x94, 0x1b, 0x58, 0x2f, 0x6d, 0xb5, 0x47, 0xe1, 0x93, 0x42, 0x94, 0x02, + 0x87, 0x90, 0x98, 0x81, 0x81, 0x9a, 0x6a, 0xd9, 0x5b, 0x6a, 0xb5, 0xad, 0xe9, 0xf8, 0x87, 0x9c, + 0x46, 0xbf, 0x8b, 0xc4, 0x25, 0x52, 0xd7, 0x3b, 0x21, 0xf3, 0x9a, 0x90, 0x88, 0x0f, 0x8d, 0x2f, + 0x3d, 0xdb, 0xa1, 0x59, 0xb6, 0x4e, 0xa8, 0xfd, 0x23, 0xb1, 0xf4, 0x18, 0xee, 0xa2, 0x9f, 0xe2, + 0x45, 0x48, 0xd9, 0xda, 0x8d, 0xb6, 0xc8, 0xfc, 0xa6, 0x98, 0x69, 0x8a, 0x40, 0x90, 0xdf, 0x06, + 0x87, 0x9b, 0x6e, 0x13, 0x6d, 0x10, 0xfb, 0x2d, 0x4e, 0xec, 0x60, 0x93, 0xad, 0x82, 0x9b, 0x84, + 0x4e, 0x49, 0xfe, 0x63, 0x61, 0x12, 0x70, 0x88, 0xd6, 0x0a, 0x89, 0x23, 0x6c, 0x75, 0xb3, 0x33, + 0xa9, 0xfd, 0xb6, 0x90, 0x1a, 0xc3, 0x0d, 0x48, 0x6d, 0x0d, 0x0e, 0x72, 0x8a, 0x9d, 0xcd, 0xeb, + 0xa7, 0x84, 0x61, 0x65, 0xd8, 0xeb, 0xc1, 0xd9, 0x7d, 0x3b, 0x64, 0x5d, 0x71, 0x0a, 0x87, 0xd5, + 0x2e, 0xd6, 0x54, 0xb3, 0x0d, 0xca, 0xbf, 0xc3, 0x29, 0x0b, 0x8b, 0xef, 0x7a, 0xbc, 0xf6, 0xa2, + 0x6a, 0x12, 0xe2, 0xcf, 0x41, 0x46, 0x10, 0xaf, 0xeb, 0x16, 0x2e, 0x19, 0x15, 0x5d, 0xbb, 0x81, + 0xcb, 0x6d, 0x90, 0xfe, 0x74, 0x68, 0xaa, 0xd6, 0x7d, 0xe8, 0x84, 0xf2, 0x3c, 0xa4, 0x5d, 0x5f, + 0xa5, 0xa8, 0xd5, 0x4c, 0xc3, 0x72, 0x22, 0x28, 0x7e, 0x46, 0xcc, 0x94, 0x8b, 0x37, 0x4f, 0xd1, + 0xa6, 0x0b, 0x30, 0x48, 0x8b, 0xed, 0xaa, 0xe4, 0x67, 0x39, 0xa1, 0x01, 0x0f, 0x8b, 0x1b, 0x8e, + 0x92, 0x51, 0x33, 0x55, 0xab, 0x1d, 0xfb, 0xf7, 0xbb, 0xc2, 0x70, 0x70, 0x14, 0x6e, 0x38, 0x9c, + 0x5d, 0x13, 0x93, 0xdd, 0xbe, 0x0d, 0x0a, 0x9f, 0x13, 0x86, 0x43, 0xe0, 0x70, 0x12, 0xc2, 0x61, + 0x68, 0x83, 0xc4, 0x3f, 0x11, 0x24, 0x04, 0x0e, 0x21, 0xf1, 0x8c, 0xb7, 0xd1, 0x5a, 0xb8, 0xa2, + 0xd9, 0x8e, 0xc5, 0xdc, 0xe4, 0xbd, 0x49, 0xfd, 0xd3, 0xef, 0x06, 0x9d, 0x30, 0xc5, 0x87, 0x4a, + 0x2c, 0x11, 0x4f, 0xbb, 0xd2, 0x28, 0x2a, 0x9a, 0xb1, 0xdf, 0x13, 0x96, 0xc8, 0x87, 0x46, 0x78, + 0xf3, 0x79, 0x88, 0x44, 0xec, 0x25, 0x12, 0x3b, 0xb4, 0x41, 0xee, 0x9f, 0x85, 0x98, 0x5b, 0x15, + 0xb8, 0x84, 0xa6, 0xcf, 0xff, 0xa9, 0xeb, 0xdb, 0x78, 0xb7, 0x2d, 0xed, 0xfc, 0xfd, 0x90, 0xff, + 0xb3, 0xce, 0x30, 0x99, 0x0d, 0x19, 0x0a, 0xf9, 0x53, 0x28, 0xea, 0xfe, 0x50, 0xe6, 0xa7, 0xbe, + 0xcf, 0xc7, 0x1b, 0x74, 0xa7, 0xa6, 0x17, 0x88, 0x92, 0x07, 0x9d, 0x9e, 0x68, 0x62, 0x3f, 0xf3, + 0x7d, 0x57, 0xcf, 0x03, 0x3e, 0xcf, 0xf4, 0x65, 0x18, 0x08, 0x38, 0x3c, 0xd1, 0xa4, 0x7e, 0x96, + 0x93, 0xea, 0xf7, 0xfb, 0x3b, 0xd3, 0x67, 0x21, 0x41, 0x9c, 0x97, 0x68, 0xf4, 0x9f, 0xe3, 0xe8, + 0x14, 0x7c, 0xfa, 0x09, 0x48, 0x0a, 0xa7, 0x25, 0x1a, 0xf5, 0xe7, 0x39, 0xaa, 0x8b, 0x42, 0xd0, + 0x85, 0xc3, 0x12, 0x8d, 0xfe, 0x0b, 0x02, 0x5d, 0xa0, 0x10, 0xf4, 0xf6, 0x45, 0xf8, 0xf9, 0x5f, + 0x4a, 0xf0, 0x4d, 0x47, 0xc8, 0xee, 0x22, 0xf4, 0x72, 0x4f, 0x25, 0x1a, 0xfb, 0x17, 0x79, 0xe7, + 0x02, 0x63, 0xfa, 0x3c, 0x74, 0xb7, 0x29, 0xf0, 0x77, 0x73, 0x54, 0x06, 0x3f, 0x3d, 0x03, 0x7d, + 0x3e, 0xef, 0x24, 0x1a, 0xfd, 0xef, 0x72, 0x74, 0x3f, 0x16, 0x61, 0x9d, 0x7b, 0x27, 0xd1, 0x04, + 0xde, 0x23, 0x58, 0xe7, 0x18, 0x44, 0x6c, 0xc2, 0x31, 0x89, 0xc6, 0x7e, 0xaf, 0x90, 0xba, 0x40, + 0x99, 0xbe, 0x04, 0x29, 0x77, 0xb3, 0x89, 0xc6, 0x7f, 0x1f, 0xc7, 0xf7, 0x70, 0x88, 0x04, 0x7c, + 0x9b, 0x5d, 0x34, 0x89, 0xf7, 0x0b, 0x09, 0xf8, 0xb0, 0xc8, 0x32, 0x0a, 0x3b, 0x30, 0xd1, 0x94, + 0x7e, 0x59, 0x2c, 0xa3, 0x90, 0xff, 0x42, 0x66, 0x93, 0xda, 0xfc, 0x68, 0x12, 0xbf, 0x22, 0x66, + 0x93, 0xc2, 0x13, 0x36, 0xc2, 0x1e, 0x41, 0x34, 0x8d, 0x5f, 0x13, 0x6c, 0x84, 0x1c, 0x82, 0xe9, + 0x15, 0x40, 0x8d, 0xde, 0x40, 0x34, 0xbd, 0x0f, 0x70, 0x7a, 0xc3, 0x0d, 0xce, 0xc0, 0xf4, 0xb3, + 0x70, 0xb0, 0xb9, 0x27, 0x10, 0x4d, 0xf5, 0xd7, 0xbf, 0x1f, 0x8a, 0xdd, 0xfc, 0x8e, 0xc0, 0xf4, + 0x9a, 0xb7, 0xa5, 0xf8, 0xbd, 0x80, 0x68, 0xb2, 0xaf, 0x7e, 0x3f, 0x68, 0xb8, 0xfd, 0x4e, 0xc0, + 0x74, 0x0e, 0xc0, 0xdb, 0x80, 0xa3, 0x69, 0x7d, 0x88, 0xd3, 0xf2, 0x21, 0x91, 0xa5, 0xc1, 0xf7, + 0xdf, 0x68, 0xfc, 0x9b, 0x62, 0x69, 0x70, 0x0c, 0xb2, 0x34, 0xc4, 0xd6, 0x1b, 0x8d, 0xfd, 0x61, + 0xb1, 0x34, 0x04, 0x0a, 0xd1, 0x6c, 0xdf, 0xee, 0x16, 0x4d, 0xe1, 0xa3, 0x42, 0xb3, 0x7d, 0x58, + 0xd3, 0x4b, 0x30, 0xdc, 0xb0, 0x21, 0x46, 0x93, 0xfa, 0x0d, 0x4e, 0x2a, 0x1d, 0xde, 0x0f, 0xfd, + 0x9b, 0x17, 0xdf, 0x0c, 0xa3, 0xa9, 0x7d, 0x2c, 0xb4, 0x79, 0xf1, 0xbd, 0x70, 0xfa, 0x22, 0x24, + 0xf5, 0x7a, 0xb5, 0x4a, 0x16, 0x0f, 0xda, 0xfb, 0xce, 0x5f, 0xe6, 0xbf, 0xfe, 0x90, 0x4b, 0x47, + 0x20, 0x4c, 0x9f, 0x85, 0x6e, 0x5c, 0xdb, 0xc0, 0xe5, 0x28, 0xcc, 0xef, 0xfc, 0x50, 0x18, 0x4c, + 0x02, 0x3d, 0x7d, 0x09, 0x80, 0xa5, 0x46, 0xe8, 0xf1, 0x60, 0x04, 0xee, 0x7f, 0xfb, 0x21, 0xbf, + 0x8d, 0xe3, 0xa1, 0x78, 0x04, 0xd8, 0xdd, 0x9e, 0xbd, 0x09, 0x7c, 0x37, 0x48, 0x80, 0xce, 0xc8, + 0xe3, 0xd0, 0xfb, 0x82, 0x6d, 0xe8, 0x8e, 0x5a, 0x89, 0xc2, 0xfe, 0xef, 0x1c, 0x5b, 0xc0, 0x13, + 0x81, 0xd5, 0x0c, 0x0b, 0x3b, 0x6a, 0xc5, 0x8e, 0xc2, 0xfd, 0x1f, 0x1c, 0xd7, 0x45, 0x20, 0xc8, + 0x25, 0xd5, 0x76, 0xda, 0x19, 0xf7, 0x5f, 0x08, 0x64, 0x81, 0x40, 0x98, 0x26, 0xff, 0x6f, 0xe3, + 0xdd, 0x28, 0xdc, 0xef, 0x09, 0xa6, 0x39, 0xfc, 0xf4, 0x13, 0x90, 0x22, 0xff, 0xb2, 0x2b, 0x76, + 0x11, 0xc8, 0xff, 0x93, 0x23, 0x7b, 0x18, 0xa4, 0x67, 0xdb, 0x29, 0x3b, 0x5a, 0xb4, 0xb0, 0xdf, + 0xe0, 0x33, 0x2d, 0xe0, 0xa7, 0x73, 0xd0, 0x67, 0x3b, 0xe5, 0x72, 0x9d, 0xfb, 0xa7, 0x11, 0xe8, + 0xff, 0xeb, 0x87, 0x6e, 0xca, 0xc2, 0xc5, 0x21, 0xb3, 0x7d, 0x7d, 0xdb, 0x31, 0x0d, 0x7a, 0x04, + 0x12, 0x45, 0xe1, 0xfb, 0x9c, 0x82, 0x0f, 0x65, 0x7a, 0x06, 0xfa, 0xc9, 0x58, 0x2c, 0x6c, 0x62, + 0x7a, 0x5e, 0x15, 0x41, 0xe2, 0x07, 0x5c, 0x00, 0x01, 0xa4, 0xfc, 0x4f, 0x7c, 0xf1, 0xf5, 0x31, + 0xe9, 0xcb, 0xaf, 0x8f, 0x49, 0xdf, 0x78, 0x7d, 0x4c, 0x7a, 0xef, 0x37, 0xc7, 0xba, 0xbe, 0xfc, + 0xcd, 0xb1, 0xae, 0xaf, 0x7d, 0x73, 0xac, 0xab, 0x79, 0xda, 0x18, 0xe6, 0x8c, 0x39, 0x83, 0x25, + 0x8c, 0x9f, 0x97, 0x03, 0xe9, 0xe2, 0x8a, 0xe1, 0x65, 0x6b, 0xdd, 0x20, 0x07, 0x7e, 0x20, 0x91, + 0x80, 0x39, 0x98, 0xcb, 0x55, 0xf5, 0xdd, 0x16, 0x6f, 0x70, 0xb2, 0x4d, 0x13, 0xc3, 0xf2, 0x5b, + 0x20, 0x9e, 0xd3, 0x77, 0xd1, 0x61, 0x66, 0xf3, 0x8a, 0x75, 0xab, 0xca, 0xaf, 0x7e, 0xf5, 0x92, + 0xf2, 0xba, 0x55, 0x45, 0xa3, 0xde, 0xfd, 0x4c, 0xe9, 0x64, 0x3f, 0xbf, 0x74, 0x39, 0x9d, 0xf8, + 0xde, 0x47, 0xc7, 0xbb, 0xf2, 0xdb, 0xe1, 0x11, 0x7e, 0x3e, 0x72, 0x94, 0xc9, 0x9c, 0xbe, 0x4b, + 0x07, 0xb9, 0x22, 0x3d, 0xdf, 0x4d, 0xfa, 0xb0, 0x45, 0x62, 0x7b, 0x2c, 0x9c, 0xd8, 0x7e, 0x16, + 0x57, 0xab, 0x4f, 0xeb, 0xc6, 0x75, 0x7d, 0x8d, 0x80, 0x6d, 0xf4, 0x50, 0x1a, 0x8f, 0xc2, 0x7b, + 0x63, 0x30, 0x1e, 0x1e, 0x37, 0x51, 0x1c, 0xdb, 0x51, 0x6b, 0x66, 0xab, 0x17, 0x48, 0x17, 0x21, + 0xb5, 0x26, 0x60, 0x50, 0x06, 0x7a, 0x6d, 0x5c, 0x32, 0xf4, 0xb2, 0x4d, 0x07, 0x1b, 0x57, 0x44, + 0x91, 0x0c, 0x56, 0x57, 0x75, 0xc3, 0xe6, 0x17, 0x24, 0x59, 0x21, 0xff, 0xab, 0x52, 0x67, 0x33, + 0x39, 0xe8, 0x76, 0x25, 0x46, 0xfa, 0xe0, 0x5e, 0xe9, 0x7f, 0x2a, 0x05, 0x6f, 0x08, 0xbe, 0x5c, + 0x7f, 0xbb, 0x22, 0xf9, 0xe9, 0x38, 0x1c, 0x2e, 0x19, 0x76, 0xcd, 0xb0, 0x8b, 0x6c, 0x86, 0x59, + 0x81, 0x0b, 0xa3, 0xdf, 0xdf, 0xd4, 0x46, 0xfe, 0xff, 0x0a, 0x0c, 0xd2, 0x55, 0x40, 0x33, 0x9f, + 0xd4, 0xf0, 0x44, 0xee, 0x15, 0x7f, 0xf4, 0xef, 0xba, 0xa9, 0xd6, 0x0c, 0xb8, 0x88, 0xf4, 0x6a, + 0xc7, 0x1a, 0x8c, 0x6a, 0x35, 0xb3, 0x8a, 0xe9, 0x19, 0x50, 0xd1, 0x6d, 0x8b, 0xa6, 0xf7, 0x25, + 0x4e, 0x6f, 0xc4, 0x43, 0x9f, 0x17, 0xd8, 0xd3, 0x0b, 0x30, 0xac, 0x96, 0x4a, 0xd8, 0x0c, 0x90, + 0x8c, 0x58, 0xa1, 0x82, 0xc1, 0x34, 0xc7, 0x74, 0xa9, 0xe5, 0x2f, 0xb5, 0x9a, 0xdb, 0xe7, 0xef, + 0xf7, 0x4d, 0x9a, 0x85, 0x2b, 0x58, 0x3f, 0xad, 0x63, 0xe7, 0xba, 0x61, 0x6d, 0x73, 0xf1, 0x9e, + 0x66, 0x5d, 0x89, 0x49, 0xf8, 0xd9, 0x38, 0x8c, 0xb1, 0x86, 0xa9, 0x0d, 0xd5, 0xc6, 0x53, 0xd7, + 0x1e, 0xd9, 0xc0, 0x8e, 0xfa, 0xc8, 0x54, 0xc9, 0xd0, 0x74, 0x3e, 0x13, 0x23, 0x7c, 0x5e, 0x48, + 0xfb, 0x24, 0x6f, 0x6f, 0xb1, 0x30, 0xe7, 0x20, 0x31, 0x63, 0x68, 0x3a, 0xd1, 0xc8, 0x32, 0xd6, + 0x8d, 0x1a, 0x5f, 0x96, 0xac, 0x80, 0xee, 0x85, 0x1e, 0xb5, 0x66, 0xd4, 0x75, 0x87, 0x1d, 0x5f, + 0xe5, 0xfb, 0xbe, 0x78, 0x6b, 0xbc, 0xeb, 0x4f, 0x6f, 0x8d, 0xc7, 0xe7, 0x75, 0x47, 0xe1, 0x4d, + 0xd3, 0x89, 0x6f, 0x7f, 0x64, 0x5c, 0x92, 0x9f, 0x82, 0xde, 0x59, 0x5c, 0xda, 0x0f, 0xad, 0x59, + 0x5c, 0x0a, 0xd1, 0x7a, 0x00, 0x92, 0xf3, 0xba, 0xc3, 0xee, 0xcc, 0x1e, 0x83, 0xb8, 0xa6, 0xb3, + 0x5b, 0x58, 0xa1, 0xfe, 0x49, 0x3d, 0x01, 0x9d, 0xc5, 0x25, 0x17, 0xb4, 0x8c, 0x4b, 0x61, 0x50, + 0x42, 0x9e, 0xd4, 0xe7, 0x67, 0xbf, 0xf6, 0x67, 0x63, 0x5d, 0x2f, 0xbd, 0x3e, 0xd6, 0xd5, 0x72, + 0x26, 0xfc, 0xe6, 0x90, 0x8b, 0x98, 0x4f, 0x81, 0x5d, 0xde, 0x9e, 0x72, 0x02, 0x6b, 0xe1, 0xef, + 0xc4, 0x60, 0xac, 0x41, 0xc5, 0xf9, 0xc6, 0xd0, 0xca, 0x3a, 0x4c, 0x43, 0x72, 0x56, 0xec, 0x37, + 0x9d, 0x1a, 0x87, 0x5f, 0xe9, 0xd0, 0x38, 0x0c, 0x88, 0x9e, 0x84, 0x6d, 0x38, 0x15, 0x6d, 0x1b, + 0x04, 0xff, 0xfb, 0x30, 0x0d, 0xaf, 0x25, 0xe0, 0x18, 0x7d, 0x14, 0x62, 0xd5, 0x34, 0xdd, 0x99, + 0x2a, 0x59, 0xbb, 0xa6, 0x43, 0xb7, 0x13, 0x63, 0x93, 0x4b, 0x63, 0xd8, 0x6b, 0x9e, 0x64, 0xcd, + 0x2d, 0x54, 0x72, 0x13, 0xba, 0x57, 0x08, 0x1e, 0x11, 0x84, 0x63, 0x38, 0x6a, 0x95, 0x0b, 0x88, + 0x15, 0x48, 0x2d, 0x7b, 0x48, 0x12, 0x63, 0xb5, 0x9a, 0x78, 0x43, 0x52, 0xc5, 0xea, 0x26, 0xbb, + 0xb8, 0x1b, 0xa7, 0x5b, 0x48, 0x92, 0x54, 0xd0, 0x3b, 0xba, 0xa3, 0xd0, 0xad, 0xd6, 0xd9, 0x91, + 0x73, 0x9c, 0xec, 0x2d, 0xb4, 0x20, 0x3f, 0x0d, 0xbd, 0xfc, 0x98, 0x0b, 0xa5, 0x21, 0xbe, 0x8d, + 0x77, 0x69, 0x3f, 0xfd, 0x0a, 0xf9, 0x17, 0x4d, 0x42, 0x37, 0x65, 0x9e, 0xbf, 0x48, 0xc8, 0x4c, + 0x36, 0x70, 0x3f, 0x49, 0x99, 0x54, 0x18, 0x98, 0xfc, 0x14, 0x24, 0x67, 0x8d, 0x9a, 0xa6, 0x1b, + 0x41, 0x6a, 0x29, 0x46, 0x8d, 0xf2, 0x6c, 0xd6, 0xb9, 0xea, 0x2b, 0xac, 0x80, 0x0e, 0x42, 0x0f, + 0xbb, 0xc8, 0xcd, 0x8f, 0xcd, 0x79, 0x49, 0x9e, 0x81, 0x5e, 0x4a, 0x7b, 0xd9, 0x44, 0x88, 0xbf, + 0xec, 0xe1, 0x37, 0xc6, 0xa9, 0x95, 0xe4, 0xe4, 0x63, 0x1e, 0xb3, 0x08, 0x12, 0x65, 0xd5, 0x51, + 0xf9, 0xb8, 0xe9, 0xff, 0xf2, 0x93, 0x90, 0xe4, 0x44, 0x6c, 0x74, 0x06, 0xe2, 0x86, 0x69, 0xf3, + 0x83, 0xef, 0x6c, 0xab, 0xa1, 0x2c, 0x9b, 0xf9, 0x04, 0x59, 0x34, 0x0a, 0x01, 0xce, 0x2b, 0x2d, + 0x57, 0xc9, 0x05, 0x9f, 0x22, 0xf9, 0xa6, 0xdc, 0xf7, 0x2f, 0x9b, 0xd2, 0x06, 0x75, 0x70, 0x95, + 0xe5, 0xa3, 0x31, 0x18, 0xf3, 0xb5, 0x5e, 0xc3, 0x16, 0x89, 0xf5, 0xd8, 0x02, 0xe3, 0xda, 0x82, + 0x7c, 0x4c, 0xf2, 0xf6, 0x16, 0xea, 0xf2, 0x04, 0xc4, 0x73, 0xa6, 0x89, 0xb2, 0x90, 0x64, 0x07, + 0xdc, 0x06, 0xd3, 0x97, 0x84, 0xe2, 0x96, 0x49, 0x9b, 0x6d, 0x6c, 0x3a, 0xd7, 0x55, 0xcb, 0x7d, + 0xc2, 0x24, 0xca, 0xf2, 0xe3, 0x90, 0x9a, 0x31, 0x74, 0x1b, 0xeb, 0x76, 0x9d, 0x2e, 0xbd, 0x8d, + 0xaa, 0x51, 0xda, 0xe6, 0x14, 0x58, 0x81, 0x08, 0x5c, 0x35, 0x4d, 0x8a, 0x99, 0x50, 0xc8, 0xbf, + 0xcc, 0x4c, 0xe5, 0x57, 0x5b, 0x8a, 0xe8, 0xf1, 0xce, 0x45, 0xc4, 0x07, 0xe9, 0xca, 0xe8, 0xff, + 0x48, 0x70, 0xb4, 0x71, 0x41, 0x6d, 0xe3, 0x5d, 0xbb, 0xd3, 0xf5, 0xf4, 0x1c, 0xa4, 0x56, 0xe8, + 0x3b, 0xe2, 0xa7, 0xf1, 0x2e, 0xca, 0x42, 0x2f, 0x2e, 0x9f, 0x39, 0x7b, 0xf6, 0x91, 0xc7, 0x99, + 0xb6, 0x5f, 0xe9, 0x52, 0x44, 0x05, 0x1a, 0x83, 0x94, 0x8d, 0x4b, 0xe6, 0x99, 0xb3, 0xe7, 0xb6, + 0x1f, 0x61, 0xea, 0x75, 0xa5, 0x4b, 0xf1, 0xaa, 0xa6, 0x93, 0x64, 0xd4, 0xdf, 0xfe, 0xe8, 0xb8, + 0x94, 0xef, 0x86, 0xb8, 0x5d, 0xaf, 0xdd, 0x55, 0x1d, 0x79, 0xb5, 0x1b, 0x26, 0xfc, 0x98, 0xd4, + 0x40, 0x5d, 0x53, 0xab, 0x5a, 0x59, 0xf5, 0x5e, 0x80, 0xa7, 0x7d, 0x32, 0xa0, 0x10, 0xcd, 0x45, + 0x90, 0xdd, 0x53, 0x92, 0xf2, 0xa7, 0x25, 0xe8, 0xbf, 0x2a, 0x28, 0xaf, 0x62, 0x07, 0x5d, 0x04, + 0x70, 0x7b, 0x12, 0xcb, 0xe6, 0xc8, 0x64, 0xb8, 0xaf, 0x49, 0x17, 0x47, 0xf1, 0x81, 0xa3, 0xf3, + 0x54, 0x11, 0x4d, 0xc3, 0xe6, 0xef, 0x5f, 0x22, 0x50, 0x5d, 0x60, 0xf4, 0x10, 0x20, 0x6a, 0xe1, + 0x8a, 0xd7, 0x0c, 0x47, 0xd3, 0x2b, 0x45, 0xd3, 0xb8, 0xce, 0x1f, 0x0b, 0xc6, 0x95, 0x34, 0x6d, + 0xb9, 0x4a, 0x1b, 0x56, 0x48, 0x3d, 0x61, 0x3a, 0xe5, 0x52, 0x21, 0xbb, 0x89, 0x5a, 0x2e, 0x5b, + 0xd8, 0xb6, 0xb9, 0x11, 0x13, 0x45, 0x74, 0x11, 0x7a, 0xcd, 0xfa, 0x46, 0x51, 0x58, 0x8c, 0xbe, + 0x33, 0x47, 0x9b, 0xad, 0x7f, 0xa1, 0x1f, 0xdc, 0x02, 0xf4, 0x98, 0xf5, 0x0d, 0xa2, 0x2d, 0xf7, + 0x40, 0x7f, 0x13, 0x66, 0xfa, 0xae, 0x79, 0x7c, 0xd0, 0xe7, 0xeb, 0x7c, 0x04, 0x45, 0xd3, 0xd2, + 0x0c, 0x4b, 0x73, 0x76, 0xe9, 0xed, 0x95, 0xb8, 0x92, 0x16, 0x0d, 0x2b, 0xbc, 0x5e, 0xde, 0x86, + 0xa1, 0x55, 0xea, 0x6a, 0x79, 0x9c, 0x9f, 0xf5, 0xf8, 0x93, 0xa2, 0xf9, 0x6b, 0xc9, 0x59, 0xac, + 0x81, 0xb3, 0xfc, 0x33, 0x2d, 0xb5, 0xf3, 0x7c, 0xe7, 0xda, 0x19, 0xdc, 0xfc, 0xff, 0xe2, 0x70, + 0x60, 0x71, 0x72, 0xcf, 0xda, 0x67, 0xbe, 0xda, 0x55, 0xcc, 0xa8, 0x08, 0x23, 0xbb, 0xf7, 0xa6, + 0x9a, 0x8d, 0x30, 0xa3, 0xd9, 0xc8, 0x25, 0x24, 0x3f, 0x0e, 0x03, 0x2b, 0xaa, 0xe5, 0xac, 0x62, + 0xe7, 0x0a, 0x56, 0xcb, 0xd8, 0x0a, 0xee, 0xba, 0x03, 0x62, 0xd7, 0x45, 0x90, 0xa0, 0x5b, 0x2b, + 0xdb, 0x75, 0xe8, 0xff, 0xf2, 0x16, 0x24, 0xe8, 0x0d, 0x36, 0x77, 0x47, 0xe6, 0x18, 0x6c, 0x47, + 0x26, 0xb6, 0x74, 0xd7, 0xc1, 0xb6, 0x08, 0xe8, 0x68, 0x01, 0x3d, 0x26, 0xf6, 0xd5, 0xf8, 0xde, + 0xfb, 0x2a, 0x57, 0x44, 0xbe, 0xbb, 0x56, 0xa1, 0x37, 0x4f, 0x4c, 0xf1, 0xfc, 0xac, 0xcb, 0x88, + 0xe4, 0x31, 0x82, 0x16, 0x61, 0xc8, 0x54, 0x2d, 0x87, 0x5e, 0xdd, 0xdf, 0xa2, 0xa3, 0xe0, 0xba, + 0x3e, 0xde, 0xb8, 0xf2, 0x02, 0x83, 0xe5, 0xbd, 0x0c, 0x98, 0xfe, 0x4a, 0xf9, 0xcf, 0x13, 0xd0, + 0xc3, 0x85, 0xf1, 0x04, 0xf4, 0x72, 0xb1, 0x72, 0xed, 0x3c, 0x36, 0xd9, 0xb8, 0x31, 0x4d, 0xba, + 0x1b, 0x08, 0xa7, 0x27, 0x70, 0xd0, 0x71, 0x48, 0x96, 0xb6, 0x54, 0x4d, 0x2f, 0x6a, 0x65, 0xe1, + 0xf5, 0xbe, 0x7e, 0x6b, 0xbc, 0x77, 0x86, 0xd4, 0xcd, 0xcf, 0x2a, 0xbd, 0xb4, 0x71, 0xbe, 0x4c, + 0x3c, 0x81, 0x2d, 0xac, 0x55, 0xb6, 0x1c, 0xbe, 0xc2, 0x78, 0x09, 0x5d, 0x80, 0x04, 0x51, 0x08, + 0xfe, 0xb2, 0x2b, 0xdb, 0x10, 0x7b, 0xb8, 0x01, 0x60, 0x3e, 0x49, 0x3a, 0x7e, 0xef, 0xd7, 0xc7, + 0x25, 0x85, 0x62, 0xa0, 0x19, 0x18, 0xa8, 0xaa, 0xb6, 0x53, 0xa4, 0x3b, 0x18, 0xe9, 0xbe, 0x9b, + 0x92, 0x38, 0xdc, 0x28, 0x10, 0x2e, 0x58, 0xce, 0x7a, 0x1f, 0xc1, 0x62, 0x55, 0x65, 0x74, 0x12, + 0xd2, 0x94, 0x48, 0xc9, 0xa8, 0xd5, 0x34, 0x87, 0xf9, 0x56, 0x3d, 0x54, 0xee, 0x83, 0xa4, 0x7e, + 0x86, 0x56, 0x53, 0x0f, 0xeb, 0x08, 0xa4, 0xe8, 0x53, 0x12, 0x0a, 0xc2, 0xae, 0x4d, 0x26, 0x49, + 0x05, 0x6d, 0x3c, 0x01, 0x43, 0x9e, 0x7d, 0x64, 0x20, 0x49, 0x46, 0xc5, 0xab, 0xa6, 0x80, 0x0f, + 0xc3, 0xa8, 0x8e, 0x77, 0xe8, 0x45, 0xce, 0x00, 0x74, 0x8a, 0x42, 0x23, 0xd2, 0x76, 0x35, 0x88, + 0x71, 0x3f, 0x0c, 0x96, 0x84, 0xf0, 0x19, 0x2c, 0x50, 0xd8, 0x01, 0xb7, 0x96, 0x82, 0x1d, 0x86, + 0xa4, 0x6a, 0x9a, 0x0c, 0xa0, 0x8f, 0xdb, 0x47, 0xd3, 0xa4, 0x4d, 0xa7, 0x60, 0x98, 0x8e, 0xd1, + 0xc2, 0x76, 0xbd, 0xea, 0x70, 0x22, 0xfd, 0x14, 0x66, 0x88, 0x34, 0x28, 0xac, 0x9e, 0xc2, 0xde, + 0x0b, 0x03, 0xf8, 0x9a, 0x56, 0xc6, 0x7a, 0x09, 0x33, 0xb8, 0x01, 0x0a, 0xd7, 0x2f, 0x2a, 0x29, + 0xd0, 0x03, 0xe0, 0xda, 0xbd, 0xa2, 0xb0, 0xc9, 0x83, 0x8c, 0x9e, 0xa8, 0xcf, 0xb1, 0x6a, 0x39, + 0x03, 0x89, 0x59, 0xd5, 0x51, 0x89, 0x83, 0xe1, 0xec, 0xb0, 0x8d, 0xa6, 0x5f, 0x21, 0xff, 0xca, + 0xdf, 0x8e, 0x41, 0xe2, 0xaa, 0xe1, 0x60, 0xf4, 0xa8, 0xcf, 0x01, 0x1c, 0x6c, 0xa6, 0xcf, 0xab, + 0x5a, 0x45, 0xc7, 0xe5, 0x45, 0xbb, 0xe2, 0x7b, 0xcf, 0xed, 0xa9, 0x53, 0x2c, 0xa0, 0x4e, 0xa3, + 0xd0, 0x6d, 0x19, 0x75, 0xbd, 0x2c, 0x6e, 0x1c, 0xd2, 0x02, 0x2a, 0x40, 0xd2, 0xd5, 0x92, 0x44, + 0x94, 0x96, 0x0c, 0x11, 0x2d, 0x21, 0x3a, 0xcc, 0x2b, 0x94, 0xde, 0x0d, 0xae, 0x2c, 0x79, 0x48, + 0xb9, 0xc6, 0x8b, 0x6b, 0x5b, 0x7b, 0x0a, 0xeb, 0xa1, 0x91, 0xcd, 0xc4, 0x9d, 0x7b, 0x57, 0x78, + 0x4c, 0xe3, 0xd2, 0x6e, 0x03, 0x97, 0x5e, 0x40, 0xad, 0xf8, 0xdb, 0xf2, 0x5e, 0x3a, 0x2e, 0x4f, + 0xad, 0xd8, 0xfb, 0xf2, 0xa3, 0x90, 0xb2, 0xb5, 0x8a, 0xae, 0x3a, 0x75, 0x0b, 0x73, 0xcd, 0xf3, + 0x2a, 0xe4, 0xcf, 0x4b, 0xd0, 0xc3, 0x34, 0xd9, 0x27, 0x37, 0xa9, 0xb9, 0xdc, 0x62, 0xad, 0xe4, + 0x16, 0xdf, 0xbf, 0xdc, 0x72, 0x00, 0x2e, 0x33, 0x36, 0x7f, 0x1b, 0xdc, 0xc4, 0x63, 0x60, 0x2c, + 0xae, 0x6a, 0x15, 0xbe, 0x50, 0x7d, 0x48, 0xf2, 0x7f, 0x92, 0x88, 0x13, 0xcb, 0xdb, 0x51, 0x0e, + 0x06, 0x04, 0x5f, 0xc5, 0xcd, 0xaa, 0x5a, 0xe1, 0xba, 0x73, 0xac, 0x25, 0x73, 0x97, 0xab, 0x6a, + 0x45, 0xe9, 0xe3, 0xfc, 0x90, 0x42, 0xf3, 0x79, 0x88, 0xb5, 0x98, 0x87, 0xc0, 0xc4, 0xc7, 0xf7, + 0x37, 0xf1, 0x81, 0x29, 0x4a, 0x84, 0xa7, 0xe8, 0x33, 0x31, 0x1a, 0xcc, 0x98, 0x86, 0xad, 0x56, + 0xdf, 0x8c, 0x15, 0x71, 0x04, 0x52, 0xa6, 0x51, 0x2d, 0xb2, 0x16, 0x76, 0x13, 0x37, 0x69, 0x1a, + 0x55, 0xa5, 0x61, 0xda, 0xbb, 0xef, 0xd0, 0x72, 0xe9, 0xb9, 0x03, 0x52, 0xeb, 0x0d, 0x4b, 0xcd, + 0x82, 0x7e, 0x26, 0x0a, 0xbe, 0x97, 0x3d, 0x4c, 0x64, 0x40, 0x37, 0x47, 0xa9, 0x71, 0xef, 0x65, + 0x6c, 0x33, 0x48, 0x85, 0xc3, 0x11, 0x0c, 0x66, 0xfa, 0x9b, 0x45, 0xc1, 0x7e, 0xb5, 0x54, 0x38, + 0x9c, 0xfc, 0xab, 0x12, 0xc0, 0x02, 0x91, 0x2c, 0x1d, 0x2f, 0xd9, 0x85, 0x6c, 0xca, 0x42, 0x31, + 0xd0, 0xf3, 0x58, 0xab, 0x49, 0xe3, 0xfd, 0xf7, 0xdb, 0x7e, 0xbe, 0x67, 0x60, 0xc0, 0x53, 0x46, + 0x1b, 0x0b, 0x66, 0xc6, 0xf6, 0xf0, 0xaa, 0x57, 0xb1, 0xa3, 0xf4, 0x5f, 0xf3, 0x95, 0xe4, 0x3f, + 0x90, 0x20, 0x45, 0x79, 0x5a, 0xc4, 0x8e, 0x1a, 0x98, 0x43, 0x69, 0xff, 0x73, 0x78, 0x0c, 0x80, + 0x91, 0xb1, 0xb5, 0x1b, 0x98, 0x6b, 0x56, 0x8a, 0xd6, 0xac, 0x6a, 0x37, 0x30, 0x3a, 0xe7, 0x0a, + 0x3c, 0xbe, 0xb7, 0xc0, 0x85, 0xd7, 0xcd, 0xc5, 0x7e, 0x08, 0x7a, 0xe9, 0x27, 0x72, 0x76, 0x6c, + 0xee, 0x48, 0xf7, 0xe8, 0xf5, 0xda, 0xda, 0x8e, 0x2d, 0xbf, 0x00, 0xbd, 0x6b, 0x3b, 0x2c, 0x37, + 0x72, 0x04, 0x52, 0x96, 0x61, 0xf0, 0x3d, 0x99, 0xf9, 0x42, 0x49, 0x52, 0x41, 0xb7, 0x20, 0x91, + 0x0f, 0x88, 0x79, 0xf9, 0x00, 0x2f, 0xa1, 0x11, 0x6f, 0x2b, 0xa1, 0x71, 0xea, 0xab, 0x12, 0xf4, + 0xf9, 0xec, 0x03, 0x7a, 0x04, 0x0e, 0xe4, 0x17, 0x96, 0x67, 0x9e, 0x2e, 0xce, 0xcf, 0x16, 0x2f, + 0x2f, 0xe4, 0xe6, 0xbc, 0xb7, 0x26, 0xd9, 0x83, 0xaf, 0xdc, 0x9c, 0x40, 0x3e, 0xd8, 0x75, 0x7d, + 0x5b, 0x37, 0xae, 0xeb, 0x68, 0x0a, 0x46, 0x83, 0x28, 0xb9, 0xfc, 0x6a, 0x61, 0x69, 0x2d, 0x2d, + 0x65, 0x0f, 0xbc, 0x72, 0x73, 0x62, 0xd8, 0x87, 0x91, 0xdb, 0xb0, 0xb1, 0xee, 0x34, 0x22, 0xcc, + 0x2c, 0x2f, 0x2e, 0xce, 0xaf, 0xa5, 0x63, 0x0d, 0x08, 0xdc, 0x60, 0x3f, 0x00, 0xc3, 0x41, 0x84, + 0xa5, 0xf9, 0x85, 0x74, 0x3c, 0x8b, 0x5e, 0xb9, 0x39, 0x31, 0xe8, 0x83, 0x5e, 0xd2, 0xaa, 0xd9, + 0xe4, 0xcb, 0x1f, 0x1b, 0xeb, 0xfa, 0xe4, 0xc7, 0xc7, 0x24, 0x32, 0xb2, 0x81, 0x80, 0x8d, 0x40, + 0x0f, 0xc1, 0xa1, 0xd5, 0xf9, 0xb9, 0xa5, 0xc2, 0x6c, 0x71, 0x71, 0x75, 0xae, 0xc8, 0x3e, 0xb2, + 0xe1, 0x8e, 0x6e, 0xe8, 0x95, 0x9b, 0x13, 0x7d, 0x7c, 0x48, 0xad, 0xa0, 0x57, 0x94, 0xc2, 0xd5, + 0xe5, 0xb5, 0x42, 0x5a, 0x62, 0xd0, 0x2b, 0x16, 0xbe, 0x66, 0x38, 0xec, 0x1b, 0x5a, 0x0f, 0xc3, + 0xe1, 0x26, 0xd0, 0xee, 0xc0, 0x86, 0x5f, 0xb9, 0x39, 0x31, 0xb0, 0x62, 0x61, 0xb6, 0x7e, 0x28, + 0xc6, 0x24, 0x64, 0x1a, 0x31, 0x96, 0x57, 0x96, 0x57, 0x73, 0x0b, 0xe9, 0x89, 0x6c, 0xfa, 0x95, + 0x9b, 0x13, 0xfd, 0xc2, 0x18, 0x12, 0x78, 0x6f, 0x64, 0x77, 0x33, 0xe2, 0x79, 0xff, 0xc3, 0x70, + 0xcc, 0x76, 0xd4, 0x6d, 0x4d, 0xaf, 0xb8, 0x19, 0x67, 0x5e, 0xe6, 0x21, 0xcf, 0xb1, 0xaa, 0xf6, + 0x62, 0x5d, 0x2b, 0x8b, 0x4a, 0xf1, 0x77, 0xcf, 0xf4, 0x73, 0xb6, 0xf5, 0xc9, 0x52, 0x36, 0x22, + 0xbb, 0x1a, 0x1d, 0x3a, 0xb5, 0x3e, 0xaa, 0xc8, 0x46, 0x24, 0xd0, 0xb3, 0x7b, 0x06, 0x77, 0xf2, + 0x7b, 0x25, 0x18, 0xbc, 0xa2, 0xd9, 0x8e, 0x61, 0x69, 0x25, 0xb5, 0x4a, 0x5f, 0x98, 0x9c, 0x6b, + 0xd7, 0xb6, 0x86, 0x96, 0xfa, 0x65, 0xe8, 0xb9, 0xa6, 0x56, 0x99, 0x51, 0x63, 0x8f, 0x78, 0xf6, + 0x94, 0xa2, 0x67, 0xe1, 0x04, 0x1d, 0x86, 0x2d, 0xff, 0x76, 0x0c, 0x86, 0xe8, 0x9a, 0xb0, 0xd9, + 0x97, 0x90, 0x48, 0xa8, 0x95, 0x87, 0x84, 0xa5, 0x3a, 0x3c, 0x77, 0x98, 0x9f, 0xe4, 0xf9, 0xf0, + 0xe3, 0xd1, 0x39, 0xee, 0xc9, 0x59, 0x5c, 0x52, 0x28, 0x2e, 0xfa, 0x5b, 0x90, 0xac, 0xa9, 0x3b, + 0x45, 0x4a, 0x87, 0x05, 0x30, 0xb9, 0xce, 0xe8, 0xbc, 0x71, 0x6b, 0x7c, 0x68, 0x57, 0xad, 0x55, + 0xa7, 0x65, 0x41, 0x47, 0x56, 0x7a, 0x6b, 0xea, 0x0e, 0x61, 0x11, 0x99, 0x30, 0x44, 0x6a, 0x4b, + 0x5b, 0xaa, 0x5e, 0xc1, 0xac, 0x13, 0x9a, 0x09, 0xcd, 0x5f, 0xe9, 0xb8, 0x93, 0x83, 0x5e, 0x27, + 0x3e, 0x72, 0xb2, 0x32, 0x50, 0x53, 0x77, 0x66, 0x68, 0x05, 0xe9, 0x71, 0x3a, 0xf9, 0x81, 0x8f, + 0x8c, 0x77, 0xd1, 0x33, 0x86, 0xaf, 0x49, 0x00, 0x9e, 0xc4, 0x50, 0x09, 0xd2, 0x25, 0xb7, 0x44, + 0x71, 0x6d, 0x3e, 0x95, 0x93, 0x11, 0x53, 0x12, 0x12, 0x3b, 0xdb, 0xa9, 0xbf, 0x7c, 0x6b, 0x5c, + 0x52, 0x86, 0x4a, 0xa1, 0x19, 0x79, 0x3b, 0xf4, 0xd5, 0xcd, 0xb2, 0xea, 0xe0, 0x22, 0x8d, 0xea, + 0x62, 0x91, 0xbb, 0xfe, 0x18, 0xa1, 0xf5, 0xc6, 0xad, 0x71, 0xc4, 0x46, 0xe7, 0x43, 0x96, 0xa9, + 0x2f, 0x00, 0xac, 0x86, 0x20, 0xf8, 0x86, 0xf6, 0x47, 0x12, 0xf4, 0xcd, 0xfa, 0xee, 0x7d, 0x65, + 0xa0, 0xb7, 0x66, 0xe8, 0xda, 0x36, 0xd7, 0xce, 0x94, 0x22, 0x8a, 0x28, 0x0b, 0x49, 0xf6, 0x04, + 0xcf, 0xd9, 0x15, 0x89, 0x51, 0x51, 0x26, 0x58, 0xd7, 0xf1, 0x86, 0xad, 0x89, 0x49, 0x51, 0x44, + 0x11, 0x5d, 0x86, 0xb4, 0x8d, 0x4b, 0x75, 0x4b, 0x73, 0x76, 0x8b, 0x25, 0x43, 0x77, 0xd4, 0x92, + 0xc3, 0x1e, 0x73, 0xe5, 0x8f, 0xbc, 0x71, 0x6b, 0xfc, 0x10, 0xe3, 0x35, 0x0c, 0x21, 0x2b, 0x43, + 0xa2, 0x6a, 0x86, 0xd5, 0x90, 0x1e, 0xca, 0xd8, 0x51, 0xb5, 0xaa, 0x9d, 0x61, 0xa7, 0x66, 0xa2, + 0xe8, 0x1b, 0xcb, 0x17, 0x7a, 0xfd, 0x69, 0xae, 0xcb, 0x90, 0x36, 0x4c, 0x6c, 0x05, 0xdc, 0x52, + 0x29, 0xdc, 0x73, 0x18, 0x42, 0x56, 0x86, 0x44, 0x95, 0x70, 0x59, 0x1d, 0x32, 0xdb, 0x22, 0x6c, + 0x34, 0xeb, 0x1b, 0x5e, 0x76, 0x6c, 0xb4, 0x61, 0x36, 0x72, 0xfa, 0x6e, 0xfe, 0x51, 0x8f, 0x7a, + 0x18, 0x4f, 0xfe, 0xd2, 0x67, 0x4f, 0x8f, 0x72, 0xe3, 0xe2, 0x65, 0xab, 0x9e, 0xc6, 0xbb, 0x64, + 0xfa, 0x39, 0xe8, 0x0a, 0x85, 0x24, 0x4e, 0xe8, 0x0b, 0xaa, 0x56, 0x15, 0x8f, 0x92, 0x15, 0x5e, + 0x42, 0x39, 0xe8, 0xb1, 0x1d, 0xd5, 0xa9, 0xdb, 0xfc, 0x13, 0x60, 0x0f, 0x44, 0x68, 0x5c, 0xde, + 0xd0, 0xcb, 0xab, 0x14, 0x41, 0xe1, 0x88, 0xc4, 0x8e, 0x38, 0xc6, 0x36, 0xd6, 0xb9, 0x24, 0x3b, + 0x5a, 0xed, 0xf4, 0x2c, 0x8f, 0x61, 0x13, 0xc1, 0x94, 0x71, 0x15, 0x57, 0x98, 0xaf, 0xb5, 0xa5, + 0x92, 0x90, 0x84, 0x7e, 0x10, 0x2c, 0x3f, 0xdf, 0xf1, 0x92, 0xe4, 0x02, 0x0b, 0xd3, 0x93, 0x95, + 0x21, 0xb7, 0x6a, 0x95, 0xd6, 0x20, 0x25, 0x70, 0x4f, 0x91, 0x7f, 0x35, 0xef, 0x54, 0x84, 0x14, + 0x7c, 0x1a, 0x2e, 0x72, 0x17, 0xfe, 0xcb, 0x8e, 0x97, 0x21, 0x5d, 0xd7, 0x37, 0x0c, 0x9d, 0xbe, + 0x23, 0xe4, 0xbe, 0x3f, 0x89, 0xfd, 0xe2, 0x7e, 0x55, 0x09, 0x43, 0xc8, 0xca, 0x90, 0x5b, 0x75, + 0x85, 0x45, 0x08, 0x65, 0x18, 0xf4, 0xa0, 0xe8, 0xb2, 0x4d, 0x45, 0x2e, 0xdb, 0x7b, 0xf8, 0xb2, + 0x3d, 0x10, 0xee, 0xc5, 0x5b, 0xb9, 0x03, 0x6e, 0x25, 0x41, 0x43, 0xcb, 0x00, 0x9e, 0xb1, 0xa0, + 0x39, 0x8c, 0xbe, 0x48, 0x35, 0xf0, 0x0c, 0x8f, 0x08, 0x09, 0x3d, 0x12, 0xe8, 0x9d, 0x30, 0x52, + 0xd3, 0xf4, 0xa2, 0x8d, 0xab, 0x9b, 0x45, 0x2e, 0x6e, 0x42, 0x99, 0x7e, 0x0e, 0x26, 0xbf, 0xd0, + 0x99, 0x76, 0xbc, 0x71, 0x6b, 0x3c, 0xcb, 0xcd, 0x6b, 0x23, 0x49, 0x59, 0x19, 0xae, 0x69, 0xfa, + 0x2a, 0xae, 0x6e, 0xce, 0xba, 0x75, 0xd3, 0xfd, 0x2f, 0x7f, 0x64, 0xbc, 0x8b, 0xaf, 0xe1, 0x2e, + 0xf9, 0x1c, 0x4d, 0xaf, 0xf3, 0xb5, 0x87, 0x6d, 0x12, 0xb6, 0xa8, 0xa2, 0x40, 0x93, 0x1e, 0x29, + 0xc5, 0xab, 0x60, 0x6b, 0xff, 0xa5, 0xff, 0x38, 0x21, 0xc9, 0xbf, 0x29, 0x41, 0xcf, 0xec, 0xd5, + 0x15, 0x55, 0xb3, 0xd0, 0x3c, 0x0c, 0x7b, 0x7a, 0x14, 0x5c, 0xf9, 0x47, 0xdf, 0xb8, 0x35, 0x9e, + 0x09, 0xab, 0x9a, 0xbb, 0xf4, 0x3d, 0x75, 0x16, 0x6b, 0x7f, 0xbe, 0x55, 0x6c, 0x1b, 0x20, 0xd5, + 0x00, 0x22, 0x37, 0x46, 0xbe, 0xa1, 0x61, 0x2e, 0x40, 0x2f, 0xe3, 0x96, 0x7e, 0xfc, 0xc2, 0x24, + 0xff, 0xf0, 0xb3, 0x83, 0xfb, 0xa3, 0x54, 0x99, 0xa2, 0xb9, 0x29, 0x4f, 0x82, 0x29, 0xbf, 0x2f, + 0x06, 0x30, 0x7b, 0xf5, 0xea, 0x9a, 0xa5, 0x99, 0x55, 0xec, 0xdc, 0x49, 0x01, 0xac, 0xc1, 0x01, + 0x5f, 0x3c, 0x65, 0x95, 0x42, 0x42, 0x98, 0x78, 0xe3, 0xd6, 0xf8, 0xd1, 0xb0, 0x10, 0x7c, 0x60, + 0xb2, 0x32, 0xe2, 0x45, 0x56, 0x56, 0xa9, 0x29, 0xd5, 0xb2, 0xed, 0xb8, 0x54, 0xe3, 0xad, 0xa9, + 0xfa, 0xc0, 0xfc, 0x54, 0x67, 0x6d, 0xa7, 0xb9, 0x84, 0x9f, 0x87, 0x3e, 0x4f, 0x24, 0x36, 0x7a, + 0x1a, 0x92, 0x0e, 0xff, 0x9f, 0x0b, 0xfa, 0x81, 0x48, 0x41, 0x0b, 0x6c, 0x2e, 0x6c, 0x97, 0x80, + 0xfc, 0x97, 0x12, 0x80, 0xa7, 0xc1, 0x3f, 0x9e, 0x0a, 0x47, 0xcc, 0x3c, 0x37, 0xca, 0xf1, 0x7d, + 0x39, 0x75, 0x1c, 0x3b, 0x24, 0xd6, 0xf7, 0xc7, 0x60, 0x64, 0x5d, 0x98, 0xa3, 0x1f, 0x7b, 0x19, + 0x3c, 0x0b, 0xbd, 0x58, 0x77, 0x2c, 0x8d, 0x0a, 0x81, 0x4c, 0xfa, 0xf9, 0x88, 0x49, 0x6f, 0x32, + 0x34, 0xfa, 0x91, 0x1c, 0x91, 0xac, 0xe7, 0xd4, 0x42, 0x42, 0x79, 0x4f, 0x1c, 0x32, 0xad, 0x30, + 0xd1, 0x0c, 0x0c, 0x95, 0x2c, 0x4c, 0x2b, 0x8a, 0xfe, 0x8c, 0x61, 0x3e, 0xeb, 0xb9, 0xa2, 0x21, + 0x00, 0x59, 0x19, 0x14, 0x35, 0x7c, 0x67, 0xa9, 0x00, 0x71, 0x10, 0x89, 0xf6, 0x11, 0xa8, 0x36, + 0x3d, 0x42, 0x99, 0x6f, 0x2d, 0xa2, 0x93, 0x20, 0x01, 0xb6, 0xb7, 0x0c, 0x7a, 0xb5, 0x74, 0x73, + 0x79, 0x11, 0x86, 0x34, 0x5d, 0x73, 0x34, 0xb5, 0x5a, 0xdc, 0x50, 0xab, 0xaa, 0x5e, 0xda, 0x8f, + 0x9b, 0xcd, 0xf6, 0x01, 0xde, 0x6d, 0x88, 0x9c, 0xac, 0x0c, 0xf2, 0x9a, 0x3c, 0xab, 0x40, 0x57, + 0xa0, 0x57, 0x74, 0x95, 0xd8, 0x97, 0x43, 0x22, 0xd0, 0x7d, 0xae, 0xe0, 0xbb, 0xe3, 0x30, 0xac, + 0xe0, 0xf2, 0xff, 0x9f, 0x8a, 0xce, 0xa6, 0x62, 0x11, 0x80, 0xad, 0x7a, 0x62, 0x6e, 0xf7, 0x31, + 0x1b, 0xc4, 0x6e, 0xa4, 0x18, 0x85, 0x59, 0xdb, 0xf1, 0xcd, 0xc7, 0x7f, 0x8e, 0x41, 0xbf, 0x7f, + 0x3e, 0xfe, 0x86, 0xee, 0x51, 0x68, 0xc5, 0x33, 0x48, 0x2c, 0x7b, 0xff, 0x70, 0x84, 0x41, 0x6a, + 0x50, 0xe2, 0xbd, 0x2d, 0xd1, 0x1b, 0x31, 0xe8, 0x59, 0x51, 0x2d, 0xb5, 0x66, 0xa3, 0xa7, 0x1a, + 0x9c, 0x51, 0x91, 0xbd, 0x6c, 0xf8, 0x3e, 0x34, 0x4f, 0x96, 0xb0, 0x70, 0xf4, 0x03, 0x4d, 0x5c, + 0xce, 0xfb, 0x61, 0x90, 0x44, 0xcb, 0xbe, 0x8b, 0x0e, 0x31, 0x7a, 0x7c, 0x4b, 0x22, 0x66, 0xef, + 0x94, 0x0d, 0x8d, 0x43, 0x1f, 0x01, 0xf3, 0x4c, 0x2e, 0x81, 0x81, 0x9a, 0xba, 0x53, 0x60, 0x35, + 0xe8, 0x34, 0xa0, 0x2d, 0x37, 0x19, 0x52, 0xf4, 0x24, 0x41, 0xe0, 0x86, 0xbd, 0x16, 0x01, 0x7e, + 0x0c, 0x80, 0x70, 0x51, 0x64, 0x37, 0x04, 0x59, 0xdc, 0x97, 0x22, 0x35, 0xb3, 0xf4, 0x96, 0x20, + 0xf7, 0x5b, 0x43, 0xb1, 0x38, 0x8f, 0x41, 0x16, 0x3a, 0x8e, 0x41, 0x7c, 0x7e, 0x6b, 0x88, 0x24, + 0xf3, 0x5b, 0x83, 0xc1, 0xbb, 0x4f, 0xb9, 0x5f, 0x93, 0x00, 0x79, 0x56, 0x5f, 0xc1, 0xb6, 0x49, + 0x82, 0x39, 0xe2, 0xa7, 0xfb, 0xbc, 0x69, 0xa9, 0x2d, 0x3f, 0xdd, 0x23, 0x23, 0xfc, 0x74, 0xdf, + 0x9a, 0x79, 0xdc, 0x33, 0x94, 0x31, 0x3e, 0x95, 0x4d, 0x2e, 0x6f, 0x4e, 0xce, 0x18, 0x9a, 0xc0, + 0x6e, 0xb0, 0x8c, 0x5d, 0xf2, 0x9f, 0x48, 0x70, 0xb8, 0x41, 0xa9, 0x5c, 0x9e, 0x31, 0x20, 0xcb, + 0xd7, 0xc8, 0xbf, 0x18, 0xc7, 0x78, 0xdf, 0xaf, 0xaa, 0x0e, 0x5b, 0x0d, 0x86, 0xf8, 0xce, 0x99, + 0x7c, 0x76, 0x09, 0xf4, 0x5f, 0x49, 0x30, 0xea, 0xef, 0xde, 0x1d, 0xcf, 0x3a, 0xf4, 0xfb, 0x7b, + 0xe7, 0x23, 0x79, 0xb0, 0x83, 0x91, 0xf0, 0x41, 0x04, 0xc8, 0xa0, 0xe7, 0xbc, 0x65, 0xcc, 0x72, + 0x71, 0x17, 0x3a, 0x95, 0x8d, 0xe0, 0x30, 0xbc, 0x9c, 0x13, 0x74, 0x92, 0xfe, 0xaf, 0x04, 0x89, + 0x15, 0xc3, 0xa8, 0x22, 0x03, 0x86, 0x75, 0xc3, 0x29, 0x12, 0x9d, 0xc7, 0xe5, 0x22, 0x0f, 0xdb, + 0x99, 0x99, 0x9c, 0xe9, 0x4c, 0x64, 0xdf, 0xb9, 0x35, 0xde, 0x48, 0x4a, 0x19, 0xd2, 0x0d, 0x27, + 0x4f, 0x6b, 0xd6, 0x58, 0x50, 0xff, 0x4e, 0x18, 0x08, 0x76, 0xc6, 0x8c, 0xe8, 0xb3, 0x1d, 0x77, + 0x16, 0x24, 0xf3, 0xc6, 0xad, 0xf1, 0x51, 0xb6, 0xbc, 0x02, 0xd5, 0xb2, 0xd2, 0xbf, 0xe1, 0xeb, + 0x9d, 0xdd, 0x1a, 0xfb, 0x1e, 0x99, 0xd1, 0x4f, 0x4b, 0x30, 0x42, 0x2b, 0xb5, 0x1b, 0x98, 0x46, + 0xfe, 0x0a, 0x2e, 0x19, 0x56, 0x19, 0x0d, 0x42, 0x8c, 0x9f, 0xc3, 0x24, 0x94, 0x98, 0x56, 0x46, + 0xa3, 0xd0, 0x6d, 0x5c, 0xd7, 0xf9, 0x25, 0x8e, 0x94, 0xc2, 0x0a, 0xe8, 0x14, 0x0c, 0xd3, 0x5d, + 0x88, 0x75, 0xc3, 0xed, 0x07, 0xff, 0xde, 0x10, 0x6d, 0xa0, 0xa4, 0x99, 0x15, 0x21, 0xb6, 0xcd, + 0x28, 0xd7, 0xab, 0xb8, 0xa8, 0x96, 0x4a, 0xf4, 0xce, 0x31, 0xfb, 0x82, 0xc9, 0x00, 0xab, 0xcd, + 0xb1, 0x4a, 0x12, 0x88, 0xba, 0xe6, 0x4f, 0x98, 0x22, 0xb7, 0x82, 0xa9, 0xe1, 0xa9, 0xcf, 0x49, + 0x00, 0x5e, 0xc2, 0x05, 0x3d, 0x04, 0x87, 0xf2, 0xcb, 0x4b, 0xb3, 0xc5, 0xd5, 0xb5, 0xdc, 0xda, + 0xfa, 0x6a, 0x71, 0x7d, 0x69, 0x75, 0xa5, 0x30, 0x33, 0x7f, 0x79, 0xbe, 0x30, 0xeb, 0x1d, 0x15, + 0xd8, 0x26, 0x2e, 0x69, 0x9b, 0x1a, 0x2e, 0xa3, 0xe3, 0x30, 0x1a, 0x84, 0x26, 0xa5, 0xc2, 0x6c, + 0x5a, 0xca, 0xf6, 0xbf, 0x72, 0x73, 0x22, 0xc9, 0xfc, 0x4b, 0x5c, 0x46, 0x27, 0xe1, 0x40, 0x23, + 0xdc, 0xfc, 0xd2, 0x5c, 0x3a, 0x96, 0x1d, 0x78, 0xe5, 0xe6, 0x44, 0xca, 0x75, 0x44, 0x91, 0x0c, + 0xc8, 0x0f, 0xc9, 0xe9, 0xc5, 0xb3, 0xf0, 0xca, 0xcd, 0x89, 0x1e, 0x36, 0xeb, 0xd9, 0xc4, 0xcb, + 0x1f, 0x1b, 0xeb, 0xca, 0xbf, 0xad, 0xe5, 0x61, 0xc0, 0x25, 0xdf, 0x84, 0x6b, 0x2f, 0x56, 0xeb, + 0xc4, 0xfc, 0x69, 0x7a, 0x69, 0x8a, 0xa9, 0xbb, 0xe6, 0xec, 0x9e, 0xe6, 0xaa, 0x7e, 0x9a, 0x89, + 0x6b, 0x6a, 0x47, 0xa4, 0xfa, 0x43, 0x87, 0x02, 0x2f, 0xcb, 0x90, 0x09, 0x1f, 0x0a, 0x38, 0x3b, + 0xed, 0x9d, 0x07, 0xec, 0x91, 0xf9, 0x8f, 0xcc, 0xec, 0xb7, 0x38, 0x4b, 0xd8, 0x7f, 0xbe, 0x7f, + 0xef, 0xa3, 0x0d, 0xf9, 0x3f, 0x24, 0x00, 0x2d, 0xda, 0x95, 0x19, 0xe2, 0x34, 0xfa, 0xae, 0xae, + 0x85, 0xd2, 0x56, 0xd2, 0x9d, 0x48, 0x5b, 0xad, 0x05, 0x12, 0x41, 0xb1, 0x7d, 0x65, 0xa0, 0xdb, + 0xce, 0x06, 0xc5, 0xdf, 0x94, 0x6c, 0x50, 0x73, 0xbf, 0x30, 0x71, 0xe7, 0xe2, 0xc8, 0xee, 0xfd, + 0xc6, 0xd2, 0x3c, 0xf3, 0xdb, 0xb3, 0x47, 0xe6, 0x37, 0xd3, 0x32, 0xbd, 0xcb, 0xb1, 0xd1, 0x59, + 0xf1, 0x70, 0xa9, 0xb7, 0xbd, 0xfd, 0x9b, 0xbf, 0x6c, 0x4a, 0xbe, 0x2c, 0x76, 0xef, 0xa3, 0x90, + 0x6d, 0x54, 0x2e, 0xb1, 0x97, 0xc8, 0xaf, 0xc6, 0x21, 0xbd, 0x68, 0x57, 0x0a, 0x65, 0xcd, 0xb9, + 0xbb, 0x9a, 0x77, 0xa9, 0x75, 0x88, 0x8e, 0xde, 0xb8, 0x35, 0x3e, 0xc8, 0x44, 0xbb, 0x87, 0x40, + 0x6b, 0x30, 0x14, 0x76, 0xdb, 0x98, 0x82, 0xcd, 0xee, 0xe7, 0x24, 0xa7, 0xc1, 0x5d, 0x1b, 0x0c, + 0x9e, 0xa6, 0xa0, 0x9d, 0xe6, 0x3a, 0xcd, 0xf4, 0xea, 0xca, 0xdd, 0xcc, 0x6e, 0x7a, 0x53, 0x97, + 0x85, 0x4c, 0x78, 0x6e, 0xdc, 0x89, 0xfb, 0x73, 0x09, 0xfa, 0x16, 0x6d, 0x91, 0x3a, 0xc0, 0x3f, + 0xa6, 0xd9, 0x94, 0xf3, 0xee, 0xab, 0x9c, 0x78, 0x7b, 0xea, 0x2b, 0x5e, 0xea, 0x78, 0x42, 0x38, + 0x00, 0x23, 0xbe, 0x71, 0xba, 0xe3, 0xff, 0xe3, 0x18, 0x35, 0x9a, 0x79, 0x5c, 0xd1, 0x74, 0xd7, + 0x55, 0xc2, 0x7f, 0x53, 0x83, 0x44, 0x4f, 0xce, 0x89, 0xfd, 0xca, 0x79, 0x9b, 0xda, 0x89, 0x90, + 0x3c, 0x5d, 0xaf, 0x78, 0xb1, 0x31, 0x85, 0x21, 0x75, 0x70, 0xab, 0x28, 0x94, 0xa8, 0x90, 0xbf, + 0x2d, 0xc1, 0xc0, 0xa2, 0x5d, 0x59, 0xd7, 0xcb, 0x7f, 0xed, 0xf5, 0x77, 0x13, 0x0e, 0x04, 0x46, + 0x7a, 0xb7, 0x44, 0xfa, 0x07, 0x31, 0x18, 0x5e, 0xb4, 0x2b, 0x01, 0x0f, 0xd8, 0xfe, 0x6b, 0x26, + 0x56, 0xb2, 0x7a, 0x1c, 0x3e, 0xc0, 0x32, 0x3b, 0xf0, 0x2b, 0x32, 0x5f, 0x3e, 0x11, 0x5e, 0x3d, + 0x4d, 0xc1, 0x64, 0x65, 0xc4, 0xad, 0xa7, 0x02, 0x5a, 0x26, 0xb5, 0xbe, 0xc9, 0x5a, 0x83, 0xc3, + 0x0d, 0x32, 0x74, 0x27, 0xcc, 0xe3, 0x5a, 0xea, 0x88, 0x6b, 0xf9, 0x93, 0x12, 0x35, 0xe4, 0x64, + 0x59, 0xe1, 0x1a, 0x8b, 0x5b, 0x36, 0xdd, 0xd3, 0xc9, 0x3b, 0x38, 0x43, 0xe7, 0x03, 0x6f, 0x20, + 0xf7, 0xa5, 0xad, 0x6f, 0x87, 0x89, 0x56, 0x9c, 0xde, 0xbe, 0x1c, 0x3e, 0x20, 0xc1, 0x18, 0x11, + 0xaf, 0xa5, 0xea, 0xf6, 0x26, 0xb6, 0x9a, 0x05, 0x6b, 0xe7, 0x21, 0x23, 0x66, 0x88, 0x4f, 0x9c, + 0x45, 0x1b, 0x8a, 0x6e, 0x08, 0xe7, 0x2a, 0x80, 0x0f, 0x8d, 0xdd, 0x71, 0xb7, 0xe9, 0x9d, 0x18, + 0x1e, 0xd6, 0xf1, 0x12, 0xfd, 0x38, 0x2e, 0xbe, 0xce, 0xb5, 0x84, 0x7f, 0x59, 0x40, 0xc7, 0xd7, + 0xc3, 0x13, 0x7f, 0x12, 0x8e, 0xef, 0xcd, 0x99, 0x18, 0xfd, 0x99, 0xf7, 0x24, 0x21, 0xbe, 0x68, + 0x57, 0xd0, 0x4f, 0xc2, 0x50, 0xd8, 0x63, 0x7f, 0x24, 0xc2, 0x45, 0x6a, 0xf4, 0xc3, 0xb2, 0x8f, + 0x77, 0x8c, 0xe2, 0x4e, 0xc3, 0x2e, 0x0c, 0x04, 0xdd, 0xb6, 0xa9, 0x68, 0x5a, 0x01, 0x84, 0xec, + 0xf9, 0x0e, 0x11, 0xdc, 0xae, 0x5f, 0x80, 0xa4, 0xeb, 0x78, 0x9c, 0x8a, 0x26, 0x22, 0x60, 0xb3, + 0x67, 0xda, 0x87, 0x75, 0xfb, 0xfa, 0x49, 0x18, 0x0a, 0x6f, 0xf2, 0x6d, 0xc8, 0x39, 0x84, 0xd2, + 0x8e, 0x9c, 0x5b, 0x6d, 0x7d, 0x26, 0x80, 0x6f, 0x9f, 0x7a, 0x28, 0x9a, 0x90, 0x07, 0x9d, 0x7d, + 0xac, 0x13, 0x68, 0xb7, 0xc7, 0x77, 0xc2, 0x60, 0xc8, 0x8c, 0x3f, 0x1c, 0x4d, 0x27, 0x88, 0x91, + 0xbd, 0xd0, 0x29, 0x86, 0xdb, 0xfb, 0xcb, 0x12, 0x4b, 0xbc, 0x0b, 0x03, 0x80, 0xda, 0x50, 0x93, + 0xa6, 0x06, 0x23, 0x7b, 0x69, 0x9f, 0x88, 0x2e, 0x2b, 0x1f, 0x93, 0xe0, 0xc8, 0x5e, 0xd6, 0xe2, + 0x89, 0x36, 0x06, 0xd9, 0x1a, 0x3d, 0x5b, 0xb8, 0x2d, 0x74, 0x37, 0x1f, 0xf7, 0x26, 0xa4, 0x42, + 0xbe, 0x1e, 0x83, 0x53, 0xfe, 0x24, 0xc3, 0x8b, 0x75, 0x6c, 0xed, 0xba, 0xe9, 0x04, 0x53, 0xad, + 0x68, 0xba, 0xff, 0x69, 0xf8, 0x61, 0xbf, 0x41, 0xa6, 0xb0, 0x62, 0x4c, 0xf2, 0xcb, 0x12, 0xf4, + 0xad, 0xa8, 0x15, 0xac, 0xe0, 0x17, 0xeb, 0xd8, 0x76, 0x9a, 0xbc, 0x4d, 0x3e, 0x08, 0x3d, 0xc6, + 0xe6, 0xa6, 0xb8, 0x09, 0x9d, 0x50, 0x78, 0x09, 0x8d, 0x42, 0x77, 0x55, 0xab, 0x69, 0x6c, 0xcf, + 0x4e, 0x28, 0xac, 0x80, 0xc6, 0xa1, 0x8f, 0x66, 0xbb, 0x8a, 0xec, 0x55, 0x57, 0x42, 0x7c, 0x37, + 0xb0, 0xae, 0x3b, 0x6b, 0xf4, 0x69, 0x57, 0x06, 0x7a, 0x2d, 0x7c, 0x0d, 0x5b, 0x36, 0xfb, 0x76, + 0x7a, 0x52, 0x11, 0x45, 0xf9, 0x12, 0xf4, 0x33, 0x4e, 0xf8, 0x6c, 0x1f, 0x86, 0x24, 0x7d, 0x9f, + 0xe3, 0xf1, 0xd3, 0x4b, 0xca, 0x4f, 0xb3, 0x17, 0xce, 0x8c, 0x3e, 0x63, 0x89, 0x15, 0xf2, 0xf9, + 0x96, 0x82, 0x3f, 0x19, 0x1d, 0x9c, 0x31, 0x19, 0xba, 0x12, 0xfe, 0xc3, 0x6e, 0x38, 0xc0, 0x13, + 0x43, 0xaa, 0xa9, 0x4d, 0x6d, 0x39, 0x8e, 0xf8, 0x0a, 0x07, 0x70, 0x6f, 0x4c, 0x35, 0x35, 0x79, + 0x17, 0x12, 0x57, 0x1c, 0xc7, 0x44, 0xa7, 0xa0, 0xdb, 0xaa, 0x57, 0xb1, 0xb8, 0x18, 0xe0, 0x06, + 0xf7, 0xaa, 0xa9, 0x4d, 0x12, 0x00, 0xa5, 0x5e, 0xc5, 0x0a, 0x03, 0x41, 0x05, 0x18, 0xdf, 0xac, + 0x57, 0xab, 0xbb, 0xc5, 0x32, 0xa6, 0x3f, 0xf2, 0xea, 0xfe, 0x9e, 0x1a, 0xde, 0x31, 0x55, 0xdd, + 0x4d, 0xc4, 0x24, 0x95, 0xa3, 0x14, 0x6c, 0x96, 0x42, 0x89, 0xdf, 0x52, 0x2b, 0x08, 0x18, 0xf9, + 0x4f, 0x63, 0x90, 0x14, 0xa4, 0xe9, 0x93, 0x63, 0x5c, 0xc5, 0x25, 0xc7, 0x10, 0x97, 0xee, 0xdc, + 0x32, 0x42, 0x10, 0xaf, 0xf0, 0xc9, 0x4b, 0x5d, 0xe9, 0x52, 0x48, 0x81, 0xd4, 0xb9, 0x0f, 0xc1, + 0x49, 0x9d, 0x59, 0x27, 0xf3, 0x99, 0x30, 0x0d, 0x71, 0x66, 0x77, 0xa5, 0x4b, 0xa1, 0x25, 0x94, + 0x81, 0x1e, 0x62, 0x8f, 0x1c, 0x36, 0x5b, 0xa4, 0x9e, 0x97, 0xd1, 0x41, 0xe8, 0x36, 0x55, 0xa7, + 0xc4, 0xde, 0x68, 0x91, 0x06, 0x56, 0x24, 0xee, 0x00, 0xfb, 0xc2, 0x50, 0xf8, 0x17, 0x14, 0x89, + 0x30, 0xd8, 0xa7, 0x9c, 0x09, 0xdf, 0x2b, 0xaa, 0xe3, 0x60, 0x4b, 0x27, 0x04, 0x19, 0x38, 0x42, + 0x90, 0xd8, 0x30, 0xca, 0xbb, 0xfc, 0x57, 0x1d, 0xe9, 0xff, 0xfc, 0xf7, 0xe6, 0xa8, 0x3e, 0x14, + 0x69, 0x23, 0xfb, 0x31, 0xdb, 0x7e, 0x51, 0x99, 0x27, 0x40, 0x05, 0x18, 0x51, 0xcb, 0x65, 0x8d, + 0x28, 0xbc, 0x5a, 0x2d, 0x6e, 0x68, 0x34, 0x77, 0x69, 0xd3, 0x9f, 0x2a, 0x6e, 0x35, 0x17, 0xc8, + 0x43, 0xc8, 0x73, 0xf8, 0x7c, 0x0a, 0x7a, 0x4d, 0xc6, 0x94, 0x7c, 0x11, 0x86, 0x1b, 0x38, 0x25, + 0xfc, 0x6d, 0x6b, 0x7a, 0x59, 0xbc, 0x8e, 0x27, 0xff, 0x93, 0x3a, 0xfa, 0x39, 0x76, 0xe6, 0x64, + 0xd0, 0xff, 0xf3, 0x3f, 0xdd, 0xfa, 0xdb, 0x09, 0x83, 0xbe, 0x6f, 0x27, 0xa8, 0xa6, 0x96, 0x4f, + 0x51, 0xfa, 0xfc, 0x93, 0x09, 0x39, 0xde, 0xc0, 0x3e, 0x97, 0x30, 0x69, 0x58, 0x95, 0xa9, 0x0a, + 0xd6, 0x45, 0xe2, 0x91, 0x34, 0xa9, 0xa6, 0x66, 0x53, 0x75, 0xf4, 0x3e, 0x0f, 0x6f, 0x5f, 0xf4, + 0xfd, 0x4f, 0xbf, 0xa4, 0x90, 0x98, 0xcb, 0xad, 0xcc, 0xbb, 0x7a, 0xfc, 0x85, 0x18, 0x1c, 0xf5, + 0xe9, 0xb1, 0x0f, 0xb8, 0x51, 0x9d, 0xb3, 0xcd, 0x35, 0xbe, 0x8d, 0x8f, 0xab, 0x3c, 0x0d, 0x09, + 0x02, 0x8f, 0x22, 0x7e, 0x0d, 0x2e, 0xf3, 0xa9, 0x2f, 0xfd, 0x73, 0x39, 0x98, 0xfe, 0x0a, 0xcc, + 0x0a, 0x25, 0x92, 0xff, 0xf9, 0xf6, 0xe5, 0x97, 0xf6, 0xbe, 0x8c, 0x6f, 0xdf, 0x39, 0x31, 0x86, + 0x65, 0xf8, 0xbf, 0xe7, 0xe0, 0x48, 0x38, 0x65, 0xcb, 0xac, 0x68, 0x5b, 0xb9, 0xe7, 0x0e, 0x2c, + 0x75, 0xab, 0x07, 0xe5, 0x7b, 0xcd, 0x60, 0x44, 0x3a, 0x39, 0x2a, 0x1b, 0x2d, 0xef, 0xc0, 0xc1, + 0x67, 0x08, 0x53, 0xde, 0x29, 0xac, 0xd8, 0x0b, 0x0e, 0xba, 0x37, 0x45, 0x25, 0xee, 0x43, 0x8b, + 0xeb, 0x9f, 0xe0, 0x31, 0xce, 0x63, 0x8b, 0xe3, 0x93, 0x2d, 0xf7, 0x98, 0x49, 0xdf, 0xfe, 0xa2, + 0xf8, 0x30, 0xe5, 0x4f, 0x4b, 0x70, 0xa8, 0xa1, 0x6b, 0x6e, 0xfc, 0x97, 0x9a, 0x3c, 0x8a, 0xef, + 0xf4, 0xba, 0xba, 0xff, 0x9d, 0xfc, 0x5c, 0x13, 0x9e, 0x4f, 0x44, 0xf2, 0xcc, 0x98, 0x09, 0x30, + 0xfd, 0x24, 0x1c, 0x08, 0xf2, 0x2c, 0xa4, 0x75, 0x3f, 0x0c, 0x06, 0x83, 0x5d, 0x2e, 0xb5, 0x81, + 0x40, 0xb8, 0x2b, 0x6f, 0x86, 0xc5, 0xed, 0x0e, 0x79, 0xc1, 0x7f, 0x3e, 0xc4, 0x42, 0xa9, 0x4e, + 0x47, 0xec, 0x11, 0x90, 0xdf, 0x27, 0xc1, 0x44, 0xb0, 0x23, 0x2f, 0xa7, 0x68, 0x77, 0xc6, 0xf3, + 0x1d, 0x9b, 0xf0, 0xef, 0x49, 0x70, 0xcf, 0x1e, 0x3c, 0x71, 0x39, 0xfc, 0x94, 0x04, 0xa3, 0xbe, + 0x03, 0x64, 0x61, 0xea, 0x85, 0x16, 0x3c, 0xd2, 0xf6, 0x01, 0xb8, 0xeb, 0x91, 0x1d, 0x21, 0xc2, + 0x79, 0xed, 0xeb, 0xe3, 0x23, 0x8d, 0x6d, 0xb6, 0x32, 0xd2, 0x78, 0xe8, 0x7b, 0x07, 0xd5, 0xe5, + 0x55, 0x09, 0x1e, 0x08, 0x0e, 0xb9, 0xc9, 0x35, 0xaf, 0x1f, 0xd5, 0x7c, 0x7c, 0x43, 0x82, 0x53, + 0xed, 0x30, 0xc7, 0x27, 0x46, 0x83, 0x11, 0xef, 0x3e, 0x48, 0x78, 0x5a, 0xce, 0x74, 0x7e, 0x2f, + 0x8e, 0x2b, 0x2d, 0x72, 0x89, 0xde, 0x05, 0xf9, 0x9b, 0x7c, 0xb9, 0xf9, 0x67, 0xde, 0x95, 0x75, + 0x30, 0x8b, 0x22, 0x64, 0x1d, 0xc8, 0xa3, 0x34, 0x99, 0x92, 0x58, 0x93, 0x29, 0xf1, 0xa5, 0x0e, + 0xde, 0xc5, 0x8d, 0x5a, 0x93, 0xfb, 0x1c, 0x1b, 0x30, 0xd2, 0x44, 0xb1, 0xf9, 0x5a, 0xef, 0x5c, + 0xaf, 0x15, 0xd4, 0xa8, 0xba, 0xf2, 0x2e, 0x8c, 0xd3, 0xee, 0x9b, 0xc8, 0xfb, 0x6e, 0x8f, 0xdc, + 0xe1, 0x16, 0xa7, 0x69, 0xd7, 0x5c, 0x04, 0x2b, 0xd0, 0xc3, 0xa6, 0x9b, 0x8f, 0x7a, 0xff, 0x6a, + 0xc3, 0xe9, 0xc8, 0x1f, 0x14, 0x86, 0x6e, 0x56, 0x70, 0xdf, 0x7c, 0x61, 0xb5, 0x33, 0xe4, 0x3b, + 0xb4, 0xb0, 0x7c, 0x32, 0xf9, 0x9a, 0x30, 0x79, 0xcd, 0xb9, 0x73, 0x13, 0x28, 0x77, 0xd8, 0xe2, + 0x31, 0x11, 0xdd, 0x5d, 0xd3, 0xf6, 0x71, 0x61, 0xda, 0xdc, 0xa1, 0x45, 0x98, 0xb6, 0x1f, 0xcd, + 0x0c, 0xb8, 0x46, 0x2e, 0x82, 0xcd, 0xbf, 0xc2, 0x46, 0xee, 0x7b, 0x12, 0x1c, 0xa6, 0x43, 0xf4, + 0x5f, 0x12, 0xea, 0x54, 0xf2, 0x0f, 0x01, 0xb2, 0xad, 0x52, 0xb1, 0xe9, 0x92, 0x4f, 0xdb, 0x56, + 0xe9, 0x6a, 0x60, 0x0b, 0x7a, 0x08, 0x50, 0xd9, 0x76, 0xc2, 0xd0, 0x2c, 0xa1, 0x9a, 0x2e, 0xdb, + 0xce, 0xd5, 0x3d, 0x36, 0xac, 0xc4, 0x1d, 0x98, 0xd5, 0xaf, 0x4a, 0x90, 0x6d, 0x36, 0x64, 0x37, + 0x49, 0x77, 0x30, 0x70, 0x0b, 0x2d, 0x3c, 0x91, 0x8f, 0x76, 0x70, 0xdb, 0x2a, 0xb4, 0xa8, 0x0e, + 0x58, 0xf8, 0x6e, 0x7b, 0x0c, 0xe3, 0x41, 0x7d, 0x6d, 0xf4, 0xcc, 0x7f, 0x64, 0x8b, 0xe9, 0xf7, + 0x1b, 0x8c, 0xed, 0x5f, 0x25, 0xdf, 0x7d, 0x07, 0xc6, 0x5a, 0x30, 0x7f, 0xb7, 0xb7, 0x46, 0xa3, + 0xe5, 0x9c, 0xde, 0x25, 0xf7, 0xff, 0x31, 0xbe, 0x3c, 0x82, 0x2f, 0x87, 0x7d, 0x91, 0x5d, 0xb3, + 0x4f, 0x8f, 0xc8, 0x7f, 0x1b, 0x8e, 0x34, 0xc5, 0xe2, 0x2c, 0xe6, 0x20, 0xb1, 0xa5, 0xd9, 0xe2, + 0x9c, 0xe7, 0x74, 0x04, 0x77, 0x21, 0x22, 0x14, 0x55, 0x46, 0x90, 0xa6, 0x3d, 0xac, 0x18, 0x46, + 0x95, 0x73, 0x23, 0x2b, 0x30, 0xec, 0xab, 0xe3, 0x7d, 0x3d, 0x01, 0x09, 0xd3, 0xe0, 0x5f, 0xd7, + 0xeb, 0x3b, 0x73, 0x6f, 0x44, 0x5f, 0x04, 0x95, 0x0b, 0x81, 0xa2, 0xc9, 0xa3, 0x80, 0x18, 0x4d, + 0x7a, 0x95, 0x59, 0xf4, 0xf4, 0x3c, 0x8c, 0x04, 0x6a, 0x79, 0x5f, 0x33, 0xd0, 0x63, 0xd2, 0x1a, + 0xde, 0x5b, 0xd4, 0x0b, 0x2a, 0x86, 0xee, 0x7e, 0xbd, 0x8c, 0x96, 0xe4, 0xb3, 0x70, 0x2f, 0xa5, + 0xdd, 0x24, 0x35, 0x9c, 0xdf, 0x9d, 0x2f, 0x0b, 0xd1, 0x87, 0xae, 0x1f, 0xca, 0x3b, 0x70, 0xdf, + 0xde, 0x68, 0x9e, 0xe3, 0xc4, 0x8e, 0xbe, 0xda, 0x74, 0x9c, 0x9a, 0xd1, 0xe3, 0x0c, 0x33, 0x3a, + 0xf2, 0x93, 0x70, 0xbc, 0x75, 0xcf, 0xf4, 0x66, 0xa3, 0xe0, 0xb9, 0xe9, 0x27, 0x56, 0xe5, 0x77, + 0xc0, 0x89, 0x48, 0xfc, 0xbb, 0xc6, 0xfc, 0x13, 0x70, 0x7f, 0xab, 0xce, 0xed, 0xe5, 0xeb, 0x3a, + 0x2e, 0xfb, 0x78, 0x67, 0x87, 0x7d, 0x92, 0xef, 0x7a, 0xa7, 0xfc, 0xce, 0xd6, 0x63, 0x17, 0xe8, + 0x9c, 0x75, 0x05, 0x7a, 0x59, 0x97, 0xed, 0xfa, 0x00, 0xad, 0x79, 0x17, 0x84, 0xe4, 0xfb, 0xb9, + 0xaa, 0xe4, 0xaa, 0xd5, 0x66, 0x0c, 0x08, 0x6d, 0xbd, 0xc1, 0x55, 0xa3, 0x25, 0xd8, 0x5d, 0x64, + 0xf1, 0x04, 0x97, 0xef, 0x82, 0x6a, 0x3b, 0x6b, 0xcd, 0x4e, 0x58, 0x05, 0x93, 0x17, 0xb8, 0x24, + 0xf7, 0x00, 0xe4, 0x6c, 0x86, 0x35, 0xff, 0x84, 0x3b, 0x85, 0x8e, 0x1a, 0x1c, 0x60, 0x39, 0x67, + 0xdb, 0xd8, 0x71, 0xe5, 0x50, 0x74, 0x27, 0xab, 0x25, 0x20, 0xef, 0xc2, 0xbd, 0x1d, 0x27, 0x75, + 0x72, 0x3b, 0xee, 0xcc, 0x67, 0xc6, 0xa1, 0x9b, 0xf6, 0x80, 0x3e, 0x21, 0x01, 0xf8, 0x9e, 0x23, + 0x9c, 0x8d, 0x10, 0x64, 0xf3, 0xc4, 0x59, 0xf6, 0x5c, 0xa7, 0x68, 0x3c, 0x76, 0x3b, 0xf5, 0xd3, + 0xff, 0xe6, 0x5b, 0xbf, 0x1c, 0xbb, 0x0f, 0xc9, 0xe2, 0x90, 0x22, 0x9c, 0xd9, 0xf3, 0x6d, 0x8a, + 0xbf, 0x1b, 0xf8, 0x22, 0xe3, 0x63, 0x1d, 0xf5, 0x28, 0xf8, 0x3c, 0xdb, 0x21, 0x16, 0x67, 0xf3, + 0x22, 0x65, 0xf3, 0x2c, 0x7a, 0x34, 0x9a, 0xcd, 0xa9, 0x77, 0x04, 0xf7, 0xc9, 0x77, 0xa1, 0xd7, + 0x25, 0x18, 0x6d, 0x96, 0xfe, 0x41, 0x97, 0x3a, 0x62, 0xa6, 0x31, 0xc2, 0xc8, 0xbe, 0x75, 0xff, + 0x04, 0xf8, 0xc0, 0xe6, 0xe8, 0xc0, 0x72, 0xe8, 0xd2, 0x3e, 0x06, 0x36, 0xe5, 0x73, 0x43, 0xd1, + 0x2f, 0xc4, 0xe0, 0xd8, 0x9e, 0x39, 0x15, 0x74, 0xa5, 0x23, 0x66, 0xf7, 0x08, 0xac, 0xb2, 0xf3, + 0x77, 0x80, 0x12, 0x1f, 0xff, 0x33, 0x74, 0xfc, 0x4f, 0xa3, 0xf9, 0xfd, 0x8c, 0xdf, 0x8b, 0x9a, + 0xfc, 0x92, 0xf8, 0xb7, 0xc1, 0x87, 0xae, 0x6d, 0x69, 0x5c, 0x43, 0xc6, 0xa2, 0xbd, 0x05, 0xd5, + 0x18, 0x06, 0xcb, 0xcf, 0xd1, 0x01, 0x29, 0x68, 0xe5, 0x36, 0x27, 0x74, 0xea, 0x1d, 0x41, 0xaf, + 0xf0, 0x5d, 0xe8, 0xe7, 0x5a, 0xbc, 0x62, 0x7d, 0xb2, 0x1d, 0x4e, 0x5b, 0xe7, 0x66, 0xb2, 0x97, + 0xf6, 0x8d, 0xcf, 0x87, 0x5c, 0xa3, 0x43, 0xae, 0x20, 0x7c, 0xa7, 0x87, 0xdc, 0x74, 0x82, 0xd1, + 0x57, 0x25, 0x18, 0x6d, 0x96, 0xda, 0x68, 0x6f, 0x39, 0xef, 0x91, 0xb2, 0x69, 0x6f, 0x39, 0xef, + 0x95, 0x55, 0x91, 0xdf, 0x42, 0x45, 0x71, 0x0e, 0x3d, 0xd6, 0x4a, 0x14, 0x7b, 0xce, 0x30, 0x59, + 0xc3, 0x7b, 0xa6, 0x0c, 0xda, 0x5b, 0xc3, 0xed, 0x24, 0x47, 0xda, 0x5b, 0xc3, 0x6d, 0xe5, 0x2f, + 0xa2, 0xd7, 0xb0, 0x3b, 0xce, 0x36, 0xa7, 0xd8, 0x46, 0xff, 0x5a, 0x82, 0x81, 0x40, 0x98, 0x8d, + 0x2e, 0xb4, 0xc3, 0x6f, 0xb3, 0x64, 0x44, 0xe4, 0xc5, 0x9b, 0xd6, 0x31, 0xbd, 0x3c, 0x4f, 0x47, + 0x36, 0x83, 0x72, 0xfb, 0x19, 0x99, 0x15, 0xe0, 0xff, 0x96, 0x04, 0x23, 0x4d, 0x22, 0xd8, 0xf6, + 0x56, 0x6f, 0xeb, 0xb8, 0x3c, 0x7b, 0x69, 0xdf, 0xf8, 0x7c, 0x8c, 0x97, 0xe9, 0x18, 0xdf, 0x8a, + 0x9e, 0xdc, 0xcf, 0x18, 0x7d, 0xde, 0xc1, 0x77, 0xbd, 0x07, 0x85, 0xbe, 0x7e, 0x22, 0x2f, 0xc8, + 0xec, 0x1d, 0x1d, 0x67, 0x9f, 0xdc, 0x2f, 0x3a, 0x1f, 0xdd, 0xb3, 0x74, 0x74, 0xcf, 0xa0, 0xe5, + 0xdb, 0x1b, 0x5d, 0xa3, 0x53, 0xf1, 0x85, 0xc6, 0x6f, 0x64, 0xb5, 0xa5, 0x68, 0x4d, 0xa3, 0xe3, + 0xec, 0xf4, 0x7e, 0x50, 0xf9, 0x10, 0x2f, 0xd0, 0x21, 0x9e, 0x41, 0x0f, 0xb7, 0x1a, 0xa2, 0xef, + 0xf5, 0xaa, 0xa6, 0x6f, 0x1a, 0x53, 0xef, 0x60, 0xa1, 0xf7, 0xbb, 0xd0, 0x7b, 0xc4, 0x8b, 0xbd, + 0xa9, 0x76, 0xba, 0xf7, 0xc5, 0xcf, 0xd9, 0x87, 0xdb, 0x47, 0xe0, 0x5c, 0xde, 0x47, 0xb9, 0x1c, + 0x43, 0x47, 0x5b, 0x71, 0x49, 0x62, 0x68, 0xf4, 0x6b, 0x92, 0xfb, 0x14, 0xf8, 0x91, 0xb6, 0xba, + 0xf0, 0xc7, 0xda, 0x91, 0x97, 0xfb, 0x9a, 0x04, 0xe2, 0xf2, 0x71, 0xca, 0xd7, 0x04, 0x1a, 0x6b, + 0xc9, 0x17, 0x63, 0xe7, 0xe3, 0x12, 0x1c, 0x6a, 0x11, 0x30, 0xa3, 0x7c, 0x3b, 0xfd, 0xee, 0x1d, + 0xa4, 0x67, 0x67, 0x6e, 0x8b, 0x06, 0x1f, 0x4c, 0x17, 0xfa, 0x2d, 0x09, 0xb2, 0xad, 0xa3, 0x63, + 0x54, 0xd8, 0x77, 0x2f, 0xfe, 0xe8, 0x3c, 0x7b, 0xf9, 0x76, 0xc9, 0xb8, 0xfc, 0xbe, 0x26, 0xc1, + 0xe1, 0x96, 0x11, 0x31, 0x9a, 0xdd, 0x67, 0x3f, 0x81, 0x78, 0x3c, 0x5b, 0xb8, 0x4d, 0x2a, 0x2e, + 0xb3, 0x44, 0x07, 0x5a, 0x44, 0xc6, 0xed, 0xe9, 0xc0, 0xde, 0xd1, 0x77, 0x7b, 0x3a, 0x10, 0x11, + 0x9a, 0x73, 0x99, 0xb6, 0x8c, 0x8d, 0xdb, 0x93, 0x69, 0x54, 0x0c, 0xde, 0x9e, 0x4c, 0x23, 0x03, + 0x74, 0x57, 0x01, 0x5a, 0x44, 0xd9, 0xed, 0x2a, 0xc0, 0xde, 0xd1, 0x7c, 0xbb, 0x0a, 0x10, 0x11, + 0xea, 0xcb, 0x6f, 0xca, 0x93, 0xd3, 0x1f, 0xf4, 0x34, 0xde, 0xfc, 0x51, 0xeb, 0xce, 0xd6, 0x8d, + 0xdb, 0xfa, 0x0a, 0xe5, 0xbe, 0x5f, 0x8e, 0xca, 0x7f, 0x16, 0x07, 0xb4, 0xea, 0xa8, 0xdb, 0x38, + 0x57, 0x77, 0xb6, 0x0c, 0x4b, 0xbb, 0xc1, 0x9c, 0x70, 0x0c, 0x50, 0x53, 0x77, 0xfc, 0x8f, 0xbb, + 0xf7, 0xcc, 0x7d, 0x3c, 0xf8, 0xda, 0xd7, 0xc7, 0x4f, 0xb4, 0xf1, 0x5c, 0x8d, 0x00, 0x2b, 0xa9, + 0x9a, 0xba, 0xc3, 0x2f, 0xfe, 0xfe, 0x04, 0x80, 0x5a, 0xad, 0x1a, 0xd7, 0x8b, 0x55, 0xcd, 0x16, + 0x6f, 0x0a, 0xde, 0x12, 0x31, 0x9b, 0x8d, 0xdc, 0x4e, 0xfa, 0x3e, 0xaa, 0xde, 0xa5, 0xa4, 0x28, + 0xc5, 0x05, 0xcd, 0x76, 0xd0, 0xdb, 0x21, 0x55, 0xc6, 0xfa, 0x2e, 0xa3, 0x1e, 0xbf, 0x23, 0xd4, + 0x93, 0x84, 0x20, 0x25, 0x5e, 0x04, 0xa4, 0xfa, 0xe1, 0xe8, 0x4f, 0x80, 0xf1, 0x2f, 0xe0, 0x45, + 0xed, 0x9f, 0x81, 0x0e, 0xe8, 0x67, 0x9e, 0x87, 0xd5, 0x70, 0x55, 0xf6, 0x78, 0x20, 0x71, 0x14, + 0xf8, 0x85, 0x8c, 0xf8, 0xc9, 0x94, 0xfb, 0x0b, 0x19, 0xd3, 0xc3, 0x7f, 0xf2, 0xd9, 0xd3, 0x03, + 0x01, 0x8a, 0xf9, 0x7e, 0xff, 0x79, 0xc9, 0xa9, 0x0f, 0x4b, 0x30, 0xdc, 0xd0, 0x23, 0x92, 0x61, + 0x2c, 0xb7, 0xbe, 0x76, 0x65, 0x59, 0x99, 0x7f, 0x3e, 0xb7, 0x36, 0xbf, 0xbc, 0x24, 0xbe, 0x1b, + 0xeb, 0x7b, 0x10, 0x8e, 0xc6, 0xe1, 0x48, 0x13, 0x98, 0xd9, 0xc2, 0x42, 0x61, 0x2e, 0xb7, 0x56, + 0x48, 0x4b, 0xe8, 0x1e, 0x38, 0xd6, 0x94, 0x88, 0x0b, 0x12, 0x6b, 0x01, 0xa2, 0x14, 0x5c, 0x90, + 0xf8, 0x9b, 0xb1, 0xee, 0xfe, 0x7d, 0xaa, 0xf1, 0xfb, 0xaf, 0x15, 0xac, 0x63, 0x5b, 0xb3, 0x6f, + 0x67, 0xe5, 0x45, 0x3c, 0xbc, 0xfe, 0x54, 0x2f, 0xf4, 0xcf, 0xb1, 0x5e, 0x56, 0x1d, 0xd5, 0xb9, + 0x33, 0xe7, 0x02, 0xc8, 0xe6, 0x3f, 0x6b, 0xc0, 0x7e, 0x6d, 0xc5, 0xfb, 0xfd, 0x90, 0xfe, 0x8e, + 0x3e, 0x72, 0xc8, 0x9e, 0x8e, 0xf2, 0x0f, 0x09, 0x86, 0xe9, 0xc9, 0xec, 0x17, 0x12, 0xa8, 0xd1, + 0x64, 0xbf, 0x93, 0xf2, 0x4b, 0x12, 0x1c, 0xa0, 0x50, 0x9e, 0xa7, 0x4c, 0x21, 0xc5, 0x57, 0xac, + 0xa2, 0xfc, 0x39, 0xb2, 0x59, 0xb8, 0xea, 0xcc, 0x7e, 0xe0, 0xe4, 0x3e, 0xfe, 0x01, 0xa2, 0xa3, + 0x3e, 0x1e, 0xc2, 0xd4, 0x65, 0x65, 0xa4, 0xda, 0x80, 0x69, 0x87, 0x0e, 0x04, 0x13, 0xb7, 0x7d, + 0x20, 0xf8, 0x0c, 0xf4, 0xf9, 0xa2, 0xb9, 0x4c, 0x77, 0x7b, 0x5f, 0x63, 0x0b, 0x1f, 0xc9, 0xfb, + 0x69, 0xa0, 0x77, 0x4b, 0x70, 0xa0, 0x69, 0xf4, 0x9b, 0xe9, 0xd9, 0xf7, 0xc9, 0x7f, 0x48, 0x62, + 0x4d, 0xc9, 0xcb, 0xca, 0x68, 0xbd, 0x59, 0x6e, 0xe1, 0x59, 0x18, 0x08, 0x84, 0xac, 0x99, 0x5e, + 0xca, 0xc6, 0x3e, 0xbe, 0x3b, 0x12, 0xa4, 0x83, 0xb2, 0x90, 0xc4, 0x3b, 0xa6, 0x61, 0x39, 0xb8, + 0x4c, 0x2f, 0x68, 0x27, 0x15, 0xb7, 0x8c, 0x74, 0x38, 0xd8, 0xf4, 0xb5, 0x95, 0x9d, 0x49, 0xdd, + 0xe6, 0xb9, 0xc2, 0xa8, 0xd3, 0xcc, 0x4d, 0x7b, 0x2b, 0x1c, 0xe3, 0xaa, 0xdc, 0xe2, 0x89, 0x17, + 0xd0, 0xc3, 0x82, 0xc3, 0xd5, 0x56, 0xae, 0x8b, 0xbc, 0x04, 0xa8, 0x51, 0x55, 0xc3, 0xbf, 0x4f, + 0xe4, 0x59, 0x5f, 0x34, 0x0a, 0xdd, 0xfe, 0x5f, 0xf0, 0x61, 0x05, 0xef, 0x9c, 0xf6, 0x4d, 0xb0, + 0x6d, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x90, 0x82, 0xf1, 0x6d, 0xa8, 0x00, 0x00, +>>>>>>> Stashed changes } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index aa633333..99f64214 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -573,6 +573,7 @@ func (m *MsgRedeemTokensforShares) XXX_DiscardUnknown() { var xxx_messageInfo_MsgRedeemTokensforShares proto.InternalMessageInfo type MsgRedeemTokensforSharesResponse struct { + Amount types1.Coin `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount"` } func (m *MsgRedeemTokensforSharesResponse) Reset() { *m = MsgRedeemTokensforSharesResponse{} } @@ -608,6 +609,13 @@ func (m *MsgRedeemTokensforSharesResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgRedeemTokensforSharesResponse proto.InternalMessageInfo +func (m *MsgRedeemTokensforSharesResponse) GetAmount() types1.Coin { + if m != nil { + return m.Amount + } + return types1.Coin{} +} + type MsgTransferTokenizeShareRecord struct { TokenizeShareRecordId uint64 `protobuf:"varint,1,opt,name=tokenize_share_record_id,json=tokenizeShareRecordId,proto3" json:"tokenize_share_record_id,omitempty"` Sender string `protobuf:"bytes,2,opt,name=sender,proto3" json:"sender,omitempty"` @@ -707,78 +715,78 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/tx.proto", fileDescriptor_dc1f14f20335eae7) } var fileDescriptor_dc1f14f20335eae7 = []byte{ - // 1122 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0x3a, 0x69, 0x48, 0x27, 0x34, 0x7f, 0x36, 0x49, 0xe5, 0x6c, 0x53, 0x6f, 0xb4, 0x87, - 0x2a, 0xaa, 0xc8, 0x2e, 0x09, 0xa0, 0x40, 0x25, 0x14, 0xd5, 0x4d, 0x11, 0x11, 0x58, 0xa0, 0x4d, - 0x40, 0x82, 0x8b, 0xb5, 0xde, 0x1d, 0x6f, 0x07, 0xef, 0xee, 0xb8, 0x3b, 0xe3, 0x24, 0x46, 0x95, - 0x7a, 0xed, 0x8d, 0x1e, 0x11, 0xa7, 0x4a, 0x5c, 0xf8, 0x00, 0x7c, 0x02, 0x4e, 0x15, 0x07, 0xd4, - 0x23, 0x02, 0xc9, 0xa0, 0x44, 0x42, 0x3d, 0xfb, 0x13, 0xa0, 0x9d, 0x9d, 0x1d, 0xaf, 0xd7, 0x4e, - 0x6c, 0xa7, 0xcd, 0xa5, 0x27, 0xdb, 0x33, 0xef, 0xfd, 0xe6, 0xbd, 0xdf, 0xfb, 0xbd, 0x37, 0x63, - 0x50, 0x20, 0xd4, 0xaa, 0xa3, 0xc0, 0x35, 0x0e, 0x37, 0xab, 0x90, 0x5a, 0x9b, 0x06, 0x3d, 0xd6, - 0x1b, 0x21, 0xa6, 0x58, 0xbe, 0xe9, 0xa1, 0x87, 0x4d, 0xe4, 0xf0, 0x7d, 0x3d, 0xf9, 0xe4, 0x76, - 0xca, 0x8a, 0x8b, 0xb1, 0xeb, 0x41, 0x83, 0x19, 0x57, 0x9b, 0x35, 0xc3, 0x0a, 0x5a, 0xb1, 0xa7, - 0xa2, 0x66, 0xb7, 0x28, 0xf2, 0x21, 0xa1, 0x96, 0xdf, 0xe0, 0x06, 0x4b, 0x2e, 0x76, 0x31, 0xfb, - 0x6a, 0x44, 0xdf, 0xf8, 0xea, 0x8a, 0x8d, 0x89, 0x8f, 0x49, 0x25, 0xde, 0x88, 0x7f, 0xf0, 0xad, - 0x62, 0xfc, 0xcb, 0xa8, 0x5a, 0x04, 0x8a, 0x48, 0x6d, 0x8c, 0x02, 0xbe, 0x7f, 0x33, 0x9b, 0x45, - 0x12, 0x2d, 0xdb, 0xd6, 0xfe, 0x9e, 0x04, 0x72, 0x99, 0xb8, 0xf7, 0x42, 0x68, 0x51, 0xf8, 0xb5, - 0xe5, 0x21, 0xc7, 0xa2, 0x38, 0x94, 0x4d, 0x30, 0xe3, 0x40, 0x62, 0x87, 0xa8, 0x41, 0x11, 0x0e, - 0x0a, 0xd2, 0x9a, 0xb4, 0x3e, 0xb3, 0x75, 0x5b, 0x3f, 0x37, 0x6f, 0x7d, 0xb7, 0xeb, 0x51, 0x9a, - 0x7c, 0xde, 0x56, 0x73, 0x66, 0x1a, 0x44, 0x3e, 0x00, 0xc0, 0xc6, 0xbe, 0x8f, 0x08, 0x89, 0x20, - 0xf3, 0x0c, 0x52, 0x1f, 0x02, 0x79, 0x4f, 0x38, 0x98, 0x16, 0x85, 0x84, 0xc3, 0xa6, 0x70, 0xe4, - 0x47, 0x60, 0xd1, 0x47, 0x41, 0x85, 0x40, 0xaf, 0x56, 0x71, 0xa0, 0x07, 0x5d, 0x8b, 0x45, 0x3c, - 0xb1, 0x26, 0xad, 0x5f, 0x2d, 0x7d, 0x1e, 0x99, 0xff, 0xd5, 0x56, 0x6f, 0xb9, 0x88, 0x3e, 0x68, - 0x56, 0x75, 0x1b, 0xfb, 0x9c, 0x3d, 0xfe, 0xb1, 0x41, 0x9c, 0xba, 0x41, 0x5b, 0x0d, 0x48, 0xf4, - 0xbd, 0x80, 0x76, 0xda, 0xaa, 0xd2, 0xb2, 0x7c, 0xef, 0x8e, 0x36, 0x00, 0x52, 0x33, 0x17, 0x7c, - 0x14, 0xec, 0x43, 0xaf, 0xb6, 0x2b, 0xd6, 0xe4, 0x3d, 0xb0, 0xc0, 0x2d, 0x70, 0x58, 0xb1, 0x1c, - 0x27, 0x84, 0x84, 0x14, 0x26, 0xd9, 0xd9, 0xab, 0x9d, 0xb6, 0x5a, 0x88, 0xd1, 0xfa, 0x4c, 0x34, - 0x73, 0x5e, 0xac, 0xdd, 0x8d, 0x97, 0x22, 0xa8, 0xc3, 0x84, 0x7f, 0x01, 0x75, 0x25, 0x0b, 0xd5, - 0x67, 0xa2, 0x99, 0xf3, 0x62, 0x2d, 0x81, 0xfa, 0x04, 0x4c, 0x35, 0x9a, 0xd5, 0x3a, 0x6c, 0x15, - 0xa6, 0x18, 0xcb, 0x4b, 0x7a, 0x2c, 0x3b, 0x3d, 0x91, 0x9d, 0x7e, 0x37, 0x68, 0x95, 0x0a, 0xbf, - 0xff, 0xba, 0xb1, 0xc4, 0xb5, 0x64, 0x87, 0xad, 0x06, 0xc5, 0xfa, 0x97, 0xcd, 0xea, 0x67, 0xb0, - 0x65, 0x72, 0x6f, 0xf9, 0x03, 0x70, 0xe5, 0xd0, 0xf2, 0x9a, 0xb0, 0xf0, 0x16, 0x83, 0x59, 0xd1, - 0xb9, 0x75, 0xa4, 0xb5, 0x54, 0x89, 0x50, 0x52, 0xee, 0xd8, 0xfa, 0xce, 0xf4, 0x93, 0x67, 0x6a, - 0xee, 0xe5, 0x33, 0x35, 0xa7, 0xad, 0x02, 0xa5, 0x5f, 0x5c, 0x26, 0x24, 0x0d, 0x1c, 0x10, 0xa8, - 0xfd, 0x34, 0x01, 0xe6, 0xcb, 0xc4, 0xbd, 0xef, 0x20, 0x7a, 0xb9, 0xca, 0xdb, 0x19, 0x44, 0x6d, - 0x9e, 0x51, 0x2b, 0x77, 0xda, 0xea, 0x6c, 0x4c, 0xed, 0x39, 0x84, 0xfa, 0x60, 0xae, 0x2b, 0xb9, - 0x4a, 0x68, 0x51, 0xc8, 0x05, 0xb6, 0x3b, 0xa2, 0xb8, 0x76, 0xa1, 0xdd, 0x69, 0xab, 0xd7, 0xe3, - 0x83, 0x32, 0x50, 0x9a, 0x39, 0x6b, 0xf7, 0xc8, 0x5c, 0x3e, 0x1e, 0xac, 0xe9, 0x58, 0x57, 0x9f, - 0x5e, 0xa2, 0x9e, 0x53, 0xa5, 0x53, 0x40, 0x21, 0x5b, 0x1b, 0x51, 0xb8, 0xff, 0x24, 0x30, 0x53, - 0x26, 0x2e, 0xf7, 0x83, 0x83, 0xbb, 0x40, 0x7a, 0x7d, 0x5d, 0x90, 0xbf, 0x50, 0x17, 0x6c, 0x83, - 0x29, 0xcb, 0xc7, 0xcd, 0x80, 0xb2, 0x5a, 0x8d, 0x20, 0x5f, 0x6e, 0x9e, 0x22, 0x61, 0x19, 0x2c, - 0xa6, 0xf2, 0x14, 0xf9, 0xff, 0x91, 0x67, 0x43, 0xb3, 0x04, 0x5d, 0x14, 0x98, 0xd0, 0xb9, 0x04, - 0x1a, 0x0e, 0xc0, 0x72, 0x37, 0x47, 0x12, 0xda, 0x19, 0x2a, 0xd6, 0x3a, 0x6d, 0x75, 0x35, 0x4b, - 0x45, 0xca, 0x4c, 0x33, 0x17, 0xc5, 0xfa, 0x7e, 0x68, 0x0f, 0x44, 0x75, 0x08, 0x15, 0xa8, 0x13, - 0x67, 0xa3, 0xa6, 0xcc, 0xd2, 0xa8, 0xbb, 0x84, 0xf6, 0xf3, 0x3c, 0x79, 0x51, 0x9e, 0xeb, 0x6c, - 0x4e, 0x64, 0xf8, 0x4c, 0xe8, 0x96, 0xcb, 0xac, 0xfb, 0x1a, 0x1e, 0x8c, 0x24, 0x5a, 0x89, 0x6e, - 0x4c, 0x3e, 0x16, 0x94, 0xbe, 0xb9, 0x76, 0x90, 0x5c, 0xa7, 0xa5, 0xe9, 0xe8, 0xa8, 0xa7, 0xff, - 0xa8, 0x12, 0xeb, 0x2e, 0xee, 0x1c, 0x6d, 0x6b, 0x2f, 0x25, 0x70, 0xad, 0x4c, 0xdc, 0xaf, 0x02, - 0xe7, 0x8d, 0xd7, 0x6f, 0x0d, 0x2c, 0xf7, 0x64, 0x7a, 0x59, 0x94, 0xfe, 0x96, 0x07, 0x0b, 0x65, - 0xe2, 0x1e, 0xe0, 0x3a, 0x0c, 0xd0, 0xf7, 0x70, 0xff, 0x81, 0x15, 0x42, 0xf2, 0x86, 0xd1, 0x1a, - 0x75, 0x0f, 0xe5, 0x09, 0x3a, 0x15, 0x12, 0xa5, 0x58, 0xc1, 0x47, 0x01, 0x0c, 0xf9, 0x5c, 0x4e, - 0x75, 0xcf, 0x40, 0x33, 0xcd, 0x5c, 0x14, 0xeb, 0x8c, 0xa0, 0x2f, 0xa2, 0xd5, 0x54, 0xb1, 0x0e, - 0xc0, 0x4a, 0x1f, 0x87, 0xa2, 0x60, 0xdd, 0xa8, 0xa5, 0xb1, 0xa2, 0xd6, 0x7e, 0x91, 0xd8, 0x20, - 0x8f, 0xda, 0x0a, 0xfa, 0x0c, 0x9c, 0xd4, 0x70, 0xf8, 0xfa, 0x2b, 0xd4, 0x0d, 0x30, 0x7f, 0x51, - 0xb5, 0x6a, 0x60, 0xed, 0xac, 0x48, 0xc5, 0xe8, 0xfd, 0x51, 0x02, 0xc5, 0x88, 0xa5, 0xd0, 0x0a, - 0x48, 0x0d, 0x86, 0x3d, 0x6c, 0x99, 0xd0, 0xc6, 0xa1, 0x23, 0x6f, 0x83, 0x42, 0x42, 0x34, 0xe7, - 0x3f, 0x64, 0x1b, 0x15, 0xe4, 0xb0, 0xdc, 0x26, 0x4d, 0x51, 0xc7, 0x94, 0xdb, 0x9e, 0x23, 0x5f, - 0x07, 0x53, 0x04, 0x06, 0x0e, 0x0c, 0x63, 0x65, 0x99, 0xfc, 0x97, 0x7c, 0x03, 0x5c, 0x0d, 0xe0, - 0x11, 0x2f, 0x36, 0x1b, 0x95, 0xe6, 0x74, 0x00, 0x8f, 0xb2, 0xf5, 0x5b, 0x07, 0xb7, 0xce, 0x8f, - 0x2c, 0x49, 0x62, 0xeb, 0x87, 0x69, 0x30, 0x51, 0x26, 0xae, 0xfc, 0x18, 0xcc, 0x65, 0x1f, 0xde, - 0x9b, 0x43, 0x5e, 0x3a, 0xfd, 0xcf, 0x29, 0xe5, 0xa3, 0xb1, 0x5d, 0x84, 0xaa, 0x5a, 0xe0, 0x5a, - 0xef, 0xeb, 0xcb, 0x18, 0x8e, 0xd5, 0xe3, 0xa0, 0x6c, 0x8f, 0xe9, 0x20, 0x8e, 0xfe, 0x0e, 0x4c, - 0x8b, 0xf7, 0xc3, 0xed, 0xe1, 0x20, 0x89, 0xad, 0xb2, 0x35, 0xba, 0xad, 0x38, 0xeb, 0x31, 0x98, - 0xcb, 0xde, 0xd5, 0x23, 0xf0, 0x9c, 0x71, 0x19, 0x85, 0xe7, 0xb3, 0x6e, 0xb0, 0x06, 0x00, 0xa9, - 0xeb, 0xe6, 0x9d, 0xe1, 0x40, 0x5d, 0x6b, 0xe5, 0xfd, 0x71, 0xac, 0xc5, 0x89, 0x8f, 0xc0, 0x6c, - 0x66, 0x1a, 0xbf, 0x3b, 0x1c, 0xa7, 0xd7, 0x43, 0xf9, 0x70, 0x5c, 0x0f, 0x71, 0xfa, 0x13, 0x09, - 0xbc, 0x9d, 0xee, 0x63, 0x79, 0x04, 0x99, 0x0c, 0xec, 0x7b, 0x65, 0xe7, 0x82, 0x8e, 0x22, 0x94, - 0x9f, 0x25, 0x70, 0xe3, 0xbc, 0x69, 0xf1, 0xf1, 0x08, 0x49, 0x9e, 0xed, 0xae, 0xdc, 0x7f, 0x25, - 0xf7, 0x24, 0xca, 0xd2, 0x37, 0xcf, 0x4f, 0x8a, 0xd2, 0x8b, 0x93, 0xa2, 0xf4, 0xef, 0x49, 0x51, - 0x7a, 0x7a, 0x5a, 0xcc, 0xbd, 0x38, 0x2d, 0xe6, 0xfe, 0x3c, 0x2d, 0xe6, 0xbe, 0xdd, 0x49, 0x3d, - 0xf5, 0xd1, 0x43, 0xaf, 0x19, 0xfd, 0x49, 0x40, 0x81, 0x6d, 0xc4, 0xc7, 0x22, 0xda, 0xda, 0xe0, - 0x47, 0x6e, 0xf8, 0xd8, 0x69, 0x7a, 0xd0, 0x38, 0x4e, 0xfe, 0xe1, 0xc7, 0xff, 0x03, 0xaa, 0x53, - 0xec, 0x26, 0x7f, 0xef, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc7, 0xd8, 0xe4, 0x99, 0xcf, 0x10, - 0x00, 0x00, + // 1126 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcf, 0x6e, 0xdb, 0xc6, + 0x13, 0x16, 0x65, 0xc7, 0x3f, 0x67, 0xfd, 0x8b, 0xff, 0xd0, 0x76, 0x20, 0x33, 0x8e, 0x68, 0xf0, + 0x10, 0x18, 0x41, 0x4d, 0xd6, 0x6e, 0x0b, 0xb7, 0x01, 0x0a, 0x23, 0x8a, 0x53, 0xd4, 0x68, 0x85, + 0x16, 0xb4, 0x5b, 0xa0, 0xed, 0x41, 0xa0, 0xc8, 0x15, 0xb3, 0x15, 0xc9, 0x55, 0xb8, 0x2b, 0xdb, + 0x2a, 0x02, 0xe4, 0x9a, 0x5b, 0x73, 0x2c, 0x7a, 0x0a, 0xd0, 0x4b, 0x1f, 0xa0, 0x4f, 0xd0, 0x53, + 0xd0, 0x43, 0x91, 0x63, 0xd1, 0x02, 0x6a, 0x61, 0x03, 0x45, 0xce, 0x7a, 0x82, 0x82, 0xcb, 0xe5, + 0x8a, 0xa2, 0x64, 0x4b, 0x72, 0xe2, 0x4b, 0x4e, 0x16, 0x77, 0x67, 0xbe, 0x99, 0xf9, 0xe6, 0xdb, + 0xe1, 0xd2, 0xa0, 0x40, 0xa8, 0x55, 0x47, 0x81, 0x6b, 0x1c, 0x6e, 0x56, 0x21, 0xb5, 0x36, 0x0d, + 0x7a, 0xac, 0x37, 0x42, 0x4c, 0xb1, 0x7c, 0xd3, 0x43, 0x0f, 0x9b, 0xc8, 0xe1, 0xfb, 0x7a, 0xf2, + 0x97, 0xdb, 0x29, 0x2b, 0x2e, 0xc6, 0xae, 0x07, 0x0d, 0x66, 0x5c, 0x6d, 0xd6, 0x0c, 0x2b, 0x68, + 0xc5, 0x9e, 0x8a, 0x9a, 0xdd, 0xa2, 0xc8, 0x87, 0x84, 0x5a, 0x7e, 0x83, 0x1b, 0x2c, 0xb9, 0xd8, + 0xc5, 0xec, 0xa7, 0x11, 0xfd, 0xe2, 0xab, 0x2b, 0x36, 0x26, 0x3e, 0x26, 0x95, 0x78, 0x23, 0x7e, + 0xe0, 0x5b, 0xc5, 0xf8, 0xc9, 0xa8, 0x5a, 0x04, 0x8a, 0x4c, 0x6d, 0x8c, 0x02, 0xbe, 0x7f, 0x33, + 0x5b, 0x45, 0x92, 0x2d, 0xdb, 0xd6, 0xfe, 0x9a, 0x04, 0x72, 0x99, 0xb8, 0xf7, 0x42, 0x68, 0x51, + 0xf8, 0xa5, 0xe5, 0x21, 0xc7, 0xa2, 0x38, 0x94, 0x4d, 0x30, 0xe3, 0x40, 0x62, 0x87, 0xa8, 0x41, + 0x11, 0x0e, 0x0a, 0xd2, 0x9a, 0xb4, 0x3e, 0xb3, 0x75, 0x5b, 0x3f, 0xb7, 0x6e, 0x7d, 0xb7, 0xeb, + 0x51, 0x9a, 0x7c, 0xde, 0x56, 0x73, 0x66, 0x1a, 0x44, 0x3e, 0x00, 0xc0, 0xc6, 0xbe, 0x8f, 0x08, + 0x89, 0x20, 0xf3, 0x0c, 0x52, 0x1f, 0x02, 0x79, 0x4f, 0x38, 0x98, 0x16, 0x85, 0x84, 0xc3, 0xa6, + 0x70, 0xe4, 0x47, 0x60, 0xd1, 0x47, 0x41, 0x85, 0x40, 0xaf, 0x56, 0x71, 0xa0, 0x07, 0x5d, 0x8b, + 0x65, 0x3c, 0xb1, 0x26, 0xad, 0x5f, 0x2d, 0x7d, 0x1a, 0x99, 0xff, 0xd9, 0x56, 0x6f, 0xb9, 0x88, + 0x3e, 0x68, 0x56, 0x75, 0x1b, 0xfb, 0x9c, 0x3d, 0xfe, 0x67, 0x83, 0x38, 0x75, 0x83, 0xb6, 0x1a, + 0x90, 0xe8, 0x7b, 0x01, 0xed, 0xb4, 0x55, 0xa5, 0x65, 0xf9, 0xde, 0x1d, 0x6d, 0x00, 0xa4, 0x66, + 0x2e, 0xf8, 0x28, 0xd8, 0x87, 0x5e, 0x6d, 0x57, 0xac, 0xc9, 0x7b, 0x60, 0x81, 0x5b, 0xe0, 0xb0, + 0x62, 0x39, 0x4e, 0x08, 0x09, 0x29, 0x4c, 0xb2, 0xd8, 0xab, 0x9d, 0xb6, 0x5a, 0x88, 0xd1, 0xfa, + 0x4c, 0x34, 0x73, 0x5e, 0xac, 0xdd, 0x8d, 0x97, 0x22, 0xa8, 0xc3, 0x84, 0x7f, 0x01, 0x75, 0x25, + 0x0b, 0xd5, 0x67, 0xa2, 0x99, 0xf3, 0x62, 0x2d, 0x81, 0xfa, 0x08, 0x4c, 0x35, 0x9a, 0xd5, 0x3a, + 0x6c, 0x15, 0xa6, 0x18, 0xcb, 0x4b, 0x7a, 0x2c, 0x3b, 0x3d, 0x91, 0x9d, 0x7e, 0x37, 0x68, 0x95, + 0x0a, 0xbf, 0xfd, 0xb2, 0xb1, 0xc4, 0xb5, 0x64, 0x87, 0xad, 0x06, 0xc5, 0xfa, 0xe7, 0xcd, 0xea, + 0x27, 0xb0, 0x65, 0x72, 0x6f, 0xf9, 0x3d, 0x70, 0xe5, 0xd0, 0xf2, 0x9a, 0xb0, 0xf0, 0x3f, 0x06, + 0xb3, 0xa2, 0x73, 0xeb, 0x48, 0x6b, 0xa9, 0x16, 0xa1, 0xa4, 0xdd, 0xb1, 0xf5, 0x9d, 0xe9, 0x27, + 0xcf, 0xd4, 0xdc, 0xcb, 0x67, 0x6a, 0x4e, 0x5b, 0x05, 0x4a, 0xbf, 0xb8, 0x4c, 0x48, 0x1a, 0x38, + 0x20, 0x50, 0xfb, 0x71, 0x02, 0xcc, 0x97, 0x89, 0x7b, 0xdf, 0x41, 0xf4, 0x72, 0x95, 0xb7, 0x33, + 0x88, 0xda, 0x3c, 0xa3, 0x56, 0xee, 0xb4, 0xd5, 0xd9, 0x98, 0xda, 0x73, 0x08, 0xf5, 0xc1, 0x5c, + 0x57, 0x72, 0x95, 0xd0, 0xa2, 0x90, 0x0b, 0x6c, 0x77, 0x44, 0x71, 0xed, 0x42, 0xbb, 0xd3, 0x56, + 0xaf, 0xc7, 0x81, 0x32, 0x50, 0x9a, 0x39, 0x6b, 0xf7, 0xc8, 0x5c, 0x3e, 0x1e, 0xac, 0xe9, 0x58, + 0x57, 0x1f, 0x5f, 0xa2, 0x9e, 0x53, 0xad, 0x53, 0x40, 0x21, 0xdb, 0x1b, 0xd1, 0xb8, 0x7f, 0x25, + 0x30, 0x53, 0x26, 0x2e, 0xf7, 0x83, 0x83, 0x4f, 0x81, 0xf4, 0xfa, 0x4e, 0x41, 0xfe, 0x42, 0xa7, + 0x60, 0x1b, 0x4c, 0x59, 0x3e, 0x6e, 0x06, 0x94, 0xf5, 0x6a, 0x04, 0xf9, 0x72, 0xf3, 0x14, 0x09, + 0xcb, 0x60, 0x31, 0x55, 0xa7, 0xa8, 0xff, 0xf7, 0x3c, 0x1b, 0x9a, 0x25, 0xe8, 0xa2, 0xc0, 0x84, + 0xce, 0x25, 0xd0, 0x70, 0x00, 0x96, 0xbb, 0x35, 0x92, 0xd0, 0xce, 0x50, 0xb1, 0xd6, 0x69, 0xab, + 0xab, 0x59, 0x2a, 0x52, 0x66, 0x9a, 0xb9, 0x28, 0xd6, 0xf7, 0x43, 0x7b, 0x20, 0xaa, 0x43, 0xa8, + 0x40, 0x9d, 0x38, 0x1b, 0x35, 0x65, 0x96, 0x46, 0xdd, 0x25, 0xb4, 0x9f, 0xe7, 0xc9, 0x8b, 0xf2, + 0x5c, 0x67, 0x73, 0x22, 0xc3, 0x67, 0x42, 0xb7, 0x5c, 0x66, 0xa7, 0xaf, 0xe1, 0xc1, 0x48, 0xa2, + 0x95, 0xe8, 0x8d, 0xc9, 0xc7, 0x82, 0xd2, 0x37, 0xd7, 0x0e, 0x92, 0xd7, 0x69, 0x69, 0x3a, 0x0a, + 0xf5, 0xf4, 0x6f, 0x55, 0x62, 0xa7, 0x8b, 0x3b, 0x47, 0xdb, 0xda, 0x4b, 0x09, 0x5c, 0x2b, 0x13, + 0xf7, 0x8b, 0xc0, 0x79, 0xe3, 0xf5, 0x5b, 0x03, 0xcb, 0x3d, 0x95, 0x5e, 0x16, 0xa5, 0xbf, 0xe6, + 0xc1, 0x42, 0x99, 0xb8, 0x07, 0xb8, 0x0e, 0x03, 0xf4, 0x1d, 0xdc, 0x7f, 0x60, 0x85, 0x90, 0xbc, + 0x61, 0xb4, 0x46, 0xa7, 0x87, 0xf2, 0x02, 0x9d, 0x0a, 0x89, 0x4a, 0xac, 0xe0, 0xa3, 0x00, 0x86, + 0x7c, 0x2e, 0xa7, 0x4e, 0xcf, 0x40, 0x33, 0xcd, 0x5c, 0x14, 0xeb, 0x8c, 0xa0, 0xcf, 0xa2, 0xd5, + 0x54, 0xb3, 0x0e, 0xc0, 0x4a, 0x1f, 0x87, 0xa2, 0x61, 0xdd, 0xac, 0xa5, 0xb1, 0xb2, 0xd6, 0x7e, + 0x96, 0xd8, 0x20, 0x8f, 0x8e, 0x15, 0xf4, 0x19, 0x38, 0xa9, 0xe1, 0xf0, 0xf5, 0x77, 0xa8, 0x9b, + 0x60, 0xfe, 0xa2, 0x6a, 0xfd, 0x06, 0xac, 0x9d, 0x95, 0xe9, 0xab, 0xf3, 0xf0, 0x83, 0x04, 0x8a, + 0x11, 0xbd, 0xa1, 0x15, 0x90, 0x1a, 0x0c, 0x7b, 0x68, 0x36, 0xa1, 0x8d, 0x43, 0x47, 0xde, 0x06, + 0x85, 0xa4, 0x43, 0xbc, 0x71, 0x21, 0xdb, 0xa8, 0x20, 0x87, 0x45, 0x9b, 0x34, 0x85, 0x00, 0x52, + 0x6e, 0x7b, 0x8e, 0x7c, 0x1d, 0x4c, 0x11, 0x18, 0x38, 0x30, 0x8c, 0x25, 0x69, 0xf2, 0x27, 0xf9, + 0x06, 0xb8, 0x1a, 0xc0, 0x23, 0xae, 0x12, 0x36, 0x63, 0xcd, 0xe9, 0x00, 0x1e, 0x65, 0x1b, 0xbf, + 0x0e, 0x6e, 0x9d, 0x9f, 0x59, 0x52, 0xfd, 0xd6, 0xf7, 0xd3, 0x60, 0xa2, 0x4c, 0x5c, 0xf9, 0x31, + 0x98, 0xcb, 0xde, 0xd8, 0x37, 0x87, 0x5c, 0x91, 0xfa, 0xef, 0x61, 0xca, 0x07, 0x63, 0xbb, 0x88, + 0x36, 0xb4, 0xc0, 0xb5, 0xde, 0x6b, 0x9b, 0x31, 0x1c, 0xab, 0xc7, 0x41, 0xd9, 0x1e, 0xd3, 0x41, + 0x84, 0xfe, 0x16, 0x4c, 0x8b, 0x8b, 0xc7, 0xed, 0xe1, 0x20, 0x89, 0xad, 0xb2, 0x35, 0xba, 0xad, + 0x88, 0xf5, 0x18, 0xcc, 0x65, 0x5f, 0xf2, 0x23, 0xf0, 0x9c, 0x71, 0x19, 0x85, 0xe7, 0xb3, 0x5e, + 0x7d, 0x0d, 0x00, 0x52, 0xef, 0xa9, 0xb7, 0x86, 0x03, 0x75, 0xad, 0x95, 0x77, 0xc7, 0xb1, 0x16, + 0x11, 0x1f, 0x81, 0xd9, 0xcc, 0x18, 0x7f, 0x7b, 0x38, 0x4e, 0xaf, 0x87, 0xf2, 0xfe, 0xb8, 0x1e, + 0x22, 0xfa, 0x13, 0x09, 0xfc, 0x3f, 0x3d, 0x00, 0xe4, 0x11, 0x64, 0x32, 0x70, 0x60, 0x28, 0x3b, + 0x17, 0x74, 0x14, 0xa9, 0xfc, 0x24, 0x81, 0x1b, 0xe7, 0x4d, 0x8b, 0x0f, 0x47, 0x28, 0xf2, 0x6c, + 0x77, 0xe5, 0xfe, 0x2b, 0xb9, 0x27, 0x59, 0x96, 0xbe, 0x7a, 0x7e, 0x52, 0x94, 0x5e, 0x9c, 0x14, + 0xa5, 0x7f, 0x4e, 0x8a, 0xd2, 0xd3, 0xd3, 0x62, 0xee, 0xc5, 0x69, 0x31, 0xf7, 0xc7, 0x69, 0x31, + 0xf7, 0xf5, 0x4e, 0xea, 0x1b, 0x01, 0x3d, 0xf4, 0x9a, 0xd1, 0xd7, 0x05, 0x0a, 0x6c, 0x23, 0x0e, + 0x8b, 0x68, 0x6b, 0x83, 0x87, 0xdc, 0xf0, 0xb1, 0xd3, 0xf4, 0xa0, 0x71, 0x9c, 0xfc, 0x6b, 0x20, + 0xfe, 0x80, 0xa8, 0x4e, 0xb1, 0x2b, 0xc0, 0x3b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x74, 0xa1, + 0xc9, 0x5c, 0x08, 0x11, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1718,6 +1726,16 @@ func (m *MsgRedeemTokensforSharesResponse) MarshalToSizedBuffer(dAtA []byte) (in _ = i var l int _ = l + { + size, err := m.Amount.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -2014,6 +2032,8 @@ func (m *MsgRedeemTokensforSharesResponse) Size() (n int) { } var l int _ = l + l = m.Amount.Size() + n += 1 + l + sovTx(uint64(l)) return n } @@ -3756,6 +3776,39 @@ func (m *MsgRedeemTokensforSharesResponse) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: MsgRedeemTokensforSharesResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", 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 err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) From 5072c4e250f76163c36070f954b44909f3fa3c64 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Sat, 21 May 2022 03:41:06 +1000 Subject: [PATCH 24/57] conflict fix --- x/staking/keeper/msg_server.go | 4 - x/staking/types/staking.pb.go | 656 --------------------------------- 2 files changed, 660 deletions(-) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 7fe1c66f..a8e7a6bd 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -608,7 +608,6 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken return nil, err } -<<<<<<< Updated upstream ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeRedeemShares, @@ -618,12 +617,9 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken ), ) - return &types.MsgRedeemTokensforSharesResponse{}, nil -======= return &types.MsgRedeemTokensforSharesResponse{ Amount: returnCoin, }, nil ->>>>>>> Stashed changes } func (k msgServer) TransferTokenizeShareRecord(goCtx context.Context, msg *types.MsgTransferTokenizeShareRecord) (*types.MsgTransferTokenizeShareRecordResponse, error) { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 430b4c37..0b339437 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1335,661 +1335,6 @@ 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{ -<<<<<<< Updated upstream - // 10431 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, - 0x75, 0x18, 0x8e, 0xd9, 0x5d, 0x00, 0xbb, 0x0f, 0x5f, 0x8b, 0x06, 0xee, 0x6e, 0x6f, 0xef, 0x0e, - 0x00, 0x87, 0xe4, 0xdd, 0xf1, 0xc8, 0x03, 0xc8, 0x23, 0xef, 0x83, 0x38, 0x91, 0xa7, 0x5d, 0x60, - 0x0f, 0x07, 0x12, 0x5f, 0x1c, 0x00, 0x47, 0x8a, 0xfe, 0xa9, 0xf6, 0x37, 0xd8, 0x6d, 0x2c, 0x86, - 0xd8, 0x9d, 0x19, 0xce, 0xcc, 0xde, 0x01, 0x27, 0xa9, 0x4c, 0x4b, 0xb6, 0x4c, 0xd3, 0x51, 0xf4, - 0x61, 0x97, 0x2d, 0x53, 0x3a, 0x45, 0xb2, 0x94, 0x48, 0x61, 0xec, 0x58, 0x96, 0x64, 0x25, 0x8e, - 0xf3, 0x87, 0xe4, 0x2a, 0x27, 0xb2, 0xaa, 0x62, 0x4b, 0x4e, 0x25, 0x52, 0x9c, 0xe4, 0x24, 0x53, - 0x8a, 0xa2, 0x28, 0x4a, 0xac, 0x30, 0x52, 0xc5, 0x55, 0xaa, 0x54, 0x52, 0xfd, 0x35, 0x5f, 0xbb, - 0x8b, 0xd9, 0x05, 0xef, 0x28, 0xd9, 0xce, 0x5f, 0x40, 0x77, 0xbf, 0xf7, 0xfa, 0xf5, 0xeb, 0xd7, - 0xaf, 0xdf, 0x7b, 0xdd, 0x3d, 0x0b, 0x1f, 0xba, 0x08, 0x13, 0x15, 0xc3, 0xa8, 0x54, 0xf1, 0x94, - 0x69, 0x19, 0x8e, 0xb1, 0x51, 0xdf, 0x9c, 0x2a, 0x63, 0xbb, 0x64, 0x69, 0xa6, 0x63, 0x58, 0x93, - 0xb4, 0x0e, 0x0d, 0x31, 0x88, 0x49, 0x01, 0x21, 0x2f, 0xc2, 0xf0, 0x65, 0xad, 0x8a, 0x67, 0x5d, - 0xc0, 0x55, 0xec, 0xa0, 0x0b, 0x90, 0xd8, 0xd4, 0xaa, 0x38, 0x23, 0x4d, 0xc4, 0x4f, 0xf6, 0x9d, - 0xb9, 0x67, 0x32, 0x84, 0x34, 0x19, 0xc4, 0x58, 0x21, 0xd5, 0x0a, 0xc5, 0x90, 0xbf, 0x9d, 0x80, - 0x91, 0x26, 0xad, 0x08, 0x41, 0x42, 0x57, 0x6b, 0x84, 0xa2, 0x74, 0x32, 0xa5, 0xd0, 0xff, 0x51, - 0x06, 0x7a, 0x4d, 0xb5, 0xb4, 0xad, 0x56, 0x70, 0x26, 0x46, 0xab, 0x45, 0x11, 0x8d, 0x01, 0x94, - 0xb1, 0x89, 0xf5, 0x32, 0xd6, 0x4b, 0xbb, 0x99, 0xf8, 0x44, 0xfc, 0x64, 0x4a, 0xf1, 0xd5, 0xa0, - 0xfb, 0x61, 0xd8, 0xac, 0x6f, 0x54, 0xb5, 0x52, 0xd1, 0x07, 0x06, 0x13, 0xf1, 0x93, 0xdd, 0x4a, - 0x9a, 0x35, 0xcc, 0x7a, 0xc0, 0x27, 0x60, 0xe8, 0x3a, 0x56, 0xb7, 0xfd, 0xa0, 0x7d, 0x14, 0x74, - 0x90, 0x54, 0xfb, 0x00, 0x67, 0xa0, 0xbf, 0x86, 0x6d, 0x5b, 0xad, 0xe0, 0xa2, 0xb3, 0x6b, 0xe2, - 0x4c, 0x82, 0x8e, 0x7e, 0xa2, 0x61, 0xf4, 0xe1, 0x91, 0xf7, 0x71, 0xac, 0xb5, 0x5d, 0x13, 0xa3, - 0x1c, 0xa4, 0xb0, 0x5e, 0xaf, 0x31, 0x0a, 0xdd, 0x2d, 0xe4, 0x57, 0xd0, 0xeb, 0xb5, 0x30, 0x95, - 0x24, 0x41, 0xe3, 0x24, 0x7a, 0x6d, 0x6c, 0x5d, 0xd3, 0x4a, 0x38, 0xd3, 0x43, 0x09, 0x9c, 0x68, - 0x20, 0xb0, 0xca, 0xda, 0xc3, 0x34, 0x04, 0x1e, 0x9a, 0x81, 0x14, 0xde, 0x71, 0xb0, 0x6e, 0x6b, - 0x86, 0x9e, 0xe9, 0xa5, 0x44, 0xee, 0x6d, 0x32, 0x8b, 0xb8, 0x5a, 0x0e, 0x93, 0xf0, 0xf0, 0xd0, - 0x39, 0xe8, 0x35, 0x4c, 0x47, 0x33, 0x74, 0x3b, 0x93, 0x9c, 0x90, 0x4e, 0xf6, 0x9d, 0x39, 0xda, - 0x54, 0x11, 0x96, 0x19, 0x8c, 0x22, 0x80, 0xd1, 0x3c, 0xa4, 0x6d, 0xa3, 0x6e, 0x95, 0x70, 0xb1, - 0x64, 0x94, 0x71, 0x51, 0xd3, 0x37, 0x8d, 0x4c, 0x8a, 0x12, 0x18, 0x6f, 0x1c, 0x08, 0x05, 0x9c, - 0x31, 0xca, 0x78, 0x5e, 0xdf, 0x34, 0x94, 0x41, 0x3b, 0x50, 0x46, 0x07, 0xa1, 0xc7, 0xde, 0xd5, - 0x1d, 0x75, 0x27, 0xd3, 0x4f, 0x35, 0x84, 0x97, 0xe4, 0xdf, 0xef, 0x81, 0xa1, 0x76, 0x54, 0xec, - 0x22, 0x74, 0x6f, 0x92, 0x51, 0x66, 0x62, 0x9d, 0xc8, 0x80, 0xe1, 0x04, 0x85, 0xd8, 0xb3, 0x4f, - 0x21, 0xe6, 0xa0, 0x4f, 0xc7, 0xb6, 0x83, 0xcb, 0x4c, 0x23, 0xe2, 0x6d, 0xea, 0x14, 0x30, 0xa4, - 0x46, 0x95, 0x4a, 0xec, 0x4b, 0xa5, 0x9e, 0x81, 0x21, 0x97, 0xa5, 0xa2, 0xa5, 0xea, 0x15, 0xa1, - 0x9b, 0x53, 0x51, 0x9c, 0x4c, 0x16, 0x04, 0x9e, 0x42, 0xd0, 0x94, 0x41, 0x1c, 0x28, 0xa3, 0x59, - 0x00, 0x43, 0xc7, 0xc6, 0x66, 0xb1, 0x8c, 0x4b, 0xd5, 0x4c, 0xb2, 0x85, 0x94, 0x96, 0x09, 0x48, - 0x83, 0x94, 0x0c, 0x56, 0x5b, 0xaa, 0xa2, 0x47, 0x3d, 0x55, 0xeb, 0x6d, 0xa1, 0x29, 0x8b, 0x6c, - 0x91, 0x35, 0x68, 0xdb, 0x3a, 0x0c, 0x5a, 0x98, 0xe8, 0x3d, 0x2e, 0xf3, 0x91, 0xa5, 0x28, 0x13, - 0x93, 0x91, 0x23, 0x53, 0x38, 0x1a, 0x1b, 0xd8, 0x80, 0xe5, 0x2f, 0xa2, 0xbb, 0xc1, 0xad, 0x28, - 0x52, 0xb5, 0x02, 0x6a, 0x85, 0xfa, 0x45, 0xe5, 0x92, 0x5a, 0xc3, 0xd9, 0x1b, 0x30, 0x18, 0x14, - 0x0f, 0x1a, 0x85, 0x6e, 0xdb, 0x51, 0x2d, 0x87, 0x6a, 0x61, 0xb7, 0xc2, 0x0a, 0x28, 0x0d, 0x71, - 0xac, 0x97, 0xa9, 0x95, 0xeb, 0x56, 0xc8, 0xbf, 0xe8, 0xcd, 0xde, 0x80, 0xe3, 0x74, 0xc0, 0xc7, - 0x1b, 0x67, 0x34, 0x40, 0x39, 0x3c, 0xee, 0xec, 0x79, 0x18, 0x08, 0x0c, 0xa0, 0xdd, 0xae, 0xe5, - 0xb7, 0xc3, 0x81, 0xa6, 0xa4, 0xd1, 0x33, 0x30, 0x5a, 0xd7, 0x35, 0xdd, 0xc1, 0x96, 0x69, 0x61, - 0xa2, 0xb1, 0xac, 0xab, 0xcc, 0x7f, 0xee, 0x6d, 0xa1, 0x73, 0xeb, 0x7e, 0x68, 0x46, 0x45, 0x19, - 0xa9, 0x37, 0x56, 0x9e, 0x4a, 0x25, 0xbf, 0xdb, 0x9b, 0x7e, 0xe1, 0x85, 0x17, 0x5e, 0x88, 0xc9, - 0x1f, 0xec, 0x81, 0xd1, 0x66, 0x6b, 0xa6, 0xe9, 0xf2, 0x3d, 0x08, 0x3d, 0x7a, 0xbd, 0xb6, 0x81, - 0x2d, 0x2a, 0xa4, 0x6e, 0x85, 0x97, 0x50, 0x0e, 0xba, 0xab, 0xea, 0x06, 0xae, 0x66, 0x12, 0x13, - 0xd2, 0xc9, 0xc1, 0x33, 0xf7, 0xb7, 0xb5, 0x2a, 0x27, 0x17, 0x08, 0x8a, 0xc2, 0x30, 0xd1, 0xe3, - 0x90, 0xe0, 0x26, 0x9a, 0x50, 0x38, 0xd5, 0x1e, 0x05, 0xb2, 0x96, 0x14, 0x8a, 0x87, 0x8e, 0x40, - 0x8a, 0xfc, 0x65, 0xba, 0xd1, 0x43, 0x79, 0x4e, 0x92, 0x0a, 0xa2, 0x17, 0x28, 0x0b, 0x49, 0xba, - 0x4c, 0xca, 0x58, 0x6c, 0x6d, 0x6e, 0x99, 0x28, 0x56, 0x19, 0x6f, 0xaa, 0xf5, 0xaa, 0x53, 0xbc, - 0xa6, 0x56, 0xeb, 0x98, 0x2a, 0x7c, 0x4a, 0xe9, 0xe7, 0x95, 0x57, 0x49, 0x1d, 0x1a, 0x87, 0x3e, - 0xb6, 0xaa, 0x34, 0xbd, 0x8c, 0x77, 0xa8, 0xf5, 0xec, 0x56, 0xd8, 0x42, 0x9b, 0x27, 0x35, 0xa4, - 0xfb, 0xe7, 0x6c, 0x43, 0x17, 0xaa, 0x49, 0xbb, 0x20, 0x15, 0xb4, 0xfb, 0xf3, 0x61, 0xc3, 0x7d, - 0xac, 0xf9, 0xf0, 0xc2, 0x3a, 0x25, 0x7f, 0x3e, 0x06, 0x09, 0x6a, 0x2f, 0x86, 0xa0, 0x6f, 0xed, - 0x2d, 0x2b, 0x85, 0xe2, 0xec, 0xf2, 0x7a, 0x7e, 0xa1, 0x90, 0x96, 0xd0, 0x20, 0x00, 0xad, 0xb8, - 0xbc, 0xb0, 0x9c, 0x5b, 0x4b, 0xc7, 0xdc, 0xf2, 0xfc, 0xd2, 0xda, 0xb9, 0x47, 0xd2, 0x71, 0x17, - 0x61, 0x9d, 0x55, 0x24, 0xfc, 0x00, 0x0f, 0x9f, 0x49, 0x77, 0xa3, 0x34, 0xf4, 0x33, 0x02, 0xf3, - 0xcf, 0x14, 0x66, 0xcf, 0x3d, 0x92, 0xee, 0x09, 0xd6, 0x3c, 0x7c, 0x26, 0xdd, 0x8b, 0x06, 0x20, - 0x45, 0x6b, 0xf2, 0xcb, 0xcb, 0x0b, 0xe9, 0xa4, 0x4b, 0x73, 0x75, 0x4d, 0x99, 0x5f, 0x9a, 0x4b, - 0xa7, 0x5c, 0x9a, 0x73, 0xca, 0xf2, 0xfa, 0x4a, 0x1a, 0x5c, 0x0a, 0x8b, 0x85, 0xd5, 0xd5, 0xdc, - 0x5c, 0x21, 0xdd, 0xe7, 0x42, 0xe4, 0xdf, 0xb2, 0x56, 0x58, 0x4d, 0xf7, 0x07, 0xd8, 0x7a, 0xf8, - 0x4c, 0x7a, 0xc0, 0xed, 0xa2, 0xb0, 0xb4, 0xbe, 0x98, 0x1e, 0x44, 0xc3, 0x30, 0xc0, 0xba, 0x10, - 0x4c, 0x0c, 0x85, 0xaa, 0xce, 0x3d, 0x92, 0x4e, 0x7b, 0x8c, 0x30, 0x2a, 0xc3, 0x81, 0x8a, 0x73, - 0x8f, 0xa4, 0x91, 0x3c, 0x03, 0xdd, 0x54, 0xbb, 0x10, 0x82, 0xc1, 0x85, 0x5c, 0xbe, 0xb0, 0x50, - 0x5c, 0x5e, 0x59, 0x9b, 0x5f, 0x5e, 0xca, 0x2d, 0xa4, 0x25, 0xaf, 0x4e, 0x29, 0x3c, 0xb5, 0x3e, - 0xaf, 0x14, 0x66, 0xd3, 0x31, 0x7f, 0xdd, 0x4a, 0x21, 0xb7, 0x56, 0x98, 0x4d, 0xc7, 0xe5, 0x12, - 0x8c, 0x36, 0xb3, 0x93, 0x4d, 0x57, 0x86, 0x6f, 0x8a, 0x63, 0x2d, 0xa6, 0x98, 0xd2, 0x6a, 0x98, - 0xe2, 0x6f, 0xc5, 0x60, 0xa4, 0xc9, 0x5e, 0xd1, 0xb4, 0x93, 0x4b, 0xd0, 0xcd, 0x54, 0x94, 0xed, - 0x9e, 0xf7, 0x35, 0xdd, 0x74, 0xa8, 0xc2, 0x36, 0xec, 0xa0, 0x14, 0xcf, 0xef, 0x41, 0xc4, 0x5b, - 0x78, 0x10, 0x84, 0x44, 0x83, 0x4d, 0x7f, 0x6b, 0x83, 0x4d, 0x67, 0xdb, 0xde, 0xb9, 0x76, 0xb6, - 0x3d, 0x5a, 0xd7, 0x99, 0x6d, 0xef, 0x6e, 0x62, 0xdb, 0x2f, 0xc2, 0x70, 0x03, 0xa1, 0xb6, 0x6d, - 0xec, 0xbb, 0x24, 0xc8, 0xb4, 0x12, 0x4e, 0x84, 0xa5, 0x8b, 0x05, 0x2c, 0xdd, 0xc5, 0xb0, 0x04, - 0xef, 0x6a, 0x3d, 0x09, 0x0d, 0x73, 0xfd, 0x49, 0x09, 0x0e, 0x36, 0xf7, 0x14, 0x9b, 0xf2, 0xf0, - 0x38, 0xf4, 0xd4, 0xb0, 0xb3, 0x65, 0x08, 0x6f, 0xe9, 0x78, 0x93, 0x3d, 0x98, 0x34, 0x87, 0x27, - 0x9b, 0x63, 0xf9, 0x37, 0xf1, 0x78, 0x2b, 0x77, 0x8f, 0x71, 0xd3, 0xc0, 0xe9, 0x2f, 0xc5, 0xe0, - 0x40, 0x53, 0xe2, 0x4d, 0x19, 0x3d, 0x06, 0xa0, 0xe9, 0x66, 0xdd, 0x61, 0x1e, 0x11, 0x33, 0xb0, - 0x29, 0x5a, 0x43, 0x8d, 0x17, 0x31, 0x9e, 0x75, 0xc7, 0x6d, 0x8f, 0xd3, 0x76, 0x60, 0x55, 0x14, - 0xe0, 0x82, 0xc7, 0x68, 0x82, 0x32, 0x3a, 0xd6, 0x62, 0xa4, 0x0d, 0x8a, 0xf9, 0x20, 0xa4, 0x4b, - 0x55, 0x0d, 0xeb, 0x4e, 0xd1, 0x76, 0x2c, 0xac, 0xd6, 0x34, 0xbd, 0x42, 0x77, 0x90, 0xe4, 0x74, - 0xf7, 0xa6, 0x5a, 0xb5, 0xb1, 0x32, 0xc4, 0x9a, 0x57, 0x45, 0x2b, 0xc1, 0xa0, 0x0a, 0x64, 0xf9, - 0x30, 0x7a, 0x02, 0x18, 0xac, 0xd9, 0xc5, 0x90, 0x3f, 0x90, 0x82, 0x3e, 0x9f, 0x5f, 0x8d, 0xee, - 0x82, 0xfe, 0xe7, 0xd4, 0x6b, 0x6a, 0x51, 0xc4, 0x4a, 0x4c, 0x12, 0x7d, 0xa4, 0x6e, 0x85, 0xc7, - 0x4b, 0x0f, 0xc2, 0x28, 0x05, 0x31, 0xea, 0x0e, 0xb6, 0x8a, 0xa5, 0xaa, 0x6a, 0xdb, 0x54, 0x68, - 0x49, 0x0a, 0x8a, 0x48, 0xdb, 0x32, 0x69, 0x9a, 0x11, 0x2d, 0xe8, 0x2c, 0x8c, 0x50, 0x8c, 0x5a, - 0xbd, 0xea, 0x68, 0x66, 0x15, 0x17, 0x49, 0xf4, 0x66, 0xd3, 0x9d, 0xc4, 0xe5, 0x6c, 0x98, 0x40, - 0x2c, 0x72, 0x00, 0xc2, 0x91, 0x8d, 0x66, 0xe1, 0x18, 0x45, 0xab, 0x60, 0x1d, 0x5b, 0xaa, 0x83, - 0x8b, 0xf8, 0xf9, 0xba, 0x5a, 0xb5, 0x8b, 0xaa, 0x5e, 0x2e, 0x6e, 0xa9, 0xf6, 0x56, 0x66, 0x94, - 0x10, 0xc8, 0xc7, 0x32, 0x92, 0x72, 0x98, 0x00, 0xce, 0x71, 0xb8, 0x02, 0x05, 0xcb, 0xe9, 0xe5, - 0x2b, 0xaa, 0xbd, 0x85, 0xa6, 0xe1, 0x20, 0xa5, 0x62, 0x3b, 0x96, 0xa6, 0x57, 0x8a, 0xa5, 0x2d, - 0x5c, 0xda, 0x2e, 0xd6, 0x9d, 0xcd, 0x0b, 0x99, 0x23, 0xfe, 0xfe, 0x29, 0x87, 0xab, 0x14, 0x66, - 0x86, 0x80, 0xac, 0x3b, 0x9b, 0x17, 0xd0, 0x2a, 0xf4, 0x93, 0xc9, 0xa8, 0x69, 0x37, 0x70, 0x71, - 0xd3, 0xb0, 0xe8, 0xd6, 0x38, 0xd8, 0xc4, 0x34, 0xf9, 0x24, 0x38, 0xb9, 0xcc, 0x11, 0x16, 0x8d, - 0x32, 0x9e, 0xee, 0x5e, 0x5d, 0x29, 0x14, 0x66, 0x95, 0x3e, 0x41, 0xe5, 0xb2, 0x61, 0x11, 0x85, - 0xaa, 0x18, 0xae, 0x80, 0xfb, 0x98, 0x42, 0x55, 0x0c, 0x21, 0xde, 0xb3, 0x30, 0x52, 0x2a, 0xb1, - 0x31, 0x6b, 0xa5, 0x22, 0x8f, 0xb1, 0xec, 0x4c, 0x3a, 0x20, 0xac, 0x52, 0x69, 0x8e, 0x01, 0x70, - 0x1d, 0xb7, 0xd1, 0xa3, 0x70, 0xc0, 0x13, 0x96, 0x1f, 0x71, 0xb8, 0x61, 0x94, 0x61, 0xd4, 0xb3, - 0x30, 0x62, 0xee, 0x36, 0x22, 0xa2, 0x40, 0x8f, 0xe6, 0x6e, 0x18, 0xed, 0x3c, 0x8c, 0x9a, 0x5b, - 0x66, 0x23, 0xde, 0x29, 0x3f, 0x1e, 0x32, 0xb7, 0xcc, 0x30, 0xe2, 0xbd, 0x34, 0xe0, 0xb6, 0x70, - 0x49, 0x75, 0x70, 0x39, 0x73, 0xc8, 0x0f, 0xee, 0x6b, 0x40, 0x53, 0x90, 0x2e, 0x95, 0x8a, 0x58, - 0x57, 0x37, 0xaa, 0xb8, 0xa8, 0x5a, 0x58, 0x57, 0xed, 0xcc, 0xb8, 0x1f, 0x78, 0xb0, 0x54, 0x2a, - 0xd0, 0xd6, 0x1c, 0x6d, 0x44, 0xa7, 0x60, 0xd8, 0xd8, 0x78, 0xae, 0xc4, 0x54, 0xb2, 0x68, 0x5a, - 0x78, 0x53, 0xdb, 0xc9, 0xdc, 0x43, 0xe5, 0x3b, 0x44, 0x1a, 0xa8, 0x42, 0xae, 0xd0, 0x6a, 0x74, - 0x1f, 0xa4, 0x4b, 0xf6, 0x96, 0x6a, 0x99, 0xd4, 0x26, 0xdb, 0xa6, 0x5a, 0xc2, 0x99, 0x7b, 0x19, - 0x28, 0xab, 0x5f, 0x12, 0xd5, 0x64, 0x49, 0xd8, 0xd7, 0xb5, 0x4d, 0x47, 0x50, 0x3c, 0xc1, 0x96, - 0x04, 0xad, 0xe3, 0xd4, 0x4e, 0x42, 0x9a, 0x88, 0x22, 0xd0, 0xf1, 0x49, 0x0a, 0x36, 0x68, 0x6e, - 0x99, 0xfe, 0x7e, 0xef, 0x86, 0x01, 0x02, 0xe9, 0x75, 0x7a, 0x1f, 0x73, 0xc8, 0xcc, 0x2d, 0x5f, - 0x8f, 0x8f, 0xc0, 0x41, 0x02, 0x54, 0xc3, 0x8e, 0x5a, 0x56, 0x1d, 0xd5, 0x07, 0xfd, 0x00, 0x85, - 0x26, 0x72, 0x5f, 0xe4, 0x8d, 0x01, 0x3e, 0xad, 0xfa, 0xc6, 0xae, 0xab, 0x59, 0xa7, 0x19, 0x9f, - 0xa4, 0x4e, 0xe8, 0xd6, 0x1d, 0x73, 0xba, 0xe5, 0x69, 0xe8, 0xf7, 0x2b, 0x3e, 0x4a, 0x01, 0x53, - 0xfd, 0xb4, 0x44, 0xbc, 0xa0, 0x99, 0xe5, 0x59, 0xe2, 0xbf, 0x3c, 0x5b, 0x48, 0xc7, 0x88, 0x1f, - 0xb5, 0x30, 0xbf, 0x56, 0x28, 0x2a, 0xeb, 0x4b, 0x6b, 0xf3, 0x8b, 0x85, 0x74, 0xdc, 0xe7, 0xb0, - 0x3f, 0x91, 0x48, 0x1e, 0x4f, 0x9f, 0x90, 0xbf, 0x1a, 0x83, 0xc1, 0x60, 0x04, 0x86, 0xde, 0x04, - 0x87, 0x44, 0xba, 0xc4, 0xc6, 0x4e, 0xf1, 0xba, 0x66, 0xd1, 0x15, 0x59, 0x53, 0xd9, 0xee, 0xe8, - 0xea, 0xc4, 0x28, 0x87, 0x5a, 0xc5, 0xce, 0xd3, 0x9a, 0x45, 0xd6, 0x5b, 0x4d, 0x75, 0xd0, 0x02, - 0x8c, 0xeb, 0x46, 0xd1, 0x76, 0x54, 0xbd, 0xac, 0x5a, 0xe5, 0xa2, 0x97, 0xa8, 0x2a, 0xaa, 0xa5, - 0x12, 0xb6, 0x6d, 0x83, 0xed, 0x84, 0x2e, 0x95, 0xa3, 0xba, 0xb1, 0xca, 0x81, 0xbd, 0x2d, 0x22, - 0xc7, 0x41, 0x43, 0xfa, 0x1b, 0x6f, 0xa5, 0xbf, 0x47, 0x20, 0x55, 0x53, 0xcd, 0x22, 0xd6, 0x1d, - 0x6b, 0x97, 0xfa, 0xdd, 0x49, 0x25, 0x59, 0x53, 0xcd, 0x02, 0x29, 0xbf, 0x21, 0xe1, 0xcf, 0x13, - 0x89, 0x64, 0x32, 0x9d, 0x7a, 0x22, 0x91, 0x4c, 0xa5, 0x41, 0x7e, 0x35, 0x0e, 0xfd, 0x7e, 0x3f, - 0x9c, 0x84, 0x35, 0x25, 0xba, 0x65, 0x49, 0xd4, 0xa8, 0xdd, 0xbd, 0xa7, 0xd7, 0x3e, 0x39, 0x43, - 0xf6, 0xb2, 0xe9, 0x1e, 0xe6, 0x1d, 0x2b, 0x0c, 0x93, 0xf8, 0x11, 0x44, 0xd9, 0x30, 0xf3, 0x46, - 0x92, 0x0a, 0x2f, 0xa1, 0x39, 0xe8, 0x79, 0xce, 0xa6, 0xb4, 0x7b, 0x28, 0xed, 0x7b, 0xf6, 0xa6, - 0xfd, 0xc4, 0x2a, 0x25, 0x9e, 0x7a, 0x62, 0xb5, 0xb8, 0xb4, 0xac, 0x2c, 0xe6, 0x16, 0x14, 0x8e, - 0x8e, 0x0e, 0x43, 0xa2, 0xaa, 0xde, 0xd8, 0x0d, 0xee, 0x7a, 0xb4, 0xaa, 0xdd, 0x49, 0x38, 0x0c, - 0x89, 0xeb, 0x58, 0xdd, 0x0e, 0xee, 0x35, 0xb4, 0xea, 0x0e, 0x2e, 0x86, 0x29, 0xe8, 0xa6, 0xf2, - 0x42, 0x00, 0x5c, 0x62, 0xe9, 0x2e, 0x94, 0x84, 0xc4, 0xcc, 0xb2, 0x42, 0x16, 0x44, 0x1a, 0xfa, - 0x59, 0x6d, 0x71, 0x65, 0xbe, 0x30, 0x53, 0x48, 0xc7, 0xe4, 0xb3, 0xd0, 0xc3, 0x84, 0x40, 0x16, - 0x8b, 0x2b, 0x86, 0x74, 0x17, 0x2f, 0x72, 0x1a, 0x92, 0x68, 0x5d, 0x5f, 0xcc, 0x17, 0x94, 0x74, - 0x2c, 0x38, 0xd5, 0x89, 0x74, 0xb7, 0x6c, 0x43, 0xbf, 0xdf, 0x11, 0x7f, 0x63, 0x82, 0xec, 0x2f, - 0x48, 0xd0, 0xe7, 0x73, 0xac, 0x89, 0x47, 0xa4, 0x56, 0xab, 0xc6, 0xf5, 0xa2, 0x5a, 0xd5, 0x54, - 0x9b, 0xab, 0x06, 0xd0, 0xaa, 0x1c, 0xa9, 0x69, 0x77, 0xea, 0xde, 0xa0, 0x25, 0xd2, 0x9d, 0xee, - 0x91, 0x3f, 0x22, 0x41, 0x3a, 0xec, 0xd9, 0x86, 0xd8, 0x94, 0x7e, 0x92, 0x6c, 0xca, 0x1f, 0x96, - 0x60, 0x30, 0xe8, 0xce, 0x86, 0xd8, 0xbb, 0xeb, 0x27, 0xca, 0xde, 0x37, 0x63, 0x30, 0x10, 0x70, - 0x62, 0xdb, 0xe5, 0xee, 0x79, 0x18, 0xd6, 0xca, 0xb8, 0x66, 0x1a, 0x0e, 0xd6, 0x4b, 0xbb, 0xc5, - 0x2a, 0xbe, 0x86, 0xab, 0x19, 0x99, 0x1a, 0x8d, 0xa9, 0xbd, 0xdd, 0xe4, 0xc9, 0x79, 0x0f, 0x6f, - 0x81, 0xa0, 0x4d, 0x8f, 0xcc, 0xcf, 0x16, 0x16, 0x57, 0x96, 0xd7, 0x0a, 0x4b, 0x33, 0x6f, 0x29, - 0xae, 0x2f, 0x3d, 0xb9, 0xb4, 0xfc, 0xf4, 0x92, 0x92, 0xd6, 0x42, 0x60, 0x77, 0x70, 0xd9, 0xaf, - 0x40, 0x3a, 0xcc, 0x14, 0x3a, 0x04, 0xcd, 0xd8, 0x4a, 0x77, 0xa1, 0x11, 0x18, 0x5a, 0x5a, 0x2e, - 0xae, 0xce, 0xcf, 0x16, 0x8a, 0x85, 0xcb, 0x97, 0x0b, 0x33, 0x6b, 0xab, 0x2c, 0xf1, 0xe1, 0x42, - 0xaf, 0x05, 0x16, 0xb8, 0xfc, 0x72, 0x1c, 0x46, 0x9a, 0x70, 0x82, 0x72, 0x3c, 0x64, 0x61, 0x51, - 0xd4, 0xe9, 0x76, 0xb8, 0x9f, 0x24, 0x3e, 0xc3, 0x8a, 0x6a, 0x39, 0x3c, 0xc2, 0xb9, 0x0f, 0x88, - 0x94, 0x74, 0x47, 0xdb, 0xd4, 0xb0, 0xc5, 0xf3, 0x44, 0x2c, 0x8e, 0x19, 0xf2, 0xea, 0x59, 0xaa, - 0xe8, 0x01, 0x40, 0xa6, 0x61, 0x6b, 0x8e, 0x76, 0x0d, 0x17, 0x35, 0x5d, 0x24, 0x95, 0x48, 0x5c, - 0x93, 0x50, 0xd2, 0xa2, 0x65, 0x5e, 0x77, 0x5c, 0x68, 0x1d, 0x57, 0xd4, 0x10, 0x34, 0x31, 0xe6, - 0x71, 0x25, 0x2d, 0x5a, 0x5c, 0xe8, 0xbb, 0xa0, 0xbf, 0x6c, 0xd4, 0x89, 0xb3, 0xc7, 0xe0, 0xc8, - 0xde, 0x21, 0x29, 0x7d, 0xac, 0xce, 0x05, 0xe1, 0x6e, 0xbc, 0x97, 0xcd, 0xea, 0x57, 0xfa, 0x58, - 0x1d, 0x03, 0x39, 0x01, 0x43, 0x6a, 0xa5, 0x62, 0x11, 0xe2, 0x82, 0x10, 0x0b, 0x4c, 0x06, 0xdd, - 0x6a, 0x0a, 0x98, 0x7d, 0x02, 0x92, 0x42, 0x0e, 0x64, 0xab, 0x26, 0x92, 0x28, 0x9a, 0x2c, 0xda, - 0x8e, 0x9d, 0x4c, 0x29, 0x49, 0x5d, 0x34, 0xde, 0x05, 0xfd, 0x9a, 0x5d, 0xf4, 0x92, 0xf3, 0xb1, - 0x89, 0xd8, 0xc9, 0xa4, 0xd2, 0xa7, 0xd9, 0x6e, 0x62, 0x53, 0xfe, 0x64, 0x0c, 0x06, 0x83, 0x87, - 0x0b, 0x68, 0x16, 0x92, 0x55, 0xa3, 0xa4, 0x52, 0xd5, 0x62, 0x27, 0x5b, 0x27, 0x23, 0xce, 0x23, - 0x26, 0x17, 0x38, 0xbc, 0xe2, 0x62, 0x66, 0xff, 0x44, 0x82, 0xa4, 0xa8, 0x46, 0x07, 0x21, 0x61, - 0xaa, 0xce, 0x16, 0x25, 0xd7, 0x9d, 0x8f, 0xa5, 0x25, 0x85, 0x96, 0x49, 0xbd, 0x6d, 0xaa, 0x3a, - 0x55, 0x01, 0x5e, 0x4f, 0xca, 0x64, 0x5e, 0xab, 0x58, 0x2d, 0xd3, 0xa8, 0xc7, 0xa8, 0xd5, 0xb0, - 0xee, 0xd8, 0x62, 0x5e, 0x79, 0xfd, 0x0c, 0xaf, 0x46, 0xf7, 0xc3, 0xb0, 0x63, 0xa9, 0x5a, 0x35, - 0x00, 0x9b, 0xa0, 0xb0, 0x69, 0xd1, 0xe0, 0x02, 0x4f, 0xc3, 0x61, 0x41, 0xb7, 0x8c, 0x1d, 0xb5, - 0xb4, 0x85, 0xcb, 0x1e, 0x52, 0x0f, 0xcd, 0x6e, 0x1c, 0xe2, 0x00, 0xb3, 0xbc, 0x5d, 0xe0, 0xca, - 0x5f, 0x95, 0x60, 0x58, 0xc4, 0x69, 0x65, 0x57, 0x58, 0x8b, 0x00, 0xaa, 0xae, 0x1b, 0x8e, 0x5f, - 0x5c, 0x8d, 0xaa, 0xdc, 0x80, 0x37, 0x99, 0x73, 0x91, 0x14, 0x1f, 0x81, 0x6c, 0x0d, 0xc0, 0x6b, - 0x69, 0x29, 0xb6, 0x71, 0xe8, 0xe3, 0x27, 0x47, 0xf4, 0xf8, 0x91, 0x45, 0xf6, 0xc0, 0xaa, 0x48, - 0x40, 0x87, 0x46, 0xa1, 0x7b, 0x03, 0x57, 0x34, 0x9d, 0xe7, 0x83, 0x59, 0x41, 0xe4, 0x5f, 0x12, - 0x6e, 0xfe, 0x25, 0xff, 0x5e, 0x09, 0x46, 0x4a, 0x46, 0x2d, 0xcc, 0x6f, 0x3e, 0x1d, 0x4a, 0x2f, - 0xd8, 0x57, 0xa4, 0x67, 0x1f, 0xaf, 0x68, 0xce, 0x56, 0x7d, 0x63, 0xb2, 0x64, 0xd4, 0xa6, 0x2a, - 0x46, 0x55, 0xd5, 0x2b, 0xde, 0xf9, 0x29, 0xfd, 0xa7, 0x74, 0xba, 0x82, 0xf5, 0xd3, 0x15, 0xc3, - 0x77, 0x9a, 0x7a, 0xd1, 0xfb, 0xf7, 0xaf, 0x24, 0xe9, 0x37, 0x63, 0xf1, 0xb9, 0x95, 0xfc, 0x2b, - 0xb1, 0xec, 0x1c, 0xeb, 0x6e, 0x45, 0x88, 0x47, 0xc1, 0x9b, 0x55, 0x5c, 0x22, 0x43, 0x86, 0xef, - 0xdd, 0x0f, 0xa3, 0x15, 0xa3, 0x62, 0x50, 0x8a, 0x53, 0xe4, 0x3f, 0x7e, 0x22, 0x9b, 0x72, 0x6b, - 0xb3, 0x91, 0xc7, 0xb7, 0xd3, 0x4b, 0x30, 0xc2, 0x81, 0x8b, 0xf4, 0x48, 0x88, 0x05, 0x36, 0x68, - 0xcf, 0xb4, 0x5a, 0xe6, 0x77, 0xbf, 0x4d, 0x37, 0x74, 0x65, 0x98, 0xa3, 0x92, 0x36, 0x16, 0xfb, - 0x4c, 0x2b, 0x70, 0x20, 0x40, 0x8f, 0x2d, 0x5b, 0x6c, 0x45, 0x50, 0xfc, 0x23, 0x4e, 0x71, 0xc4, - 0x47, 0x71, 0x95, 0xa3, 0x4e, 0xcf, 0xc0, 0x40, 0x27, 0xb4, 0xfe, 0x05, 0xa7, 0xd5, 0x8f, 0xfd, - 0x44, 0xe6, 0x60, 0x88, 0x12, 0x29, 0xd5, 0x6d, 0xc7, 0xa8, 0x51, 0x9b, 0xb8, 0x37, 0x99, 0x7f, - 0xf9, 0x6d, 0xb6, 0x8e, 0x06, 0x09, 0xda, 0x8c, 0x8b, 0x35, 0x3d, 0x0d, 0xf4, 0x14, 0xac, 0x8c, - 0x4b, 0xd5, 0x08, 0x0a, 0x5f, 0xe2, 0x8c, 0xb8, 0xf0, 0xd3, 0x57, 0x61, 0x94, 0xfc, 0x4f, 0x4d, - 0x96, 0x9f, 0x93, 0xe8, 0x1c, 0x5c, 0xe6, 0xab, 0xef, 0x62, 0x4b, 0x75, 0xc4, 0x25, 0xe0, 0xe3, - 0xc9, 0x37, 0x8b, 0x15, 0xec, 0x38, 0xd8, 0xb2, 0x8b, 0x6a, 0xb5, 0x19, 0x7b, 0xbe, 0x24, 0x46, - 0xe6, 0x37, 0xbe, 0x1f, 0x9c, 0xc5, 0x39, 0x86, 0x99, 0xab, 0x56, 0xa7, 0xd7, 0xe1, 0x50, 0x13, - 0xad, 0x68, 0x83, 0xe6, 0xcb, 0x9c, 0xe6, 0x68, 0x83, 0x66, 0x10, 0xb2, 0x2b, 0x20, 0xea, 0xdd, - 0xb9, 0x6c, 0x83, 0xe6, 0x87, 0x38, 0x4d, 0xc4, 0x71, 0xc5, 0x94, 0x12, 0x8a, 0x4f, 0xc0, 0xf0, - 0x35, 0x6c, 0x6d, 0x18, 0x36, 0x4f, 0x1c, 0xb5, 0x41, 0xee, 0xc3, 0x9c, 0xdc, 0x10, 0x47, 0xa4, - 0x99, 0x24, 0x42, 0xeb, 0x51, 0x48, 0x6e, 0xaa, 0x25, 0xdc, 0x06, 0x89, 0x9b, 0x9c, 0x44, 0x2f, - 0x81, 0x27, 0xa8, 0x39, 0xe8, 0xaf, 0x18, 0x7c, 0xd7, 0x8a, 0x46, 0xff, 0x08, 0x47, 0xef, 0x13, - 0x38, 0x9c, 0x84, 0x69, 0x98, 0xf5, 0x2a, 0xd9, 0xd2, 0xa2, 0x49, 0xfc, 0x3d, 0x41, 0x42, 0xe0, - 0x70, 0x12, 0x1d, 0x88, 0xf5, 0xa3, 0x82, 0x84, 0xed, 0x93, 0xe7, 0x25, 0xe8, 0x33, 0xf4, 0xea, - 0xae, 0xa1, 0xb7, 0xc3, 0xc4, 0xc7, 0x38, 0x05, 0xe0, 0x28, 0x84, 0xc0, 0x45, 0x48, 0xb5, 0x3b, - 0x11, 0x7f, 0xff, 0xfb, 0x62, 0x79, 0x88, 0x19, 0x98, 0x83, 0x21, 0x61, 0xa0, 0x34, 0x43, 0x6f, - 0x83, 0xc4, 0x3f, 0xe0, 0x24, 0x06, 0x7d, 0x68, 0x7c, 0x18, 0x0e, 0xb6, 0x9d, 0x0a, 0x6e, 0x87, - 0xc8, 0x27, 0xc5, 0x30, 0x38, 0x0a, 0x17, 0xe5, 0x06, 0xd6, 0x4b, 0x5b, 0xed, 0x51, 0xf8, 0x94, - 0x10, 0xa5, 0xc0, 0x21, 0x24, 0x66, 0x60, 0xa0, 0xa6, 0x5a, 0xf6, 0x96, 0x5a, 0x6d, 0x6b, 0x3a, - 0xfe, 0x21, 0xa7, 0xd1, 0xef, 0x22, 0x71, 0x89, 0xd4, 0xf5, 0x4e, 0xc8, 0xbc, 0x22, 0x24, 0xe2, - 0x43, 0xe3, 0x4b, 0xcf, 0x76, 0x68, 0x96, 0xad, 0x13, 0x6a, 0xff, 0x48, 0x2c, 0x3d, 0x86, 0xbb, - 0xe8, 0xa7, 0x78, 0x11, 0x52, 0xb6, 0x76, 0xa3, 0x2d, 0x32, 0xbf, 0x25, 0x66, 0x9a, 0x22, 0x10, - 0xe4, 0xb7, 0xc0, 0xe1, 0xa6, 0xdb, 0x44, 0x1b, 0xc4, 0x7e, 0x9b, 0x13, 0x3b, 0xd8, 0x64, 0xab, - 0xe0, 0x26, 0xa1, 0x53, 0x92, 0xff, 0x58, 0x98, 0x04, 0x1c, 0xa2, 0xb5, 0x42, 0xe2, 0x08, 0x5b, - 0xdd, 0xec, 0x4c, 0x6a, 0xbf, 0x23, 0xa4, 0xc6, 0x70, 0x03, 0x52, 0x5b, 0x83, 0x83, 0x9c, 0x62, - 0x67, 0xf3, 0xfa, 0x69, 0x61, 0x58, 0x19, 0xf6, 0x7a, 0x70, 0x76, 0x7f, 0x06, 0xb2, 0xae, 0x38, - 0x85, 0xc3, 0x6a, 0x17, 0x6b, 0xaa, 0xd9, 0x06, 0xe5, 0xdf, 0xe5, 0x94, 0x85, 0xc5, 0x77, 0x3d, - 0x5e, 0x7b, 0x51, 0x35, 0x09, 0xf1, 0x67, 0x20, 0x23, 0x88, 0xd7, 0x75, 0x0b, 0x97, 0x8c, 0x8a, - 0xae, 0xdd, 0xc0, 0xe5, 0x36, 0x48, 0x7f, 0x26, 0x34, 0x55, 0xeb, 0x3e, 0x74, 0x42, 0x79, 0x1e, - 0xd2, 0xae, 0xaf, 0x52, 0xd4, 0x6a, 0xa6, 0x61, 0x39, 0x11, 0x14, 0x3f, 0x2b, 0x66, 0xca, 0xc5, - 0x9b, 0xa7, 0x68, 0xd3, 0x05, 0x18, 0xa4, 0xc5, 0x76, 0x55, 0xf2, 0x73, 0x9c, 0xd0, 0x80, 0x87, - 0xc5, 0x0d, 0x47, 0xc9, 0xa8, 0x99, 0xaa, 0xd5, 0x8e, 0xfd, 0xfb, 0x3d, 0x61, 0x38, 0x38, 0x0a, - 0x37, 0x1c, 0xce, 0xae, 0x89, 0xc9, 0x6e, 0xdf, 0x06, 0x85, 0xcf, 0x0b, 0xc3, 0x21, 0x70, 0x38, - 0x09, 0xe1, 0x30, 0xb4, 0x41, 0xe2, 0x9f, 0x08, 0x12, 0x02, 0x87, 0x90, 0x78, 0xca, 0xdb, 0x68, - 0x2d, 0x5c, 0xd1, 0x6c, 0xc7, 0x62, 0x6e, 0xf2, 0xde, 0xa4, 0xfe, 0xe9, 0xf7, 0x83, 0x4e, 0x98, - 0xe2, 0x43, 0x25, 0x96, 0x88, 0xa7, 0x5d, 0x69, 0x14, 0x15, 0xcd, 0xd8, 0xef, 0x0b, 0x4b, 0xe4, - 0x43, 0x23, 0xbc, 0xf9, 0x3c, 0x44, 0x22, 0xf6, 0x12, 0x89, 0x1d, 0xda, 0x20, 0xf7, 0xcf, 0x42, - 0xcc, 0xad, 0x0a, 0x5c, 0x42, 0xd3, 0xe7, 0xff, 0xd4, 0xf5, 0x6d, 0xbc, 0xdb, 0x96, 0x76, 0xfe, - 0x41, 0xc8, 0xff, 0x59, 0x67, 0x98, 0xcc, 0x86, 0x0c, 0x85, 0xfc, 0x29, 0x14, 0x75, 0x7f, 0x28, - 0xf3, 0x73, 0x3f, 0xe4, 0xe3, 0x0d, 0xba, 0x53, 0xd3, 0x0b, 0x44, 0xc9, 0x83, 0x4e, 0x4f, 0x34, - 0xb1, 0x77, 0xfd, 0xd0, 0xd5, 0xf3, 0x80, 0xcf, 0x33, 0x7d, 0x19, 0x06, 0x02, 0x0e, 0x4f, 0x34, - 0xa9, 0x9f, 0xe7, 0xa4, 0xfa, 0xfd, 0xfe, 0xce, 0xf4, 0x59, 0x48, 0x10, 0xe7, 0x25, 0x1a, 0xfd, - 0x17, 0x38, 0x3a, 0x05, 0x9f, 0x7e, 0x0c, 0x92, 0xc2, 0x69, 0x89, 0x46, 0x7d, 0x37, 0x47, 0x75, - 0x51, 0x08, 0xba, 0x70, 0x58, 0xa2, 0xd1, 0x7f, 0x51, 0xa0, 0x0b, 0x14, 0x82, 0xde, 0xbe, 0x08, - 0xbf, 0xf0, 0xcb, 0x09, 0xbe, 0xe9, 0x08, 0xd9, 0x5d, 0x84, 0x5e, 0xee, 0xa9, 0x44, 0x63, 0xff, - 0x12, 0xef, 0x5c, 0x60, 0x4c, 0x9f, 0x87, 0xee, 0x36, 0x05, 0xfe, 0x1e, 0x8e, 0xca, 0xe0, 0xa7, - 0x67, 0xa0, 0xcf, 0xe7, 0x9d, 0x44, 0xa3, 0xff, 0x5d, 0x8e, 0xee, 0xc7, 0x22, 0xac, 0x73, 0xef, - 0x24, 0x9a, 0xc0, 0x7b, 0x05, 0xeb, 0x1c, 0x83, 0x88, 0x4d, 0x38, 0x26, 0xd1, 0xd8, 0xef, 0x13, - 0x52, 0x17, 0x28, 0xd3, 0x97, 0x20, 0xe5, 0x6e, 0x36, 0xd1, 0xf8, 0xef, 0xe7, 0xf8, 0x1e, 0x0e, - 0x91, 0x80, 0x6f, 0xb3, 0x8b, 0x26, 0xf1, 0x01, 0x21, 0x01, 0x1f, 0x16, 0x59, 0x46, 0x61, 0x07, - 0x26, 0x9a, 0xd2, 0xaf, 0x88, 0x65, 0x14, 0xf2, 0x5f, 0xc8, 0x6c, 0x52, 0x9b, 0x1f, 0x4d, 0xe2, - 0x57, 0xc5, 0x6c, 0x52, 0x78, 0xc2, 0x46, 0xd8, 0x23, 0x88, 0xa6, 0xf1, 0xeb, 0x82, 0x8d, 0x90, - 0x43, 0x30, 0xbd, 0x02, 0xa8, 0xd1, 0x1b, 0x88, 0xa6, 0xf7, 0x41, 0x4e, 0x6f, 0xb8, 0xc1, 0x19, - 0x98, 0x7e, 0x1a, 0x0e, 0x36, 0xf7, 0x04, 0xa2, 0xa9, 0xfe, 0xc6, 0x0f, 0x43, 0xb1, 0x9b, 0xdf, - 0x11, 0x98, 0x5e, 0xf3, 0xb6, 0x14, 0xbf, 0x17, 0x10, 0x4d, 0xf6, 0xe5, 0x1f, 0x06, 0x0d, 0xb7, - 0xdf, 0x09, 0x98, 0xce, 0x01, 0x78, 0x1b, 0x70, 0x34, 0xad, 0x0f, 0x73, 0x5a, 0x3e, 0x24, 0xb2, - 0x34, 0xf8, 0xfe, 0x1b, 0x8d, 0x7f, 0x53, 0x2c, 0x0d, 0x8e, 0x41, 0x96, 0x86, 0xd8, 0x7a, 0xa3, - 0xb1, 0x3f, 0x22, 0x96, 0x86, 0x40, 0x21, 0x9a, 0xed, 0xdb, 0xdd, 0xa2, 0x29, 0x7c, 0x4c, 0x68, - 0xb6, 0x0f, 0x6b, 0x7a, 0x09, 0x86, 0x1b, 0x36, 0xc4, 0x68, 0x52, 0xbf, 0xc9, 0x49, 0xa5, 0xc3, - 0xfb, 0xa1, 0x7f, 0xf3, 0xe2, 0x9b, 0x61, 0x34, 0xb5, 0x8f, 0x87, 0x36, 0x2f, 0xbe, 0x17, 0x4e, - 0x5f, 0x84, 0xa4, 0x5e, 0xaf, 0x56, 0xc9, 0xe2, 0x41, 0x7b, 0xdf, 0xf9, 0xcb, 0xfc, 0x97, 0x1f, - 0x73, 0xe9, 0x08, 0x84, 0xe9, 0xb3, 0xd0, 0x8d, 0x6b, 0x1b, 0xb8, 0x1c, 0x85, 0xf9, 0xbd, 0x1f, - 0x0b, 0x83, 0x49, 0xa0, 0xa7, 0x2f, 0x01, 0xb0, 0xd4, 0x08, 0x3d, 0x1e, 0x8c, 0xc0, 0xfd, 0xaf, - 0x3f, 0xe6, 0xb7, 0x71, 0x3c, 0x14, 0x8f, 0x00, 0xbb, 0xdb, 0xb3, 0x37, 0x81, 0xef, 0x07, 0x09, - 0xd0, 0x19, 0x79, 0x14, 0x7a, 0x9f, 0xb3, 0x0d, 0xdd, 0x51, 0x2b, 0x51, 0xd8, 0xff, 0x8d, 0x63, - 0x0b, 0x78, 0x22, 0xb0, 0x9a, 0x61, 0x61, 0x47, 0xad, 0xd8, 0x51, 0xb8, 0xff, 0x9d, 0xe3, 0xba, - 0x08, 0x04, 0xb9, 0xa4, 0xda, 0x4e, 0x3b, 0xe3, 0xfe, 0x4b, 0x81, 0x2c, 0x10, 0x08, 0xd3, 0xe4, - 0xff, 0x6d, 0xbc, 0x1b, 0x85, 0xfb, 0x03, 0xc1, 0x34, 0x87, 0x9f, 0x7e, 0x0c, 0x52, 0xe4, 0x5f, - 0x76, 0xc5, 0x2e, 0x02, 0xf9, 0x7f, 0x70, 0x64, 0x0f, 0x83, 0xf4, 0x6c, 0x3b, 0x65, 0x47, 0x8b, - 0x16, 0xf6, 0x6b, 0x7c, 0xa6, 0x05, 0xfc, 0x74, 0x0e, 0xfa, 0x6c, 0xa7, 0x5c, 0xae, 0x73, 0xff, - 0x34, 0x02, 0xfd, 0x7f, 0xfe, 0xd8, 0x4d, 0x59, 0xb8, 0x38, 0x64, 0xb6, 0xaf, 0x6f, 0x3b, 0xa6, - 0x41, 0x8f, 0x40, 0xa2, 0x28, 0xfc, 0x90, 0x53, 0xf0, 0xa1, 0x4c, 0xcf, 0x40, 0x3f, 0x19, 0x8b, - 0x85, 0x4d, 0x4c, 0xcf, 0xab, 0x22, 0x48, 0xfc, 0x88, 0x0b, 0x20, 0x80, 0x94, 0x7f, 0xeb, 0x97, - 0x5e, 0x1d, 0x93, 0xbe, 0xf2, 0xea, 0x98, 0xf4, 0xcd, 0x57, 0xc7, 0xa4, 0xf7, 0x7d, 0x6b, 0xac, - 0xeb, 0x2b, 0xdf, 0x1a, 0xeb, 0xfa, 0xfa, 0xb7, 0xc6, 0xba, 0x9a, 0xa7, 0x8d, 0x61, 0xce, 0x98, - 0x33, 0x58, 0xc2, 0xf8, 0x59, 0x39, 0x90, 0x2e, 0xae, 0x18, 0x5e, 0xb6, 0xd6, 0x0d, 0x72, 0xe0, - 0x47, 0x12, 0x09, 0x98, 0x83, 0xb9, 0x5c, 0x55, 0xdf, 0x6d, 0xf1, 0x06, 0x27, 0xdb, 0x34, 0x31, - 0x2c, 0xbf, 0x09, 0xe2, 0x39, 0x7d, 0x17, 0x1d, 0x66, 0x36, 0xaf, 0x58, 0xb7, 0xaa, 0xfc, 0xea, - 0x57, 0x2f, 0x29, 0xaf, 0x5b, 0x55, 0x34, 0xea, 0xdd, 0xcf, 0x94, 0x4e, 0xf6, 0xf3, 0x4b, 0x97, - 0xd3, 0x89, 0x1f, 0x7c, 0x6c, 0xbc, 0x2b, 0xbf, 0x1d, 0x1e, 0xe1, 0x17, 0x22, 0x47, 0x99, 0xcc, - 0xe9, 0xbb, 0x74, 0x90, 0x2b, 0xd2, 0xb3, 0xdd, 0xa4, 0x0f, 0x5b, 0x24, 0xb6, 0xc7, 0xc2, 0x89, - 0xed, 0xa7, 0x71, 0xb5, 0xfa, 0xa4, 0x6e, 0x5c, 0xd7, 0xd7, 0x08, 0xd8, 0x46, 0x0f, 0xa5, 0xf1, - 0x30, 0xbc, 0x2f, 0x06, 0xe3, 0xe1, 0x71, 0x13, 0xc5, 0xb1, 0x1d, 0xb5, 0x66, 0xb6, 0x7a, 0x81, - 0x74, 0x11, 0x52, 0x6b, 0x02, 0x06, 0x65, 0xa0, 0xd7, 0xc6, 0x25, 0x43, 0x2f, 0xdb, 0x74, 0xb0, - 0x71, 0x45, 0x14, 0xc9, 0x60, 0x75, 0x55, 0x37, 0x6c, 0x7e, 0x41, 0x92, 0x15, 0xf2, 0xbf, 0x26, - 0x75, 0x36, 0x93, 0x83, 0x6e, 0x57, 0x62, 0xa4, 0xf7, 0xef, 0x95, 0xfe, 0xa7, 0x52, 0xf0, 0x86, - 0xe0, 0xcb, 0xf5, 0xb7, 0x2b, 0x92, 0x77, 0xc6, 0xe1, 0x70, 0xc9, 0xb0, 0x6b, 0x86, 0x5d, 0x64, - 0x33, 0xcc, 0x0a, 0x5c, 0x18, 0xfd, 0xfe, 0xa6, 0x36, 0xf2, 0xff, 0x57, 0x60, 0x90, 0xae, 0x02, - 0x9a, 0xf9, 0xa4, 0x86, 0x27, 0x72, 0xaf, 0xf8, 0xe3, 0x7f, 0xdb, 0x4d, 0xb5, 0x66, 0xc0, 0x45, - 0xa4, 0x57, 0x3b, 0xd6, 0x60, 0x54, 0xab, 0x99, 0x55, 0x4c, 0xcf, 0x80, 0x8a, 0x6e, 0x5b, 0x34, - 0xbd, 0x2f, 0x73, 0x7a, 0x23, 0x1e, 0xfa, 0xbc, 0xc0, 0x9e, 0x5e, 0x80, 0x61, 0xb5, 0x54, 0xc2, - 0x66, 0x80, 0x64, 0xc4, 0x0a, 0x15, 0x0c, 0xa6, 0x39, 0xa6, 0x4b, 0x2d, 0x7f, 0xa9, 0xd5, 0xdc, - 0x3e, 0x7b, 0xaf, 0x6f, 0xd2, 0x2c, 0x5c, 0xc1, 0xfa, 0x69, 0x1d, 0x3b, 0xd7, 0x0d, 0x6b, 0x9b, - 0x8b, 0xf7, 0x34, 0xeb, 0x4a, 0x4c, 0xc2, 0xcf, 0xc7, 0x61, 0x8c, 0x35, 0x4c, 0x6d, 0xa8, 0x36, - 0x9e, 0xba, 0xf6, 0xd0, 0x06, 0x76, 0xd4, 0x87, 0xa6, 0x4a, 0x86, 0xa6, 0xf3, 0x99, 0x18, 0xe1, - 0xf3, 0x42, 0xda, 0x27, 0x79, 0x7b, 0x8b, 0x85, 0x39, 0x07, 0x89, 0x19, 0x43, 0xd3, 0x89, 0x46, - 0x96, 0xb1, 0x6e, 0xd4, 0xf8, 0xb2, 0x64, 0x05, 0x74, 0x37, 0xf4, 0xa8, 0x35, 0xa3, 0xae, 0x3b, - 0xec, 0xf8, 0x2a, 0xdf, 0xf7, 0xa5, 0x5b, 0xe3, 0x5d, 0x7f, 0x7e, 0x6b, 0x3c, 0x3e, 0xaf, 0x3b, - 0x0a, 0x6f, 0x9a, 0x4e, 0x7c, 0xf7, 0xa3, 0xe3, 0x92, 0xfc, 0x04, 0xf4, 0xce, 0xe2, 0xd2, 0x7e, - 0x68, 0xcd, 0xe2, 0x52, 0x88, 0xd6, 0x7d, 0x90, 0x9c, 0xd7, 0x1d, 0x76, 0x67, 0xf6, 0x18, 0xc4, - 0x35, 0x9d, 0xdd, 0xc2, 0x0a, 0xf5, 0x4f, 0xea, 0x09, 0xe8, 0x2c, 0x2e, 0xb9, 0xa0, 0x65, 0x5c, - 0x0a, 0x83, 0x12, 0xf2, 0xa4, 0x3e, 0x3f, 0xfb, 0xf5, 0xbf, 0x18, 0xeb, 0x7a, 0xe1, 0xd5, 0xb1, - 0xae, 0x96, 0x33, 0xe1, 0x37, 0x87, 0x5c, 0xc4, 0x7c, 0x0a, 0xec, 0xf2, 0xf6, 0x94, 0x13, 0x58, - 0x0b, 0x7f, 0x27, 0x06, 0x63, 0x0d, 0x2a, 0xce, 0x37, 0x86, 0x56, 0xd6, 0x61, 0x1a, 0x92, 0xb3, - 0x62, 0xbf, 0xe9, 0xd4, 0x38, 0xfc, 0x6a, 0x87, 0xc6, 0x61, 0x40, 0xf4, 0x24, 0x6c, 0xc3, 0xa9, - 0x68, 0xdb, 0x20, 0xf8, 0xdf, 0x87, 0x69, 0x78, 0x25, 0x01, 0xc7, 0xe8, 0xa3, 0x10, 0xab, 0xa6, - 0xe9, 0xce, 0x54, 0xc9, 0xda, 0x35, 0x1d, 0xba, 0x9d, 0x18, 0x9b, 0x5c, 0x1a, 0xc3, 0x5e, 0xf3, - 0x24, 0x6b, 0x6e, 0xa1, 0x92, 0x9b, 0xd0, 0xbd, 0x42, 0xf0, 0x88, 0x20, 0x1c, 0xc3, 0x51, 0xab, - 0x5c, 0x40, 0xac, 0x40, 0x6a, 0xd9, 0x43, 0x92, 0x18, 0xab, 0xd5, 0xc4, 0x1b, 0x92, 0x2a, 0x56, - 0x37, 0xd9, 0xc5, 0xdd, 0x38, 0xdd, 0x42, 0x92, 0xa4, 0x82, 0xde, 0xd1, 0x1d, 0x85, 0x6e, 0xb5, - 0xce, 0x8e, 0x9c, 0xe3, 0x64, 0x6f, 0xa1, 0x05, 0xf9, 0x49, 0xe8, 0xe5, 0xc7, 0x5c, 0x28, 0x0d, - 0xf1, 0x6d, 0xbc, 0x4b, 0xfb, 0xe9, 0x57, 0xc8, 0xbf, 0x68, 0x12, 0xba, 0x29, 0xf3, 0xfc, 0x45, - 0x42, 0x66, 0xb2, 0x81, 0xfb, 0x49, 0xca, 0xa4, 0xc2, 0xc0, 0xe4, 0x27, 0x20, 0x39, 0x6b, 0xd4, - 0x34, 0xdd, 0x08, 0x52, 0x4b, 0x31, 0x6a, 0x94, 0x67, 0xb3, 0xce, 0x55, 0x5f, 0x61, 0x05, 0x74, - 0x10, 0x7a, 0xd8, 0x45, 0x6e, 0x7e, 0x6c, 0xce, 0x4b, 0xf2, 0x0c, 0xf4, 0x52, 0xda, 0xcb, 0x26, - 0x42, 0xfc, 0x65, 0x0f, 0xbf, 0x31, 0x4e, 0xad, 0x24, 0x27, 0x1f, 0xf3, 0x98, 0x45, 0x90, 0x28, - 0xab, 0x8e, 0xca, 0xc7, 0x4d, 0xff, 0x97, 0x1f, 0x87, 0x24, 0x27, 0x62, 0xa3, 0x33, 0x10, 0x37, - 0x4c, 0x9b, 0x1f, 0x7c, 0x67, 0x5b, 0x0d, 0x65, 0xd9, 0xcc, 0x27, 0xc8, 0xa2, 0x51, 0x08, 0x70, - 0x5e, 0x69, 0xb9, 0x4a, 0x2e, 0xf8, 0x14, 0xc9, 0x37, 0xe5, 0xbe, 0x7f, 0xd9, 0x94, 0x36, 0xa8, - 0x83, 0xab, 0x2c, 0x1f, 0x8b, 0xc1, 0x98, 0xaf, 0xf5, 0x1a, 0xb6, 0x48, 0xac, 0xc7, 0x16, 0x18, - 0xd7, 0x16, 0xe4, 0x63, 0x92, 0xb7, 0xb7, 0x50, 0x97, 0xc7, 0x20, 0x9e, 0x33, 0x4d, 0x94, 0x85, - 0x24, 0x3b, 0xe0, 0x36, 0x98, 0xbe, 0x24, 0x14, 0xb7, 0x4c, 0xda, 0x6c, 0x63, 0xd3, 0xb9, 0xae, - 0x5a, 0xee, 0x13, 0x26, 0x51, 0x96, 0x1f, 0x85, 0xd4, 0x8c, 0xa1, 0xdb, 0x58, 0xb7, 0xeb, 0x74, - 0xe9, 0x6d, 0x54, 0x8d, 0xd2, 0x36, 0xa7, 0xc0, 0x0a, 0x44, 0xe0, 0xaa, 0x69, 0x52, 0xcc, 0x84, - 0x42, 0xfe, 0x65, 0x66, 0x2a, 0xbf, 0xda, 0x52, 0x44, 0x8f, 0x76, 0x2e, 0x22, 0x3e, 0x48, 0x57, - 0x46, 0xff, 0x5b, 0x82, 0xa3, 0x8d, 0x0b, 0x6a, 0x1b, 0xef, 0xda, 0x9d, 0xae, 0xa7, 0x67, 0x20, - 0xb5, 0x42, 0xdf, 0x11, 0x3f, 0x89, 0x77, 0x51, 0x16, 0x7a, 0x71, 0xf9, 0xcc, 0xd9, 0xb3, 0x0f, - 0x3d, 0xca, 0xb4, 0xfd, 0x4a, 0x97, 0x22, 0x2a, 0xd0, 0x18, 0xa4, 0x6c, 0x5c, 0x32, 0xcf, 0x9c, - 0x3d, 0xb7, 0xfd, 0x10, 0x53, 0xaf, 0x2b, 0x5d, 0x8a, 0x57, 0x35, 0x9d, 0x24, 0xa3, 0xfe, 0xee, - 0xc7, 0xc6, 0xa5, 0x7c, 0x37, 0xc4, 0xed, 0x7a, 0xed, 0x8e, 0xea, 0xc8, 0xcb, 0xdd, 0x30, 0xe1, - 0xc7, 0xa4, 0x06, 0xea, 0x9a, 0x5a, 0xd5, 0xca, 0xaa, 0xf7, 0x02, 0x3c, 0xed, 0x93, 0x01, 0x85, - 0x68, 0x2e, 0x82, 0xec, 0x9e, 0x92, 0x94, 0x3f, 0x23, 0x41, 0xff, 0x55, 0x41, 0x79, 0x15, 0x3b, - 0xe8, 0x22, 0x80, 0xdb, 0x93, 0x58, 0x36, 0x47, 0x26, 0xc3, 0x7d, 0x4d, 0xba, 0x38, 0x8a, 0x0f, - 0x1c, 0x9d, 0xa7, 0x8a, 0x68, 0x1a, 0x36, 0x7f, 0xff, 0x12, 0x81, 0xea, 0x02, 0xa3, 0x07, 0x00, - 0x51, 0x0b, 0x57, 0xbc, 0x66, 0x38, 0x9a, 0x5e, 0x29, 0x9a, 0xc6, 0x75, 0xfe, 0x58, 0x30, 0xae, - 0xa4, 0x69, 0xcb, 0x55, 0xda, 0xb0, 0x42, 0xea, 0x09, 0xd3, 0x29, 0x97, 0x0a, 0xd9, 0x4d, 0xd4, - 0x72, 0xd9, 0xc2, 0xb6, 0xcd, 0x8d, 0x98, 0x28, 0xa2, 0x8b, 0xd0, 0x6b, 0xd6, 0x37, 0x8a, 0xc2, - 0x62, 0xf4, 0x9d, 0x39, 0xda, 0x6c, 0xfd, 0x0b, 0xfd, 0xe0, 0x16, 0xa0, 0xc7, 0xac, 0x6f, 0x10, - 0x6d, 0xb9, 0x0b, 0xfa, 0x9b, 0x30, 0xd3, 0x77, 0xcd, 0xe3, 0x83, 0x3e, 0x5f, 0xe7, 0x23, 0x28, - 0x9a, 0x96, 0x66, 0x58, 0x9a, 0xb3, 0x4b, 0x6f, 0xaf, 0xc4, 0x95, 0xb4, 0x68, 0x58, 0xe1, 0xf5, - 0xf2, 0x36, 0x0c, 0xad, 0x52, 0x57, 0xcb, 0xe3, 0xfc, 0xac, 0xc7, 0x9f, 0x14, 0xcd, 0x5f, 0x4b, - 0xce, 0x62, 0x0d, 0x9c, 0xe5, 0x9f, 0x6a, 0xa9, 0x9d, 0xe7, 0x3b, 0xd7, 0xce, 0xe0, 0xe6, 0xff, - 0x97, 0x87, 0x03, 0x8b, 0x93, 0x7b, 0xd6, 0x3e, 0xf3, 0xd5, 0xae, 0x62, 0x46, 0x45, 0x18, 0xd9, - 0xbd, 0x37, 0xd5, 0x6c, 0x84, 0x19, 0xcd, 0x46, 0x2e, 0x21, 0xf9, 0x51, 0x18, 0x58, 0x51, 0x2d, - 0x67, 0x15, 0x3b, 0x57, 0xb0, 0x5a, 0xc6, 0x56, 0x70, 0xd7, 0x1d, 0x10, 0xbb, 0x2e, 0x82, 0x04, - 0xdd, 0x5a, 0xd9, 0xae, 0x43, 0xff, 0x97, 0xb7, 0x20, 0x41, 0x6f, 0xb0, 0xb9, 0x3b, 0x32, 0xc7, - 0x60, 0x3b, 0x32, 0xb1, 0xa5, 0xbb, 0x0e, 0xb6, 0x45, 0x40, 0x47, 0x0b, 0xe8, 0x11, 0xb1, 0xaf, - 0xc6, 0xf7, 0xde, 0x57, 0xb9, 0x22, 0xf2, 0xdd, 0xb5, 0x0a, 0xbd, 0x79, 0x62, 0x8a, 0xe7, 0x67, - 0x5d, 0x46, 0x24, 0x8f, 0x11, 0xb4, 0x08, 0x43, 0xa6, 0x6a, 0x39, 0xf4, 0xea, 0xfe, 0x16, 0x1d, - 0x05, 0xd7, 0xf5, 0xf1, 0xc6, 0x95, 0x17, 0x18, 0x2c, 0xef, 0x65, 0xc0, 0xf4, 0x57, 0xca, 0xdf, - 0x49, 0x40, 0x0f, 0x17, 0xc6, 0x63, 0xd0, 0xcb, 0xc5, 0xca, 0xb5, 0xf3, 0xd8, 0x64, 0xe3, 0xc6, - 0x34, 0xe9, 0x6e, 0x20, 0x9c, 0x9e, 0xc0, 0x41, 0xc7, 0x21, 0x59, 0xda, 0x52, 0x35, 0xbd, 0xa8, - 0x95, 0x85, 0xd7, 0xfb, 0xea, 0xad, 0xf1, 0xde, 0x19, 0x52, 0x37, 0x3f, 0xab, 0xf4, 0xd2, 0xc6, - 0xf9, 0x32, 0xf1, 0x04, 0xb6, 0xb0, 0x56, 0xd9, 0x72, 0xf8, 0x0a, 0xe3, 0x25, 0x74, 0x01, 0x12, - 0x44, 0x21, 0xf8, 0xcb, 0xae, 0x6c, 0x43, 0xec, 0xe1, 0x06, 0x80, 0xf9, 0x24, 0xe9, 0xf8, 0x7d, - 0xdf, 0x18, 0x97, 0x14, 0x8a, 0x81, 0x66, 0x60, 0xa0, 0xaa, 0xda, 0x4e, 0x91, 0xee, 0x60, 0xa4, - 0xfb, 0x6e, 0x4a, 0xe2, 0x70, 0xa3, 0x40, 0xb8, 0x60, 0x39, 0xeb, 0x7d, 0x04, 0x8b, 0x55, 0x95, - 0xd1, 0x49, 0x48, 0x53, 0x22, 0x25, 0xa3, 0x56, 0xd3, 0x1c, 0xe6, 0x5b, 0xf5, 0x50, 0xb9, 0x0f, - 0x92, 0xfa, 0x19, 0x5a, 0x4d, 0x3d, 0xac, 0x23, 0x90, 0xa2, 0x4f, 0x49, 0x28, 0x08, 0xbb, 0x36, - 0x99, 0x24, 0x15, 0xb4, 0xf1, 0x04, 0x0c, 0x79, 0xf6, 0x91, 0x81, 0x24, 0x19, 0x15, 0xaf, 0x9a, - 0x02, 0x3e, 0x08, 0xa3, 0x3a, 0xde, 0xa1, 0x17, 0x39, 0x03, 0xd0, 0x29, 0x0a, 0x8d, 0x48, 0xdb, - 0xd5, 0x20, 0xc6, 0xbd, 0x30, 0x58, 0x12, 0xc2, 0x67, 0xb0, 0x40, 0x61, 0x07, 0xdc, 0x5a, 0x0a, - 0x76, 0x18, 0x92, 0xaa, 0x69, 0x32, 0x80, 0x3e, 0x6e, 0x1f, 0x4d, 0x93, 0x36, 0x9d, 0x82, 0x61, - 0x3a, 0x46, 0x0b, 0xdb, 0xf5, 0xaa, 0xc3, 0x89, 0xf4, 0x53, 0x98, 0x21, 0xd2, 0xa0, 0xb0, 0x7a, - 0x0a, 0x7b, 0x37, 0x0c, 0xe0, 0x6b, 0x5a, 0x19, 0xeb, 0x25, 0xcc, 0xe0, 0x06, 0x28, 0x5c, 0xbf, - 0xa8, 0xa4, 0x40, 0xf7, 0x81, 0x6b, 0xf7, 0x8a, 0xc2, 0x26, 0x0f, 0x32, 0x7a, 0xa2, 0x3e, 0xc7, - 0xaa, 0xe5, 0x0c, 0x24, 0x66, 0x55, 0x47, 0x25, 0x0e, 0x86, 0xb3, 0xc3, 0x36, 0x9a, 0x7e, 0x85, - 0xfc, 0x2b, 0x7f, 0x37, 0x06, 0x89, 0xab, 0x86, 0x83, 0xd1, 0xc3, 0x3e, 0x07, 0x70, 0xb0, 0x99, - 0x3e, 0xaf, 0x6a, 0x15, 0x1d, 0x97, 0x17, 0xed, 0x8a, 0xef, 0x3d, 0xb7, 0xa7, 0x4e, 0xb1, 0x80, - 0x3a, 0x8d, 0x42, 0xb7, 0x65, 0xd4, 0xf5, 0xb2, 0xb8, 0x71, 0x48, 0x0b, 0xa8, 0x00, 0x49, 0x57, - 0x4b, 0x12, 0x51, 0x5a, 0x32, 0x44, 0xb4, 0x84, 0xe8, 0x30, 0xaf, 0x50, 0x7a, 0x37, 0xb8, 0xb2, - 0xe4, 0x21, 0xe5, 0x1a, 0x2f, 0xae, 0x6d, 0xed, 0x29, 0xac, 0x87, 0x46, 0x36, 0x13, 0x77, 0xee, - 0x5d, 0xe1, 0x31, 0x8d, 0x4b, 0xbb, 0x0d, 0x5c, 0x7a, 0x01, 0xb5, 0xe2, 0x6f, 0xcb, 0x7b, 0xe9, - 0xb8, 0x3c, 0xb5, 0x62, 0xef, 0xcb, 0x8f, 0x42, 0xca, 0xd6, 0x2a, 0xba, 0xea, 0xd4, 0x2d, 0xcc, - 0x35, 0xcf, 0xab, 0x90, 0xbf, 0x20, 0x41, 0x0f, 0xd3, 0x64, 0x9f, 0xdc, 0xa4, 0xe6, 0x72, 0x8b, - 0xb5, 0x92, 0x5b, 0x7c, 0xff, 0x72, 0xcb, 0x01, 0xb8, 0xcc, 0xd8, 0xfc, 0x6d, 0x70, 0x13, 0x8f, - 0x81, 0xb1, 0xb8, 0xaa, 0x55, 0xf8, 0x42, 0xf5, 0x21, 0xc9, 0xff, 0x51, 0x22, 0x4e, 0x2c, 0x6f, - 0x47, 0x39, 0x18, 0x10, 0x7c, 0x15, 0x37, 0xab, 0x6a, 0x85, 0xeb, 0xce, 0xb1, 0x96, 0xcc, 0x5d, - 0xae, 0xaa, 0x15, 0xa5, 0x8f, 0xf3, 0x43, 0x0a, 0xcd, 0xe7, 0x21, 0xd6, 0x62, 0x1e, 0x02, 0x13, - 0x1f, 0xdf, 0xdf, 0xc4, 0x07, 0xa6, 0x28, 0x11, 0x9e, 0xa2, 0xcf, 0xc6, 0x68, 0x30, 0x63, 0x1a, - 0xb6, 0x5a, 0x7d, 0x23, 0x56, 0xc4, 0x11, 0x48, 0x99, 0x46, 0xb5, 0xc8, 0x5a, 0xd8, 0x4d, 0xdc, - 0xa4, 0x69, 0x54, 0x95, 0x86, 0x69, 0xef, 0xbe, 0x4d, 0xcb, 0xa5, 0xe7, 0x36, 0x48, 0xad, 0x37, - 0x2c, 0x35, 0x0b, 0xfa, 0x99, 0x28, 0xf8, 0x5e, 0xf6, 0x20, 0x91, 0x01, 0xdd, 0x1c, 0xa5, 0xc6, - 0xbd, 0x97, 0xb1, 0xcd, 0x20, 0x15, 0x0e, 0x47, 0x30, 0x98, 0xe9, 0x6f, 0x16, 0x05, 0xfb, 0xd5, - 0x52, 0xe1, 0x70, 0xf2, 0xaf, 0x49, 0x00, 0x0b, 0x44, 0xb2, 0x74, 0xbc, 0x64, 0x17, 0xb2, 0x29, - 0x0b, 0xc5, 0x40, 0xcf, 0x63, 0xad, 0x26, 0x8d, 0xf7, 0xdf, 0x6f, 0xfb, 0xf9, 0x9e, 0x81, 0x01, - 0x4f, 0x19, 0x6d, 0x2c, 0x98, 0x19, 0xdb, 0xc3, 0xab, 0x5e, 0xc5, 0x8e, 0xd2, 0x7f, 0xcd, 0x57, - 0x92, 0xff, 0x50, 0x82, 0x14, 0xe5, 0x69, 0x11, 0x3b, 0x6a, 0x60, 0x0e, 0xa5, 0xfd, 0xcf, 0xe1, - 0x31, 0x00, 0x46, 0xc6, 0xd6, 0x6e, 0x60, 0xae, 0x59, 0x29, 0x5a, 0xb3, 0xaa, 0xdd, 0xc0, 0xe8, - 0x9c, 0x2b, 0xf0, 0xf8, 0xde, 0x02, 0x17, 0x5e, 0x37, 0x17, 0xfb, 0x21, 0xe8, 0xa5, 0x9f, 0xc8, - 0xd9, 0xb1, 0xb9, 0x23, 0xdd, 0xa3, 0xd7, 0x6b, 0x6b, 0x3b, 0xb6, 0xfc, 0x1c, 0xf4, 0xae, 0xed, - 0xb0, 0xdc, 0xc8, 0x11, 0x48, 0x59, 0x86, 0xc1, 0xf7, 0x64, 0xe6, 0x0b, 0x25, 0x49, 0x05, 0xdd, - 0x82, 0x44, 0x3e, 0x20, 0xe6, 0xe5, 0x03, 0xbc, 0x84, 0x46, 0xbc, 0xad, 0x84, 0xc6, 0xa9, 0xaf, - 0x49, 0xd0, 0xe7, 0xb3, 0x0f, 0xe8, 0x21, 0x38, 0x90, 0x5f, 0x58, 0x9e, 0x79, 0xb2, 0x38, 0x3f, - 0x5b, 0xbc, 0xbc, 0x90, 0x9b, 0xf3, 0xde, 0x9a, 0x64, 0x0f, 0xbe, 0x74, 0x73, 0x02, 0xf9, 0x60, - 0xd7, 0xf5, 0x6d, 0xdd, 0xb8, 0xae, 0xa3, 0x29, 0x18, 0x0d, 0xa2, 0xe4, 0xf2, 0xab, 0x85, 0xa5, - 0xb5, 0xb4, 0x94, 0x3d, 0xf0, 0xd2, 0xcd, 0x89, 0x61, 0x1f, 0x46, 0x6e, 0xc3, 0xc6, 0xba, 0xd3, - 0x88, 0x30, 0xb3, 0xbc, 0xb8, 0x38, 0xbf, 0x96, 0x8e, 0x35, 0x20, 0x70, 0x83, 0x7d, 0x1f, 0x0c, - 0x07, 0x11, 0x96, 0xe6, 0x17, 0xd2, 0xf1, 0x2c, 0x7a, 0xe9, 0xe6, 0xc4, 0xa0, 0x0f, 0x7a, 0x49, - 0xab, 0x66, 0x93, 0x2f, 0x7e, 0x7c, 0xac, 0xeb, 0x53, 0x9f, 0x18, 0x93, 0xc8, 0xc8, 0x06, 0x02, - 0x36, 0x02, 0x3d, 0x00, 0x87, 0x56, 0xe7, 0xe7, 0x96, 0x0a, 0xb3, 0xc5, 0xc5, 0xd5, 0xb9, 0x22, - 0xfb, 0xc8, 0x86, 0x3b, 0xba, 0xa1, 0x97, 0x6e, 0x4e, 0xf4, 0xf1, 0x21, 0xb5, 0x82, 0x5e, 0x51, - 0x0a, 0x57, 0x97, 0xd7, 0x0a, 0x69, 0x89, 0x41, 0xaf, 0x58, 0xf8, 0x9a, 0xe1, 0xb0, 0x6f, 0x68, - 0x3d, 0x08, 0x87, 0x9b, 0x40, 0xbb, 0x03, 0x1b, 0x7e, 0xe9, 0xe6, 0xc4, 0xc0, 0x8a, 0x85, 0xd9, - 0xfa, 0xa1, 0x18, 0x93, 0x90, 0x69, 0xc4, 0x58, 0x5e, 0x59, 0x5e, 0xcd, 0x2d, 0xa4, 0x27, 0xb2, - 0xe9, 0x97, 0x6e, 0x4e, 0xf4, 0x0b, 0x63, 0x48, 0xe0, 0xbd, 0x91, 0xdd, 0xc9, 0x88, 0xe7, 0x3b, - 0x53, 0x70, 0xcc, 0x76, 0xd4, 0x6d, 0x4d, 0xaf, 0xb8, 0x19, 0x67, 0x5e, 0xe6, 0x21, 0xcf, 0xb1, - 0xaa, 0xf6, 0x7c, 0x5d, 0x2b, 0x8b, 0x4a, 0xf1, 0x77, 0xcf, 0xf4, 0x73, 0xb6, 0xf5, 0xc9, 0x52, - 0x36, 0x22, 0xbb, 0x1a, 0x1d, 0x3a, 0xb5, 0x3e, 0xaa, 0xc8, 0x46, 0x24, 0xd0, 0xb3, 0x7b, 0x06, - 0x77, 0xf2, 0xfb, 0x24, 0x18, 0xbc, 0xa2, 0xd9, 0x8e, 0x61, 0x69, 0x25, 0xb5, 0x4a, 0x5f, 0x98, - 0x9c, 0x6b, 0xd7, 0xb6, 0x86, 0x96, 0xfa, 0x65, 0xe8, 0xb9, 0xa6, 0x56, 0x99, 0x51, 0x63, 0x8f, - 0x78, 0xf6, 0x94, 0xa2, 0x67, 0xe1, 0x04, 0x1d, 0x86, 0x2d, 0xff, 0x4e, 0x0c, 0x86, 0xe8, 0x9a, - 0xb0, 0xd9, 0x97, 0x90, 0x48, 0xa8, 0x95, 0x87, 0x84, 0xa5, 0x3a, 0x3c, 0x77, 0x98, 0x9f, 0xe4, - 0xf9, 0xf0, 0xe3, 0xd1, 0x39, 0xee, 0xc9, 0x59, 0x5c, 0x52, 0x28, 0x2e, 0xfa, 0xff, 0x20, 0x59, - 0x53, 0x77, 0x8a, 0x94, 0x0e, 0x0b, 0x60, 0x72, 0x9d, 0xd1, 0x79, 0xed, 0xd6, 0xf8, 0xd0, 0xae, - 0x5a, 0xab, 0x4e, 0xcb, 0x82, 0x8e, 0xac, 0xf4, 0xd6, 0xd4, 0x1d, 0xc2, 0x22, 0x32, 0x61, 0x88, - 0xd4, 0x96, 0xb6, 0x54, 0xbd, 0x82, 0x59, 0x27, 0x34, 0x13, 0x9a, 0xbf, 0xd2, 0x71, 0x27, 0x07, - 0xbd, 0x4e, 0x7c, 0xe4, 0x64, 0x65, 0xa0, 0xa6, 0xee, 0xcc, 0xd0, 0x0a, 0xd2, 0xe3, 0x74, 0xf2, - 0x83, 0x1f, 0x1d, 0xef, 0xa2, 0x67, 0x0c, 0x5f, 0x97, 0x00, 0x3c, 0x89, 0xa1, 0x12, 0xa4, 0x4b, - 0x6e, 0x89, 0xe2, 0xda, 0x7c, 0x2a, 0x27, 0x23, 0xa6, 0x24, 0x24, 0x76, 0xb6, 0x53, 0x7f, 0xe5, - 0xd6, 0xb8, 0xa4, 0x0c, 0x95, 0x42, 0x33, 0xf2, 0x33, 0xd0, 0x57, 0x37, 0xcb, 0xaa, 0x83, 0x8b, - 0x34, 0xaa, 0x8b, 0x45, 0xee, 0xfa, 0x63, 0x84, 0xd6, 0x6b, 0xb7, 0xc6, 0x11, 0x1b, 0x9d, 0x0f, - 0x59, 0xa6, 0xbe, 0x00, 0xb0, 0x1a, 0x82, 0xe0, 0x1b, 0xda, 0x1f, 0x4b, 0xd0, 0x37, 0xeb, 0xbb, - 0xf7, 0x95, 0x81, 0xde, 0x9a, 0xa1, 0x6b, 0xdb, 0x5c, 0x3b, 0x53, 0x8a, 0x28, 0xa2, 0x2c, 0x24, - 0xd9, 0x13, 0x3c, 0x67, 0x57, 0x24, 0x46, 0x45, 0x99, 0x60, 0x5d, 0xc7, 0x1b, 0xb6, 0x26, 0x26, - 0x45, 0x11, 0x45, 0x74, 0x19, 0xd2, 0x36, 0x2e, 0xd5, 0x2d, 0xcd, 0xd9, 0x2d, 0x96, 0x0c, 0xdd, - 0x51, 0x4b, 0x0e, 0x7b, 0xcc, 0x95, 0x3f, 0xf2, 0xda, 0xad, 0xf1, 0x43, 0x8c, 0xd7, 0x30, 0x84, - 0xac, 0x0c, 0x89, 0xaa, 0x19, 0x56, 0x43, 0x7a, 0x28, 0x63, 0x47, 0xd5, 0xaa, 0x76, 0x86, 0x9d, - 0x9a, 0x89, 0xa2, 0x6f, 0x2c, 0x5f, 0xec, 0xf5, 0xa7, 0xb9, 0x2e, 0x43, 0xda, 0x30, 0xb1, 0x15, - 0x70, 0x4b, 0xa5, 0x70, 0xcf, 0x61, 0x08, 0x59, 0x19, 0x12, 0x55, 0xc2, 0x65, 0x75, 0xc8, 0x6c, - 0x8b, 0xb0, 0xd1, 0xac, 0x6f, 0x78, 0xd9, 0xb1, 0xd1, 0x86, 0xd9, 0xc8, 0xe9, 0xbb, 0xf9, 0x87, - 0x3d, 0xea, 0x61, 0x3c, 0xf9, 0xcb, 0x9f, 0x3b, 0x3d, 0xca, 0x8d, 0x8b, 0x97, 0xad, 0x7a, 0x12, - 0xef, 0x92, 0xe9, 0xe7, 0xa0, 0x2b, 0x14, 0x92, 0x38, 0xa1, 0xcf, 0xa9, 0x5a, 0x55, 0x3c, 0x4a, - 0x56, 0x78, 0x09, 0xe5, 0xa0, 0xc7, 0x76, 0x54, 0xa7, 0x6e, 0xf3, 0x4f, 0x80, 0xdd, 0x17, 0xa1, - 0x71, 0x79, 0x43, 0x2f, 0xaf, 0x52, 0x04, 0x85, 0x23, 0x12, 0x3b, 0xe2, 0x18, 0xdb, 0x58, 0xe7, - 0x92, 0xec, 0x68, 0xb5, 0xd3, 0xb3, 0x3c, 0x86, 0x4d, 0x04, 0x53, 0xc6, 0x55, 0x5c, 0x61, 0xbe, - 0xd6, 0x96, 0x4a, 0x42, 0x12, 0xfa, 0x41, 0xb0, 0xfc, 0x7c, 0xc7, 0x4b, 0x92, 0x0b, 0x2c, 0x4c, - 0x4f, 0x56, 0x86, 0xdc, 0xaa, 0x55, 0x5a, 0x83, 0x94, 0xc0, 0x3d, 0x45, 0xfe, 0xd5, 0xbc, 0x53, - 0x11, 0x52, 0xf0, 0x69, 0xb8, 0xc8, 0x5d, 0xf8, 0x2f, 0x3b, 0x5e, 0x86, 0x74, 0x5d, 0xdf, 0x30, - 0x74, 0xfa, 0x8e, 0x90, 0xfb, 0xfe, 0x24, 0xf6, 0x8b, 0xfb, 0x55, 0x25, 0x0c, 0x21, 0x2b, 0x43, - 0x6e, 0xd5, 0x15, 0x16, 0x21, 0x94, 0x61, 0xd0, 0x83, 0xa2, 0xcb, 0x36, 0x15, 0xb9, 0x6c, 0xef, - 0xe2, 0xcb, 0xf6, 0x40, 0xb8, 0x17, 0x6f, 0xe5, 0x0e, 0xb8, 0x95, 0x04, 0x0d, 0x2d, 0x03, 0x78, - 0xc6, 0x82, 0xe6, 0x30, 0xfa, 0x22, 0xd5, 0xc0, 0x33, 0x3c, 0x22, 0x24, 0xf4, 0x48, 0xa0, 0xb7, - 0xc3, 0x48, 0x4d, 0xd3, 0x8b, 0x36, 0xae, 0x6e, 0x16, 0xb9, 0xb8, 0x09, 0x65, 0xfa, 0x39, 0x98, - 0xfc, 0x42, 0x67, 0xda, 0xf1, 0xda, 0xad, 0xf1, 0x2c, 0x37, 0xaf, 0x8d, 0x24, 0x65, 0x65, 0xb8, - 0xa6, 0xe9, 0xab, 0xb8, 0xba, 0x39, 0xeb, 0xd6, 0x4d, 0xf7, 0xbf, 0xf8, 0xd1, 0xf1, 0x2e, 0xbe, - 0x86, 0xbb, 0xe4, 0x73, 0x34, 0xbd, 0xce, 0xd7, 0x1e, 0xb6, 0x49, 0xd8, 0xa2, 0x8a, 0x02, 0x4d, - 0x7a, 0xa4, 0x14, 0xaf, 0x82, 0xad, 0xfd, 0x17, 0xfe, 0xc3, 0x84, 0x24, 0xff, 0x96, 0x04, 0x3d, - 0xb3, 0x57, 0x57, 0x54, 0xcd, 0x42, 0xf3, 0x30, 0xec, 0xe9, 0x51, 0x70, 0xe5, 0x1f, 0x7d, 0xed, - 0xd6, 0x78, 0x26, 0xac, 0x6a, 0xee, 0xd2, 0xf7, 0xd4, 0x59, 0xac, 0xfd, 0xf9, 0x56, 0xb1, 0x6d, - 0x80, 0x54, 0x03, 0x88, 0xdc, 0x18, 0xf9, 0x86, 0x86, 0xb9, 0x00, 0xbd, 0x8c, 0x5b, 0xfa, 0xf1, - 0x0b, 0x93, 0xfc, 0xc3, 0xcf, 0x0e, 0xee, 0x8d, 0x52, 0x65, 0x8a, 0xe6, 0xa6, 0x3c, 0x09, 0xa6, - 0xfc, 0xfe, 0x18, 0xc0, 0xec, 0xd5, 0xab, 0x6b, 0x96, 0x66, 0x56, 0xb1, 0x73, 0x3b, 0x05, 0xb0, - 0x06, 0x07, 0x7c, 0xf1, 0x94, 0x55, 0x0a, 0x09, 0x61, 0xe2, 0xb5, 0x5b, 0xe3, 0x47, 0xc3, 0x42, - 0xf0, 0x81, 0xc9, 0xca, 0x88, 0x17, 0x59, 0x59, 0xa5, 0xa6, 0x54, 0xcb, 0xb6, 0xe3, 0x52, 0x8d, - 0xb7, 0xa6, 0xea, 0x03, 0xf3, 0x53, 0x9d, 0xb5, 0x9d, 0xe6, 0x12, 0x7e, 0x16, 0xfa, 0x3c, 0x91, - 0xd8, 0xe8, 0x49, 0x48, 0x3a, 0xfc, 0x7f, 0x2e, 0xe8, 0xfb, 0x22, 0x05, 0x2d, 0xb0, 0xb9, 0xb0, - 0x5d, 0x02, 0xf2, 0x5f, 0x49, 0x00, 0x9e, 0x06, 0xff, 0x74, 0x2a, 0x1c, 0x31, 0xf3, 0xdc, 0x28, - 0xc7, 0xf7, 0xe5, 0xd4, 0x71, 0xec, 0x90, 0x58, 0x3f, 0x10, 0x83, 0x91, 0x75, 0x61, 0x8e, 0x7e, - 0xea, 0x65, 0xf0, 0x34, 0xf4, 0x62, 0xdd, 0xb1, 0x34, 0x2a, 0x04, 0x32, 0xe9, 0xe7, 0x23, 0x26, - 0xbd, 0xc9, 0xd0, 0xe8, 0x47, 0x72, 0x44, 0xb2, 0x9e, 0x53, 0x0b, 0x09, 0xe5, 0xbd, 0x71, 0xc8, - 0xb4, 0xc2, 0x44, 0x33, 0x30, 0x54, 0xb2, 0x30, 0xad, 0x28, 0xfa, 0x33, 0x86, 0xf9, 0xac, 0xe7, - 0x8a, 0x86, 0x00, 0x64, 0x65, 0x50, 0xd4, 0xf0, 0x9d, 0xa5, 0x02, 0xc4, 0x41, 0x24, 0xda, 0x47, - 0xa0, 0xda, 0xf4, 0x08, 0x65, 0xbe, 0xb5, 0x88, 0x4e, 0x82, 0x04, 0xd8, 0xde, 0x32, 0xe8, 0xd5, - 0xd2, 0xcd, 0xe5, 0x79, 0x18, 0xd2, 0x74, 0xcd, 0xd1, 0xd4, 0x6a, 0x71, 0x43, 0xad, 0xaa, 0x7a, - 0x69, 0x3f, 0x6e, 0x36, 0xdb, 0x07, 0x78, 0xb7, 0x21, 0x72, 0xb2, 0x32, 0xc8, 0x6b, 0xf2, 0xac, - 0x02, 0x5d, 0x81, 0x5e, 0xd1, 0x55, 0x62, 0x5f, 0x0e, 0x89, 0x40, 0xf7, 0xb9, 0x82, 0xef, 0x89, - 0xc3, 0xb0, 0x82, 0xcb, 0xff, 0x6f, 0x2a, 0x3a, 0x9b, 0x8a, 0x45, 0x00, 0xb6, 0xea, 0x89, 0xb9, - 0xdd, 0xc7, 0x6c, 0x10, 0xbb, 0x91, 0x62, 0x14, 0x66, 0x6d, 0xc7, 0x37, 0x1f, 0xff, 0x29, 0x06, - 0xfd, 0xfe, 0xf9, 0xf8, 0x5b, 0xba, 0x47, 0xa1, 0x15, 0xcf, 0x20, 0xb1, 0xec, 0xfd, 0x83, 0x11, - 0x06, 0xa9, 0x41, 0x89, 0xf7, 0xb6, 0x44, 0xaf, 0xc5, 0xa0, 0x67, 0x45, 0xb5, 0xd4, 0x9a, 0x8d, - 0x9e, 0x68, 0x70, 0x46, 0x45, 0xf6, 0xb2, 0xe1, 0xfb, 0xd0, 0x3c, 0x59, 0xc2, 0xc2, 0xd1, 0x0f, - 0x36, 0x71, 0x39, 0xef, 0x85, 0x41, 0x12, 0x2d, 0xfb, 0x2e, 0x3a, 0xc4, 0xe8, 0xf1, 0x2d, 0x89, - 0x98, 0xbd, 0x53, 0x36, 0x34, 0x0e, 0x7d, 0x04, 0xcc, 0x33, 0xb9, 0x04, 0x06, 0x6a, 0xea, 0x4e, - 0x81, 0xd5, 0xa0, 0xd3, 0x80, 0xb6, 0xdc, 0x64, 0x48, 0xd1, 0x93, 0x04, 0x81, 0x1b, 0xf6, 0x5a, - 0x04, 0xf8, 0x31, 0x00, 0xc2, 0x45, 0x91, 0xdd, 0x10, 0x64, 0x71, 0x5f, 0x8a, 0xd4, 0xcc, 0xd2, - 0x5b, 0x82, 0xdc, 0x6f, 0x0d, 0xc5, 0xe2, 0x3c, 0x06, 0x59, 0xe8, 0x38, 0x06, 0xf1, 0xf9, 0xad, - 0x21, 0x92, 0xcc, 0x6f, 0x0d, 0x06, 0xef, 0x3e, 0xe5, 0x7e, 0x45, 0x02, 0xe4, 0x59, 0x7d, 0x05, - 0xdb, 0x26, 0x09, 0xe6, 0x88, 0x9f, 0xee, 0xf3, 0xa6, 0xa5, 0xb6, 0xfc, 0x74, 0x8f, 0x8c, 0xf0, - 0xd3, 0x7d, 0x6b, 0xe6, 0x51, 0xcf, 0x50, 0xc6, 0xf8, 0x54, 0x36, 0xb9, 0xbc, 0x39, 0x39, 0x63, - 0x68, 0x02, 0xbb, 0xc1, 0x32, 0x76, 0xc9, 0x7f, 0x26, 0xc1, 0xe1, 0x06, 0xa5, 0x72, 0x79, 0xc6, - 0x80, 0x2c, 0x5f, 0x23, 0xff, 0x62, 0x1c, 0xe3, 0x7d, 0xbf, 0xaa, 0x3a, 0x6c, 0x35, 0x18, 0xe2, - 0xdb, 0x67, 0xf2, 0xd9, 0x25, 0xd0, 0x7f, 0x25, 0xc1, 0xa8, 0xbf, 0x7b, 0x77, 0x3c, 0xeb, 0xd0, - 0xef, 0xef, 0x9d, 0x8f, 0xe4, 0xfe, 0x0e, 0x46, 0xc2, 0x07, 0x11, 0x20, 0x83, 0x9e, 0xf1, 0x96, - 0x31, 0xcb, 0xc5, 0x5d, 0xe8, 0x54, 0x36, 0x82, 0xc3, 0xf0, 0x72, 0x4e, 0xd0, 0x49, 0xfa, 0x3f, - 0x12, 0x24, 0x56, 0x0c, 0xa3, 0x8a, 0x0c, 0x18, 0xd6, 0x0d, 0xa7, 0x48, 0x74, 0x1e, 0x97, 0x8b, - 0x3c, 0x6c, 0x67, 0x66, 0x72, 0xa6, 0x33, 0x91, 0x7d, 0xef, 0xd6, 0x78, 0x23, 0x29, 0x65, 0x48, - 0x37, 0x9c, 0x3c, 0xad, 0x59, 0x63, 0x41, 0xfd, 0xdb, 0x61, 0x20, 0xd8, 0x19, 0x33, 0xa2, 0x4f, - 0x77, 0xdc, 0x59, 0x90, 0xcc, 0x6b, 0xb7, 0xc6, 0x47, 0xd9, 0xf2, 0x0a, 0x54, 0xcb, 0x4a, 0xff, - 0x86, 0xaf, 0x77, 0x76, 0x6b, 0xec, 0x07, 0x64, 0x46, 0xdf, 0x2d, 0xc1, 0x08, 0xad, 0xd4, 0x6e, - 0x60, 0x1a, 0xf9, 0x2b, 0xb8, 0x64, 0x58, 0x65, 0x34, 0x08, 0x31, 0x7e, 0x0e, 0x93, 0x50, 0x62, - 0x5a, 0x19, 0x8d, 0x42, 0xb7, 0x71, 0x5d, 0xe7, 0x97, 0x38, 0x52, 0x0a, 0x2b, 0x50, 0x7b, 0x65, - 0x94, 0xeb, 0x55, 0x5c, 0x54, 0x4b, 0x25, 0x7a, 0x8f, 0x98, 0xa5, 0xa5, 0x06, 0x58, 0x6d, 0x8e, - 0x55, 0x92, 0xe0, 0xd2, 0x35, 0x69, 0xfc, 0x13, 0x43, 0x5e, 0x05, 0x53, 0xad, 0x53, 0x9f, 0x97, - 0x00, 0xbc, 0x24, 0x0a, 0x7a, 0x00, 0x0e, 0xe5, 0x97, 0x97, 0x66, 0x8b, 0xab, 0x6b, 0xb9, 0xb5, - 0xf5, 0xd5, 0xe2, 0xfa, 0xd2, 0xea, 0x4a, 0x61, 0x66, 0xfe, 0xf2, 0x7c, 0x61, 0xd6, 0x4b, 0xff, - 0xdb, 0x26, 0x2e, 0x69, 0x9b, 0x1a, 0x2e, 0xa3, 0xe3, 0x30, 0x1a, 0x84, 0x26, 0xa5, 0xc2, 0x6c, - 0x5a, 0xca, 0xf6, 0xbf, 0x74, 0x73, 0x22, 0xc9, 0x7c, 0x46, 0x5c, 0x46, 0x27, 0xe1, 0x40, 0x23, - 0xdc, 0xfc, 0xd2, 0x5c, 0x3a, 0x96, 0x1d, 0x78, 0xe9, 0xe6, 0x44, 0xca, 0x75, 0x2e, 0x91, 0x0c, - 0xc8, 0x0f, 0xc9, 0xe9, 0xc5, 0xb3, 0xf0, 0xd2, 0xcd, 0x89, 0x1e, 0x36, 0x93, 0xd9, 0xc4, 0x8b, - 0x1f, 0x1f, 0xeb, 0xca, 0xbf, 0xa5, 0x65, 0x82, 0xff, 0x92, 0x6f, 0x12, 0xb5, 0xe7, 0xab, 0x75, - 0x62, 0xd2, 0x34, 0xbd, 0x34, 0xc5, 0x54, 0x58, 0x73, 0x76, 0x4f, 0x73, 0xf5, 0x3d, 0xcd, 0xc4, - 0x35, 0xb5, 0x23, 0xd2, 0xf7, 0xa1, 0x44, 0xff, 0x9f, 0xde, 0x05, 0x99, 0x70, 0xa2, 0xdf, 0xd9, - 0x69, 0x2f, 0xc7, 0xbf, 0x47, 0x36, 0x3f, 0x32, 0x5b, 0xdf, 0xe2, 0x7c, 0x60, 0xff, 0x39, 0xfc, - 0xbd, 0x8f, 0x2b, 0xe4, 0x7f, 0x9f, 0x00, 0xb4, 0x68, 0x57, 0x66, 0x88, 0x23, 0xe8, 0xbb, 0x8e, - 0x16, 0x4a, 0x45, 0x49, 0xb7, 0x23, 0x15, 0xb5, 0x16, 0x48, 0xee, 0xc4, 0xf6, 0x95, 0x55, 0x6e, - 0x3b, 0xc3, 0x13, 0x7f, 0x43, 0x32, 0x3c, 0xcd, 0x7d, 0xbd, 0xc4, 0xed, 0x8b, 0x0d, 0xbb, 0xf7, - 0x1b, 0x1f, 0xf3, 0x6c, 0x6e, 0xcf, 0x1e, 0xd9, 0xdc, 0x4c, 0xcb, 0x94, 0x2d, 0xc7, 0x46, 0x67, - 0xc5, 0x63, 0xa4, 0xde, 0xf6, 0xf6, 0x64, 0xfe, 0x5a, 0x29, 0xf9, 0xa2, 0xd8, 0x91, 0x8f, 0x42, - 0xb6, 0x51, 0xb9, 0xc4, 0xfe, 0x20, 0xbf, 0x1c, 0x87, 0xf4, 0xa2, 0x5d, 0x29, 0x94, 0x35, 0xe7, - 0xce, 0x6a, 0xde, 0xa5, 0xd6, 0x61, 0x37, 0x7a, 0xed, 0xd6, 0xf8, 0x20, 0x13, 0xed, 0x1e, 0x02, - 0xad, 0xc1, 0x50, 0xd8, 0x15, 0x63, 0x0a, 0x36, 0xbb, 0x9f, 0xd3, 0x99, 0x06, 0x17, 0x6c, 0x30, - 0x78, 0x42, 0x82, 0x76, 0x9a, 0xeb, 0x34, 0xd3, 0xab, 0x2b, 0x77, 0x32, 0x63, 0xe9, 0x4d, 0x5d, - 0x16, 0x32, 0xe1, 0xb9, 0x71, 0x27, 0xee, 0x3b, 0x12, 0xf4, 0x2d, 0xda, 0x22, 0x1d, 0x80, 0x7f, - 0x4a, 0x33, 0x24, 0xe7, 0xdd, 0x97, 0x36, 0xf1, 0xf6, 0xd4, 0x57, 0xbc, 0xbe, 0xf1, 0x84, 0x70, - 0x00, 0x46, 0x7c, 0xe3, 0x74, 0xc7, 0xff, 0x27, 0x31, 0x6a, 0x34, 0xf3, 0xb8, 0xa2, 0xe9, 0xae, - 0xfb, 0x83, 0xff, 0xb6, 0x06, 0x7e, 0x9e, 0x9c, 0x13, 0xfb, 0x95, 0xf3, 0x36, 0xb5, 0x13, 0x21, - 0x79, 0xba, 0x9e, 0xee, 0x62, 0x63, 0x5a, 0x42, 0xea, 0xe0, 0xa6, 0x50, 0x28, 0xf9, 0x20, 0x7f, - 0x57, 0x82, 0x81, 0x45, 0xbb, 0xb2, 0xae, 0x97, 0xff, 0xc6, 0xeb, 0xef, 0x26, 0x1c, 0x08, 0x8c, - 0xf4, 0x4e, 0x89, 0xf4, 0x0f, 0x63, 0x30, 0xbc, 0x68, 0x57, 0x02, 0x5e, 0xad, 0xfd, 0x37, 0x4c, - 0xac, 0x64, 0xf5, 0x38, 0x7c, 0x80, 0x65, 0x76, 0x88, 0x57, 0x64, 0xfe, 0x79, 0x22, 0xbc, 0x7a, - 0x9a, 0x82, 0xc9, 0xca, 0x88, 0x5b, 0x4f, 0x05, 0xb4, 0x4c, 0x6a, 0x7d, 0x93, 0xb5, 0x06, 0x87, - 0x1b, 0x64, 0xe8, 0x4e, 0x98, 0xc7, 0xb5, 0xd4, 0x11, 0xd7, 0xf2, 0xa7, 0x24, 0x6a, 0xc8, 0xc9, - 0xb2, 0xc2, 0x35, 0x16, 0x8b, 0x6c, 0xba, 0x27, 0x8e, 0xb7, 0x71, 0x86, 0xce, 0x07, 0xde, 0x35, - 0xee, 0x4b, 0x5b, 0x65, 0x98, 0x68, 0xc5, 0xa9, 0x6b, 0x7a, 0x3f, 0x28, 0xc1, 0x18, 0x91, 0x92, - 0xa5, 0xea, 0xf6, 0x26, 0xb6, 0x9a, 0xc5, 0x51, 0xe7, 0x21, 0x23, 0x04, 0xcd, 0xe5, 0x6f, 0xd1, - 0x86, 0xa2, 0x1b, 0x5d, 0xb9, 0xf3, 0xe8, 0x43, 0x63, 0xd7, 0xcf, 0x6d, 0x7a, 0x5d, 0x85, 0x47, - 0x5c, 0xbc, 0x44, 0xbf, 0x5b, 0x8b, 0xaf, 0xf3, 0xc9, 0xe6, 0x8f, 0xfe, 0x75, 0x7c, 0x3d, 0x3c, - 0x7f, 0x27, 0xe1, 0xf8, 0xde, 0x9c, 0x89, 0x41, 0x9c, 0x79, 0x6f, 0x12, 0xe2, 0x8b, 0x76, 0x05, - 0xfd, 0x2c, 0x0c, 0x85, 0x1d, 0xef, 0x87, 0x22, 0x3c, 0x9d, 0x46, 0x77, 0x2a, 0xfb, 0x68, 0xc7, - 0x28, 0xae, 0x56, 0xed, 0xc2, 0x40, 0xd0, 0xfb, 0x9a, 0x8a, 0xa6, 0x15, 0x40, 0xc8, 0x9e, 0xef, - 0x10, 0xc1, 0xed, 0xfa, 0x39, 0x48, 0xba, 0xfe, 0xc3, 0xa9, 0x68, 0x22, 0x02, 0x36, 0x7b, 0xa6, - 0x7d, 0x58, 0xb7, 0xaf, 0x9f, 0x85, 0xa1, 0xf0, 0x5e, 0xdd, 0x86, 0x9c, 0x43, 0x28, 0xed, 0xc8, - 0xb9, 0xd5, 0x0e, 0x66, 0x02, 0xf8, 0xb6, 0x9b, 0x07, 0xa2, 0x09, 0x79, 0xd0, 0xd9, 0x47, 0x3a, - 0x81, 0x76, 0x7b, 0x7c, 0x3b, 0x0c, 0x86, 0xac, 0xf1, 0x83, 0xd1, 0x74, 0x82, 0x18, 0xd9, 0x0b, - 0x9d, 0x62, 0xb8, 0xbd, 0xbf, 0x28, 0xb1, 0x9c, 0xb8, 0x58, 0xc7, 0xa8, 0x0d, 0x35, 0x69, 0xba, - 0xee, 0xb3, 0x97, 0xf6, 0x89, 0xe8, 0xb2, 0xf2, 0x71, 0x09, 0x8e, 0xec, 0x65, 0x2d, 0x1e, 0x6b, - 0x63, 0x90, 0xad, 0xd1, 0xb3, 0x85, 0xd7, 0x85, 0xee, 0xa6, 0xca, 0xde, 0x80, 0x8c, 0xc6, 0x37, - 0x62, 0x70, 0xca, 0x9f, 0x2b, 0x78, 0xbe, 0x8e, 0xad, 0x5d, 0x37, 0x2b, 0x60, 0xaa, 0x15, 0x4d, - 0xf7, 0xbf, 0xda, 0x3e, 0xec, 0x37, 0xdf, 0x14, 0x56, 0x8c, 0x49, 0x7e, 0x51, 0x82, 0xbe, 0x15, - 0xb5, 0x82, 0x15, 0xfc, 0x7c, 0x1d, 0xdb, 0x4e, 0x93, 0x67, 0xc3, 0x07, 0xa1, 0xc7, 0xd8, 0xdc, - 0x14, 0x97, 0x94, 0x13, 0x0a, 0x2f, 0xa1, 0x51, 0xe8, 0xae, 0x6a, 0x35, 0x8d, 0x6d, 0xbd, 0x09, - 0x85, 0x15, 0xd0, 0x38, 0xf4, 0xd1, 0xa4, 0x55, 0x91, 0x3d, 0xb8, 0x4a, 0x88, 0x4f, 0xfa, 0xd5, - 0x75, 0x67, 0x8d, 0xbe, 0xba, 0xca, 0x40, 0xaf, 0x85, 0xaf, 0x61, 0xcb, 0x66, 0x9f, 0x35, 0x4f, - 0x2a, 0xa2, 0x28, 0x5f, 0x82, 0x7e, 0xc6, 0x09, 0x9f, 0xed, 0xc3, 0x90, 0xa4, 0x4f, 0x67, 0x3c, - 0x7e, 0x7a, 0x49, 0xf9, 0x49, 0xf6, 0xf8, 0x98, 0xd1, 0x67, 0x2c, 0xb1, 0x42, 0x3e, 0xdf, 0x52, - 0xf0, 0x27, 0xa3, 0x63, 0x2c, 0x26, 0x43, 0x57, 0xc2, 0x7f, 0xd4, 0x0d, 0x07, 0x78, 0x7e, 0x47, - 0x35, 0xb5, 0xa9, 0x2d, 0xc7, 0x11, 0x1f, 0xc8, 0x00, 0xee, 0x54, 0xa9, 0xa6, 0x26, 0xef, 0x42, - 0xe2, 0x8a, 0xe3, 0x98, 0xe8, 0x14, 0x74, 0x5b, 0xf5, 0x2a, 0x16, 0x67, 0xf6, 0x6e, 0x8c, 0xae, - 0x9a, 0xda, 0x24, 0x01, 0x50, 0xea, 0x55, 0xac, 0x30, 0x10, 0x54, 0x80, 0xf1, 0xcd, 0x7a, 0xb5, - 0xba, 0x5b, 0x2c, 0x63, 0xfa, 0xfb, 0xab, 0xee, 0x4f, 0x9d, 0xe1, 0x1d, 0x53, 0xd5, 0xdd, 0x7c, - 0x4a, 0x52, 0x39, 0x4a, 0xc1, 0x66, 0x29, 0x94, 0xf8, 0x99, 0xb3, 0x82, 0x80, 0x91, 0xff, 0x3c, - 0x06, 0x49, 0x41, 0x9a, 0xbe, 0x06, 0xc6, 0x55, 0x5c, 0x72, 0x0c, 0x71, 0x1f, 0xce, 0x2d, 0x23, - 0x04, 0xf1, 0x0a, 0x9f, 0xbc, 0xd4, 0x95, 0x2e, 0x85, 0x14, 0x48, 0x9d, 0xfb, 0x46, 0x9b, 0xd4, - 0x99, 0x75, 0x32, 0x9f, 0x09, 0xd3, 0x10, 0xc7, 0x69, 0x57, 0xba, 0x14, 0x5a, 0x42, 0x19, 0xe8, - 0x21, 0xf6, 0xc8, 0x61, 0xb3, 0x45, 0xea, 0x79, 0x19, 0x1d, 0x84, 0x6e, 0x53, 0x75, 0x4a, 0xec, - 0xf9, 0x14, 0x69, 0x60, 0x45, 0xe2, 0x3c, 0xb0, 0x8f, 0xff, 0x84, 0x7f, 0xdc, 0x90, 0x08, 0x83, - 0x7d, 0x65, 0x99, 0xf0, 0xbd, 0xa2, 0x3a, 0x0e, 0xb6, 0x74, 0x42, 0x90, 0x81, 0x23, 0x04, 0x89, - 0x0d, 0xa3, 0xbc, 0xcb, 0x7f, 0x70, 0x91, 0xfe, 0xcf, 0x7f, 0x0a, 0x8e, 0xea, 0x43, 0x91, 0x36, - 0xb2, 0xdf, 0x99, 0xed, 0x17, 0x95, 0x79, 0x02, 0x54, 0x80, 0x11, 0xb5, 0x5c, 0xd6, 0x88, 0xc2, - 0xab, 0xd5, 0xe2, 0x86, 0x46, 0x53, 0x90, 0x36, 0xfd, 0x15, 0xe1, 0x56, 0x73, 0x81, 0x3c, 0x84, - 0x3c, 0x87, 0xcf, 0xa7, 0xa0, 0xd7, 0x64, 0x4c, 0xc9, 0x17, 0x61, 0xb8, 0x81, 0x53, 0xc2, 0xdf, - 0xb6, 0xa6, 0x97, 0xc5, 0xc3, 0x75, 0xf2, 0x3f, 0xa9, 0xa3, 0x5f, 0x4a, 0x67, 0x4e, 0x06, 0xfd, - 0x3f, 0xff, 0xce, 0xd6, 0x9f, 0x35, 0x18, 0xf4, 0x7d, 0xd6, 0x40, 0x35, 0xb5, 0x7c, 0x8a, 0xd2, - 0xe7, 0x5f, 0x33, 0xc8, 0xf1, 0x06, 0xf6, 0x25, 0x83, 0x49, 0xc3, 0xaa, 0x4c, 0x55, 0xb0, 0x2e, - 0xf2, 0x87, 0xa4, 0x49, 0x35, 0x35, 0x9b, 0xaa, 0xa3, 0xf7, 0xe5, 0x76, 0xfb, 0xa2, 0xef, 0x7f, - 0xfa, 0x91, 0x83, 0xc4, 0x5c, 0x6e, 0x65, 0xde, 0xd5, 0xe3, 0x2f, 0xc6, 0xe0, 0xa8, 0x4f, 0x8f, - 0x7d, 0xc0, 0x8d, 0xea, 0x9c, 0x6d, 0xae, 0xf1, 0x6d, 0x7c, 0xf7, 0xe4, 0x49, 0x48, 0x10, 0x78, - 0x14, 0xf1, 0x43, 0x6d, 0x99, 0x4f, 0x7f, 0xf9, 0x9f, 0xcb, 0xc1, 0x2c, 0x56, 0x60, 0x56, 0x28, - 0x91, 0xfc, 0xbb, 0xdb, 0x97, 0x5f, 0xda, 0xfb, 0x68, 0xbd, 0x7d, 0xfb, 0xc4, 0x18, 0x96, 0xe1, - 0xff, 0x9a, 0x83, 0x23, 0xe1, 0xcc, 0x2b, 0xb3, 0xa2, 0x6d, 0xa5, 0x90, 0x3b, 0xb0, 0xd4, 0xad, - 0xde, 0x7a, 0xef, 0x35, 0x83, 0x11, 0x59, 0xe1, 0xa8, 0xa4, 0xb2, 0xbc, 0x03, 0x07, 0x9f, 0x22, - 0x4c, 0x79, 0x07, 0xa4, 0x62, 0x2f, 0x38, 0xe8, 0x5e, 0xe2, 0x94, 0xb8, 0x0f, 0x2d, 0x6e, 0x66, - 0x82, 0xc7, 0x38, 0x0f, 0x11, 0x8e, 0x4f, 0xb6, 0xdc, 0x63, 0x26, 0x7d, 0xfb, 0x8b, 0xe2, 0xc3, - 0x94, 0x3f, 0x23, 0xc1, 0xa1, 0x86, 0xae, 0xb9, 0xf1, 0x5f, 0x6a, 0xf2, 0x5e, 0xbd, 0xd3, 0x9b, - 0xe4, 0xfe, 0x27, 0xec, 0x73, 0x4d, 0x78, 0x3e, 0x11, 0xc9, 0x33, 0x63, 0x26, 0xc0, 0xf4, 0xe3, - 0x70, 0x20, 0xc8, 0xb3, 0x90, 0xd6, 0xbd, 0x30, 0x18, 0x8c, 0x59, 0xb9, 0xd4, 0x06, 0x02, 0x51, - 0xab, 0xbc, 0x19, 0x16, 0xb7, 0x3b, 0xe4, 0x05, 0xff, 0x31, 0x0f, 0x8b, 0x0c, 0x3b, 0x1d, 0xb1, - 0x47, 0x40, 0x7e, 0xbf, 0x04, 0x13, 0xc1, 0x8e, 0xbc, 0xd4, 0xa0, 0xdd, 0x19, 0xcf, 0xb7, 0x6d, - 0xc2, 0x7f, 0x20, 0xc1, 0x5d, 0x7b, 0xf0, 0xc4, 0xe5, 0xf0, 0x73, 0x12, 0x8c, 0xfa, 0xce, 0x76, - 0x85, 0xa9, 0x17, 0x5a, 0xf0, 0x50, 0xdb, 0x67, 0xd3, 0xae, 0x47, 0x76, 0x84, 0x08, 0xe7, 0x95, - 0x6f, 0x8c, 0x8f, 0x34, 0xb6, 0xd9, 0xca, 0x48, 0xe3, 0x79, 0xec, 0x6d, 0x54, 0x97, 0x97, 0x25, - 0xb8, 0x2f, 0x38, 0xe4, 0x26, 0x37, 0xb0, 0x7e, 0x52, 0xf3, 0xf1, 0x4d, 0x09, 0x4e, 0xb5, 0xc3, - 0x1c, 0x9f, 0x18, 0x0d, 0x46, 0xbc, 0xab, 0x1a, 0xe1, 0x69, 0x39, 0xd3, 0xf9, 0x95, 0x35, 0xae, - 0xb4, 0xc8, 0x25, 0x7a, 0x07, 0xe4, 0x6f, 0xf2, 0xe5, 0xe6, 0x9f, 0x79, 0x57, 0xd6, 0xc1, 0x64, - 0x88, 0x90, 0x75, 0x20, 0x1d, 0xd2, 0x64, 0x4a, 0x62, 0x4d, 0xa6, 0xc4, 0x97, 0x3a, 0x78, 0x07, - 0x37, 0x6a, 0x4d, 0xae, 0x5a, 0x6c, 0xc0, 0x48, 0x13, 0xc5, 0xe6, 0x6b, 0xbd, 0x73, 0xbd, 0x56, - 0x50, 0xa3, 0xea, 0xca, 0xbb, 0x30, 0x4e, 0xbb, 0x6f, 0x22, 0xef, 0x3b, 0x3d, 0x72, 0x87, 0x5b, - 0x9c, 0xa6, 0x5d, 0x73, 0x11, 0xac, 0x40, 0x0f, 0x9b, 0x6e, 0x3e, 0xea, 0xfd, 0xab, 0x0d, 0xa7, - 0x23, 0x7f, 0x48, 0x18, 0xba, 0x59, 0xc1, 0x7d, 0xf3, 0x85, 0xd5, 0xce, 0x90, 0x6f, 0xd3, 0xc2, - 0xf2, 0xc9, 0xe4, 0xeb, 0xc2, 0xe4, 0x35, 0xe7, 0xce, 0x4d, 0xa0, 0xdc, 0x66, 0x8b, 0xc7, 0x44, - 0x74, 0x67, 0x4d, 0xdb, 0x27, 0x84, 0x69, 0x73, 0x87, 0x16, 0x61, 0xda, 0x7e, 0x32, 0x33, 0xe0, - 0x1a, 0xb9, 0x08, 0x36, 0xff, 0x1a, 0x1b, 0xb9, 0x1f, 0x48, 0x70, 0x98, 0x0e, 0xd1, 0x7f, 0x7f, - 0xa7, 0x53, 0xc9, 0x3f, 0x00, 0xc8, 0xb6, 0x4a, 0xc5, 0xa6, 0x4b, 0x3e, 0x6d, 0x5b, 0xa5, 0xab, - 0x81, 0x2d, 0xe8, 0x01, 0x40, 0x65, 0xdb, 0x09, 0x43, 0xb3, 0x84, 0x6a, 0xba, 0x6c, 0x3b, 0x57, - 0xf7, 0xd8, 0xb0, 0x12, 0xb7, 0x61, 0x56, 0xbf, 0x26, 0x41, 0xb6, 0xd9, 0x90, 0xdd, 0x24, 0xdd, - 0xc1, 0xc0, 0x05, 0xb1, 0xf0, 0x44, 0x3e, 0xdc, 0xc1, 0x45, 0xa8, 0xd0, 0xa2, 0x3a, 0x60, 0xe1, - 0x3b, 0xed, 0x31, 0x8c, 0x07, 0xf5, 0xb5, 0xd1, 0x33, 0xff, 0x89, 0x2d, 0xa6, 0x3f, 0x68, 0x30, - 0xb6, 0x7f, 0x9d, 0x7c, 0xf7, 0x1d, 0x18, 0x6b, 0xc1, 0xfc, 0x9d, 0xde, 0x1a, 0x8d, 0x96, 0x73, - 0x7a, 0x87, 0xdc, 0xff, 0x47, 0xf8, 0xf2, 0x08, 0x3e, 0xea, 0xf5, 0x45, 0x76, 0xcd, 0xbe, 0x0a, - 0x22, 0xff, 0xff, 0x70, 0xa4, 0x29, 0x16, 0x67, 0x31, 0x07, 0x89, 0x2d, 0xcd, 0x16, 0xc7, 0x56, - 0xa7, 0x23, 0xb8, 0x0b, 0x11, 0xa1, 0xa8, 0x32, 0x82, 0x34, 0xed, 0x61, 0xc5, 0x30, 0xaa, 0x9c, - 0x1b, 0x59, 0x81, 0x61, 0x5f, 0x1d, 0xef, 0xeb, 0x31, 0x48, 0x98, 0x06, 0xff, 0xf0, 0x5d, 0xdf, - 0x99, 0xbb, 0x23, 0xfa, 0x22, 0xa8, 0x5c, 0x08, 0x14, 0x4d, 0x1e, 0x05, 0xc4, 0x68, 0xd2, 0x5b, - 0xc6, 0xa2, 0xa7, 0x67, 0x61, 0x24, 0x50, 0xcb, 0xfb, 0x9a, 0x81, 0x1e, 0x93, 0xd6, 0xf0, 0xde, - 0xa2, 0x1e, 0x37, 0x31, 0x74, 0xf7, 0xc3, 0x62, 0xb4, 0x24, 0x9f, 0x85, 0xbb, 0x29, 0xed, 0x26, - 0xa9, 0xe1, 0xfc, 0xee, 0x7c, 0x59, 0x88, 0x3e, 0x74, 0x33, 0x50, 0xde, 0x81, 0x7b, 0xf6, 0x46, - 0xf3, 0x1c, 0x27, 0x76, 0xf4, 0xd5, 0xa6, 0xe3, 0xd4, 0x8c, 0x1e, 0x67, 0x98, 0xd1, 0x91, 0x1f, - 0x87, 0xe3, 0xad, 0x7b, 0xa6, 0x57, 0x97, 0x05, 0xcf, 0x4d, 0xbf, 0x7e, 0x2a, 0xbf, 0x0d, 0x4e, - 0x44, 0xe2, 0xdf, 0x31, 0xe6, 0x1f, 0x83, 0x7b, 0x5b, 0x75, 0x6e, 0x2f, 0x5f, 0xd7, 0x71, 0xd9, - 0xc7, 0x3b, 0x3b, 0xec, 0x93, 0x7c, 0x37, 0x2f, 0xe5, 0xb7, 0xb7, 0x1e, 0xbb, 0x40, 0xe7, 0xac, - 0x2b, 0xd0, 0xcb, 0xba, 0x6c, 0xd7, 0x07, 0x68, 0xcd, 0xbb, 0x20, 0x24, 0xdf, 0xcb, 0x55, 0x25, - 0x57, 0xad, 0x36, 0x63, 0x40, 0x68, 0xeb, 0x0d, 0xae, 0x1a, 0x2d, 0xc1, 0xee, 0x20, 0x8b, 0x27, - 0xb8, 0x7c, 0x17, 0x54, 0xdb, 0x59, 0x6b, 0x76, 0xc2, 0x2a, 0x98, 0xbc, 0xc0, 0x25, 0xb9, 0x07, - 0x20, 0x67, 0x33, 0xac, 0xf9, 0x27, 0xdc, 0x29, 0x74, 0xd4, 0xe0, 0x00, 0xcb, 0x39, 0xdb, 0xc6, - 0x8e, 0x2b, 0x87, 0xa2, 0x3b, 0x59, 0x2d, 0x01, 0x79, 0x17, 0xee, 0x25, 0x37, 0xa9, 0x93, 0x4b, - 0x6e, 0x67, 0x3e, 0x3b, 0x0e, 0xdd, 0xb4, 0x07, 0xf4, 0x49, 0x09, 0xc0, 0xf7, 0x52, 0xe0, 0x6c, - 0x84, 0x20, 0x9b, 0x27, 0xce, 0xb2, 0xe7, 0x3a, 0x45, 0xe3, 0xb1, 0xdb, 0xa9, 0x77, 0xfe, 0xeb, - 0x6f, 0xff, 0x4a, 0xec, 0x1e, 0x24, 0x8b, 0x43, 0x8a, 0x70, 0x66, 0xcf, 0xb7, 0x29, 0xfe, 0x5e, - 0xe0, 0x63, 0x89, 0x8f, 0x74, 0xd4, 0xa3, 0xe0, 0xf3, 0x6c, 0x87, 0x58, 0x9c, 0xcd, 0x8b, 0x94, - 0xcd, 0xb3, 0xe8, 0xe1, 0x68, 0x36, 0xa7, 0xde, 0x16, 0xdc, 0x27, 0xdf, 0x81, 0x5e, 0x95, 0x60, - 0xb4, 0x59, 0xfa, 0x07, 0x5d, 0xea, 0x88, 0x99, 0xc6, 0x08, 0x23, 0xfb, 0xe6, 0xfd, 0x13, 0xe0, - 0x03, 0x9b, 0xa3, 0x03, 0xcb, 0xa1, 0x4b, 0xfb, 0x18, 0xd8, 0x94, 0xcf, 0x0d, 0x45, 0xbf, 0x18, - 0x83, 0x63, 0x7b, 0xe6, 0x54, 0xd0, 0x95, 0x8e, 0x98, 0xdd, 0x23, 0xb0, 0xca, 0xce, 0xdf, 0x06, - 0x4a, 0x7c, 0xfc, 0x4f, 0xd1, 0xf1, 0x3f, 0x89, 0xe6, 0xf7, 0x33, 0x7e, 0x2f, 0x6a, 0xf2, 0x4b, - 0xe2, 0xdf, 0x04, 0xdf, 0xa0, 0xb6, 0xa5, 0x71, 0x0d, 0x19, 0x8b, 0xf6, 0x16, 0x54, 0x63, 0x18, - 0x2c, 0x3f, 0x43, 0x07, 0xa4, 0xa0, 0x95, 0xd7, 0x39, 0xa1, 0x53, 0x6f, 0x0b, 0x7a, 0x85, 0xef, - 0x40, 0xbf, 0xd0, 0xe2, 0x81, 0xe9, 0xe3, 0xed, 0x70, 0xda, 0x3a, 0x37, 0x93, 0xbd, 0xb4, 0x6f, - 0x7c, 0x3e, 0xe4, 0x1a, 0x1d, 0x72, 0x05, 0xe1, 0xdb, 0x3d, 0xe4, 0xa6, 0x13, 0x8c, 0xbe, 0x26, - 0xc1, 0x68, 0xb3, 0xd4, 0x46, 0x7b, 0xcb, 0x79, 0x8f, 0x94, 0x4d, 0x7b, 0xcb, 0x79, 0xaf, 0xac, - 0x8a, 0xfc, 0x26, 0x2a, 0x8a, 0x73, 0xe8, 0x91, 0x56, 0xa2, 0xd8, 0x73, 0x86, 0xc9, 0x1a, 0xde, - 0x33, 0x65, 0xd0, 0xde, 0x1a, 0x6e, 0x27, 0x39, 0xd2, 0xde, 0x1a, 0x6e, 0x2b, 0x7f, 0x11, 0xbd, - 0x86, 0xdd, 0x71, 0xb6, 0x39, 0xc5, 0x36, 0xfa, 0x53, 0x09, 0x06, 0x02, 0x61, 0x36, 0xba, 0xd0, - 0x0e, 0xbf, 0xcd, 0x92, 0x11, 0x91, 0x17, 0x6f, 0x5a, 0xc7, 0xf4, 0xf2, 0x3c, 0x1d, 0xd9, 0x0c, - 0xca, 0xed, 0x67, 0x64, 0x56, 0x80, 0xff, 0x5b, 0x12, 0x8c, 0x34, 0x89, 0x60, 0xdb, 0x5b, 0xbd, - 0xad, 0xe3, 0xf2, 0xec, 0xa5, 0x7d, 0xe3, 0xf3, 0x31, 0x5e, 0xa6, 0x63, 0x7c, 0x33, 0x7a, 0x7c, - 0x3f, 0x63, 0xf4, 0x79, 0x07, 0xdf, 0xf7, 0xde, 0xfa, 0xf9, 0xfa, 0x89, 0xbc, 0x20, 0xb3, 0x77, - 0x74, 0x9c, 0x7d, 0x7c, 0xbf, 0xe8, 0x7c, 0x74, 0x4f, 0xd3, 0xd1, 0x3d, 0x85, 0x96, 0x5f, 0xdf, - 0xe8, 0x1a, 0x9d, 0x8a, 0x2f, 0x36, 0x7e, 0xbe, 0xaa, 0x2d, 0x45, 0x6b, 0x1a, 0x1d, 0x67, 0xa7, - 0xf7, 0x83, 0xca, 0x87, 0x78, 0x81, 0x0e, 0xf1, 0x0c, 0x7a, 0xb0, 0xd5, 0x10, 0x7d, 0x0f, 0x4b, - 0x35, 0x7d, 0xd3, 0x98, 0x7a, 0x1b, 0x0b, 0xbd, 0xdf, 0x81, 0xde, 0x2b, 0x1e, 0xd3, 0x4d, 0xb5, - 0xd3, 0xbd, 0x2f, 0x7e, 0xce, 0x3e, 0xd8, 0x3e, 0x02, 0xe7, 0xf2, 0x1e, 0xca, 0xe5, 0x18, 0x3a, - 0xda, 0x8a, 0x4b, 0x12, 0x43, 0xa3, 0x5f, 0x97, 0xdc, 0x57, 0xba, 0x0f, 0xb5, 0xd5, 0x85, 0x3f, - 0xd6, 0x8e, 0xbc, 0xdc, 0xd7, 0x24, 0x10, 0x97, 0x8f, 0x53, 0xbe, 0x26, 0xd0, 0x58, 0x4b, 0xbe, - 0x18, 0x3b, 0x9f, 0x90, 0xe0, 0x50, 0x8b, 0x80, 0x19, 0xe5, 0xdb, 0xe9, 0x77, 0xef, 0x20, 0x3d, - 0x3b, 0xf3, 0xba, 0x68, 0xf0, 0xc1, 0x74, 0xa1, 0xdf, 0x96, 0x20, 0xdb, 0x3a, 0x3a, 0x46, 0x85, - 0x7d, 0xf7, 0xe2, 0x8f, 0xce, 0xb3, 0x97, 0x5f, 0x2f, 0x19, 0x97, 0xdf, 0x57, 0x24, 0x38, 0xdc, - 0x32, 0x22, 0x46, 0xb3, 0xfb, 0xec, 0x27, 0x10, 0x8f, 0x67, 0x0b, 0xaf, 0x93, 0x8a, 0xcb, 0x2c, - 0xd1, 0x81, 0x16, 0x91, 0x71, 0x7b, 0x3a, 0xb0, 0x77, 0xf4, 0xdd, 0x9e, 0x0e, 0x44, 0x84, 0xe6, - 0x5c, 0xa6, 0x2d, 0x63, 0xe3, 0xf6, 0x64, 0x1a, 0x15, 0x83, 0xb7, 0x27, 0xd3, 0xc8, 0x00, 0xdd, - 0x55, 0x80, 0x16, 0x51, 0x76, 0xbb, 0x0a, 0xb0, 0x77, 0x34, 0xdf, 0xae, 0x02, 0x44, 0x84, 0xfa, - 0xf2, 0x1b, 0xf2, 0x72, 0xf4, 0x47, 0x3d, 0x8d, 0x37, 0x7f, 0xd4, 0xba, 0xb3, 0x75, 0xe3, 0x75, - 0x7d, 0x20, 0x72, 0xdf, 0x0f, 0x40, 0xe5, 0xbf, 0x88, 0x03, 0x5a, 0x75, 0xd4, 0x6d, 0x9c, 0xab, - 0x3b, 0x5b, 0x86, 0xa5, 0xdd, 0x60, 0x4e, 0x38, 0x06, 0xa8, 0xa9, 0x3b, 0xfe, 0x77, 0xd7, 0x7b, - 0xe6, 0x3e, 0xee, 0x7f, 0xe5, 0x1b, 0xe3, 0x27, 0xda, 0x78, 0x75, 0x46, 0x80, 0x95, 0x54, 0x4d, - 0xdd, 0xe1, 0x17, 0x7f, 0xdf, 0x0a, 0xa0, 0x56, 0xab, 0xc6, 0xf5, 0x62, 0x55, 0xb3, 0xc5, 0xd3, - 0x80, 0x37, 0x45, 0xcc, 0x66, 0x23, 0xb7, 0x93, 0xbe, 0xef, 0x9d, 0x77, 0x29, 0x29, 0x4a, 0x71, - 0x41, 0xb3, 0x1d, 0xf4, 0x33, 0x90, 0x2a, 0x63, 0x7d, 0x97, 0x51, 0x8f, 0xdf, 0x16, 0xea, 0x49, - 0x42, 0x90, 0x12, 0x2f, 0x02, 0x52, 0xfd, 0x70, 0xf4, 0xd7, 0xb9, 0xf8, 0xc7, 0xe9, 0xa2, 0xf6, - 0xcf, 0x40, 0x07, 0xf4, 0x0b, 0xcc, 0xc3, 0x6a, 0xb8, 0x2a, 0x7b, 0x3c, 0x90, 0x38, 0x0a, 0xfc, - 0x78, 0x45, 0xfc, 0x64, 0xca, 0xfd, 0xf1, 0x8a, 0xe9, 0xe1, 0x3f, 0xfb, 0xdc, 0xe9, 0x81, 0x00, - 0xc5, 0x7c, 0xbf, 0xff, 0xbc, 0xe4, 0xd4, 0x47, 0x24, 0x18, 0x6e, 0xe8, 0x11, 0xc9, 0x30, 0x96, - 0x5b, 0x5f, 0xbb, 0xb2, 0xac, 0xcc, 0x3f, 0x9b, 0x5b, 0x9b, 0x5f, 0x5e, 0x12, 0x9f, 0x74, 0xf5, - 0xbd, 0xeb, 0x46, 0xe3, 0x70, 0xa4, 0x09, 0xcc, 0x6c, 0x61, 0xa1, 0x30, 0x97, 0x5b, 0x2b, 0xa4, - 0x25, 0x74, 0x17, 0x1c, 0x6b, 0x4a, 0xc4, 0x05, 0x89, 0xb5, 0x00, 0x51, 0x0a, 0x2e, 0x48, 0xfc, - 0x8d, 0x58, 0x77, 0xff, 0x2e, 0xd5, 0xf8, 0x69, 0xd6, 0x0a, 0xd6, 0xb1, 0xad, 0xd9, 0xaf, 0x67, - 0xe5, 0x45, 0xbc, 0x9f, 0xfe, 0x74, 0x2f, 0xf4, 0xcf, 0xb1, 0x5e, 0x56, 0x1d, 0xd5, 0xb9, 0x3d, - 0xe7, 0x02, 0xc8, 0xe6, 0xbf, 0x38, 0xc0, 0x7e, 0x08, 0xc5, 0xfb, 0x69, 0x8f, 0xfe, 0x8e, 0xbe, - 0x3f, 0xc8, 0x5e, 0x80, 0xf2, 0x6f, 0xfc, 0x85, 0xe9, 0xc9, 0xec, 0xc7, 0x0b, 0xa8, 0xd1, 0x64, - 0x3f, 0x61, 0xf2, 0xcb, 0x12, 0x1c, 0xa0, 0x50, 0x9e, 0xa7, 0x4c, 0x21, 0xc5, 0x07, 0xa6, 0xa2, - 0xfc, 0x39, 0xb2, 0x59, 0xb8, 0xea, 0xcc, 0x7e, 0x7b, 0xe4, 0x1e, 0xfe, 0x6d, 0xa0, 0xa3, 0x3e, - 0x1e, 0xc2, 0xd4, 0x65, 0x65, 0xa4, 0xda, 0x80, 0x69, 0x87, 0x0e, 0x04, 0x13, 0xaf, 0xfb, 0x40, - 0xf0, 0x29, 0xe8, 0xf3, 0x45, 0x73, 0x99, 0xee, 0xf6, 0x3e, 0x94, 0x16, 0x3e, 0x92, 0xf7, 0xd3, - 0x40, 0xef, 0x91, 0xe0, 0x40, 0xd3, 0xe8, 0x37, 0xd3, 0xb3, 0xef, 0x93, 0xff, 0x90, 0xc4, 0x9a, - 0x92, 0x97, 0x95, 0xd1, 0x7a, 0xb3, 0xdc, 0xc2, 0xd3, 0x30, 0x10, 0x08, 0x59, 0x33, 0xbd, 0x94, - 0x8d, 0x7d, 0x7c, 0x12, 0x24, 0x48, 0x07, 0x65, 0x21, 0x89, 0x77, 0x4c, 0xc3, 0x72, 0x70, 0x99, - 0x5e, 0xd0, 0x4e, 0x2a, 0x6e, 0x19, 0xe9, 0x70, 0xb0, 0xe9, 0x6b, 0x2b, 0x3b, 0x93, 0x7a, 0x9d, - 0xe7, 0x0a, 0xa3, 0x4e, 0x33, 0x37, 0xed, 0xcd, 0x70, 0x8c, 0xab, 0x72, 0x8b, 0x27, 0x5e, 0x40, - 0x0f, 0x0b, 0x0e, 0x57, 0x5b, 0xb9, 0x2e, 0xf2, 0x12, 0xa0, 0x46, 0x55, 0x0d, 0xff, 0x74, 0x90, - 0x67, 0x7d, 0xd1, 0x28, 0x74, 0xfb, 0x7f, 0x5c, 0x87, 0x15, 0xbc, 0x73, 0xda, 0x37, 0xc0, 0xb6, - 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa8, 0x86, 0x13, 0xc9, 0x08, 0xa8, 0x00, 0x00, -======= // 10447 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, 0x75, 0x18, 0x66, 0x77, 0x01, 0xec, 0x3e, 0x7c, 0x2d, 0x1a, 0xb8, 0xbb, 0xbd, 0xbd, 0x3b, 0x00, @@ -2644,7 +1989,6 @@ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descri 0xd0, 0xc3, 0x82, 0xc3, 0xd5, 0x56, 0xae, 0x8b, 0xbc, 0x04, 0xa8, 0x51, 0x55, 0xc3, 0xbf, 0x4f, 0xe4, 0x59, 0x5f, 0x34, 0x0a, 0xdd, 0xfe, 0x5f, 0xf0, 0x61, 0x05, 0xef, 0x9c, 0xf6, 0x4d, 0xb0, 0x6d, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x90, 0x82, 0xf1, 0x6d, 0xa8, 0x00, 0x00, ->>>>>>> Stashed changes } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) From fba17f7cedd24ef95003999e2aaee5c45298001b Mon Sep 17 00:00:00 2001 From: junkai121 Date: Mon, 23 May 2022 20:12:13 +1000 Subject: [PATCH 25/57] resolve typo for depositor --- x/distribution/keeper/msg_server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/distribution/keeper/msg_server.go b/x/distribution/keeper/msg_server.go index 89571d5f..01dfaba1 100644 --- a/x/distribution/keeper/msg_server.go +++ b/x/distribution/keeper/msg_server.go @@ -197,11 +197,11 @@ func (k msgServer) WithdrawAllTokenizeShareRecordReward(goCtx context.Context, m func (k msgServer) FundCommunityPool(goCtx context.Context, msg *types.MsgFundCommunityPool) (*types.MsgFundCommunityPoolResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - depositer, err := sdk.AccAddressFromBech32(msg.Depositor) + depositor, err := sdk.AccAddressFromBech32(msg.Depositor) if err != nil { return nil, err } - if err := k.Keeper.FundCommunityPool(ctx, msg.Amount, depositer); err != nil { + if err := k.Keeper.FundCommunityPool(ctx, msg.Amount, depositor); err != nil { return nil, err } From 43865c5ef254121f683379149e06c794490102a5 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 26 May 2022 00:09:08 +1000 Subject: [PATCH 26/57] resolve telemetry param --- x/distribution/keeper/msg_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/distribution/keeper/msg_server.go b/x/distribution/keeper/msg_server.go index 01dfaba1..9ab1f327 100644 --- a/x/distribution/keeper/msg_server.go +++ b/x/distribution/keeper/msg_server.go @@ -175,7 +175,7 @@ func (k msgServer) WithdrawAllTokenizeShareRecordReward(goCtx context.Context, m for _, a := range amount { if a.Amount.IsInt64() { telemetry.SetGaugeWithLabels( - []string{"tx", "msg", "withdraw_tokenize_share_reward"}, + []string{"tx", "msg", "withdraw_all_tokenize_share_reward"}, float32(a.Amount.Int64()), []metrics.Label{telemetry.NewLabel("denom", a.Denom)}, ) From e192a217e92b024191372e1ba9cf948602541736 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 26 May 2022 00:14:27 +1000 Subject: [PATCH 27/57] error check keeper.AddPubkey return value on slashing/InitGenesis --- x/slashing/genesis.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x/slashing/genesis.go b/x/slashing/genesis.go index d4c9c55b..1d015962 100644 --- a/x/slashing/genesis.go +++ b/x/slashing/genesis.go @@ -16,7 +16,10 @@ func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, stakingKeeper types.Stak if err != nil { panic(err) } - keeper.AddPubkey(ctx, consPk) + err = keeper.AddPubkey(ctx, consPk) + if err != nil { + panic(err) + } return false }, ) From bc67e183bec18ea60e472e255ededc5f4c452a73 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 26 May 2022 00:19:04 +1000 Subject: [PATCH 28/57] convert to separate if statement on TokenizeShareRecordReward query --- x/distribution/keeper/grpc_query.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x/distribution/keeper/grpc_query.go b/x/distribution/keeper/grpc_query.go index 4347e328..8c9af8bd 100644 --- a/x/distribution/keeper/grpc_query.go +++ b/x/distribution/keeper/grpc_query.go @@ -284,7 +284,9 @@ func (k Keeper) TokenizeShareRecordReward(c context.Context, req *types.QueryTok Reward: recordReward.Add(moduleBalanceDecCoins...), }) totalRewards = totalRewards.Add(recordReward...) - } else if !moduleBalance.IsZero() { + } + + if !moduleBalance.IsZero() { rewards = append(rewards, types.TokenizeShareRecordReward{ RecordId: record.Id, Reward: moduleBalanceDecCoins, From f056d8825b8d04039204ae931f8b3962617e7ca9 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 26 May 2022 00:21:55 +1000 Subject: [PATCH 29/57] remove unused getShareTokenDenom and update record.GetShareTokenDenom --- x/staking/keeper/msg_server.go | 6 ------ x/staking/types/tokenize_share_record.go | 3 ++- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 6b112f1c..b05b4b6e 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -3,8 +3,6 @@ package keeper import ( "context" "fmt" - "strconv" - "strings" "time" metrics "github.com/armon/go-metrics" @@ -391,10 +389,6 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( }, nil } -func getShareTokenDenom(validatorAddress string, tokenizeShareRecordId uint64) string { - return strings.ToLower(validatorAddress) + strconv.Itoa(int(tokenizeShareRecordId)) -} - func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeShares) (*types.MsgTokenizeSharesResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) diff --git a/x/staking/types/tokenize_share_record.go b/x/staking/types/tokenize_share_record.go index 27f96714..c452b615 100644 --- a/x/staking/types/tokenize_share_record.go +++ b/x/staking/types/tokenize_share_record.go @@ -2,6 +2,7 @@ package types import ( "strconv" + "strings" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -12,5 +13,5 @@ func (r TokenizeShareRecord) GetModuleAddress() sdk.AccAddress { } func (r TokenizeShareRecord) GetShareTokenDenom() string { - return r.Validator + strconv.Itoa(int(r.Id)) + return strings.ToLower(r.Validator) + strconv.Itoa(int(r.Id)) } From 43796e021bca0f8551992fdc876cf9e08704d874 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 19 Jul 2022 17:55:06 +0800 Subject: [PATCH 30/57] resolve build errors on sdk rc3 upgrade --- app/app.go | 135 +++++---- app/state.go | 9 +- app/test_helpers.go | 32 ++- app/upgrades.go | 40 +++ cmd/liquidstakingd/cmd/root.go | 23 +- cmd/liquidstakingd/cmd/testnet.go | 3 +- go.mod | 38 ++- go.sum | 356 +++++++++++++++++++++++- testutil/network/network.go | 33 ++- testutil/network/util.go | 45 +-- x/distribution/keeper/validator.go | 2 +- x/distribution/simulation/operations.go | 21 +- x/genutil/utils.go | 22 +- x/slashing/simulation/operations.go | 15 +- x/staking/keeper/msg_server.go | 6 +- x/staking/keeper/pool.go | 2 +- x/staking/keeper/slash.go | 4 +- x/staking/simulation/genesis.go | 6 +- x/staking/simulation/operations.go | 102 ++++++- x/staking/types/validator.go | 4 +- 20 files changed, 693 insertions(+), 205 deletions(-) create mode 100644 app/upgrades.go diff --git a/app/app.go b/app/app.go index 020ba0c8..bbc0552d 100644 --- a/app/app.go +++ b/app/app.go @@ -7,8 +7,6 @@ import ( "os" "path/filepath" - "github.com/cosmos/cosmos-sdk/testutil/testdata_pulsar" - "github.com/gorilla/mux" "github.com/rakyll/statik/fs" "github.com/spf13/cast" @@ -22,19 +20,20 @@ import ( "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/store/streaming" storetypes "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/testutil/testdata_pulsar" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/ante" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authmiddleware "github.com/cosmos/cosmos-sdk/x/auth/middleware" + "github.com/cosmos/cosmos-sdk/x/auth/posthandler" authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -64,8 +63,8 @@ import ( govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - govv1beta2 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta2" "github.com/cosmos/cosmos-sdk/x/group" groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" groupmodule "github.com/cosmos/cosmos-sdk/x/group/module" @@ -80,10 +79,6 @@ import ( paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - "github.com/cosmos/cosmos-sdk/x/upgrade" - upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" - upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" distr "github.com/iqlusioninc/liquidity-staking-module/x/distribution" distrclient "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client" distrkeeper "github.com/iqlusioninc/liquidity-staking-module/x/distribution/keeper" @@ -95,6 +90,11 @@ import ( stakingkeeper "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" + "github.com/cosmos/cosmos-sdk/x/upgrade" + upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client" + upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + // unnamed import of statik for swagger UI support _ "github.com/cosmos/cosmos-sdk/client/docs/statik" ) @@ -156,8 +156,6 @@ type SimApp struct { legacyAmino *codec.LegacyAmino appCodec codec.Codec interfaceRegistry types.InterfaceRegistry - msgSvcRouter *authmiddleware.MsgServiceRouter - legacyRouter sdk.Router invCheckPeriod uint @@ -214,7 +212,7 @@ func NewSimApp( legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry - bApp := baseapp.NewBaseApp(appName, logger, db, baseAppOptions...) + bApp := baseapp.NewBaseApp(appName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetVersion(version.Version) bApp.SetInterfaceRegistry(interfaceRegistry) @@ -242,8 +240,6 @@ func NewSimApp( legacyAmino: legacyAmino, appCodec: appCodec, interfaceRegistry: interfaceRegistry, - legacyRouter: authmiddleware.NewLegacyRouter(), - msgSvcRouter: authmiddleware.NewMsgServiceRouter(interfaceRegistry), invCheckPeriod: invCheckPeriod, keys: keys, tkeys: tkeys, @@ -293,16 +289,19 @@ func NewSimApp( stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()), ) - app.AuthzKeeper = authzkeeper.NewKeeper(keys[authzkeeper.StoreKey], appCodec, app.msgSvcRouter, app.AccountKeeper) + app.AuthzKeeper = authzkeeper.NewKeeper(keys[authzkeeper.StoreKey], appCodec, app.MsgServiceRouter(), app.AccountKeeper) groupConfig := group.DefaultConfig() /* Example of setting group params: groupConfig.MaxMetadataLen = 1000 */ - app.GroupKeeper = groupkeeper.NewKeeper(keys[group.StoreKey], appCodec, app.msgSvcRouter, app.AccountKeeper, groupConfig) + app.GroupKeeper = groupkeeper.NewKeeper(keys[group.StoreKey], appCodec, app.MsgServiceRouter(), app.AccountKeeper, groupConfig) - // register the proposal types + // Register the proposal types + // Deprecated: Avoid adding new handlers, instead use the new proposal flow + // by granting the governance module the right to execute the message. + // See: https://github.com/cosmos/cosmos-sdk/blob/release/v0.46.x/x/gov/spec/01_concepts.md#proposal-messages govRouter := govv1beta1.NewRouter() govRouter.AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). @@ -315,7 +314,7 @@ func NewSimApp( */ govKeeper := govkeeper.NewKeeper( appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper, - &stakingKeeper, govRouter, app.msgSvcRouter, govConfig, + &stakingKeeper, govRouter, app.MsgServiceRouter(), govConfig, ) app.GovKeeper = *govKeeper.SetHooks( @@ -325,6 +324,7 @@ func NewSimApp( ) // set the governance module account as the authority for conducting upgrades app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp, authtypes.NewModuleAddress(govtypes.ModuleName).String()) + app.NFTKeeper = nftkeeper.NewKeeper(keys[nftkeeper.StoreKey], appCodec, app.AccountKeeper, app.BankKeeper) // create evidence keeper with router @@ -338,7 +338,7 @@ func NewSimApp( // NOTE: we may consider parsing `appOpts` inside module constructors. For the moment // we prefer to be more strict in what arguments the modules expect. - var skipGenesisInvariants = cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants)) + skipGenesisInvariants := cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants)) // NOTE: Any module instantiated in the module manager that is later modified // must be passed by reference here. @@ -405,10 +405,14 @@ func NewSimApp( // app.mm.SetOrderMigrations(custom order) app.mm.RegisterInvariants(&app.CrisisKeeper) - app.mm.RegisterRoutes(app.legacyRouter, app.QueryRouter(), encodingConfig.Amino) - app.configurator = module.NewConfigurator(app.appCodec, app.msgSvcRouter, app.GRPCQueryRouter()) + app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino) + app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.mm.RegisterServices(app.configurator) + // RegisterUpgradeHandlers is used for registering any on-chain upgrades. + // Make sure it's called after `app.mm` and `app.configurator` are set. + app.RegisterUpgradeHandlers() + // add test gRPC service for testing gRPC queries in isolation testdata_pulsar.RegisterQueryServer(app.GRPCQueryRouter(), testdata_pulsar.QueryImpl{}) @@ -416,22 +420,10 @@ func NewSimApp( // // NOTE: this is not required apps that don't use the simulator for fuzz testing // transactions - app.sm = module.NewSimulationManager( - auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper), - capability.NewAppModule(appCodec, *app.CapabilityKeeper), - feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), - gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil), - staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper), - distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), - params.NewAppModule(app.ParamsKeeper), - evidence.NewAppModule(app.EvidenceKeeper), - authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), - groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), - nftmodule.NewAppModule(appCodec, app.NFTKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), - ) + overrideModules := map[string]module.AppModuleSimulation{ + authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), + } + app.sm = module.NewSimulationManagerFromAppModules(app.mm.Modules, overrideModules) app.sm.RegisterStoreDecoders() @@ -444,7 +436,21 @@ func NewSimApp( app.SetInitChainer(app.InitChainer) app.SetBeginBlocker(app.BeginBlocker) app.SetEndBlocker(app.EndBlocker) - app.setTxHandler(encodingConfig.TxConfig, cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))) + app.setAnteHandler(encodingConfig.TxConfig) + // In v0.46, the SDK introduces _postHandlers_. PostHandlers are like + // antehandlers, but are run _after_ the `runMsgs` execution. They are also + // defined as a chain, and have the same signature as antehandlers. + // + // In baseapp, postHandlers are run in the same store branch as `runMsgs`, + // meaning that both `runMsgs` and `postHandler` state will be committed if + // both are successful, and both will be reverted if any of the two fails. + // + // The SDK exposes a default empty postHandlers chain. + // + // Please note that changing any of the anteHandler or postHandler chain is + // likely to be a state-machine breaking change, which needs a coordinated + // upgrade. + app.setPostHandler() if loadLatest { if err := app.LoadLatestVersion(); err != nil { @@ -455,28 +461,33 @@ func NewSimApp( return app } -func (app *SimApp) setTxHandler(txConfig client.TxConfig, indexEventsStr []string) { - indexEvents := map[string]struct{}{} - for _, e := range indexEventsStr { - indexEvents[e] = struct{}{} +func (app *SimApp) setAnteHandler(txConfig client.TxConfig) { + anteHandler, err := ante.NewAnteHandler( + ante.HandlerOptions{ + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + SignModeHandler: txConfig.SignModeHandler(), + FeegrantKeeper: app.FeeGrantKeeper, + SigGasConsumer: ante.DefaultSigVerificationGasConsumer, + }, + ) + + if err != nil { + panic(err) } - txHandler, err := authmiddleware.NewDefaultTxHandler(authmiddleware.TxHandlerOptions{ - Debug: app.Trace(), - IndexEvents: indexEvents, - LegacyRouter: app.legacyRouter, - MsgServiceRouter: app.msgSvcRouter, - AccountKeeper: app.AccountKeeper, - BankKeeper: app.BankKeeper, - FeegrantKeeper: app.FeeGrantKeeper, - SignModeHandler: txConfig.SignModeHandler(), - SigGasConsumer: authmiddleware.DefaultSigVerificationGasConsumer, - TxDecoder: txConfig.TxDecoder(), - }) + + app.SetAnteHandler(anteHandler) +} + +func (app *SimApp) setPostHandler() { + postHandler, err := posthandler.NewPostHandler( + posthandler.HandlerOptions{}, + ) if err != nil { panic(err) } - app.SetTxHandler(txHandler) + app.SetPostHandler(postHandler) } // Name returns the name of the App @@ -581,8 +592,7 @@ func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APICon // Register new tendermint queries routes from grpc-gateway. tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) - // Register legacy and grpc-gateway routes for all modules. - ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) + // Register grpc-gateway routes for all modules. ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // register swagger API from root so that other applications can override easily @@ -598,11 +608,16 @@ func (app *SimApp) RegisterTxService(clientCtx client.Context) { // RegisterTendermintService implements the Application.RegisterTendermintService method. func (app *SimApp) RegisterTendermintService(clientCtx client.Context) { - tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) + tmservice.RegisterTendermintService( + clientCtx, + app.BaseApp.GRPCQueryRouter(), + app.interfaceRegistry, + app.Query, + ) } // RegisterSwaggerAPI registers swagger route with API Server -func RegisterSwaggerAPI(ctx client.Context, rtr *mux.Router) { +func RegisterSwaggerAPI(_ client.Context, rtr *mux.Router) { statikFS, err := fs.New() if err != nil { panic(err) @@ -631,7 +646,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(minttypes.ModuleName) paramsKeeper.Subspace(distrtypes.ModuleName) paramsKeeper.Subspace(slashingtypes.ModuleName) - paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1beta2.ParamKeyTable()) + paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) return paramsKeeper diff --git a/app/state.go b/app/state.go index 019be84b..2c022b86 100644 --- a/app/state.go +++ b/app/state.go @@ -11,6 +11,7 @@ import ( tmjson "github.com/tendermint/tendermint/libs/json" tmtypes "github.com/tendermint/tendermint/types" + sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" @@ -29,7 +30,6 @@ import ( func AppStateFn(cdc codec.JSONCodec, simManager *module.SimulationManager) simtypes.AppStateFn { return func(r *rand.Rand, accs []simtypes.Account, config simtypes.Config, ) (appState json.RawMessage, simAccs []simtypes.Account, chainID string, genesisTimestamp time.Time) { - if FlagGenesisTimeValue == 0 { genesisTimestamp = simtypes.RandTimestamp(r) } else { @@ -148,10 +148,13 @@ func AppStateRandomizedFn( // generate a random amount of initial stake coins and a random initial // number of bonded accounts - var initialStake, numInitiallyBonded int64 + var ( + numInitiallyBonded int64 + initialStake sdkmath.Int + ) appParams.GetOrGenerate( cdc, simappparams.StakePerAccount, &initialStake, r, - func(r *rand.Rand) { initialStake = r.Int63n(1e12) }, + func(r *rand.Rand) { initialStake = sdkmath.NewInt(r.Int63n(1e12)) }, ) appParams.GetOrGenerate( cdc, simappparams.InitiallyBondedValidators, &numInitiallyBonded, r, diff --git a/app/test_helpers.go b/app/test_helpers.go index ee80f474..cd8b7c0b 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -2,10 +2,10 @@ package simapp import ( "bytes" - "context" "encoding/hex" "encoding/json" "fmt" + "math/rand" "strconv" "testing" "time" @@ -40,8 +40,8 @@ import ( // DefaultConsensusParams defines the default Tendermint consensus params used in // SimApp testing. -var DefaultConsensusParams = &tmproto.ConsensusParams{ - Block: &tmproto.BlockParams{ +var DefaultConsensusParams = &abci.ConsensusParams{ + Block: &abci.BlockParams{ MaxBytes: 200000, MaxGas: 2000000, }, @@ -83,7 +83,7 @@ func NewSimappWithCustomOptions(t *testing.T, isCheckTx bool, options SetupOptio t.Helper() privVal := mock.NewPV() - pubKey, err := privVal.GetPubKey(context.TODO()) + pubKey, err := privVal.GetPubKey() require.NoError(t, err) // create validator set with single validator validator := tmtypes.NewValidator(pubKey, 1) @@ -124,7 +124,7 @@ func Setup(t *testing.T, isCheckTx bool) *SimApp { t.Helper() privVal := mock.NewPV() - pubKey, err := privVal.GetPubKey(context.TODO()) + pubKey, err := privVal.GetPubKey() require.NoError(t, err) // create validator set with single validator @@ -147,7 +147,8 @@ func Setup(t *testing.T, isCheckTx bool) *SimApp { func genesisStateWithValSet(t *testing.T, app *SimApp, genesisState GenesisState, valSet *tmtypes.ValidatorSet, genAccs []authtypes.GenesisAccount, - balances ...banktypes.Balance) GenesisState { + balances ...banktypes.Balance, +) GenesisState { // set genesis accounts authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis) @@ -247,7 +248,7 @@ func SetupWithGenesisAccounts(t *testing.T, genAccs []authtypes.GenesisAccount, t.Helper() privVal := mock.NewPV() - pubKey, err := privVal.GetPubKey(context.TODO()) + pubKey, err := privVal.GetPubKey() require.NoError(t, err) // create validator set with single validator @@ -257,13 +258,13 @@ func SetupWithGenesisAccounts(t *testing.T, genAccs []authtypes.GenesisAccount, return SetupWithGenesisValSet(t, valSet, genAccs, balances...) } -// SetupWithGenesisValSet initializes GenesisState with a single validator and genesis accounts +// GenesisStateWithSingleValidator initializes GenesisState with a single validator and genesis accounts // that also act as delegators. func GenesisStateWithSingleValidator(t *testing.T, app *SimApp) GenesisState { t.Helper() privVal := mock.NewPV() - pubKey, err := privVal.GetPubKey(context.TODO()) + pubKey, err := privVal.GetPubKey() require.NoError(t, err) // create validator set with single validator @@ -310,7 +311,7 @@ func createIncrementalAccounts(accNum int) []sdk.AccAddress { buffer.WriteString("A58856F0FD53BF058B4909A21AEC019107BA6") // base address string buffer.WriteString(numString) // adding on final two digits to make addresses unique - res, _ := sdk.AccAddressFromHex(buffer.String()) + res, _ := sdk.AccAddressFromHexUnsafe(buffer.String()) bech := res.String() addr, _ := TestAddr(buffer.String(), bech) @@ -336,7 +337,7 @@ func AddTestAddrs(app *SimApp, ctx sdk.Context, accNum int, accAmt sdk.Int) []sd return addTestAddrs(app, ctx, accNum, accAmt, createRandomAccounts) } -// AddTestAddrs constructs and returns accNum amount of accounts with an +// AddTestAddrsIncremental constructs and returns accNum amount of accounts with an // initial balance of accAmt in random order func AddTestAddrsIncremental(app *SimApp, ctx sdk.Context, accNum int, accAmt sdk.Int) []sdk.AccAddress { return addTestAddrs(app, ctx, accNum, accAmt, createIncrementalAccounts) @@ -378,7 +379,7 @@ func ConvertAddrsToValAddrs(addrs []sdk.AccAddress) []sdk.ValAddress { } func TestAddr(addr string, bech string) (sdk.AccAddress, error) { - res, err := sdk.AccAddressFromHex(addr) + res, err := sdk.AccAddressFromHexUnsafe(addr) if err != nil { return nil, err } @@ -412,8 +413,8 @@ func SignCheckDeliver( t *testing.T, txCfg client.TxConfig, app *bam.BaseApp, header tmproto.Header, msgs []sdk.Msg, chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...cryptotypes.PrivKey, ) (sdk.GasInfo, *sdk.Result, error) { - - tx, err := helpers.GenTx( + tx, err := helpers.GenSignedMockTx( + rand.New(rand.NewSource(time.Now().UnixNano())), txCfg, msgs, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}, @@ -463,7 +464,8 @@ func GenSequenceOfTxs(txGen client.TxConfig, msgs []sdk.Msg, accNums []uint64, i txs := make([]sdk.Tx, numToGenerate) var err error for i := 0; i < numToGenerate; i++ { - txs[i], err = helpers.GenTx( + txs[i], err = helpers.GenSignedMockTx( + rand.New(rand.NewSource(time.Now().UnixNano())), txGen, msgs, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}, diff --git a/app/upgrades.go b/app/upgrades.go new file mode 100644 index 00000000..d6bd2834 --- /dev/null +++ b/app/upgrades.go @@ -0,0 +1,40 @@ +package simapp + +import ( + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/group" + "github.com/cosmos/cosmos-sdk/x/nft" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" +) + +// UpgradeName defines the on-chain upgrade name for the sample simap upgrade from v045 to v046. +// +// NOTE: This upgrade defines a reference implementation of what an upgrade could look like +// when an application is migrating from Cosmos SDK version v0.45.x to v0.46.x. +const UpgradeName = "v045-to-v046" + +func (app SimApp) RegisterUpgradeHandlers() { + app.UpgradeKeeper.SetUpgradeHandler(UpgradeName, + func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return app.mm.RunMigrations(ctx, app.configurator, fromVM) + }) + + upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() + if err != nil { + panic(err) + } + + if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + storeUpgrades := storetypes.StoreUpgrades{ + Added: []string{ + group.ModuleName, + nft.ModuleName, + }, + } + + // configure store loader that checks if version == upgradeHeight and applies store upgrades + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) + } +} diff --git a/cmd/liquidstakingd/cmd/root.go b/cmd/liquidstakingd/cmd/root.go index d6f19cc0..58866c8f 100644 --- a/cmd/liquidstakingd/cmd/root.go +++ b/cmd/liquidstakingd/cmd/root.go @@ -6,7 +6,6 @@ import ( "os" "path/filepath" - serverconfig "github.com/cosmos/cosmos-sdk/server/config" "github.com/spf13/cast" "github.com/spf13/cobra" tmcfg "github.com/tendermint/tendermint/config" @@ -22,9 +21,11 @@ import ( "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/snapshots" + snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" @@ -192,7 +193,7 @@ func queryCommand() *cobra.Command { Use: "query", Aliases: []string{"q"}, Short: "Querying subcommands", - DisableFlagParsing: true, + DisableFlagParsing: false, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } @@ -215,7 +216,7 @@ func txCommand() *cobra.Command { cmd := &cobra.Command{ Use: "tx", Short: "Transactions subcommands", - DisableFlagParsing: true, + DisableFlagParsing: false, SuggestionsMinimumDistance: 2, RunE: client.ValidateCmd, } @@ -261,7 +262,7 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a } snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots") - snapshotDB, err := sdk.NewLevelDB("metadata", snapshotDir) + snapshotDB, err := dbm.NewDB("metadata", server.GetAppDBBackend(appOpts), snapshotDir) if err != nil { panic(err) } @@ -270,6 +271,11 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a panic(err) } + snapshotOptions := snapshottypes.NewSnapshotOptions( + cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval)), + cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent)), + ) + return simapp.NewSimApp( logger, db, traceStore, true, skipUpgradeHeights, cast.ToString(appOpts.Get(flags.FlagHome)), @@ -284,18 +290,15 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a baseapp.SetInterBlockCache(cache), baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))), baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))), - baseapp.SetSnapshotStore(snapshotStore), - baseapp.SetSnapshotInterval(cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval))), - baseapp.SetSnapshotKeepRecent(cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent))), + baseapp.SetSnapshot(snapshotStore, snapshotOptions), ) } // appExport creates a new simapp (optionally at a given height) // and exports state. func (a appCreator) appExport( - logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, - appOpts servertypes.AppOptions) (servertypes.ExportedApp, error) { - + logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, appOpts servertypes.AppOptions, +) (servertypes.ExportedApp, error) { var simApp *simapp.SimApp homePath, ok := appOpts.Get(flags.FlagHome).(string) if !ok || homePath == "" { diff --git a/cmd/liquidstakingd/cmd/testnet.go b/cmd/liquidstakingd/cmd/testnet.go index 5858ea47..c621df99 100644 --- a/cmd/liquidstakingd/cmd/testnet.go +++ b/cmd/liquidstakingd/cmd/testnet.go @@ -15,8 +15,8 @@ import ( tmconfig "github.com/tendermint/tendermint/config" tmos "github.com/tendermint/tendermint/libs/os" tmrand "github.com/tendermint/tendermint/libs/rand" - tmtime "github.com/tendermint/tendermint/libs/time" "github.com/tendermint/tendermint/types" + tmtime "github.com/tendermint/tendermint/types/time" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -231,7 +231,6 @@ func initTestnetFiles( nodeConfig.SetRoot(nodeDir) nodeConfig.Moniker = nodeDirName nodeConfig.RPC.ListenAddress = "tcp://0.0.0.0:26657" - nodeConfig.Mode = tmconfig.ModeValidator if err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm); err != nil { _ = os.RemoveAll(args.outputDir) diff --git a/go.mod b/go.mod index 9abd3e1b..d15b4478 100644 --- a/go.mod +++ b/go.mod @@ -3,31 +3,39 @@ module github.com/iqlusioninc/liquidity-staking-module go 1.16 require ( - github.com/armon/go-metrics v0.3.10 - github.com/cosmos/cosmos-sdk v0.46.0-alpha3 + cosmossdk.io/math v1.0.0-beta.2 // indirect + github.com/armon/go-metrics v0.3.11 + github.com/cosmos/cosmos-sdk v0.46.0-rc3 // indirect github.com/cosmos/go-bip39 v1.0.0 + github.com/creachadair/taskgroup v0.3.2 // indirect + github.com/creachadair/tomledit v0.0.22 // indirect github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/mroth/weightedrand v0.4.1 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20210609091139-0a56a4bca00b // indirect github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 - github.com/rs/zerolog v1.26.1 - github.com/spf13/cast v1.4.1 - github.com/spf13/cobra v1.3.0 + github.com/rs/zerolog v1.27.0 + github.com/spf13/cast v1.5.0 + github.com/spf13/cobra v1.5.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.10.1 - github.com/stretchr/testify v1.7.0 - github.com/tendermint/tendermint v0.35.2 - github.com/tendermint/tm-db v0.6.6 - google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 - google.golang.org/grpc v1.44.0 - google.golang.org/protobuf v1.27.1 + github.com/spf13/viper v1.12.0 + github.com/stretchr/testify v1.8.0 + github.com/tendermint/tendermint v0.34.20-rc1 // indirect + github.com/tendermint/tm-db v0.6.7 // indirect + google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd + google.golang.org/grpc v1.47.0 + google.golang.org/protobuf v1.28.0 sigs.k8s.io/yaml v1.3.0 ) -replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - -replace github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 +replace ( + github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 + github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 +) diff --git a/go.sum b/go.sum index 52dcb7f9..c850b6f1 100644 --- a/go.sum +++ b/go.sum @@ -36,6 +36,8 @@ cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Ud cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -43,11 +45,19 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -63,13 +73,31 @@ cloud.google.com/go/storage v1.14.0 h1:6RRlFMv1omScs6iq2hfE3IvgE+l6RfJPampq8UZc5 cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +cosmossdk.io/api v0.1.0-alpha8 h1:Hr+8bLI4UphF+aMiDIVklrdzRm99dFaNq2inBKGDzNU= +cosmossdk.io/api v0.1.0-alpha8/go.mod h1:gIs3NW5OSNK5wKqxF8JHnGTL82QMsXpwGeKmu2i5xFA= +cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= +cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= +cosmossdk.io/math v1.0.0-beta.2 h1:17hSVc9ne1c31IaLDfjRojtN+y4Rd2N8H/6Fht2sBzw= +cosmossdk.io/math v1.0.0-beta.2/go.mod h1:u/MXvf8wbUbCsAEyQSSYXXMsczAsFX48e2D6JI86T4o= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= +filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= +git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= +github.com/Antonboom/errname v0.1.6/go.mod h1:7lz79JAnuoMNDAWE9MeeIr1/c/VpSUWatBv2FH9NYpI= github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= +github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= @@ -85,8 +113,11 @@ github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -94,6 +125,7 @@ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3 github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.1.0/go.mod h1:LGOGuvEgCfCQsy3JF2tRmpGDpzA53iZfyGEWSPwQ6/4= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -106,6 +138,7 @@ github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jB github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= @@ -124,6 +157,7 @@ github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1: github.com/adlio/schema v1.1.13/go.mod h1:L5Z7tw+7lRK1Fnpi/LT/ooCP1elkXn0krMWBQHUhEDE= github.com/adlio/schema v1.2.3 h1:GfKThfEsjS9cCz7gaF8zdXv4cpTdUqdljkKGDTbJjys= github.com/adlio/schema v1.2.3/go.mod h1:nD7ZWmMMbwU12Pqwg+qL0rTvHBrBXfNz+5UQxTfy38M= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -149,11 +183,14 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.11 h1:/q4zqTAH+/mtFjimfc0SC7yuuxZshlS4TaCeBm+7sZ0= +github.com/armon/go-metrics v0.3.11/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= github.com/ashanbrown/makezero v1.1.0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= +github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -176,6 +213,7 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxq github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -188,17 +226,26 @@ github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/blizzy78/varnamelen v0.6.0/go.mod h1:zy2Eic4qWqjrxa60jG34cfL0VXcSwzUrIx68eJPb4Q8= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/breml/bidichk v0.2.2/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= +github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= github.com/breml/errchkjson v0.2.3/go.mod h1:jZEATw/jF69cL1iy7//Yih8yp/mXp2CBoBr9GJwCAsY= +github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= +github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= +github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -213,7 +260,9 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/bufbuild/buf v1.4.0/go.mod h1:mwHG7klTHnX+rM/ym8LXGl7vYpVmnwT96xWoRB4H5QI= github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= @@ -221,6 +270,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEe github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -231,12 +282,15 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= +github.com/chavacava/garif v0.0.0-20220316182200-5cad0b5181d4/go.mod h1:W8EnPSQ8Nv4fUjc/v1/8tHFqhuOJXnRub0dTfuAQktU= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= @@ -257,17 +311,24 @@ github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b80 github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= github.com/coinbase/rosetta-sdk-go v0.7.2 h1:uCNrASIyt7rV9bA3gzPG3JDlxVP5v/zLgi01GWngncM= github.com/coinbase/rosetta-sdk-go v0.7.2/go.mod h1:wk9dvjZFSZiWSNkFuj3dMleTA1adLFotg5y71PhqKB4= +github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= +github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= github.com/confio/ics23/go v0.7.0 h1:00d2kukk7sPoHWL4zZBZwzxnpA2pec1NPdwbSokJ5w8= github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= +github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.2.1 h1:/EeEo2EtN3umhbbgCveyjifoMYg0pS+nMMEemaYw634= github.com/containerd/continuity v0.2.1/go.mod h1:wCYX+dRqZdImhGucXOqTQn05AhX6EUDaGEMUzTFFpLg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -278,23 +339,20 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= -github.com/cosmos/cosmos-sdk v0.46.0-alpha3 h1:HzMdLPOP5OvCg8HVGyPP1HdAq7LKTIW6iOOoT8qyfxM= -github.com/cosmos/cosmos-sdk v0.46.0-alpha3/go.mod h1:wz5yINqwETrxb6OXY6srEBUj6y8mG2oIsADgaWT5RFk= -github.com/cosmos/cosmos-sdk/api v0.1.0-alpha5 h1:UlK7NOHGlEbvbDTCM0cN7BJN6hhqeXZIuLv6KapFYTc= -github.com/cosmos/cosmos-sdk/api v0.1.0-alpha5/go.mod h1:gZu6sOu2vl4Fd7I+BjDSx2bxndwPgFLGfOegek3SQQo= -github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1 h1:6YvzjQtc+cDwCe9XwYPPa8zFCxNG79N7vmCjpK+vGOg= +github.com/cosmos/cosmos-sdk v0.46.0-rc3 h1:BWU0YJ1RXUCYUmKY8k3kH/yEavMF/7y81Sjd+2otZpY= +github.com/cosmos/cosmos-sdk v0.46.0-rc3/go.mod h1:fWrmJ90UcB11LoaaTtF/qsqkA8HusUc8+XARAdnJfmA= github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1/go.mod h1:JUMM2MxF9wuwzRWZJjb8BjXsn1BmPmdBd3a75pIct4I= -github.com/cosmos/cosmos-sdk/errors v1.0.0-beta.2 h1:bBglNlra8ZHb4dmbEE8V85ihLA+DkriSm7tcx6x/JWo= -github.com/cosmos/cosmos-sdk/errors v1.0.0-beta.2/go.mod h1:Gi7pzVRnvZ1N16JAXpLADzng0ePoE7YeEHaULSFB2Ts= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.17.3 h1:s2N819a2olOmiauVa0WAhoIJq9EhSXE9HDBAoR9k+8Y= github.com/cosmos/iavl v0.17.3/go.mod h1:prJoErZFABYZGDHka1R6Oay4z9PrNeFFiMKHDAMOi4w= @@ -308,11 +366,20 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creachadair/atomicfile v0.2.6/go.mod h1:BRq8Une6ckFneYXZQ+kO7p1ZZP3I2fzVzf28JxrIkBc= +github.com/creachadair/command v0.0.0-20220426235536-a748effdf6a1/go.mod h1:bAM+qFQb/KwWyCc9MLC4U1jvn3XyakqP5QRkds5T6cY= +github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= +github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= +github.com/creachadair/tomledit v0.0.22/go.mod h1:cIu/4x5L855oSRejIqr+WRFh+mv9g4fWLiUFaApYn/Y= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/daixiang0/gci v0.3.1-0.20220208004058-76d765e3ab48/go.mod h1:jaASoJmv/ykO9dAAPy31iJnreV19248qKDdVWf3QgC4= +github.com/daixiang0/gci v0.3.3/go.mod h1:1Xr2bxnQbDxCqqulUOv8qpGqkgRw9RSCGGjEC2LjF8o= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= @@ -322,10 +389,15 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= @@ -343,7 +415,13 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= @@ -370,11 +448,13 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= @@ -392,6 +472,7 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/firefart/nonamedreturns v1.0.1/go.mod h1:D3dpIBojGGNh5UfElmwPu73SwDCm+VKhHYqwlNOk2uQ= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -401,12 +482,17 @@ github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= github.com/fzipp/gocyclo v0.4.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/fzipp/gocyclo v0.5.1/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= @@ -415,10 +501,13 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= +github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-critic/go-critic v0.6.2/go.mod h1:td1s27kfmLpe5G/DPjlnFI7o1UCzePptwU7Az0V5iCM= +github.com/go-critic/go-critic v0.6.3/go.mod h1:c6b3ZP1MQ7o6lPR7Rv3lEf7pYQUmAcx8ABHgdZCQt/k= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -429,9 +518,12 @@ github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= @@ -444,6 +536,7 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -473,12 +566,17 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -529,8 +627,11 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= github.com/golangci/golangci-lint v1.44.2/go.mod h1:KjBgkLvsTWDkhfu12iCrv0gwL1kON5KNhbyjQ6qN7Jo= +github.com/golangci/golangci-lint v1.46.0/go.mod h1:IJpcNOUfx/XLRwE95FHQ6QtbhYwwqcm0H5QkwUfF4ZE= +github.com/golangci/golangci-lint v1.46.2/go.mod h1:3DkdHnxn9eoTTrpT2gB0TEv8KSziuoqe9FitgQLHvAY= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= @@ -560,6 +661,7 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= @@ -590,12 +692,14 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -603,6 +707,10 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -636,6 +744,7 @@ github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -653,7 +762,9 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -671,9 +782,12 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.5.11 h1:wioTuNmaBU3IE9vdFtFMcmZWj0QzLc6DYaP6sNe5onY= github.com/hashicorp/go-getter v1.5.11/go.mod h1:9i48BP6wpWweI/0/+FBjqLrp9S8XtwUGjiu0QkWHEaY= +github.com/hashicorp/go-getter v1.6.1 h1:NASsgP4q6tL94WH6nJxKWj8As2H/2kop/bB1d8JMyRY= +github.com/hashicorp/go-getter v1.6.1/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -695,6 +809,8 @@ github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= +github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -713,8 +829,11 @@ github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= +github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= +github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -724,12 +843,15 @@ github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63 github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -748,6 +870,8 @@ github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bS github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -755,10 +879,12 @@ github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7H github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f/go.mod h1:qr2b5kx4HbFS7/g4uYO5qv9ei8303JMsC7ESbYiqr2Q= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= github.com/jhump/protoreflect v1.12.0 h1:1NQ4FpWMgn3by/n1X0fbeKEUxP1wBt7+Oitpv01HR10= github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -795,6 +921,7 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -810,9 +937,12 @@ github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -828,6 +958,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kulti/thelper v0.5.1/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= +github.com/kulti/thelper v0.6.2/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= @@ -835,24 +966,32 @@ github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4F github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lazyledger/smt v0.2.1-0.20210709230900-03ea40719554/go.mod h1:9+Pb2/tg1PvEgW7aFx4bFhDE4bvbI03zuJ8kb7nJ9Jc= github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= +github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= +github.com/lufeee/execinquery v1.0.0/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -874,6 +1013,7 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= @@ -900,6 +1040,7 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/mgechev/revive v1.1.4/go.mod h1:ZZq2bmyssGh8MSPz3VVziqRNIMYTJXzP8MUKG90vZ9A= +github.com/mgechev/revive v1.2.1/go.mod h1:+Ro3wqY4vakcYNtkBWdZC7dBg1xSB6sp054wWwmeFm0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= @@ -907,6 +1048,7 @@ github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJys github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= @@ -928,10 +1070,15 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -939,6 +1086,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= @@ -976,6 +1124,7 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/nishanths/exhaustive v0.7.11/go.mod h1:gX+MP7DWMKJmNa1HfMozK+u04hQd3na9i0hyqf3/dOI= github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -984,6 +1133,7 @@ github.com/oasisprotocol/curve25519-voi v0.0.0-20210609091139-0a56a4bca00b/go.mo github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= @@ -997,6 +1147,7 @@ github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvw github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -1004,6 +1155,7 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -1015,8 +1167,11 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runc v1.0.3 h1:1hbqejyQWCJBvtKAfdO0b1FmaEf2z/bxnjqbARass5k= github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -1030,6 +1185,7 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= @@ -1040,10 +1196,18 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.0/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -1056,12 +1220,15 @@ github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= @@ -1069,6 +1236,7 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polyfloyd/go-errorlint v0.0.0-20211125173453-6d6d39c5bb8b/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= +github.com/polyfloyd/go-errorlint v1.0.0/go.mod h1:KZy4xxPJyy88/gldCe5OdW6OQRtNO3EZE7hXzmnebgA= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= @@ -1081,8 +1249,11 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1104,6 +1275,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1120,14 +1293,19 @@ github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= github.com/quasilyte/go-ruleguard v0.3.15/go.mod h1:NhuWhnlVEM1gT1A4VJHYfy9MuYSxxwHgxWoPsn9llB4= +github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a/go.mod h1:VMX+OnnSw4LicdiEGtRSD/1X8kW7GuEscjYNr4cOIT4= github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.12-0.20220101150716-969a394a9451/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.12/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.16/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.17/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.19/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= github.com/quasilyte/gogrep v0.0.0-20220103110004-ffaa07af02e3/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= +github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1137,6 +1315,9 @@ github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzy github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1151,6 +1332,8 @@ github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= +github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= +github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1160,13 +1343,18 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= +github.com/sagikazarmark/crypt v0.5.0/go.mod h1:l+nzl7KWh51rpzp2h7t4MZWyiEWdhNpOAnclKvg+mdA= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/securego/gosec/v2 v2.9.6/go.mod h1:EESY9Ywxo/Zc5NyF/qIj6Cop+4PSWM0F0OfGD7FdIXc= +github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= @@ -1175,6 +1363,7 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v3 v3.22.1/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY= +github.com/shirou/gopsutil/v3 v3.22.4/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -1186,7 +1375,9 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sivchari/containedctx v1.0.1/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= +github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= +github.com/sivchari/tenv v1.5.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= @@ -1202,15 +1393,22 @@ github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY52 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60= github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1226,8 +1424,12 @@ github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhU github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1237,6 +1439,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1247,8 +1450,15 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= +github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= @@ -1264,30 +1474,39 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tendermint/tendermint v0.34.14/go.mod h1:FrwVm3TvsVicI9Z7FlucHV6Znfd5KBc/Lpp69cCwtk0= -github.com/tendermint/tendermint v0.35.2 h1:AhPjef5hptLQP5i8vs+8zMCu9mczX5fvBd2F575QXVk= -github.com/tendermint/tendermint v0.35.2/go.mod h1:0sVA1nOm5KKaxHar3aIzmMGKH9F/nBMn7T5ruQGZuHg= +github.com/tendermint/tendermint v0.34.20-rc1 h1:5ej9Fk5zlDF6Pa8/FJKp9j3Sto95JdCV+wVJFi94E5k= +github.com/tendermint/tendermint v0.34.20-rc1/go.mod h1:u2xI6q3IeLQQ2NdIpRKLUKBNog0o7EzBpvDCE0/OTmg= +github.com/tendermint/tendermint v0.35.8 h1:zgfeDBkN+p7XBf/Qz7hK7Y55AJk65BbS0eV0UDS9MQY= +github.com/tendermint/tendermint v0.35.8/go.mod h1:6cIWilifL392hrtTPeYL5A6CqNBwDbhvwvAZSDmQpvc= github.com/tendermint/tm-db v0.6.4/go.mod h1:dptYhIpJ2M5kUuenLr+Yyf3zQOv1SgBZcl8/BmWlMBw= -github.com/tendermint/tm-db v0.6.6 h1:EzhaOfR0bdKyATqcd5PNeyeq8r+V4bRPHBfyFdD9kGM= github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= +github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= +github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.12.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.3/go.mod h1:5WdjKx3AQMvCJ4RG6/2UYT7dLrGvJUV1x4jdTAyGvZs= +github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= +github.com/tomarrell/wrapcheck/v2 v2.6.1/go.mod h1:Eo+Opt6pyMW1b6cNllOcDSSoHO0aTJ+iF6BfCUbHltA= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.5.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= @@ -1316,12 +1535,17 @@ github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+ github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vektra/mockery/v2 v2.10.0/go.mod h1:m/WO2UzWzqgVX3nvqpRQq70I4Z7jbSCRhdmkgtp+Ab4= +github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= @@ -1329,6 +1553,7 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= github.com/yeya24/promlinter v0.1.1-0.20210918184747-d757024714a1/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= +github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= @@ -1354,11 +1579,18 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v2 v2.305.2/go.mod h1:2D7ZejHVMIfog1221iLSYlQRzrtECw3kz4I4VAQm3qI= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1377,17 +1609,20 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1409,6 +1644,7 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -1416,12 +1652,18 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220313003712-b769efc7c000/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1436,6 +1678,7 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1464,6 +1707,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1505,6 +1750,7 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1520,6 +1766,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1529,6 +1776,14 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b h1:MWaHNqZy3KTpuTMAGvv+Kw+ylsEpmyJZizz1dqxnu28= golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9 h1:Yqz/iviulwKwAREEeUd3nbBFn0XuyJqkoft2IlrvOhc= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1547,6 +1802,10 @@ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1560,6 +1819,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29 h1:w8s32wxx3sY+OjLlv9qltkLU5yvJzxjjgiHWLjdIcw4= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1622,6 +1883,7 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1653,6 +1915,7 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1661,14 +1924,17 @@ golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1677,10 +1943,29 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1705,6 +1990,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1718,6 +2004,7 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1802,11 +2089,17 @@ golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11-0.20220316014157-77aa08bb151a/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= @@ -1850,6 +2143,14 @@ google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3h google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.63.0 h1:n2bqqK895ygnBpdPDYetfy23K7fJ22wsrZKCyfuRkkA= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0 h1:o8WF5AvfidafWbFjsRyupxyEQJNUWxLZJCK5NXrxZZ8= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1939,9 +2240,25 @@ google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 h1:zzNejm+EgrbLfDZ6lu9Uud2IVvHySPl8vQzf04laR5Q= google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1982,6 +2299,11 @@ google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5 google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1995,8 +2317,11 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2016,6 +2341,9 @@ gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w= gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -2037,7 +2365,12 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2048,7 +2381,9 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= honnef.co/go/tools v0.2.2/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= +honnef.co/go/tools v0.3.1/go.mod h1:vlRD9XErLMGT+mDuofSr0mMMquscM/1nQqtRSsh6m70= mvdan.cc/gofumpt v0.2.1/go.mod h1:a/rvZPhsNaedOJBzqRD9omnwVwHZsBdJirXHa9Gh9Ig= +mvdan.cc/gofumpt v0.3.1/go.mod h1:w3ymliuxvzVx8DAutBnVyDqYb1Niy/yCJt/lk821YCE= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20211214103731-d0ef000c54e5/go.mod h1:b8RRCBm0eeiWR8cfN88xeq2G5SG3VKGO+5UPWi5FSOY= @@ -2060,6 +2395,7 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/testutil/network/network.go b/testutil/network/network.go index c6183891..42116cc3 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -12,14 +12,12 @@ import ( "path/filepath" "strings" "sync" - "testing" "time" "github.com/rs/zerolog" "github.com/spf13/cobra" - "github.com/tendermint/tendermint/config" tmrand "github.com/tendermint/tendermint/libs/rand" - "github.com/tendermint/tendermint/libs/service" + "github.com/tendermint/tendermint/node" tmclient "github.com/tendermint/tendermint/rpc/client" dbm "github.com/tendermint/tm-db" "google.golang.org/grpc" @@ -32,12 +30,12 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" srvconfig "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/simapp/params" - storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -61,7 +59,7 @@ func NewAppConstructor(encodingCfg params.EncodingConfig) AppConstructor { val.Ctx.Logger, dbm.NewMemDB(), nil, true, make(map[int64]bool), val.Ctx.Config.RootDir, 0, encodingCfg, simapp.EmptyAppOptions{}, - baseapp.SetPruning(storetypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), + baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices), ) } @@ -77,7 +75,7 @@ type Config struct { TxConfig client.TxConfig AccountRetriever client.AccountRetriever AppConstructor AppConstructor // the ABCI application constructor - GenesisState map[string]json.RawMessage // custom gensis state to provide + GenesisState map[string]json.RawMessage // custom genesis state to provide TimeoutCommit time.Duration // the consensus commitment timeout ChainID string // the network chain-id NumValidators int // the total number of validators to create and bond @@ -119,7 +117,7 @@ func DefaultConfig() Config { AccountTokens: sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction), StakingTokens: sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction), BondedTokens: sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction), - PruningStrategy: storetypes.PruningOptionNothing, + PruningStrategy: pruningtypes.PruningOptionNothing, CleanupDir: true, SigningAlgo: string(hd.Secp256k1Type), KeyringOptions: []keyring.Option{}, @@ -164,7 +162,7 @@ type ( ValAddress sdk.ValAddress RPCClient tmclient.Client - tmNode service.Service + tmNode *node.Node api *api.Server grpc *grpc.Server grpcWeb *http.Server @@ -178,21 +176,26 @@ type Logger interface { Logf(format string, args ...interface{}) } -var _ Logger = (*testing.T)(nil) -var _ Logger = (*CLILogger)(nil) +var ( + _ Logger = (*CLILogger)(nil) +) +// CLILogger wraps a cobra.Command and provides command logging methods. type CLILogger struct { cmd *cobra.Command } +// Log logs given args. func (s CLILogger) Log(args ...interface{}) { s.cmd.Println(args...) } +// Logf logs given args according to a format specifier. func (s CLILogger) Logf(format string, args ...interface{}) { s.cmd.Printf(format, args...) } +// NewCLILogger creates a new CLILogger. func NewCLILogger(cmd *cobra.Command) CLILogger { return CLILogger{cmd} } @@ -236,7 +239,6 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { ctx := server.NewDefaultContext() tmCfg := ctx.Config tmCfg.Consensus.TimeoutCommit = cfg.TimeoutCommit - tmCfg.Mode = config.ModeValidator // Only allow the first validator to expose an RPC, API and gRPC // server/client due to Tendermint in-process constraints. @@ -305,12 +307,12 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { clientDir := filepath.Join(network.BaseDir, nodeDirName, "simcli") gentxsDir := filepath.Join(network.BaseDir, "gentxs") - err := os.MkdirAll(filepath.Join(nodeDir, "config"), 0755) + err := os.MkdirAll(filepath.Join(nodeDir, "config"), 0o755) if err != nil { return nil, err } - err = os.MkdirAll(clientDir, 0755) + err = os.MkdirAll(clientDir, 0o755) if err != nil { return nil, err } @@ -443,6 +445,7 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { if err != nil { return nil, err } + srvconfig.WriteConfigFile(filepath.Join(nodeDir, "config", "app.toml"), appCfg) clientCtx := client.Context{}. @@ -603,6 +606,10 @@ func (n *Network) Cleanup() { } } + // Give a brief pause for things to finish closing in other processes. Hopefully this helps with the address-in-use errors. + // 100ms chosen randomly. + time.Sleep(100 * time.Millisecond) + if n.Config.CleanupDir { _ = os.RemoveAll(n.BaseDir) } diff --git a/testutil/network/util.go b/testutil/network/util.go index 104d156b..05931dc8 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -6,20 +6,22 @@ import ( "path/filepath" "time" - abciclient "github.com/tendermint/tendermint/abci/client" tmos "github.com/tendermint/tendermint/libs/os" - tmtime "github.com/tendermint/tendermint/libs/time" "github.com/tendermint/tendermint/node" + "github.com/tendermint/tendermint/p2p" + pvm "github.com/tendermint/tendermint/privval" + "github.com/tendermint/tendermint/proxy" "github.com/tendermint/tendermint/rpc/client/local" "github.com/tendermint/tendermint/types" + tmtime "github.com/tendermint/tendermint/types/time" "github.com/cosmos/cosmos-sdk/server/api" servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" srvtypes "github.com/cosmos/cosmos-sdk/server/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/iqlusioninc/liquidity-staking-module/x/genutil" ) func startInProcess(cfg Config, val *Validator) error { @@ -31,36 +33,36 @@ func startInProcess(cfg Config, val *Validator) error { return err } - app := cfg.AppConstructor(*val) - - genDoc, err := types.GenesisDocFromFile(tmCfg.GenesisFile()) + nodeKey, err := p2p.LoadOrGenNodeKey(tmCfg.NodeKeyFile()) if err != nil { return err } - val.tmNode, err = node.New( + app := cfg.AppConstructor(*val) + genDocProvider := node.DefaultGenesisDocProviderFunc(tmCfg) + + tmNode, err := node.NewNode( tmCfg, + pvm.LoadOrGenFilePV(tmCfg.PrivValidatorKeyFile(), tmCfg.PrivValidatorStateFile()), + nodeKey, + proxy.NewLocalClientCreator(app), + genDocProvider, + node.DefaultDBProvider, + node.DefaultMetricsProvider(tmCfg.Instrumentation), logger.With("module", val.Moniker), - abciclient.NewLocalCreator(app), - genDoc, ) if err != nil { return err } - if err := val.tmNode.Start(); err != nil { + if err := tmNode.Start(); err != nil { return err } + val.tmNode = tmNode + if val.RPCAddress != "" { - node, ok := val.tmNode.(local.NodeService) - if !ok { - panic("can't cast service.Service to NodeService") - } - val.RPCClient, err = local.New(node) - if err != nil { - panic("cant create a local node") - } + val.RPCClient = local.New(tmNode) } // We'll need a RPC client if the validator exposes a gRPC or REST endpoint. @@ -97,7 +99,7 @@ func startInProcess(cfg Config, val *Validator) error { } if val.AppConfig.GRPC.Enable { - grpcSrv, err := servergrpc.StartGRPCServer(val.ClientCtx, app, val.AppConfig.GRPC.Address) + grpcSrv, err := servergrpc.StartGRPCServer(val.ClientCtx, app, val.AppConfig.GRPC) if err != nil { return err } @@ -150,7 +152,6 @@ func collectGenFiles(cfg Config, vals []*Validator, outputDir string) error { } func initGenFiles(cfg Config, genAccounts []authtypes.GenesisAccount, genBalances []banktypes.Balance, genFiles []string) error { - // set the accounts in the genesis state var authGenState authtypes.GenesisState cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[authtypes.ModuleName], &authGenState) @@ -195,12 +196,12 @@ func writeFile(name string, dir string, contents []byte) error { writePath := filepath.Join(dir) file := filepath.Join(writePath, name) - err := tmos.EnsureDir(writePath, 0755) + err := tmos.EnsureDir(writePath, 0o755) if err != nil { return err } - err = ioutil.WriteFile(file, contents, 0644) // nolint: gosec + err = ioutil.WriteFile(file, contents, 0o644) // nolint: gosec if err != nil { return err } diff --git a/x/distribution/keeper/validator.go b/x/distribution/keeper/validator.go index 73ec51f0..a90690b9 100644 --- a/x/distribution/keeper/validator.go +++ b/x/distribution/keeper/validator.go @@ -45,7 +45,7 @@ func (k Keeper) IncrementValidatorPeriod(ctx sdk.Context, val sdkstaking.Validat current = sdk.DecCoins{} } else { // note: necessary to truncate so we don't allow withdrawing more rewards than owed - current = rewards.Rewards.QuoDecTruncate(val.GetTokens().ToDec()) + current = rewards.Rewards.QuoDecTruncate(sdk.NewDecFromInt(val.GetTokens())) } // fetch historical rewards for last period diff --git a/x/distribution/simulation/operations.go b/x/distribution/simulation/operations.go index b1985ab1..712429ed 100644 --- a/x/distribution/simulation/operations.go +++ b/x/distribution/simulation/operations.go @@ -27,11 +27,7 @@ const ( ) // WeightedOperations returns all the operations from the module with their respective weights -func WeightedOperations( - appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, - bk types.BankKeeper, k keeper.Keeper, sk stakingkeeper.Keeper, -) simulation.WeightedOperations { - +func WeightedOperations(appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, sk types.StakingKeeper) simulation.WeightedOperations { var weightMsgSetWithdrawAddress int appParams.GetOrGenerate(cdc, OpWeightMsgSetWithdrawAddress, &weightMsgSetWithdrawAddress, nil, func(_ *rand.Rand) { @@ -67,6 +63,8 @@ func WeightedOperations( }, ) + stakeKeeper := sk.(stakingkeeper.Keeper) + return simulation.WeightedOperations{ simulation.NewWeightedOperation( weightMsgSetWithdrawAddress, @@ -74,19 +72,19 @@ func WeightedOperations( ), simulation.NewWeightedOperation( weightMsgWithdrawDelegationReward, - SimulateMsgWithdrawDelegatorReward(ak, bk, k, sk), + SimulateMsgWithdrawDelegatorReward(ak, bk, k, stakeKeeper), ), simulation.NewWeightedOperation( weightMsgWithdrawValidatorCommission, - SimulateMsgWithdrawValidatorCommission(ak, bk, k, sk), + SimulateMsgWithdrawValidatorCommission(ak, bk, k, stakeKeeper), ), simulation.NewWeightedOperation( weightMsgFundCommunityPool, - SimulateMsgFundCommunityPool(ak, bk, k, sk), + SimulateMsgFundCommunityPool(ak, bk, k, stakeKeeper), ), simulation.NewWeightedOperation( weightMsgWithdrawTokenizeShareRecordReward, - SimulateMsgWithdrawTokenizeShareRecordReward(ak, bk, k, sk), + SimulateMsgWithdrawTokenizeShareRecordReward(ak, bk, k, stakeKeeper), ), } } @@ -174,7 +172,6 @@ func SimulateMsgWithdrawValidatorCommission(ak types.AccountKeeper, bk types.Ban return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - validator, ok := stakingkeeper.RandomValidator(r, sk, ctx) if !ok { return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgWithdrawValidatorCommission, "random validator is not ok"), nil, nil @@ -220,7 +217,6 @@ func SimulateMsgFundCommunityPool(ak types.AccountKeeper, bk types.BankKeeper, k return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - funder, _ := simtypes.RandomAcc(r, accs) account := ak.GetAccount(ctx, funder.Address) @@ -236,7 +232,7 @@ func SimulateMsgFundCommunityPool(ak types.AccountKeeper, bk types.BankKeeper, k err error ) - coins, hasNeg := spendable.SafeSub(fundAmount) + coins, hasNeg := spendable.SafeSub(fundAmount...) if !hasNeg { fees, err = simtypes.RandomFees(r, ctx, coins) if err != nil { @@ -247,6 +243,7 @@ func SimulateMsgFundCommunityPool(ak types.AccountKeeper, bk types.BankKeeper, k msg := types.NewMsgFundCommunityPool(fundAmount, funder.Address) txCtx := simulation.OperationInput{ + R: r, App: app, TxGen: simappparams.MakeTestEncodingConfig().TxConfig, Cdc: nil, diff --git a/x/genutil/utils.go b/x/genutil/utils.go index 251b0f39..7fbdc668 100644 --- a/x/genutil/utils.go +++ b/x/genutil/utils.go @@ -1,7 +1,6 @@ package genutil import ( - "context" "encoding/json" "fmt" "path/filepath" @@ -11,6 +10,7 @@ import ( cfg "github.com/tendermint/tendermint/config" tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" tmos "github.com/tendermint/tendermint/libs/os" + "github.com/tendermint/tendermint/p2p" "github.com/tendermint/tendermint/privval" tmtypes "github.com/tendermint/tendermint/types" @@ -34,7 +34,6 @@ func ExportGenesisFileWithTime( genFile, chainID string, validators []tmtypes.GenesisValidator, appState json.RawMessage, genTime time.Time, ) error { - genDoc := tmtypes.GenesisDoc{ GenesisTime: genTime, ChainID: chainID, @@ -60,36 +59,33 @@ func InitializeNodeValidatorFilesFromMnemonic(config *cfg.Config, mnemonic strin if len(mnemonic) > 0 && !bip39.IsMnemonicValid(mnemonic) { return "", nil, fmt.Errorf("invalid mnemonic") } - nodeKey, err := tmtypes.LoadOrGenNodeKey(config.NodeKeyFile()) + nodeKey, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()) if err != nil { return "", nil, err } - nodeID = string(nodeKey.ID) + nodeID = string(nodeKey.ID()) - pvKeyFile := config.PrivValidator.KeyFile() - if err := tmos.EnsureDir(filepath.Dir(pvKeyFile), 0777); err != nil { + pvKeyFile := config.PrivValidatorKeyFile() + if err := tmos.EnsureDir(filepath.Dir(pvKeyFile), 0o777); err != nil { return "", nil, err } - pvStateFile := config.PrivValidator.StateFile() - if err := tmos.EnsureDir(filepath.Dir(pvStateFile), 0777); err != nil { + pvStateFile := config.PrivValidatorStateFile() + if err := tmos.EnsureDir(filepath.Dir(pvStateFile), 0o777); err != nil { return "", nil, err } var filePV *privval.FilePV if len(mnemonic) == 0 { - filePV, err = privval.LoadOrGenFilePV(pvKeyFile, pvStateFile) - if err != nil { - return "", nil, err - } + filePV = privval.LoadOrGenFilePV(pvKeyFile, pvStateFile) } else { privKey := tmed25519.GenPrivKeyFromSecret([]byte(mnemonic)) filePV = privval.NewFilePV(privKey, pvKeyFile, pvStateFile) filePV.Save() } - tmValPubKey, err := filePV.GetPubKey(context.TODO()) + tmValPubKey, err := filePV.GetPubKey() if err != nil { return "", nil, err } diff --git a/x/slashing/simulation/operations.go b/x/slashing/simulation/operations.go index 88c73660..5f975e71 100644 --- a/x/slashing/simulation/operations.go +++ b/x/slashing/simulation/operations.go @@ -24,9 +24,8 @@ const ( // WeightedOperations returns all the operations from the module with their respective weights func WeightedOperations( appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, - bk types.BankKeeper, k keeper.Keeper, sk stakingkeeper.Keeper, + bk types.BankKeeper, k keeper.Keeper, sk types.StakingKeeper, ) simulation.WeightedOperations { - var weightMsgUnjail int appParams.GetOrGenerate(cdc, OpWeightMsgUnjail, &weightMsgUnjail, nil, func(_ *rand.Rand) { @@ -37,7 +36,7 @@ func WeightedOperations( return simulation.WeightedOperations{ simulation.NewWeightedOperation( weightMsgUnjail, - SimulateMsgUnjail(ak, bk, k, sk), + SimulateMsgUnjail(ak, bk, k, sk.(stakingkeeper.Keeper)), ), } } @@ -48,7 +47,6 @@ func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Kee r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - validator, ok := stakingkeeper.RandomValidator(r, sk, ctx) if !ok { return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUnjail, "validator is not ok"), nil, nil // skip @@ -88,9 +86,10 @@ func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Kee msg := types.NewMsgUnjail(validator.GetOperator()) - txGen := simappparams.MakeTestEncodingConfig().TxConfig - tx, err := helpers.GenTx( - txGen, + txCfg := simappparams.MakeTestEncodingConfig().TxConfig + tx, err := helpers.GenSignedMockTx( + r, + txCfg, []sdk.Msg{msg}, fees, helpers.DefaultGenTxGas, @@ -103,7 +102,7 @@ func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Kee return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err } - _, res, err := app.SimDeliver(txGen.TxEncoder(), tx) + _, res, err := app.SimDeliver(txCfg.TxEncoder(), tx) // result should fail if: // - validator cannot be unjailed due to tombstone diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index b05b4b6e..9a85e54f 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -415,8 +415,8 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS return nil, types.ErrOnlyBondDenomAllowdForTokenize } - delegationAmount := validator.Tokens.ToDec().Mul(delegation.GetShares()).Quo(validator.DelegatorShares) - if msg.Amount.Amount.GT(sdk.Int(delegationAmount)) { + delegationAmount := sdk.NewDecFromInt(validator.Tokens).Mul(delegation.GetShares()).Quo(validator.DelegatorShares) + if sdk.NewDecFromInt(msg.Amount.Amount).GT(delegationAmount) { return nil, sdkstaking.ErrNotEnoughDelegationShares } @@ -548,7 +548,7 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken // moduleAccountTotalDelegation * redeemAmount / totalIssue delegation, found := k.GetDelegation(ctx, record.GetModuleAddress(), valAddr) shareDenomSupply := k.bankKeeper.GetSupply(ctx, msg.Amount.Denom) - shares := delegation.Shares.Mul(msg.Amount.Amount.ToDec()).QuoInt(shareDenomSupply.Amount) + shares := delegation.Shares.Mul(sdk.NewDecFromInt(msg.Amount.Amount)).QuoInt(shareDenomSupply.Amount) returnAmount, err := k.Unbond(ctx, record.GetModuleAddress(), valAddr, shares) if err != nil { diff --git a/x/staking/keeper/pool.go b/x/staking/keeper/pool.go index 85875084..c9d6a431 100644 --- a/x/staking/keeper/pool.go +++ b/x/staking/keeper/pool.go @@ -71,7 +71,7 @@ func (k Keeper) StakingTokenSupply(ctx sdk.Context) sdk.Int { func (k Keeper) BondedRatio(ctx sdk.Context) sdk.Dec { stakeSupply := k.StakingTokenSupply(ctx) if stakeSupply.IsPositive() { - return k.TotalBondedTokens(ctx).ToDec().QuoInt(stakeSupply) + return sdk.NewDecFromInt(k.TotalBondedTokens(ctx)).QuoInt(stakeSupply) } return sdk.ZeroDec() diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index cb0f9601..0fe9316f 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -31,7 +31,7 @@ func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeigh // Amount of slashing = slash slashFactor * power at time of infraction amount := k.TokensFromConsensusPower(ctx, power) - slashAmountDec := amount.ToDec().Mul(slashFactor) + slashAmountDec := sdk.NewDecFromInt(amount).Mul(slashFactor) slashAmount := slashAmountDec.TruncateInt() // ref https://github.com/cosmos/cosmos-sdk/issues/1348 @@ -109,7 +109,7 @@ func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeigh // we need to calculate the *effective* slash fraction for distribution if validator.Tokens.IsPositive() { - effectiveFraction := tokensToBurn.ToDec().QuoRoundUp(validator.Tokens.ToDec()) + effectiveFraction := sdk.NewDecFromInt(tokensToBurn).QuoRoundUp(sdk.NewDecFromInt(validator.Tokens)) // possible if power has changed if effectiveFraction.GT(sdk.OneDec()) { effectiveFraction = sdk.OneDec() diff --git a/x/staking/simulation/genesis.go b/x/staking/simulation/genesis.go index 82bc5117..4282f58e 100644 --- a/x/staking/simulation/genesis.go +++ b/x/staking/simulation/genesis.go @@ -89,11 +89,11 @@ func RandomizedGenState(simState *module.SimulationState) { if err != nil { panic(err) } - validator.Tokens = sdk.NewInt(simState.InitialStake) - validator.DelegatorShares = sdk.NewDec(simState.InitialStake) + validator.Tokens = simState.InitialStake + validator.DelegatorShares = sdk.NewDecFromInt(simState.InitialStake) validator.Commission = commission - delegation := types.NewDelegation(simState.Accounts[i].Address, valAddr, sdk.NewDec(simState.InitialStake)) + delegation := types.NewDelegation(simState.Accounts[i].Address, valAddr, sdk.NewDecFromInt(simState.InitialStake)) validators = append(validators, validator) delegations = append(delegations, delegation) diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index 98897a3d..df80423a 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -28,6 +28,7 @@ const ( OpWeightMsgDelegate = "op_weight_msg_delegate" OpWeightMsgUndelegate = "op_weight_msg_undelegate" OpWeightMsgBeginRedelegate = "op_weight_msg_begin_redelegate" + OpWeightMsgCancelUnbondingDelegation = "op_weight_msg_cancel_unbonding_delegation" OpWeightMsgTokenizeShares = "op_weight_msg_tokenize_shares" OpWeightMsgRedeemTokensforShares = "op_weight_msg_redeem_tokens_for_shares" OpWeightMsgTransferTokenizeShareRecord = "op_weight_msg_transfer_tokenize_share_record" @@ -44,6 +45,7 @@ func WeightedOperations( weightMsgDelegate int weightMsgUndelegate int weightMsgBeginRedelegate int + weightMsgCancelUnbondingDelegation int weightMsgTokenizeShares int weightMsgRedeemTokensforShares int weightMsgTransferTokenizeShareRecord int @@ -79,6 +81,12 @@ func WeightedOperations( }, ) + appParams.GetOrGenerate(cdc, OpWeightMsgCancelUnbondingDelegation, &weightMsgCancelUnbondingDelegation, nil, + func(_ *rand.Rand) { + weightMsgCancelUnbondingDelegation = simappparams.DefaultWeightMsgCancelUnbondingDelegation + }, + ) + appParams.GetOrGenerate(cdc, OpWeightMsgTokenizeShares, &weightMsgTokenizeShares, nil, func(_ *rand.Rand) { weightMsgTokenizeShares = DefaultWeightMsgTokenizeShares @@ -118,6 +126,10 @@ func WeightedOperations( weightMsgBeginRedelegate, SimulateMsgBeginRedelegate(ak, bk, k), ), + simulation.NewWeightedOperation( + weightMsgCancelUnbondingDelegation, + SimulateMsgCancelUnbondingDelegate(ak, bk, k), + ), simulation.NewWeightedOperation( weightMsgTokenizeShares, SimulateMsgTokenizeShares(ak, bk, k), @@ -166,7 +178,7 @@ func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k k var fees sdk.Coins - coins, hasNeg := spendable.SafeSub(sdk.Coins{selfDelegation}) + coins, hasNeg := spendable.SafeSub(selfDelegation) if !hasNeg { fees, err = simtypes.RandomFees(r, ctx, coins) if err != nil { @@ -174,7 +186,7 @@ func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k k } } - description := sdkstaking.NewDescription( + description := types.NewDescription( simtypes.RandStringOfLength(r, 10), simtypes.RandStringOfLength(r, 10), simtypes.RandStringOfLength(r, 10), @@ -183,18 +195,19 @@ func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k k ) maxCommission := sdk.NewDecWithPrec(int64(simtypes.RandIntBetween(r, 0, 100)), 2) - commission := sdkstaking.NewCommissionRates( + commission := types.NewCommissionRates( simtypes.RandomDecAmount(r, maxCommission), maxCommission, simtypes.RandomDecAmount(r, maxCommission), ) - msg, err := sdkstaking.NewMsgCreateValidator(address, simAccount.ConsKey.PubKey(), selfDelegation, description, commission, sdk.OneInt()) + msg, err := types.NewMsgCreateValidator(address, simAccount.ConsKey.PubKey(), selfDelegation, description, commission, sdk.OneInt()) if err != nil { return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to create CreateValidator message"), nil, err } txCtx := simulation.OperationInput{ + R: r, App: app, TxGen: simappparams.MakeTestEncodingConfig().TxConfig, Cdc: nil, @@ -241,7 +254,7 @@ func SimulateMsgEditValidator(ak types.AccountKeeper, bk types.BankKeeper, k kee account := ak.GetAccount(ctx, simAccount.Address) spendable := bk.SpendableCoins(ctx, account.GetAddress()) - description := sdkstaking.NewDescription( + description := types.NewDescription( simtypes.RandStringOfLength(r, 10), simtypes.RandStringOfLength(r, 10), simtypes.RandStringOfLength(r, 10), @@ -249,7 +262,7 @@ func SimulateMsgEditValidator(ak types.AccountKeeper, bk types.BankKeeper, k kee simtypes.RandStringOfLength(r, 10), ) - msg := sdkstaking.NewMsgEditValidator(address, description, &newCommissionRate, nil) + msg := types.NewMsgEditValidator(address, description, &newCommissionRate, nil) txCtx := simulation.OperationInput{ R: r, @@ -308,7 +321,7 @@ func SimulateMsgDelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.K var fees sdk.Coins - coins, hasNeg := spendable.SafeSub(sdk.Coins{bondAmt}) + coins, hasNeg := spendable.SafeSub(bondAmt) if !hasNeg { fees, err = simtypes.RandomFees(r, ctx, coins) if err != nil { @@ -316,9 +329,10 @@ func SimulateMsgDelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.K } } - msg := sdkstaking.NewMsgDelegate(simAccount.Address, val.GetOperator(), bondAmt) + msg := types.NewMsgDelegate(simAccount.Address, val.GetOperator(), bondAmt) txCtx := simulation.OperationInput{ + R: r, App: app, TxGen: simappparams.MakeTestEncodingConfig().TxConfig, Cdc: nil, @@ -373,7 +387,7 @@ func SimulateMsgUndelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgUndelegate, "unbond amount is zero"), nil, nil } - msg := sdkstaking.NewMsgUndelegate( + msg := types.NewMsgUndelegate( delAddr, valAddr, sdk.NewCoin(k.BondDenom(ctx), unbondAmt), ) @@ -413,6 +427,74 @@ func SimulateMsgUndelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper } } +// SimulateMsgCancelUnbondingDelegate generates a MsgCancelUnbondingDelegate with random values +func SimulateMsgCancelUnbondingDelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { + return func( + r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, + ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if len(k.GetAllValidators(ctx)) == 0 { + return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgDelegate, "number of validators equal zero"), nil, nil + } + // get random account + simAccount, _ := simtypes.RandomAcc(r, accs) + // get random validator + validator, ok := keeper.RandomValidator(r, k, ctx) + if !ok { + return simtypes.NoOpMsg(types.ModuleName, sdkstaking.TypeMsgCancelUnbondingDelegation, "validator is not ok"), nil, nil + } + + if validator.IsJailed() || validator.InvalidExRate() { + return simtypes.NoOpMsg(types.ModuleName, sdkstaking.TypeMsgCancelUnbondingDelegation, "validator is jailed"), nil, nil + } + + valAddr := validator.GetOperator() + unbondingDelegation, found := k.GetUnbondingDelegation(ctx, simAccount.Address, valAddr) + if !found { + return simtypes.NoOpMsg(types.ModuleName, sdkstaking.TypeMsgCancelUnbondingDelegation, "account does have any unbonding delegation"), nil, nil + } + + // get random unbonding delegation entry at block height + unbondingDelegationEntry := unbondingDelegation.Entries[r.Intn(len(unbondingDelegation.Entries))] + + if unbondingDelegationEntry.CompletionTime.Before(ctx.BlockTime()) { + return simtypes.NoOpMsg(types.ModuleName, sdkstaking.TypeMsgCancelUnbondingDelegation, "unbonding delegation is already processed"), nil, nil + } + + if !unbondingDelegationEntry.Balance.IsPositive() { + return simtypes.NoOpMsg(types.ModuleName, sdkstaking.TypeMsgCancelUnbondingDelegation, "delegator receiving balance is negative"), nil, nil + } + + cancelBondAmt := simtypes.RandomAmount(r, unbondingDelegationEntry.Balance) + + if cancelBondAmt.IsZero() { + return simtypes.NoOpMsg(types.ModuleName, sdkstaking.TypeMsgCancelUnbondingDelegation, "cancelBondAmt amount is zero"), nil, nil + } + + msg := sdkstaking.NewMsgCancelUnbondingDelegation( + simAccount.Address, valAddr, unbondingDelegationEntry.CreationHeight, sdk.NewCoin(k.BondDenom(ctx), cancelBondAmt), + ) + + spendable := bk.SpendableCoins(ctx, simAccount.Address) + + txCtx := simulation.OperationInput{ + R: r, + App: app, + TxGen: simappparams.MakeTestEncodingConfig().TxConfig, + Cdc: nil, + Msg: msg, + MsgType: msg.Type(), + Context: ctx, + SimAccount: simAccount, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: spendable, + } + + return simulation.GenAndDeliverTxWithRandFees(txCtx) + } +} + // SimulateMsgBeginRedelegate generates a MsgBeginRedelegate with random values func SimulateMsgBeginRedelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { return func( @@ -491,7 +573,7 @@ func SimulateMsgBeginRedelegate(ak types.AccountKeeper, bk types.BankKeeper, k k account := ak.GetAccount(ctx, delAddr) spendable := bk.SpendableCoins(ctx, account.GetAddress()) - msg := sdkstaking.NewMsgBeginRedelegate( + msg := types.NewMsgBeginRedelegate( delAddr, srcAddr, destAddr, sdk.NewCoin(k.BondDenom(ctx), redAmt), ) diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index a9e951f3..99ecb71a 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -343,7 +343,7 @@ func (v Validator) SharesFromTokensTruncated(amt sdk.Int) (sdk.Dec, error) { return sdk.ZeroDec(), sdkstaking.ErrInsufficientShares } - return v.GetDelegatorShares().MulInt(amt).QuoTruncate(v.GetTokens().ToDec()), nil + return v.GetDelegatorShares().MulInt(amt).QuoTruncate(sdk.NewDecFromInt(v.GetTokens())), nil } // get the bonded tokens which the validator holds @@ -383,7 +383,7 @@ func (v Validator) AddTokensFromDel(amount sdk.Int) (Validator, sdk.Dec) { var issuedShares sdk.Dec if v.DelegatorShares.IsZero() { // the first delegation to a validator sets the exchange rate to one - issuedShares = amount.ToDec() + issuedShares = sdk.NewDecFromInt(amount) } else { shares, err := v.SharesFromTokens(amount) if err != nil { From 6fd75b9b8420f8c8a7ff8c643ff26ab73534ff5d Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 20 Jul 2022 08:57:15 +0800 Subject: [PATCH 31/57] resolve keeper tests --- x/distribution/handler_test.go | 2 +- x/distribution/keeper/delegation_test.go | 20 +- x/distribution/keeper/grpc_query_test.go | 2 +- x/distribution/keeper/migrations.go | 20 -- x/distribution/migrations/v036/types.go | 131 ------- x/distribution/migrations/v038/types.go | 55 --- x/distribution/migrations/v040/keys.go | 184 ---------- x/distribution/migrations/v040/migrate.go | 107 ------ x/distribution/migrations/v043/helpers.go | 70 ---- x/distribution/migrations/v043/store.go | 23 -- x/distribution/migrations/v043/store_test.go | 98 ------ x/distribution/module.go | 6 - x/distribution/simulation/genesis_test.go | 2 +- x/genutil/client/cli/migrate.go | 140 -------- x/genutil/client/testutil/migrate.go | 60 ---- x/genutil/client/testutil/suite.go | 132 ------- x/genutil/client/testutil/validate_genesis.go | 41 --- x/genutil/gentx_test.go | 284 --------------- x/genutil/migrations/v040/migrate.go | 199 ----------- x/genutil/migrations/v043/migrate.go | 43 --- x/genutil/migrations/v046/migrate.go | 31 -- x/genutil/utils_test.go | 17 - x/slashing/keeper/migrations.go | 3 +- x/slashing/migrations/v040/keys.go | 66 ---- x/slashing/migrations/v040/migrate.go | 63 ---- x/slashing/migrations/v040/migrate_test.go | 139 -------- x/slashing/migrations/v043/store.go | 7 - x/slashing/migrations/v043/store_test.go | 67 ---- x/slashing/simulation/genesis_test.go | 2 +- x/staking/app_test.go | 2 +- x/staking/client/testutil/suite.go | 2 +- x/staking/genesis_test.go | 8 +- x/staking/keeper/delegation_test.go | 26 +- x/staking/keeper/grpc_query_test.go | 10 +- x/staking/keeper/migrations.go | 28 -- x/staking/keeper/msg_server_test.go | 4 +- x/staking/keeper/querier_test.go | 10 +- x/staking/keeper/slash_test.go | 30 +- x/staking/keeper/validator_test.go | 10 +- x/staking/migrations/v036/types.go | 132 ------- x/staking/migrations/v038/types.go | 158 --------- x/staking/migrations/v040/keys.go | 323 ------------------ x/staking/migrations/v040/migrate.go | 139 -------- x/staking/migrations/v040/migrate_test.go | 95 ------ x/staking/migrations/v043/store.go | 78 ----- x/staking/migrations/v043/store_test.go | 137 -------- x/staking/migrations/v046/store_test.go | 31 -- x/staking/module.go | 10 - x/staking/simulation/genesis_test.go | 5 +- 49 files changed, 69 insertions(+), 3183 deletions(-) diff --git a/x/distribution/handler_test.go b/x/distribution/handler_test.go index aa5bf863..862b0984 100644 --- a/x/distribution/handler_test.go +++ b/x/distribution/handler_test.go @@ -19,7 +19,7 @@ func TestWithdrawTokenizeShareRecordReward(t *testing.T) { h := distribution.NewHandler(app.DistrKeeper) delAddr1 = sdk.AccAddress(delPk1.Address()) - res, err := h(ctx, &types.MsgWithdrawTokenizeShareRecordReward{ + res, err := h(ctx, &types.MsgWithdrawAllTokenizeShareRecordReward{ OwnerAddress: delAddr1.String(), }) require.NoError(t, err) diff --git a/x/distribution/keeper/delegation_test.go b/x/distribution/keeper/delegation_test.go index f9362f85..809e1603 100644 --- a/x/distribution/keeper/delegation_test.go +++ b/x/distribution/keeper/delegation_test.go @@ -117,7 +117,7 @@ func TestWithdrawTokenizeShareRecordReward(t *testing.T) { // allocate some rewards initial := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}} + tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecFromInt(initial)}} app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) // end period @@ -178,7 +178,7 @@ func TestWithdrawTokenizeShareRecordReward(t *testing.T) { err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, record.GetModuleAddress(), coins) require.NoError(t, err) - shareTokenBalance := app.BankKeeper.GetBalance(ctx, sdk.AccAddress(valAddrs[0]), record.ShareTokenDenom) + shareTokenBalance := app.BankKeeper.GetBalance(ctx, sdk.AccAddress(valAddrs[0]), record.GetShareTokenDenom()) _, err = msgServer.RedeemTokens(sdk.WrapSDKContext(ctx), &stakingtypes.MsgRedeemTokensforShares{ DelegatorAddress: sdk.AccAddress(valAddrs[0]).String(), @@ -236,7 +236,7 @@ func TestCalculateRewardsAfterSlash(t *testing.T) { // allocate some rewards initial := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}} + tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecFromInt(initial)}} app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) // end period @@ -246,10 +246,10 @@ func TestCalculateRewardsAfterSlash(t *testing.T) { rewards = app.DistrKeeper.CalculateDelegationRewards(ctx, val, del, endingPeriod) // rewards should be half the tokens - require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.QuoRaw(2).ToDec()}}, rewards) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecFromInt(initial.QuoRaw(2))}}, rewards) // commission should be the other half - require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.QuoRaw(2).ToDec()}}, + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecFromInt(initial.QuoRaw(2))}}, app.DistrKeeper.GetValidatorAccumulatedCommission(ctx, valAddrs[0]).Commission) } @@ -299,7 +299,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { // allocate some rewards initial := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}} + tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecFromInt(initial)}} app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) // slash the validator by 50% again @@ -321,10 +321,10 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { rewards = app.DistrKeeper.CalculateDelegationRewards(ctx, val, del, endingPeriod) // rewards should be half the tokens - require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}}, rewards) + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecFromInt(initial)}}, rewards) // commission should be the other half - require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}}, + require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecFromInt(initial)}}, app.DistrKeeper.GetValidatorAccumulatedCommission(ctx, valAddrs[0]).Commission) } @@ -500,7 +500,7 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) { ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // allocate some rewards - initial := app.StakingKeeper.TokensFromConsensusPower(ctx, 10).ToDec() + initial := sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)) tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}} app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) @@ -556,7 +556,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { del1 := app.StakingKeeper.Delegation(ctx, sdk.AccAddress(valAddrs[0]), valAddrs[0]) // allocate some rewards - initial := app.StakingKeeper.TokensFromConsensusPower(ctx, 30).ToDec() + initial := sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 30)) tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial}} app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) diff --git a/x/distribution/keeper/grpc_query_test.go b/x/distribution/keeper/grpc_query_test.go index 0c291ce1..c2f4fb59 100644 --- a/x/distribution/keeper/grpc_query_test.go +++ b/x/distribution/keeper/grpc_query_test.go @@ -692,7 +692,7 @@ func (suite *KeeperTestSuite) TestGRPCTokenizeShareRecordReward() { // allocate some rewards initial := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}} + tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDecFromInt(initial)}} app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) // end period diff --git a/x/distribution/keeper/migrations.go b/x/distribution/keeper/migrations.go index 7439dfbe..b55569d4 100644 --- a/x/distribution/keeper/migrations.go +++ b/x/distribution/keeper/migrations.go @@ -1,21 +1 @@ package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v043 "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v043" -) - -// Migrator is a struct for handling in-place store migrations. -type Migrator struct { - keeper Keeper -} - -// NewMigrator returns a new Migrator. -func NewMigrator(keeper Keeper) Migrator { - return Migrator{keeper: keeper} -} - -// Migrate1to2 migrates from version 1 to 2. -func (m Migrator) Migrate1to2(ctx sdk.Context) error { - return v043.MigrateStore(ctx, m.keeper.storeKey) -} diff --git a/x/distribution/migrations/v036/types.go b/x/distribution/migrations/v036/types.go index df1e55a9..0491ab0a 100644 --- a/x/distribution/migrations/v036/types.go +++ b/x/distribution/migrations/v036/types.go @@ -3,134 +3,3 @@ // references types from this file, so we're keeping it for now. // DONTCOVER package v036 - -import ( - "fmt" - "strings" - - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v034" - "github.com/cosmos/cosmos-sdk/x/distribution/types" - v036gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v036" -) - -// ---------------------------------------------------------------------------- -// Types and Constants -// ---------------------------------------------------------------------------- - -const ( - ModuleName = "distribution" - - // RouterKey is the message route for distribution - RouterKey = ModuleName - - // ProposalTypeCommunityPoolSpend defines the type for a CommunityPoolSpendProposal - ProposalTypeCommunityPoolSpend = "CommunityPoolSpend" -) - -type ( - ValidatorAccumulatedCommission = sdk.DecCoins - - ValidatorSlashEventRecord struct { - ValidatorAddress sdk.ValAddress `json:"validator_address"` - Height uint64 `json:"height"` - Period uint64 `json:"period"` - Event v034distr.ValidatorSlashEvent `json:"validator_slash_event"` - } - - GenesisState struct { - FeePool v034distr.FeePool `json:"fee_pool"` - CommunityTax sdk.Dec `json:"community_tax"` - BaseProposerReward sdk.Dec `json:"base_proposer_reward"` - BonusProposerReward sdk.Dec `json:"bonus_proposer_reward"` - WithdrawAddrEnabled bool `json:"withdraw_addr_enabled"` - DelegatorWithdrawInfos []v034distr.DelegatorWithdrawInfo `json:"delegator_withdraw_infos"` - PreviousProposer sdk.ConsAddress `json:"previous_proposer"` - OutstandingRewards []v034distr.ValidatorOutstandingRewardsRecord `json:"outstanding_rewards"` - ValidatorAccumulatedCommissions []v034distr.ValidatorAccumulatedCommissionRecord `json:"validator_accumulated_commissions"` - ValidatorHistoricalRewards []v034distr.ValidatorHistoricalRewardsRecord `json:"validator_historical_rewards"` - ValidatorCurrentRewards []v034distr.ValidatorCurrentRewardsRecord `json:"validator_current_rewards"` - DelegatorStartingInfos []v034distr.DelegatorStartingInfoRecord `json:"delegator_starting_infos"` - ValidatorSlashEvents []ValidatorSlashEventRecord `json:"validator_slash_events"` - } - - // CommunityPoolSpendProposal spends from the community pool - CommunityPoolSpendProposal struct { - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - Recipient sdk.AccAddress `json:"recipient" yaml:"recipient"` - Amount sdk.Coins `json:"amount" yaml:"amount"` - } -) - -func NewGenesisState( - feePool v034distr.FeePool, communityTax, baseProposerReward, bonusProposerReward sdk.Dec, - withdrawAddrEnabled bool, dwis []v034distr.DelegatorWithdrawInfo, pp sdk.ConsAddress, - r []v034distr.ValidatorOutstandingRewardsRecord, acc []v034distr.ValidatorAccumulatedCommissionRecord, - historical []v034distr.ValidatorHistoricalRewardsRecord, cur []v034distr.ValidatorCurrentRewardsRecord, - dels []v034distr.DelegatorStartingInfoRecord, slashes []ValidatorSlashEventRecord, -) GenesisState { - - return GenesisState{ - FeePool: feePool, - CommunityTax: communityTax, - BaseProposerReward: baseProposerReward, - BonusProposerReward: bonusProposerReward, - WithdrawAddrEnabled: withdrawAddrEnabled, - DelegatorWithdrawInfos: dwis, - PreviousProposer: pp, - OutstandingRewards: r, - ValidatorAccumulatedCommissions: acc, - ValidatorHistoricalRewards: historical, - ValidatorCurrentRewards: cur, - DelegatorStartingInfos: dels, - ValidatorSlashEvents: slashes, - } -} - -var _ v036gov.Content = CommunityPoolSpendProposal{} - -// GetTitle returns the title of a community pool spend proposal. -func (csp CommunityPoolSpendProposal) GetTitle() string { return csp.Title } - -// GetDescription returns the description of a community pool spend proposal. -func (csp CommunityPoolSpendProposal) GetDescription() string { return csp.Description } - -// GetDescription returns the routing key of a community pool spend proposal. -func (csp CommunityPoolSpendProposal) ProposalRoute() string { return RouterKey } - -// ProposalType returns the type of a community pool spend proposal. -func (csp CommunityPoolSpendProposal) ProposalType() string { return ProposalTypeCommunityPoolSpend } - -// ValidateBasic runs basic stateless validity checks -func (csp CommunityPoolSpendProposal) ValidateBasic() error { - err := v036gov.ValidateAbstract(csp) - if err != nil { - return err - } - if !csp.Amount.IsValid() { - return types.ErrInvalidProposalAmount - } - if csp.Recipient.Empty() { - return types.ErrEmptyProposalRecipient - } - - return nil -} - -// String implements the Stringer interface. -func (csp CommunityPoolSpendProposal) String() string { - var b strings.Builder - b.WriteString(fmt.Sprintf(`Community Pool Spend Proposal: - Title: %s - Description: %s - Recipient: %s - Amount: %s -`, csp.Title, csp.Description, csp.Recipient, csp.Amount)) - return b.String() -} - -func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - cdc.RegisterConcrete(CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil) -} diff --git a/x/distribution/migrations/v038/types.go b/x/distribution/migrations/v038/types.go index cfdc0d50..e66fe8c9 100644 --- a/x/distribution/migrations/v038/types.go +++ b/x/distribution/migrations/v038/types.go @@ -2,58 +2,3 @@ // for v038 have been removed, but the v039->v042 migration script still // references types from this file, so we're keeping it for now. package v038 - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v034distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v034" - v036distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v036" -) - -// DONTCOVER - -const ( - ModuleName = "distribution" -) - -type ( - GenesisState struct { - Params Params `json:"params" yaml:"params"` - FeePool v034distr.FeePool `json:"fee_pool"` - DelegatorWithdrawInfos []v034distr.DelegatorWithdrawInfo `json:"delegator_withdraw_infos"` - PreviousProposer sdk.ConsAddress `json:"previous_proposer" yaml:"previous_proposer"` - OutstandingRewards []v034distr.ValidatorOutstandingRewardsRecord `json:"outstanding_rewards"` - ValidatorAccumulatedCommissions []v034distr.ValidatorAccumulatedCommissionRecord `json:"validator_accumulated_commissions"` - ValidatorHistoricalRewards []v034distr.ValidatorHistoricalRewardsRecord `json:"validator_historical_rewards"` - ValidatorCurrentRewards []v034distr.ValidatorCurrentRewardsRecord `json:"validator_current_rewards"` - DelegatorStartingInfos []v034distr.DelegatorStartingInfoRecord `json:"delegator_starting_infos"` - ValidatorSlashEvents []v036distr.ValidatorSlashEventRecord `json:"validator_slash_events" yaml:"validator_slash_events"` - } - - Params struct { - CommunityTax sdk.Dec `json:"community_tax" yaml:"community_tax"` - BaseProposerReward sdk.Dec `json:"base_proposer_reward" yaml:"base_proposer_reward"` - BonusProposerReward sdk.Dec `json:"bonus_proposer_reward" yaml:"bonus_proposer_reward"` - WithdrawAddrEnabled bool `json:"withdraw_addr_enabled" yaml:"withdraw_addr_enabled"` - } -) - -func NewGenesisState( - params Params, feePool v034distr.FeePool, dwis []v034distr.DelegatorWithdrawInfo, pp sdk.ConsAddress, - r []v034distr.ValidatorOutstandingRewardsRecord, acc []v034distr.ValidatorAccumulatedCommissionRecord, - historical []v034distr.ValidatorHistoricalRewardsRecord, cur []v034distr.ValidatorCurrentRewardsRecord, - dels []v034distr.DelegatorStartingInfoRecord, slashes []v036distr.ValidatorSlashEventRecord, -) GenesisState { - - return GenesisState{ - FeePool: feePool, - Params: params, - DelegatorWithdrawInfos: dwis, - PreviousProposer: pp, - OutstandingRewards: r, - ValidatorAccumulatedCommissions: acc, - ValidatorHistoricalRewards: historical, - ValidatorCurrentRewards: cur, - DelegatorStartingInfos: dels, - ValidatorSlashEvents: slashes, - } -} diff --git a/x/distribution/migrations/v040/keys.go b/x/distribution/migrations/v040/keys.go index db8b1548..902919cc 100644 --- a/x/distribution/migrations/v040/keys.go +++ b/x/distribution/migrations/v040/keys.go @@ -1,187 +1,3 @@ // Package v040 is copy-pasted from: // https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/distribution/types/keys.go package v040 - -import ( - "encoding/binary" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/kv" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" -) - -const ( - // ModuleName is the module name constant used in many places - ModuleName = "distribution" - - // StoreKey is the store key string for distribution - StoreKey = ModuleName - - // RouterKey is the message route for distribution - RouterKey = ModuleName - - // QuerierRoute is the querier route for distribution - QuerierRoute = ModuleName -) - -// Keys for distribution store -// Items are stored with the following key: values -// -// - 0x00: FeePol -// -// - 0x01: sdk.ConsAddress -// -// - 0x02: ValidatorOutstandingRewards -// -// - 0x03: sdk.AccAddress -// -// - 0x04: DelegatorStartingInfo -// -// - 0x05: ValidatorHistoricalRewards -// -// - 0x06: ValidatorCurrentRewards -// -// - 0x07: ValidatorCurrentRewards -// -// - 0x08: ValidatorSlashEvent -var ( - FeePoolKey = []byte{0x00} // key for global distribution state - ProposerKey = []byte{0x01} // key for the proposer operator address - ValidatorOutstandingRewardsPrefix = []byte{0x02} // key for outstanding rewards - - DelegatorWithdrawAddrPrefix = []byte{0x03} // key for delegator withdraw address - DelegatorStartingInfoPrefix = []byte{0x04} // key for delegator starting info - ValidatorHistoricalRewardsPrefix = []byte{0x05} // key for historical validators rewards / stake - ValidatorCurrentRewardsPrefix = []byte{0x06} // key for current validator rewards - ValidatorAccumulatedCommissionPrefix = []byte{0x07} // key for accumulated validator commission - ValidatorSlashEventPrefix = []byte{0x08} // key for validator slash fraction -) - -// gets an address from a validator's outstanding rewards key -func GetValidatorOutstandingRewardsAddress(key []byte) (valAddr sdk.ValAddress) { - kv.AssertKeyAtLeastLength(key, 2) - addr := key[1:] - kv.AssertKeyLength(addr, v040auth.AddrLen) - return sdk.ValAddress(addr) -} - -// gets an address from a delegator's withdraw info key -func GetDelegatorWithdrawInfoAddress(key []byte) (delAddr sdk.AccAddress) { - kv.AssertKeyAtLeastLength(key, 2) - addr := key[1:] - kv.AssertKeyLength(addr, v040auth.AddrLen) - return sdk.AccAddress(addr) -} - -// gets the addresses from a delegator starting info key -func GetDelegatorStartingInfoAddresses(key []byte) (valAddr sdk.ValAddress, delAddr sdk.AccAddress) { - kv.AssertKeyAtLeastLength(key, 2+v040auth.AddrLen) - addr := key[1 : 1+v040auth.AddrLen] - kv.AssertKeyLength(addr, v040auth.AddrLen) - valAddr = sdk.ValAddress(addr) - addr = key[1+v040auth.AddrLen:] - kv.AssertKeyLength(addr, v040auth.AddrLen) - delAddr = sdk.AccAddress(addr) - return -} - -// gets the address & period from a validator's historical rewards key -func GetValidatorHistoricalRewardsAddressPeriod(key []byte) (valAddr sdk.ValAddress, period uint64) { - kv.AssertKeyAtLeastLength(key, 2+v040auth.AddrLen) - addr := key[1 : 1+v040auth.AddrLen] - kv.AssertKeyLength(addr, v040auth.AddrLen) - valAddr = sdk.ValAddress(addr) - b := key[1+v040auth.AddrLen:] - kv.AssertKeyLength(addr, 8) - period = binary.LittleEndian.Uint64(b) - return -} - -// gets the address from a validator's current rewards key -func GetValidatorCurrentRewardsAddress(key []byte) (valAddr sdk.ValAddress) { - kv.AssertKeyAtLeastLength(key, 2) - addr := key[1:] - kv.AssertKeyLength(addr, v040auth.AddrLen) - return sdk.ValAddress(addr) -} - -// gets the address from a validator's accumulated commission key -func GetValidatorAccumulatedCommissionAddress(key []byte) (valAddr sdk.ValAddress) { - kv.AssertKeyAtLeastLength(key, 2) - addr := key[1:] - kv.AssertKeyLength(addr, v040auth.AddrLen) - return sdk.ValAddress(addr) -} - -// gets the height from a validator's slash event key -func GetValidatorSlashEventAddressHeight(key []byte) (valAddr sdk.ValAddress, height uint64) { - kv.AssertKeyAtLeastLength(key, 2+v040auth.AddrLen) - addr := key[1 : 1+v040auth.AddrLen] - kv.AssertKeyLength(addr, v040auth.AddrLen) - valAddr = sdk.ValAddress(addr) - startB := 1 + v040auth.AddrLen - kv.AssertKeyAtLeastLength(key, startB+9) - b := key[startB : startB+8] // the next 8 bytes represent the height - height = binary.BigEndian.Uint64(b) - return -} - -// gets the outstanding rewards key for a validator -func GetValidatorOutstandingRewardsKey(valAddr sdk.ValAddress) []byte { - return append(ValidatorOutstandingRewardsPrefix, valAddr.Bytes()...) -} - -// gets the key for a delegator's withdraw addr -func GetDelegatorWithdrawAddrKey(delAddr sdk.AccAddress) []byte { - return append(DelegatorWithdrawAddrPrefix, delAddr.Bytes()...) -} - -// gets the key for a delegator's starting info -func GetDelegatorStartingInfoKey(v sdk.ValAddress, d sdk.AccAddress) []byte { - return append(append(DelegatorStartingInfoPrefix, v.Bytes()...), d.Bytes()...) -} - -// gets the prefix key for a validator's historical rewards -func GetValidatorHistoricalRewardsPrefix(v sdk.ValAddress) []byte { - return append(ValidatorHistoricalRewardsPrefix, v.Bytes()...) -} - -// gets the key for a validator's historical rewards -func GetValidatorHistoricalRewardsKey(v sdk.ValAddress, k uint64) []byte { - b := make([]byte, 8) - binary.LittleEndian.PutUint64(b, k) - return append(append(ValidatorHistoricalRewardsPrefix, v.Bytes()...), b...) -} - -// gets the key for a validator's current rewards -func GetValidatorCurrentRewardsKey(v sdk.ValAddress) []byte { - return append(ValidatorCurrentRewardsPrefix, v.Bytes()...) -} - -// gets the key for a validator's current commission -func GetValidatorAccumulatedCommissionKey(v sdk.ValAddress) []byte { - return append(ValidatorAccumulatedCommissionPrefix, v.Bytes()...) -} - -// gets the prefix key for a validator's slash fractions -func GetValidatorSlashEventPrefix(v sdk.ValAddress) []byte { - return append(ValidatorSlashEventPrefix, v.Bytes()...) -} - -// gets the prefix key for a validator's slash fraction (ValidatorSlashEventPrefix + height) -func GetValidatorSlashEventKeyPrefix(v sdk.ValAddress, height uint64) []byte { - heightBz := make([]byte, 8) - binary.BigEndian.PutUint64(heightBz, height) - return append( - ValidatorSlashEventPrefix, - append(v.Bytes(), heightBz...)..., - ) -} - -// gets the key for a validator's slash fraction -func GetValidatorSlashEventKey(v sdk.ValAddress, height, period uint64) []byte { - periodBz := make([]byte, 8) - binary.BigEndian.PutUint64(periodBz, period) - prefix := GetValidatorSlashEventKeyPrefix(v, height) - return append(prefix, periodBz...) -} diff --git a/x/distribution/migrations/v040/migrate.go b/x/distribution/migrations/v040/migrate.go index a5024e44..c2ae4953 100644 --- a/x/distribution/migrations/v040/migrate.go +++ b/x/distribution/migrations/v040/migrate.go @@ -1,108 +1 @@ package v040 - -import ( - v038distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v038" - v040distribution "github.com/cosmos/cosmos-sdk/x/distribution/types" -) - -// Migrate accepts exported x/distribution genesis state from v0.38 and migrates it -// to v0.40 x/distribution genesis state. The migration includes: -// -// - Convert addresses from bytes to bech32 strings. -// - Re-encode in v0.40 GenesisState. -func Migrate(oldDistributionState v038distribution.GenesisState) *v040distribution.GenesisState { - newDelegatorWithdrawInfos := make([]v040distribution.DelegatorWithdrawInfo, len(oldDistributionState.DelegatorWithdrawInfos)) - for i, oldDelegatorWithdrawInfo := range oldDistributionState.DelegatorWithdrawInfos { - newDelegatorWithdrawInfos[i] = v040distribution.DelegatorWithdrawInfo{ - DelegatorAddress: oldDelegatorWithdrawInfo.DelegatorAddress.String(), - WithdrawAddress: oldDelegatorWithdrawInfo.WithdrawAddress.String(), - } - } - - newValidatorOutstandingRewards := make([]v040distribution.ValidatorOutstandingRewardsRecord, len(oldDistributionState.OutstandingRewards)) - for i, oldValidatorOutstandingReward := range oldDistributionState.OutstandingRewards { - newValidatorOutstandingRewards[i] = v040distribution.ValidatorOutstandingRewardsRecord{ - ValidatorAddress: oldValidatorOutstandingReward.ValidatorAddress.String(), - OutstandingRewards: oldValidatorOutstandingReward.OutstandingRewards, - } - } - - newValidatorAccumulatedCommissions := make([]v040distribution.ValidatorAccumulatedCommissionRecord, len(oldDistributionState.ValidatorAccumulatedCommissions)) - for i, oldValidatorAccumulatedCommission := range oldDistributionState.ValidatorAccumulatedCommissions { - newValidatorAccumulatedCommissions[i] = v040distribution.ValidatorAccumulatedCommissionRecord{ - ValidatorAddress: oldValidatorAccumulatedCommission.ValidatorAddress.String(), - Accumulated: v040distribution.ValidatorAccumulatedCommission{ - Commission: oldValidatorAccumulatedCommission.Accumulated, - }, - } - } - - newValidatorHistoricalRewards := make([]v040distribution.ValidatorHistoricalRewardsRecord, len(oldDistributionState.ValidatorHistoricalRewards)) - for i, oldValidatorHistoricalReward := range oldDistributionState.ValidatorHistoricalRewards { - newValidatorHistoricalRewards[i] = v040distribution.ValidatorHistoricalRewardsRecord{ - ValidatorAddress: oldValidatorHistoricalReward.ValidatorAddress.String(), - Period: oldValidatorHistoricalReward.Period, - Rewards: v040distribution.ValidatorHistoricalRewards{ - CumulativeRewardRatio: oldValidatorHistoricalReward.Rewards.CumulativeRewardRatio, - ReferenceCount: uint32(oldValidatorHistoricalReward.Rewards.ReferenceCount), - }, - } - } - - newValidatorCurrentRewards := make([]v040distribution.ValidatorCurrentRewardsRecord, len(oldDistributionState.ValidatorCurrentRewards)) - for i, oldValidatorCurrentReward := range oldDistributionState.ValidatorCurrentRewards { - newValidatorCurrentRewards[i] = v040distribution.ValidatorCurrentRewardsRecord{ - ValidatorAddress: oldValidatorCurrentReward.ValidatorAddress.String(), - Rewards: v040distribution.ValidatorCurrentRewards{ - Rewards: oldValidatorCurrentReward.Rewards.Rewards, - Period: oldValidatorCurrentReward.Rewards.Period, - }, - } - } - - newDelegatorStartingInfos := make([]v040distribution.DelegatorStartingInfoRecord, len(oldDistributionState.DelegatorStartingInfos)) - for i, oldDelegatorStartingInfo := range oldDistributionState.DelegatorStartingInfos { - newDelegatorStartingInfos[i] = v040distribution.DelegatorStartingInfoRecord{ - DelegatorAddress: oldDelegatorStartingInfo.DelegatorAddress.String(), - ValidatorAddress: oldDelegatorStartingInfo.ValidatorAddress.String(), - StartingInfo: v040distribution.DelegatorStartingInfo{ - PreviousPeriod: oldDelegatorStartingInfo.StartingInfo.PreviousPeriod, - Stake: oldDelegatorStartingInfo.StartingInfo.Stake, - Height: oldDelegatorStartingInfo.StartingInfo.Height, - }, - } - } - - newValidatorSlashEvents := make([]v040distribution.ValidatorSlashEventRecord, len(oldDistributionState.ValidatorSlashEvents)) - for i, oldValidatorSlashEvent := range oldDistributionState.ValidatorSlashEvents { - newValidatorSlashEvents[i] = v040distribution.ValidatorSlashEventRecord{ - ValidatorAddress: oldValidatorSlashEvent.ValidatorAddress.String(), - Height: oldValidatorSlashEvent.Height, - Period: oldValidatorSlashEvent.Period, - ValidatorSlashEvent: v040distribution.ValidatorSlashEvent{ - ValidatorPeriod: oldValidatorSlashEvent.Event.ValidatorPeriod, - Fraction: oldValidatorSlashEvent.Event.Fraction, - }, - } - } - - return &v040distribution.GenesisState{ - Params: v040distribution.Params{ - CommunityTax: oldDistributionState.Params.CommunityTax, - BaseProposerReward: oldDistributionState.Params.BaseProposerReward, - BonusProposerReward: oldDistributionState.Params.BonusProposerReward, - WithdrawAddrEnabled: oldDistributionState.Params.WithdrawAddrEnabled, - }, - FeePool: v040distribution.FeePool{ - CommunityPool: oldDistributionState.FeePool.CommunityPool, - }, - DelegatorWithdrawInfos: newDelegatorWithdrawInfos, - PreviousProposer: oldDistributionState.PreviousProposer.String(), - OutstandingRewards: newValidatorOutstandingRewards, - ValidatorAccumulatedCommissions: newValidatorAccumulatedCommissions, - ValidatorHistoricalRewards: newValidatorHistoricalRewards, - ValidatorCurrentRewards: newValidatorCurrentRewards, - DelegatorStartingInfos: newDelegatorStartingInfos, - ValidatorSlashEvents: newValidatorSlashEvents, - } -} diff --git a/x/distribution/migrations/v043/helpers.go b/x/distribution/migrations/v043/helpers.go index 18568221..73ef0c9c 100644 --- a/x/distribution/migrations/v043/helpers.go +++ b/x/distribution/migrations/v043/helpers.go @@ -1,71 +1 @@ package v043 - -import ( - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/address" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" -) - -// MigratePrefixAddress is a helper function that migrates all keys of format: -// prefix_bytes | address_bytes -// into format: -// prefix_bytes | address_len (1 byte) | address_bytes -func MigratePrefixAddress(store sdk.KVStore, prefixBz []byte) { - oldStore := prefix.NewStore(store, prefixBz) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - addr := oldStoreIter.Key() - var newStoreKey = prefixBz - newStoreKey = append(newStoreKey, address.MustLengthPrefix(addr)...) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} - -// MigratePrefixAddressBytes is a helper function that migrates all keys of format: -// prefix_bytes | address_bytes | arbitrary_bytes -// into format: -// prefix_bytes | address_len (1 byte) | address_bytes | arbitrary_bytes -func MigratePrefixAddressBytes(store sdk.KVStore, prefixBz []byte) { - oldStore := prefix.NewStore(store, prefixBz) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - addr := oldStoreIter.Key()[:v040auth.AddrLen] - endBz := oldStoreIter.Key()[v040auth.AddrLen:] - newStoreKey := append(append(prefixBz, address.MustLengthPrefix(addr)...), endBz...) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} - -// MigratePrefixAddressAddress is a helper function that migrates all keys of format: -// prefix_bytes | address_1_bytes | address_2_bytes -// into format: -// prefix_bytes | address_1_len (1 byte) | address_1_bytes | address_2_len (1 byte) | address_2_bytes -func MigratePrefixAddressAddress(store sdk.KVStore, prefixBz []byte) { - oldStore := prefix.NewStore(store, prefixBz) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - addr1 := oldStoreIter.Key()[:v040auth.AddrLen] - addr2 := oldStoreIter.Key()[v040auth.AddrLen:] - newStoreKey := append(append(prefixBz, address.MustLengthPrefix(addr1)...), address.MustLengthPrefix(addr2)...) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} diff --git a/x/distribution/migrations/v043/store.go b/x/distribution/migrations/v043/store.go index b757c7f2..73ef0c9c 100644 --- a/x/distribution/migrations/v043/store.go +++ b/x/distribution/migrations/v043/store.go @@ -1,24 +1 @@ package v043 - -import ( - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - v040distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v040" -) - -// MigrateStore performs in-place store migrations from v0.40 to v0.43. The -// migration includes: -// -// - Change addresses to be length-prefixed. -func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey) error { - store := ctx.KVStore(storeKey) - MigratePrefixAddress(store, v040distribution.ValidatorOutstandingRewardsPrefix) - MigratePrefixAddress(store, v040distribution.DelegatorWithdrawAddrPrefix) - MigratePrefixAddressAddress(store, v040distribution.DelegatorStartingInfoPrefix) - MigratePrefixAddressBytes(store, v040distribution.ValidatorHistoricalRewardsPrefix) - MigratePrefixAddress(store, v040distribution.ValidatorCurrentRewardsPrefix) - MigratePrefixAddress(store, v040distribution.ValidatorAccumulatedCommissionPrefix) - MigratePrefixAddressBytes(store, v040distribution.ValidatorSlashEventPrefix) - - return nil -} diff --git a/x/distribution/migrations/v043/store_test.go b/x/distribution/migrations/v043/store_test.go index 9804e97d..596b211a 100644 --- a/x/distribution/migrations/v043/store_test.go +++ b/x/distribution/migrations/v043/store_test.go @@ -1,99 +1 @@ package v043_test - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - v040distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v040" - v043distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v043" - "github.com/cosmos/cosmos-sdk/x/distribution/types" -) - -func TestStoreMigration(t *testing.T) { - distributionKey := sdk.NewKVStoreKey("distribution") - ctx := testutil.DefaultContext(distributionKey, sdk.NewTransientStoreKey("transient_test")) - store := ctx.KVStore(distributionKey) - - _, _, addr1 := testdata.KeyTestPubAddr() - valAddr := sdk.ValAddress(addr1) - _, _, addr2 := testdata.KeyTestPubAddr() - // Use dummy value for all keys. - value := []byte("foo") - - testCases := []struct { - name string - oldKey []byte - newKey []byte - }{ - { - "FeePoolKey", - v040distribution.FeePoolKey, - types.FeePoolKey, - }, - { - "ProposerKey", - v040distribution.ProposerKey, - types.ProposerKey, - }, - { - "ValidatorOutstandingRewards", - v040distribution.GetValidatorOutstandingRewardsKey(valAddr), - types.GetValidatorOutstandingRewardsKey(valAddr), - }, - { - "DelegatorWithdrawAddr", - v040distribution.GetDelegatorWithdrawAddrKey(addr2), - types.GetDelegatorWithdrawAddrKey(addr2), - }, - { - "DelegatorStartingInfo", - v040distribution.GetDelegatorStartingInfoKey(valAddr, addr2), - types.GetDelegatorStartingInfoKey(valAddr, addr2), - }, - { - "ValidatorHistoricalRewards", - v040distribution.GetValidatorHistoricalRewardsKey(valAddr, 6), - types.GetValidatorHistoricalRewardsKey(valAddr, 6), - }, - { - "ValidatorCurrentRewards", - v040distribution.GetValidatorCurrentRewardsKey(valAddr), - types.GetValidatorCurrentRewardsKey(valAddr), - }, - { - "ValidatorAccumulatedCommission", - v040distribution.GetValidatorAccumulatedCommissionKey(valAddr), - types.GetValidatorAccumulatedCommissionKey(valAddr), - }, - { - "ValidatorSlashEvent", - v040distribution.GetValidatorSlashEventKey(valAddr, 6, 8), - types.GetValidatorSlashEventKey(valAddr, 6, 8), - }, - } - - // Set all the old keys to the store - for _, tc := range testCases { - store.Set(tc.oldKey, value) - } - - // Run migrations. - err := v043distribution.MigrateStore(ctx, distributionKey) - require.NoError(t, err) - - // Make sure the new keys are set and old keys are deleted. - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - if !bytes.Equal(tc.oldKey, tc.newKey) { - require.Nil(t, store.Get(tc.oldKey)) - } - require.Equal(t, value, store.Get(tc.newKey)) - }) - } -} diff --git a/x/distribution/module.go b/x/distribution/module.go index 4666256e..0d43495d 100644 --- a/x/distribution/module.go +++ b/x/distribution/module.go @@ -141,12 +141,6 @@ func (am AppModule) LegacyQuerierHandler(legacyQuerierCdc *codec.LegacyAmino) sd func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) - - m := keeper.NewMigrator(am.keeper) - err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) - if err != nil { - panic(err) - } } // InitGenesis performs genesis initialization for the distribution module. It returns diff --git a/x/distribution/simulation/genesis_test.go b/x/distribution/simulation/genesis_test.go index 26784b4d..606f4217 100644 --- a/x/distribution/simulation/genesis_test.go +++ b/x/distribution/simulation/genesis_test.go @@ -30,7 +30,7 @@ func TestRandomizedGenState(t *testing.T) { Rand: r, NumBonded: 3, Accounts: simtypes.RandomAccounts(r, 3), - InitialStake: 1000, + InitialStake: sdk.NewInt(1000), GenState: make(map[string]json.RawMessage), } diff --git a/x/genutil/client/cli/migrate.go b/x/genutil/client/cli/migrate.go index f27d979a..7f1e458c 100644 --- a/x/genutil/client/cli/migrate.go +++ b/x/genutil/client/cli/migrate.go @@ -1,141 +1 @@ package cli - -import ( - "encoding/json" - "fmt" - "sort" - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - tmjson "github.com/tendermint/tendermint/libs/json" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - v040 "github.com/cosmos/cosmos-sdk/x/genutil/migrations/v040" - v043 "github.com/cosmos/cosmos-sdk/x/genutil/migrations/v043" - v046 "github.com/cosmos/cosmos-sdk/x/genutil/migrations/v046" - "github.com/cosmos/cosmos-sdk/x/genutil/types" -) - -const flagGenesisTime = "genesis-time" - -// Allow applications to extend and modify the migration process. -// -// Ref: https://github.com/cosmos/cosmos-sdk/issues/5041 -var migrationMap = types.MigrationMap{ - "v0.42": v040.Migrate, // NOTE: v0.40, v0.41 and v0.42 are genesis compatible. - "v0.43": v043.Migrate, // NOTE: v0.43, v0.44 and v0.45 are genesis compatible. - "v0.46": v046.Migrate, -} - -// GetMigrationCallback returns a MigrationCallback for a given version. -func GetMigrationCallback(version string) types.MigrationCallback { - return migrationMap[version] -} - -// GetMigrationVersions get all migration version in a sorted slice. -func GetMigrationVersions() []string { - versions := make([]string, len(migrationMap)) - - var i int - - for version := range migrationMap { - versions[i] = version - i++ - } - - sort.Strings(versions) - - return versions -} - -// MigrateGenesisCmd returns a command to execute genesis state migration. -func MigrateGenesisCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "migrate [target-version] [genesis-file]", - Short: "Migrate genesis to a specified target version", - Long: fmt.Sprintf(`Migrate the source genesis into the target version and print to STDOUT. - -Example: -$ %s migrate v0.36 /path/to/genesis.json --chain-id=cosmoshub-3 --genesis-time=2019-04-22T17:00:00Z -`, version.AppName), - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - var err error - - target := args[0] - importGenesis := args[1] - - genDoc, err := validateGenDoc(importGenesis) - if err != nil { - return err - } - - // Since some default values are valid values, we just print to - // make sure the user didn't forget to update these values. - if genDoc.ConsensusParams.Evidence.MaxBytes == 0 { - fmt.Printf("Warning: consensus_params.evidence.max_bytes is set to 0. If this is"+ - " deliberate, feel free to ignore this warning. If not, please have a look at the chain"+ - " upgrade guide at %s.\n", chainUpgradeGuide) - } - - var initialState types.AppMap - if err := json.Unmarshal(genDoc.AppState, &initialState); err != nil { - return errors.Wrap(err, "failed to JSON unmarshal initial genesis state") - } - - migrationFunc := GetMigrationCallback(target) - if migrationFunc == nil { - return fmt.Errorf("unknown migration function for version: %s", target) - } - - // TODO: handler error from migrationFunc call - newGenState := migrationFunc(initialState, clientCtx) - - genDoc.AppState, err = json.Marshal(newGenState) - if err != nil { - return errors.Wrap(err, "failed to JSON marshal migrated genesis state") - } - - genesisTime, _ := cmd.Flags().GetString(flagGenesisTime) - if genesisTime != "" { - var t time.Time - - err := t.UnmarshalText([]byte(genesisTime)) - if err != nil { - return errors.Wrap(err, "failed to unmarshal genesis time") - } - - genDoc.GenesisTime = t - } - - chainID, _ := cmd.Flags().GetString(flags.FlagChainID) - if chainID != "" { - genDoc.ChainID = chainID - } - - bz, err := tmjson.Marshal(genDoc) - if err != nil { - return errors.Wrap(err, "failed to marshal genesis doc") - } - - sortedBz, err := sdk.SortJSON(bz) - if err != nil { - return errors.Wrap(err, "failed to sort JSON genesis doc") - } - - cmd.Println(string(sortedBz)) - return nil - }, - } - - cmd.Flags().String(flagGenesisTime, "", "override genesis_time with this flag") - cmd.Flags().String(flags.FlagChainID, "", "override chain_id with this flag") - - return cmd -} diff --git a/x/genutil/client/testutil/migrate.go b/x/genutil/client/testutil/migrate.go index 6c408e5a..110b2e6a 100644 --- a/x/genutil/client/testutil/migrate.go +++ b/x/genutil/client/testutil/migrate.go @@ -1,61 +1 @@ package testutil - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/testutil" - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" -) - -func TestGetMigrationCallback(t *testing.T) { - for _, version := range cli.GetMigrationVersions() { - require.NotNil(t, cli.GetMigrationCallback(version)) - } -} - -func (s *IntegrationTestSuite) TestMigrateGenesis() { - val0 := s.network.Validators[0] - - testCases := []struct { - name string - genesis string - target string - expErr bool - expErrMsg string - check func(jsonOut string) - }{ - { - "migrate 0.37 to 0.42", - v037Exported, - "v0.42", - true, "Make sure that you have correctly migrated all Tendermint consensus params", func(_ string) {}, - }, - { - "migrate 0.42 to 0.43", - v040Valid, - "v0.43", - false, "", - func(jsonOut string) { - // Make sure the json output contains the ADR-037 gov weighted votes. - s.Require().Contains(jsonOut, "\"weight\":\"1.000000000000000000\"") - }, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - genesisFile := testutil.WriteToNewTempFile(s.T(), tc.genesis) - jsonOutput, err := clitestutil.ExecTestCLICmd(val0.ClientCtx, cli.MigrateGenesisCmd(), []string{tc.target, genesisFile.Name()}) - if tc.expErr { - s.Require().Contains(err.Error(), tc.expErrMsg) - } else { - s.Require().NoError(err) - tc.check(jsonOutput.String()) - } - }) - } -} diff --git a/x/genutil/client/testutil/suite.go b/x/genutil/client/testutil/suite.go index 1b48ec8c..110b2e6a 100644 --- a/x/genutil/client/testutil/suite.go +++ b/x/genutil/client/testutil/suite.go @@ -1,133 +1 @@ package testutil - -import ( - "context" - "fmt" - "io" - "os" - "path/filepath" - - "github.com/stretchr/testify/suite" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/network" - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - simapp "github.com/iqlusioninc/liquidity-staking-module/app" - "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" - stakingcli "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" - "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -type IntegrationTestSuite struct { - suite.Suite - - cfg network.Config - network *network.Network -} - -func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite { - return &IntegrationTestSuite{cfg: cfg} -} - -func (s *IntegrationTestSuite) SetupSuite() { - s.T().Log("setting up integration test suite") - - var err error - s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg) - s.Require().NoError(err) - - _, err = s.network.WaitForHeight(1) - s.Require().NoError(err) -} - -func (s *IntegrationTestSuite) TearDownSuite() { - s.T().Log("tearing down integration test suite") - s.network.Cleanup() -} - -func (s *IntegrationTestSuite) TestGenTxCmd() { - val := s.network.Validators[0] - dir := s.T().TempDir() - - cmd := cli.GenTxCmd( - simapp.ModuleBasics, - val.ClientCtx.TxConfig, banktypes.GenesisBalancesIterator{}, val.ClientCtx.HomeDir) - - _, out := testutil.ApplyMockIO(cmd) - clientCtx := val.ClientCtx.WithOutput(out) - - ctx := context.Background() - ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) - - amount := sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(12)) - genTxFile := filepath.Join(dir, "myTx") - cmd.SetArgs([]string{ - fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), - fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), - val.Moniker, - amount.String(), - }) - - err := cmd.ExecuteContext(ctx) - s.Require().NoError(err) - - // validate generated transaction. - open, err := os.Open(genTxFile) - s.Require().NoError(err) - - all, err := io.ReadAll(open) - s.Require().NoError(err) - - tx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(all) - s.Require().NoError(err) - - msgs := tx.GetMsgs() - s.Require().Len(msgs, 1) - - s.Require().Equal(sdk.MsgTypeURL(&types.MsgCreateValidator{}), sdk.MsgTypeURL(msgs[0])) - s.Require().True(val.Address.Equals(msgs[0].GetSigners()[0])) - s.Require().Equal(amount, msgs[0].(*types.MsgCreateValidator).Value) - s.Require().NoError(tx.ValidateBasic()) -} - -func (s *IntegrationTestSuite) TestGenTxCmdPubkey() { - val := s.network.Validators[0] - dir := s.T().TempDir() - - cmd := cli.GenTxCmd( - simapp.ModuleBasics, - val.ClientCtx.TxConfig, - banktypes.GenesisBalancesIterator{}, - val.ClientCtx.HomeDir, - ) - - _, out := testutil.ApplyMockIO(cmd) - clientCtx := val.ClientCtx.WithOutput(out) - - ctx := context.Background() - ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) - - amount := sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(12)) - genTxFile := filepath.Join(dir, "myTx") - - cmd.SetArgs([]string{ - fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), - fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), - fmt.Sprintf("--%s={\"key\":\"BOIkjkFruMpfOFC9oNPhiJGfmY2pHF/gwHdLDLnrnS0=\"}", stakingcli.FlagPubKey), - val.Moniker, - amount.String(), - }) - s.Require().Error(cmd.ExecuteContext(ctx)) - - cmd.SetArgs([]string{ - fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), - fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), - fmt.Sprintf("--%s={\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"BOIkjkFruMpfOFC9oNPhiJGfmY2pHF/gwHdLDLnrnS0=\"}", stakingcli.FlagPubKey), - val.Moniker, - amount.String(), - }) - s.Require().NoError(cmd.ExecuteContext(ctx)) -} diff --git a/x/genutil/client/testutil/validate_genesis.go b/x/genutil/client/testutil/validate_genesis.go index 7134715a..7427625c 100644 --- a/x/genutil/client/testutil/validate_genesis.go +++ b/x/genutil/client/testutil/validate_genesis.go @@ -1,11 +1,5 @@ package testutil -import ( - "github.com/cosmos/cosmos-sdk/testutil" - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" -) - // An example exported genesis file from a 0.37 chain. Note that evidence // parameters only contains `max_age`. var v037Exported = `{ @@ -65,38 +59,3 @@ var v040Valid = `{ "genesis_time": "2020-09-29T20:16:29.172362037Z", "validators": [] }` - -func (s *IntegrationTestSuite) TestValidateGenesis() { - val0 := s.network.Validators[0] - - testCases := []struct { - name string - genesis string - expErr bool - }{ - { - "exported 0.37 genesis file", - v037Exported, - true, - }, - { - "valid 0.40 genesis file", - v040Valid, - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - genesisFile := testutil.WriteToNewTempFile(s.T(), tc.genesis) - _, err := clitestutil.ExecTestCLICmd(val0.ClientCtx, cli.ValidateGenesisCmd(nil), []string{genesisFile.Name()}) - if tc.expErr { - s.Require().Contains(err.Error(), "Make sure that you have correctly migrated all Tendermint consensus params") - - } else { - s.Require().NoError(err) - } - }) - } -} diff --git a/x/genutil/gentx_test.go b/x/genutil/gentx_test.go index 0a3d94a4..fb44d112 100644 --- a/x/genutil/gentx_test.go +++ b/x/genutil/gentx_test.go @@ -1,285 +1 @@ package genutil_test - -import ( - "encoding/json" - "fmt" - "testing" - - "github.com/stretchr/testify/suite" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/simapp/helpers" - simappparams "github.com/cosmos/cosmos-sdk/simapp/params" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/bank/testutil" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil/types" - simapp "github.com/iqlusioninc/liquidity-staking-module/app" - "github.com/iqlusioninc/liquidity-staking-module/x/genutil" - "github.com/iqlusioninc/liquidity-staking-module/x/staking" - stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" -) - -var ( - priv1 = secp256k1.GenPrivKey() - priv2 = secp256k1.GenPrivKey() - pk1 = priv1.PubKey() - pk2 = priv2.PubKey() - addr1 = sdk.AccAddress(pk1.Address()) - addr2 = sdk.AccAddress(pk2.Address()) - desc = stakingtypes.NewDescription("testname", "", "", "", "") - comm = stakingtypes.CommissionRates{} -) - -// GenTxTestSuite is a test suite to be used with gentx tests. -type GenTxTestSuite struct { - suite.Suite - - ctx sdk.Context - app *simapp.SimApp - encodingConfig simappparams.EncodingConfig - - msg1, msg2 *stakingtypes.MsgCreateValidator -} - -func (suite *GenTxTestSuite) SetupTest() { - checkTx := false - app := simapp.Setup(suite.T(), checkTx) - suite.ctx = app.BaseApp.NewContext(checkTx, tmproto.Header{}) - suite.app = app - suite.encodingConfig = simapp.MakeTestEncodingConfig() - - var err error - amount := sdk.NewInt64Coin(sdk.DefaultBondDenom, 50) - one := sdk.OneInt() - suite.msg1, err = stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(pk1.Address()), pk1, amount, desc, comm, one) - suite.NoError(err) - suite.msg2, err = stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(pk2.Address()), pk1, amount, desc, comm, one) - suite.NoError(err) -} - -func (suite *GenTxTestSuite) setAccountBalance(addr sdk.AccAddress, amount int64) json.RawMessage { - acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - - err := testutil.FundAccount(suite.app.BankKeeper, suite.ctx, addr, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 25)}) - suite.Require().NoError(err) - - bankGenesisState := suite.app.BankKeeper.ExportGenesis(suite.ctx) - bankGenesis, err := suite.encodingConfig.Amino.MarshalJSON(bankGenesisState) // TODO switch this to use Marshaler - suite.Require().NoError(err) - - return bankGenesis -} - -func (suite *GenTxTestSuite) TestSetGenTxsInAppGenesisState() { - var ( - txBuilder = suite.encodingConfig.TxConfig.NewTxBuilder() - genTxs []sdk.Tx - ) - - testCases := []struct { - msg string - malleate func() - expPass bool - }{ - { - "one genesis transaction", - func() { - err := txBuilder.SetMsgs(suite.msg1) - suite.Require().NoError(err) - tx := txBuilder.GetTx() - genTxs = []sdk.Tx{tx} - }, - true, - }, - { - "two genesis transactions", - func() { - err := txBuilder.SetMsgs(suite.msg1, suite.msg2) - suite.Require().NoError(err) - tx := txBuilder.GetTx() - genTxs = []sdk.Tx{tx} - }, - true, - }, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { - suite.SetupTest() - cdc := suite.encodingConfig.Codec - txJSONEncoder := suite.encodingConfig.TxConfig.TxJSONEncoder() - - tc.malleate() - appGenesisState, err := genutil.SetGenTxsInAppGenesisState(cdc, txJSONEncoder, make(map[string]json.RawMessage), genTxs) - - if tc.expPass { - suite.Require().NoError(err) - suite.Require().NotNil(appGenesisState[types.ModuleName]) - - var genesisState types.GenesisState - err := cdc.UnmarshalJSON(appGenesisState[types.ModuleName], &genesisState) - suite.Require().NoError(err) - suite.Require().NotNil(genesisState.GenTxs) - } else { - suite.Require().Error(err) - } - }) - } -} - -func (suite *GenTxTestSuite) TestValidateAccountInGenesis() { - var ( - appGenesisState = make(map[string]json.RawMessage) - coins sdk.Coins - ) - - testCases := []struct { - msg string - malleate func() - expPass bool - }{ - { - "no accounts", - func() { - coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)} - }, - false, - }, - { - "account without balance in the genesis state", - func() { - coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)} - appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr2, 50) - }, - false, - }, - { - "account without enough funds of default bond denom", - func() { - coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 50)} - appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr1, 25) - }, - false, - }, - { - "account with enough funds of default bond denom", - func() { - coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)} - appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr1, 25) - }, - true, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { - suite.SetupTest() - cdc := suite.encodingConfig.Codec - - suite.app.StakingKeeper.SetParams(suite.ctx, stakingtypes.DefaultParams()) - stakingGenesisState := staking.ExportGenesis(suite.ctx, suite.app.StakingKeeper) - suite.Require().Equal(stakingGenesisState.Params, stakingtypes.DefaultParams()) - stakingGenesis, err := cdc.MarshalJSON(stakingGenesisState) // TODO switch this to use Marshaler - suite.Require().NoError(err) - appGenesisState[stakingtypes.ModuleName] = stakingGenesis - - tc.malleate() - err = genutil.ValidateAccountInGenesis( - appGenesisState, banktypes.GenesisBalancesIterator{}, - addr1, coins, cdc, - ) - - if tc.expPass { - suite.Require().NoError(err) - } else { - suite.Require().Error(err) - } - - }) - } -} - -func (suite *GenTxTestSuite) TestDeliverGenTxs() { - var ( - genTxs []json.RawMessage - txBuilder = suite.encodingConfig.TxConfig.NewTxBuilder() - ) - - testCases := []struct { - msg string - malleate func() - expPass bool - }{ - { - "no signature supplied", - func() { - err := txBuilder.SetMsgs(suite.msg1) - suite.Require().NoError(err) - - genTxs = make([]json.RawMessage, 1) - tx, err := suite.encodingConfig.TxConfig.TxJSONEncoder()(txBuilder.GetTx()) - suite.Require().NoError(err) - genTxs[0] = tx - }, - false, - }, - { - "success", - func() { - _ = suite.setAccountBalance(addr1, 50) - _ = suite.setAccountBalance(addr2, 0) - - msg := banktypes.NewMsgSend(addr1, addr2, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1)}) - tx, err := helpers.GenTx( - suite.encodingConfig.TxConfig, - []sdk.Msg{msg}, - sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)}, - helpers.DefaultGenTxGas, - suite.ctx.ChainID(), - []uint64{7}, - []uint64{0}, - priv1, - ) - suite.Require().NoError(err) - - genTxs = make([]json.RawMessage, 1) - genTx, err := suite.encodingConfig.TxConfig.TxJSONEncoder()(tx) - suite.Require().NoError(err) - genTxs[0] = genTx - }, - true, - }, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { - suite.SetupTest() - - tc.malleate() - - if tc.expPass { - suite.Require().NotPanics(func() { - genutil.DeliverGenTxs( - suite.ctx, genTxs, suite.app.StakingKeeper, suite.app.BaseApp.DeliverTx, - suite.encodingConfig.TxConfig, - ) - }) - } else { - suite.Require().Panics(func() { - genutil.DeliverGenTxs( - suite.ctx, genTxs, suite.app.StakingKeeper, suite.app.BaseApp.DeliverTx, - suite.encodingConfig.TxConfig, - ) - }) - } - }) - } -} - -func TestGenTxTestSuite(t *testing.T) { - suite.Run(t, new(GenTxTestSuite)) -} diff --git a/x/genutil/migrations/v040/migrate.go b/x/genutil/migrations/v040/migrate.go index 29ea4f35..c2ae4953 100644 --- a/x/genutil/migrations/v040/migrate.go +++ b/x/genutil/migrations/v040/migrate.go @@ -1,200 +1 @@ package v040 - -import ( - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - v039auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v039" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" - v036supply "github.com/cosmos/cosmos-sdk/x/bank/migrations/v036" - v038bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v038" - v040bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v040" - v039crisis "github.com/cosmos/cosmos-sdk/x/crisis/migrations/v039" - v040crisis "github.com/cosmos/cosmos-sdk/x/crisis/migrations/v040" - v036distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v036" - v038distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v038" - v040distr "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v040" - v038evidence "github.com/cosmos/cosmos-sdk/x/evidence/migrations/v038" - v040evidence "github.com/cosmos/cosmos-sdk/x/evidence/migrations/v040" - v039genutil "github.com/cosmos/cosmos-sdk/x/genutil/migrations/v039" - "github.com/cosmos/cosmos-sdk/x/genutil/types" - v036gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v036" - v040gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v040" - v039mint "github.com/cosmos/cosmos-sdk/x/mint/migrations/v039" - v040mint "github.com/cosmos/cosmos-sdk/x/mint/migrations/v040" - v036params "github.com/cosmos/cosmos-sdk/x/params/migrations/v036" - v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v039" - v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v040" - v038upgrade "github.com/cosmos/cosmos-sdk/x/upgrade/migrations/v038" - v038staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/migrations/v038" - v040staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/migrations/v040" -) - -func migrateGenutil(oldGenState v039genutil.GenesisState) *types.GenesisState { - return &types.GenesisState{ - GenTxs: oldGenState.GenTxs, - } -} - -// Migrate migrates exported state from v0.39 to a v0.40 genesis state. -func Migrate(appState types.AppMap, clientCtx client.Context) types.AppMap { - v039Codec := codec.NewLegacyAmino() - v039auth.RegisterLegacyAminoCodec(v039Codec) - v036gov.RegisterLegacyAminoCodec(v039Codec) - v036distr.RegisterLegacyAminoCodec(v039Codec) - v036params.RegisterLegacyAminoCodec(v039Codec) - v038upgrade.RegisterLegacyAminoCodec(v039Codec) - - v040Codec := clientCtx.Codec - - if appState[v038bank.ModuleName] != nil { - // unmarshal relative source genesis application state - var bankGenState v038bank.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &bankGenState) - - // unmarshal x/auth genesis state to retrieve all account balances - var authGenState v039auth.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) - - // unmarshal x/supply genesis state to retrieve total supply - var supplyGenState v036supply.GenesisState - v039Codec.MustUnmarshalJSON(appState[v036supply.ModuleName], &supplyGenState) - - // delete deprecated x/bank genesis state - delete(appState, v038bank.ModuleName) - - // delete deprecated x/supply genesis state - delete(appState, v036supply.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040bank.ModuleName] = v040Codec.MustMarshalJSON(v040bank.Migrate(bankGenState, authGenState, supplyGenState)) - } - - // remove balances from existing accounts - if appState[v039auth.ModuleName] != nil { - // unmarshal relative source genesis application state - var authGenState v039auth.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039auth.ModuleName], &authGenState) - - // delete deprecated x/auth genesis state - delete(appState, v039auth.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040auth.ModuleName] = v040Codec.MustMarshalJSON(v040auth.Migrate(authGenState)) - } - - // Migrate x/crisis. - if appState[v039crisis.ModuleName] != nil { - // unmarshal relative source genesis application state - var crisisGenState v039crisis.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039crisis.ModuleName], &crisisGenState) - - // delete deprecated x/crisis genesis state - delete(appState, v039crisis.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040crisis.ModuleName] = v040Codec.MustMarshalJSON(v040crisis.Migrate(crisisGenState)) - } - - // Migrate x/distribution. - if appState[v038distr.ModuleName] != nil { - // unmarshal relative source genesis application state - var distributionGenState v038distr.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038distr.ModuleName], &distributionGenState) - - // delete deprecated x/distribution genesis state - delete(appState, v038distr.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040distr.ModuleName] = v040Codec.MustMarshalJSON(v040distr.Migrate(distributionGenState)) - } - - // Migrate x/evidence. - if appState[v038evidence.ModuleName] != nil { - // unmarshal relative source genesis application state - var evidenceGenState v038evidence.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038bank.ModuleName], &evidenceGenState) - - // delete deprecated x/evidence genesis state - delete(appState, v038evidence.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040evidence.ModuleName] = v040Codec.MustMarshalJSON(v040evidence.Migrate(evidenceGenState)) - } - - // Migrate x/gov. - if appState[v036gov.ModuleName] != nil { - // unmarshal relative source genesis application state - var govGenState v036gov.GenesisState - v039Codec.MustUnmarshalJSON(appState[v036gov.ModuleName], &govGenState) - - // delete deprecated x/gov genesis state - delete(appState, v036gov.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040gov.ModuleName] = v040Codec.MustMarshalJSON(v040gov.Migrate(govGenState)) - } - - // Migrate x/mint. - if appState[v039mint.ModuleName] != nil { - // unmarshal relative source genesis application state - var mintGenState v039mint.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039mint.ModuleName], &mintGenState) - - // delete deprecated x/mint genesis state - delete(appState, v039mint.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040mint.ModuleName] = v040Codec.MustMarshalJSON(v040mint.Migrate(mintGenState)) - } - - // Migrate x/slashing. - if appState[v039slashing.ModuleName] != nil { - // unmarshal relative source genesis application state - var slashingGenState v039slashing.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039slashing.ModuleName], &slashingGenState) - - // delete deprecated x/slashing genesis state - delete(appState, v039slashing.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040slashing.ModuleName] = v040Codec.MustMarshalJSON(v040slashing.Migrate(slashingGenState)) - } - - // Migrate x/staking. - if appState[v038staking.ModuleName] != nil { - // unmarshal relative source genesis application state - var stakingGenState v038staking.GenesisState - v039Codec.MustUnmarshalJSON(appState[v038staking.ModuleName], &stakingGenState) - - // delete deprecated x/staking genesis state - delete(appState, v038staking.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v040staking.ModuleName] = v040Codec.MustMarshalJSON(v040staking.Migrate(stakingGenState)) - } - - // Migrate x/genutil - if appState[v039genutil.ModuleName] != nil { - // unmarshal relative source genesis application state - var genutilGenState v039genutil.GenesisState - v039Codec.MustUnmarshalJSON(appState[v039genutil.ModuleName], &genutilGenState) - - // delete deprecated x/staking genesis state - delete(appState, v039genutil.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[ModuleName] = v040Codec.MustMarshalJSON(migrateGenutil(genutilGenState)) - } - - return appState -} diff --git a/x/genutil/migrations/v043/migrate.go b/x/genutil/migrations/v043/migrate.go index 8c37ee61..73ef0c9c 100644 --- a/x/genutil/migrations/v043/migrate.go +++ b/x/genutil/migrations/v043/migrate.go @@ -1,44 +1 @@ package v043 - -import ( - "github.com/cosmos/cosmos-sdk/client" - v040bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v040" - v043bank "github.com/cosmos/cosmos-sdk/x/bank/migrations/v043" - bank "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil/types" - v040gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v040" - v043gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v043" - gov "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" -) - -// Migrate migrates exported state from v0.40 to a v0.43 genesis state. -func Migrate(appState types.AppMap, clientCtx client.Context) types.AppMap { - // Migrate x/gov. - if appState[v040gov.ModuleName] != nil { - // unmarshal relative source genesis application state - var oldGovState gov.GenesisState - clientCtx.Codec.MustUnmarshalJSON(appState[v040gov.ModuleName], &oldGovState) - - // delete deprecated x/gov genesis state - delete(appState, v040gov.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v043gov.ModuleName] = clientCtx.Codec.MustMarshalJSON(v043gov.MigrateJSON(&oldGovState)) - } - - if appState[v040bank.ModuleName] != nil { - // unmarshal relative source genesis application state - var oldBankState bank.GenesisState - clientCtx.Codec.MustUnmarshalJSON(appState[v040bank.ModuleName], &oldBankState) - - // delete deprecated x/bank genesis state - delete(appState, v040bank.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - appState[v043bank.ModuleName] = clientCtx.Codec.MustMarshalJSON(v043bank.MigrateJSON(&oldBankState)) - } - - return appState -} diff --git a/x/genutil/migrations/v046/migrate.go b/x/genutil/migrations/v046/migrate.go index 10a04fd5..c7bd4f0e 100644 --- a/x/genutil/migrations/v046/migrate.go +++ b/x/genutil/migrations/v046/migrate.go @@ -1,32 +1 @@ package v046 - -import ( - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/x/genutil/types" - v043gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v043" - v046gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v046" - gov "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" -) - -// Migrate migrates exported state from v0.43 to a v0.46 genesis state. -func Migrate(appState types.AppMap, clientCtx client.Context) types.AppMap { - // Migrate x/gov. - if appState[v043gov.ModuleName] != nil { - // unmarshal relative source genesis application state - var oldGovState gov.GenesisState - clientCtx.Codec.MustUnmarshalJSON(appState[v043gov.ModuleName], &oldGovState) - - // delete deprecated x/gov genesis state - delete(appState, v043gov.ModuleName) - - // Migrate relative source genesis application state and marshal it into - // the respective key. - newGovState, err := v046gov.MigrateJSON(&oldGovState) - if err != nil { - panic(err) - } - appState[v046gov.ModuleName] = clientCtx.Codec.MustMarshalJSON(newGovState) - } - - return appState -} diff --git a/x/genutil/utils_test.go b/x/genutil/utils_test.go index d1a80d58..14e50d48 100644 --- a/x/genutil/utils_test.go +++ b/x/genutil/utils_test.go @@ -1,18 +1 @@ package genutil - -import ( - "encoding/json" - "path/filepath" - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestExportGenesisFileWithTime(t *testing.T) { - t.Parallel() - - fname := filepath.Join(t.TempDir(), "genesis.json") - - require.NoError(t, ExportGenesisFileWithTime(fname, "test", nil, json.RawMessage(`{"account_owner": "Bob"}`), time.Now())) -} diff --git a/x/slashing/keeper/migrations.go b/x/slashing/keeper/migrations.go index a9f74f6a..c0558cb4 100644 --- a/x/slashing/keeper/migrations.go +++ b/x/slashing/keeper/migrations.go @@ -2,7 +2,6 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - v043 "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v043" ) // Migrator is a struct for handling in-place store migrations. @@ -17,5 +16,5 @@ func NewMigrator(keeper Keeper) Migrator { // Migrate1to2 migrates from version 1 to 2. func (m Migrator) Migrate1to2(ctx sdk.Context) error { - return v043.MigrateStore(ctx, m.keeper.storeKey) + return nil } diff --git a/x/slashing/migrations/v040/keys.go b/x/slashing/migrations/v040/keys.go index 367ead65..10772af4 100644 --- a/x/slashing/migrations/v040/keys.go +++ b/x/slashing/migrations/v040/keys.go @@ -1,69 +1,3 @@ // Package v040 is copy-pasted from: // https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/slashing/types/keys.go package v040 - -import ( - "encoding/binary" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/kv" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" -) - -const ( - // ModuleName is the name of the module - ModuleName = "slashing" - - // StoreKey is the store key string for slashing - StoreKey = ModuleName - - // RouterKey is the message route for slashing - RouterKey = ModuleName - - // QuerierRoute is the querier route for slashing - QuerierRoute = ModuleName -) - -// Keys for slashing store -// Items are stored with the following key: values -// -// - 0x01: ValidatorSigningInfo -// -// - 0x02: bool -// -// - 0x03: crypto.PubKey -var ( - ValidatorSigningInfoKeyPrefix = []byte{0x01} // Prefix for signing info - ValidatorMissedBlockBitArrayKeyPrefix = []byte{0x02} // Prefix for missed block bit array - AddrPubkeyRelationKeyPrefix = []byte{0x03} // Prefix for address-pubkey relation -) - -// ValidatorSigningInfoKey - stored by *Consensus* address (not operator address) -func ValidatorSigningInfoKey(v sdk.ConsAddress) []byte { - return append(ValidatorSigningInfoKeyPrefix, v.Bytes()...) -} - -// ValidatorSigningInfoAddress - extract the address from a validator signing info key -func ValidatorSigningInfoAddress(key []byte) (v sdk.ConsAddress) { - kv.AssertKeyAtLeastLength(key, 2) - addr := key[1:] - kv.AssertKeyLength(addr, v040auth.AddrLen) - return sdk.ConsAddress(addr) -} - -// ValidatorMissedBlockBitArrayPrefixKey - stored by *Consensus* address (not operator address) -func ValidatorMissedBlockBitArrayPrefixKey(v sdk.ConsAddress) []byte { - return append(ValidatorMissedBlockBitArrayKeyPrefix, v.Bytes()...) -} - -// ValidatorMissedBlockBitArrayKey - stored by *Consensus* address (not operator address) -func ValidatorMissedBlockBitArrayKey(v sdk.ConsAddress, i int64) []byte { - b := make([]byte, 8) - binary.LittleEndian.PutUint64(b, uint64(i)) - return append(ValidatorMissedBlockBitArrayPrefixKey(v), b...) -} - -// AddrPubkeyRelationKey gets pubkey relation key used to get the pubkey from the address -func AddrPubkeyRelationKey(address []byte) []byte { - return append(AddrPubkeyRelationKeyPrefix, address...) -} diff --git a/x/slashing/migrations/v040/migrate.go b/x/slashing/migrations/v040/migrate.go index 0dbd2274..c2ae4953 100644 --- a/x/slashing/migrations/v040/migrate.go +++ b/x/slashing/migrations/v040/migrate.go @@ -1,64 +1 @@ package v040 - -import ( - "sort" - - v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v039" - v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/types" -) - -// Migrate accepts exported x/slashing genesis state from v0.39 and migrates it -// to v0.40 x/slashing genesis state. The migration includes: -// -// - Chaning SigningInfos and MissedBlocks from map to array. -// - Convert addresses from bytes to bech32 strings. -// - Re-encode in v0.40 GenesisState. -func Migrate(oldGenState v039slashing.GenesisState) *v040slashing.GenesisState { - // Note that the two following `for` loop over a map's keys, so are not - // deterministic. - var newSigningInfos = make([]v040slashing.SigningInfo, 0, len(oldGenState.SigningInfos)) - for address, signingInfo := range oldGenState.SigningInfos { - newSigningInfos = append(newSigningInfos, v040slashing.SigningInfo{ - Address: address, - ValidatorSigningInfo: v040slashing.ValidatorSigningInfo{ - Address: signingInfo.Address.String(), - StartHeight: signingInfo.StartHeight, - IndexOffset: signingInfo.IndexOffset, - JailedUntil: signingInfo.JailedUntil, - Tombstoned: signingInfo.Tombstoned, - MissedBlocksCounter: signingInfo.MissedBlocksCounter, - }, - }) - } - var newValidatorMissedBlocks = make([]v040slashing.ValidatorMissedBlocks, 0, len(oldGenState.MissedBlocks)) - for address, validatorMissedBlocks := range oldGenState.MissedBlocks { - var newMissedBlocks = make([]v040slashing.MissedBlock, len(validatorMissedBlocks)) - for i, missedBlock := range validatorMissedBlocks { - newMissedBlocks[i] = v040slashing.MissedBlock{ - Index: missedBlock.Index, - Missed: missedBlock.Missed, - } - } - - newValidatorMissedBlocks = append(newValidatorMissedBlocks, v040slashing.ValidatorMissedBlocks{ - Address: address, - MissedBlocks: newMissedBlocks, - }) - } - - // We sort these two arrays by address, so that we get determinstic states. - sort.Slice(newSigningInfos, func(i, j int) bool { return newSigningInfos[i].Address < newSigningInfos[j].Address }) - sort.Slice(newValidatorMissedBlocks, func(i, j int) bool { return newValidatorMissedBlocks[i].Address < newValidatorMissedBlocks[j].Address }) - - return &v040slashing.GenesisState{ - Params: v040slashing.Params{ - SignedBlocksWindow: oldGenState.Params.SignedBlocksWindow, - MinSignedPerWindow: oldGenState.Params.MinSignedPerWindow, - DowntimeJailDuration: oldGenState.Params.DowntimeJailDuration, - SlashFractionDoubleSign: oldGenState.Params.SlashFractionDoubleSign, - SlashFractionDowntime: oldGenState.Params.SlashFractionDowntime, - }, - SigningInfos: newSigningInfos, - MissedBlocks: newValidatorMissedBlocks, - } -} diff --git a/x/slashing/migrations/v040/migrate_test.go b/x/slashing/migrations/v040/migrate_test.go index 2f2bc666..2208ec60 100644 --- a/x/slashing/migrations/v040/migrate_test.go +++ b/x/slashing/migrations/v040/migrate_test.go @@ -1,140 +1 @@ package v040_test - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/simapp" - sdk "github.com/cosmos/cosmos-sdk/types" - v039slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v039" - v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v040" -) - -func TestMigrate(t *testing.T) { - encodingConfig := simapp.MakeTestEncodingConfig() - clientCtx := client.Context{}. - WithInterfaceRegistry(encodingConfig.InterfaceRegistry). - WithTxConfig(encodingConfig.TxConfig). - WithLegacyAmino(encodingConfig.Amino). - WithCodec(encodingConfig.Codec) - - addr1, err := sdk.ConsAddressFromBech32("cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685") - require.NoError(t, err) - addr2, err := sdk.ConsAddressFromBech32("cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph") - require.NoError(t, err) - - gs := v039slashing.GenesisState{ - Params: v039slashing.DefaultParams(), - SigningInfos: map[string]v039slashing.ValidatorSigningInfo{ - "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph": { - Address: addr2, - IndexOffset: 615501, - MissedBlocksCounter: 1, - Tombstoned: false, - }, - "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685": { - Address: addr1, - IndexOffset: 2, - MissedBlocksCounter: 2, - Tombstoned: false, - }, - }, - MissedBlocks: map[string][]v039slashing.MissedBlock{ - "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph": { - { - Index: 2, - Missed: true, - }, - }, - "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685": { - { - Index: 3, - Missed: true, - }, - { - Index: 4, - Missed: true, - }, - }, - }, - } - - migrated := v040slashing.Migrate(gs) - // Check that in `signing_infos` and `missed_blocks`, the address - // cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685 - // should always come before the address - // cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph - // (in alphabetic order, basically). - expected := `{ - "missed_blocks": [ - { - "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", - "missed_blocks": [ - { - "index": "3", - "missed": true - }, - { - "index": "4", - "missed": true - } - ] - }, - { - "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", - "missed_blocks": [ - { - "index": "2", - "missed": true - } - ] - } - ], - "params": { - "downtime_jail_duration": "600s", - "min_signed_per_window": "0.500000000000000000", - "signed_blocks_window": "100", - "slash_fraction_double_sign": "0.050000000000000000", - "slash_fraction_downtime": "0.010000000000000000" - }, - "signing_infos": [ - { - "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", - "validator_signing_info": { - "address": "cosmosvalcons104cjmxkrg8y8lmrp25de02e4zf00zle4mzs685", - "index_offset": "2", - "jailed_until": "0001-01-01T00:00:00Z", - "missed_blocks_counter": "2", - "start_height": "0", - "tombstoned": false - } - }, - { - "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", - "validator_signing_info": { - "address": "cosmosvalcons10e4c5p6qk0sycy9u6u43t7csmlx9fyadr9yxph", - "index_offset": "615501", - "jailed_until": "0001-01-01T00:00:00Z", - "missed_blocks_counter": "1", - "start_height": "0", - "tombstoned": false - } - } - ] -}` - - bz, err := clientCtx.Codec.MarshalJSON(migrated) - require.NoError(t, err) - - // Indent the JSON bz correctly. - var jsonObj map[string]interface{} - err = json.Unmarshal(bz, &jsonObj) - require.NoError(t, err) - indentedBz, err := json.MarshalIndent(jsonObj, "", " ") - require.NoError(t, err) - - require.Equal(t, expected, string(indentedBz)) -} diff --git a/x/slashing/migrations/v043/store.go b/x/slashing/migrations/v043/store.go index 15da0982..268c1745 100644 --- a/x/slashing/migrations/v043/store.go +++ b/x/slashing/migrations/v043/store.go @@ -3,8 +3,6 @@ package v043 import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - v043distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v043" - v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v040" ) // MigrateStore performs in-place store migrations from v0.40 to v0.43. The @@ -12,10 +10,5 @@ import ( // // - Change addresses to be length-prefixed. func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey) error { - store := ctx.KVStore(storeKey) - v043distribution.MigratePrefixAddress(store, v040slashing.ValidatorSigningInfoKeyPrefix) - v043distribution.MigratePrefixAddressBytes(store, v040slashing.ValidatorMissedBlockBitArrayKeyPrefix) - v043distribution.MigratePrefixAddress(store, v040slashing.AddrPubkeyRelationKeyPrefix) - return nil } diff --git a/x/slashing/migrations/v043/store_test.go b/x/slashing/migrations/v043/store_test.go index 962e7af9..596b211a 100644 --- a/x/slashing/migrations/v043/store_test.go +++ b/x/slashing/migrations/v043/store_test.go @@ -1,68 +1 @@ package v043_test - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - v040slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v040" - v043slashing "github.com/cosmos/cosmos-sdk/x/slashing/migrations/v043" - "github.com/cosmos/cosmos-sdk/x/slashing/types" -) - -func TestStoreMigration(t *testing.T) { - slashingKey := sdk.NewKVStoreKey("slashing") - ctx := testutil.DefaultContext(slashingKey, sdk.NewTransientStoreKey("transient_test")) - store := ctx.KVStore(slashingKey) - - _, _, addr1 := testdata.KeyTestPubAddr() - consAddr := sdk.ConsAddress(addr1) - // Use dummy value for all keys. - value := []byte("foo") - - testCases := []struct { - name string - oldKey []byte - newKey []byte - }{ - { - "ValidatorSigningInfoKey", - v040slashing.ValidatorSigningInfoKey(consAddr), - types.ValidatorSigningInfoKey(consAddr), - }, - { - "ValidatorMissedBlockBitArrayKey", - v040slashing.ValidatorMissedBlockBitArrayKey(consAddr, 2), - types.ValidatorMissedBlockBitArrayKey(consAddr, 2), - }, - { - "AddrPubkeyRelationKey", - v040slashing.AddrPubkeyRelationKey(consAddr), - types.AddrPubkeyRelationKey(consAddr), - }, - } - - // Set all the old keys to the store - for _, tc := range testCases { - store.Set(tc.oldKey, value) - } - - // Run migrations. - err := v043slashing.MigrateStore(ctx, slashingKey) - require.NoError(t, err) - - // Make sure the new keys are set and old keys are deleted. - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - if !bytes.Equal(tc.oldKey, tc.newKey) { - require.Nil(t, store.Get(tc.oldKey)) - } - require.Equal(t, value, store.Get(tc.newKey)) - }) - } -} diff --git a/x/slashing/simulation/genesis_test.go b/x/slashing/simulation/genesis_test.go index a468d227..26296666 100644 --- a/x/slashing/simulation/genesis_test.go +++ b/x/slashing/simulation/genesis_test.go @@ -32,7 +32,7 @@ func TestRandomizedGenState(t *testing.T) { Rand: r, NumBonded: 3, Accounts: simtypes.RandomAccounts(r, 3), - InitialStake: 1000, + InitialStake: sdk.NewInt(1000), GenState: make(map[string]json.RawMessage), } diff --git a/x/staking/app_test.go b/x/staking/app_test.go index e6fb011f..c68d4f19 100644 --- a/x/staking/app_test.go +++ b/x/staking/app_test.go @@ -108,7 +108,7 @@ func TestStakingMsgs(t *testing.T) { require.NoError(t, err) simapp.CheckBalance(t, app, addr2, sdk.Coins{genCoin.Sub(bondCoin)}) - checkDelegation(t, app, addr2, sdk.ValAddress(addr1), true, bondTokens.ToDec()) + checkDelegation(t, app, addr2, sdk.ValAddress(addr1), true, sdk.NewDecFromInt(bondTokens)) // begin unbonding beginUnbondingMsg := types.NewMsgUndelegate(addr2, sdk.ValAddress(addr1), bondCoin) diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index 6b0d2bb1..2f3595ce 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -1582,7 +1582,7 @@ func (s *IntegrationTestSuite) TestBlockResults() { require.NoError(err) // Create a HTTP rpc client. - rpcClient, err := http.New(val.RPCAddress) + rpcClient, err := http.New(val.RPCAddress, "/websocket") require.NoError(err) // Loop until we find a block result with the correct validator updates. diff --git a/x/staking/genesis_test.go b/x/staking/genesis_test.go index ba59602e..b588500e 100644 --- a/x/staking/genesis_test.go +++ b/x/staking/genesis_test.go @@ -50,7 +50,7 @@ func TestInitGenesis(t *testing.T) { ConsensusPubkey: pk0, Status: sdkstaking.Bonded, Tokens: valTokens, - DelegatorShares: valTokens.ToDec(), + DelegatorShares: sdk.NewDecFromInt(valTokens), Description: types.NewDescription("hoop", "", "", "", ""), } bondedVal2 := types.Validator{ @@ -58,7 +58,7 @@ func TestInitGenesis(t *testing.T) { ConsensusPubkey: pk1, Status: sdkstaking.Bonded, Tokens: valTokens, - DelegatorShares: valTokens.ToDec(), + DelegatorShares: sdk.NewDecFromInt(valTokens), Description: types.NewDescription("bloop", "", "", "", ""), } @@ -127,7 +127,7 @@ func TestInitGenesis_PoolsBalanceMismatch(t *testing.T) { ConsensusPubkey: consPub, Jailed: false, Tokens: sdk.NewInt(10), - DelegatorShares: sdk.NewInt(10).ToDec(), + DelegatorShares: sdk.NewDecFromInt(sdk.NewInt(10)), Description: types.NewDescription("bloop", "", "", "", ""), } // valid params @@ -183,7 +183,7 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { tokens = app.StakingKeeper.TokensFromConsensusPower(ctx, 2) } validators[i].Tokens = tokens - validators[i].DelegatorShares = tokens.ToDec() + validators[i].DelegatorShares = sdk.NewDecFromInt(tokens) // add bonded coins bondedPoolAmt = bondedPoolAmt.Add(tokens) } diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 85bd443a..8d843f74 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -213,7 +213,7 @@ func TestUnbondDelegation(t *testing.T) { app.StakingKeeper.SetDelegation(ctx, delegation) bondTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - amount, err := app.StakingKeeper.Unbond(ctx, delAddrs[0], valAddrs[0], bondTokens.ToDec()) + amount, err := app.StakingKeeper.Unbond(ctx, delAddrs[0], valAddrs[0], sdk.NewDecFromInt(bondTokens)) require.NoError(t, err) require.Equal(t, bondTokens, amount) // shares to be added to an unbonding delegation @@ -356,7 +356,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { app.StakingKeeper.SetDelegation(ctx, delegation) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], app.StakingKeeper.TokensFromConsensusPower(ctx, 6).ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 6))) require.NoError(t, err) // end block @@ -425,7 +425,7 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { // unbond the all self-delegation to put validator in unbonding state val0AccAddr := sdk.AccAddress(addrVals[0]) - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], delTokens.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) require.NoError(t, err) // end block @@ -500,7 +500,7 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { ctx = ctx.WithBlockTime(time.Unix(333, 0)) // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], valTokens.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(valTokens)) require.NoError(t, err) // end block @@ -523,12 +523,12 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { // unbond some of the other delegation's shares unbondTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], unbondTokens.ToDec()) + _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(unbondTokens)) require.NoError(t, err) // unbond rest of the other delegation's shares remainingTokens := delTokens.Sub(unbondTokens) - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], remainingTokens.ToDec()) + _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(remainingTokens)) require.NoError(t, err) // now validator should be deleted from state @@ -584,14 +584,14 @@ func TestUnbondingAllDelegationFromValidator(t *testing.T) { ctx = ctx.WithBlockTime(time.Unix(333, 0)) // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], valTokens.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(valTokens)) require.NoError(t, err) // end block applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) // unbond all the remaining delegation - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], delTokens.ToDec()) + _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(delTokens)) require.NoError(t, err) // validator should still be in state and still be in unbonding state @@ -828,7 +828,7 @@ func TestRedelegateSelfDelegation(t *testing.T) { delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares) app.StakingKeeper.SetDelegation(ctx, delegation) - _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], delTokens.ToDec()) + _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDecFromInt(delTokens)) require.NoError(t, err) // end block @@ -889,7 +889,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { ctx = ctx.WithBlockHeader(header) // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], delTokens.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) require.NoError(t, err) // end block @@ -911,7 +911,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { // unbond some of the other delegation's shares redelegateTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], redelegateTokens.ToDec()) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], sdk.NewDecFromInt(redelegateTokens)) require.NoError(t, err) // retrieve the unbonding delegation @@ -968,7 +968,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { ctx = ctx.WithBlockTime(time.Unix(333, 0)) // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], delTokens.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) require.NoError(t, err) // end block @@ -985,7 +985,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { // redelegate some of the delegation's shares redelegationTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], redelegationTokens.ToDec()) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], sdk.NewDecFromInt(redelegationTokens)) require.NoError(t, err) // no red should have been found diff --git a/x/staking/keeper/grpc_query_test.go b/x/staking/keeper/grpc_query_test.go index 854a4942..48ca4e86 100644 --- a/x/staking/keeper/grpc_query_test.go +++ b/x/staking/keeper/grpc_query_test.go @@ -423,7 +423,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryUnbondingDelegation() { unbondingTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) valAddr, err1 := sdk.ValAddressFromBech32(addrVal2) suite.NoError(err1) - _, err := app.StakingKeeper.Undelegate(ctx, addrAcc2, valAddr, unbondingTokens.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, addrAcc2, valAddr, sdk.NewDecFromInt(unbondingTokens)) suite.NoError(err) unbond, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrAcc2, valAddr) @@ -481,11 +481,11 @@ func (suite *KeeperTestSuite) TestGRPCQueryDelegatorUnbondingDelegations() { unbondingTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) valAddr1, err1 := sdk.ValAddressFromBech32(addrVal) suite.NoError(err1) - _, err := app.StakingKeeper.Undelegate(ctx, addrAcc, valAddr1, unbondingTokens.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, addrAcc, valAddr1, sdk.NewDecFromInt(unbondingTokens)) suite.NoError(err) valAddr2, err1 := sdk.ValAddressFromBech32(addrVal2) suite.NoError(err1) - _, err = app.StakingKeeper.Undelegate(ctx, addrAcc, valAddr2, unbondingTokens.ToDec()) + _, err = app.StakingKeeper.Undelegate(ctx, addrAcc, valAddr2, sdk.NewDecFromInt(unbondingTokens)) suite.NoError(err) unbond, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrAcc, valAddr1) @@ -633,7 +633,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryRedelegations() { applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) rdAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc1, val1.GetOperator(), val2.GetOperator(), rdAmount.ToDec()) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc1, val1.GetOperator(), val2.GetOperator(), sdk.NewDecFromInt(rdAmount)) suite.NoError(err) applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) @@ -725,7 +725,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryValidatorUnbondingDelegations() { // undelegate undelAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) - _, err := app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), undelAmount.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), sdk.NewDecFromInt(undelAmount)) suite.NoError(err) applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) diff --git a/x/staking/keeper/migrations.go b/x/staking/keeper/migrations.go index 1d1f019f..b55569d4 100644 --- a/x/staking/keeper/migrations.go +++ b/x/staking/keeper/migrations.go @@ -1,29 +1 @@ package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - v043 "github.com/cosmos/cosmos-sdk/x/staking/migrations/v043" - v046 "github.com/cosmos/cosmos-sdk/x/staking/migrations/v046" -) - -// Migrator is a struct for handling in-place store migrations. -type Migrator struct { - keeper Keeper -} - -// NewMigrator returns a new Migrator. -func NewMigrator(keeper Keeper) Migrator { - return Migrator{ - keeper: keeper, - } -} - -// Migrate1to2 migrates from version 1 to 2. -func (m Migrator) Migrate1to2(ctx sdk.Context) error { - return v043.MigrateStore(ctx, m.keeper.storeKey) -} - -// Migrate2to3 migrates x/staking state from consensus version 2 to 3. -func (m Migrator) Migrate2to3(ctx sdk.Context) error { - return v046.MigrateStore(ctx, m.keeper.storeKey, m.keeper.cdc, m.keeper.paramstore) -} diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 0db2a01d..2a48db8c 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -255,7 +255,7 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { require.True(t, found, "delegation not found after redeem tokens") require.Equal(t, delegation.DelegatorAddress, addrAcc2.String()) require.Equal(t, delegation.ValidatorAddress, addrVal1.String()) - require.Equal(t, delegation.Shares, tc.delegationAmount.Sub(tc.tokenizeShareAmount).Add(tc.redeemAmount).ToDec()) + require.Equal(t, delegation.Shares, sdk.NewDecFromInt(tc.delegationAmount.Sub(tc.tokenizeShareAmount).Add(tc.redeemAmount))) // check delegator balance is not changed bondDenomAmountAfter := app.BankKeeper.GetBalance(ctx, addrAcc2, app.StakingKeeper.BondDenom(ctx)) @@ -269,7 +269,7 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { delegation = types.Delegation{Shares: sdk.ZeroDec()} } delAmountAfter := val1.TokensFromShares(delegation.Shares) - require.Equal(t, delAmountAfter.String(), delAmountBefore.Add(tc.redeemAmount.ToDec().Mul(sdk.OneDec().Sub(tc.slashFactor))).String()) + require.Equal(t, delAmountAfter.String(), delAmountBefore.Add(sdk.NewDecFromInt(tc.redeemAmount).Mul(sdk.OneDec().Sub(tc.slashFactor))).String()) shareToken = app.BankKeeper.GetBalance(ctx, addrAcc2, resp.Amount.Denom) require.Equal(t, shareToken.Amount.String(), tc.tokenizeShareAmount.Sub(tc.redeemAmount).String()) diff --git a/x/staking/keeper/querier_test.go b/x/staking/keeper/querier_test.go index 05f12b6c..b36cf823 100644 --- a/x/staking/keeper/querier_test.go +++ b/x/staking/keeper/querier_test.go @@ -352,7 +352,7 @@ func TestQueryDelegation(t *testing.T) { // Query unbonding delegation unbondingTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - _, err = app.StakingKeeper.Undelegate(ctx, addrAcc2, val1.GetOperator(), unbondingTokens.ToDec()) + _, err = app.StakingKeeper.Undelegate(ctx, addrAcc2, val1.GetOperator(), sdk.NewDecFromInt(unbondingTokens)) require.NoError(t, err) queryBondParams = types.QueryDelegatorValidatorRequest{DelegatorAddr: addrAcc2.String(), ValidatorAddr: addrVal1.String()} @@ -406,7 +406,7 @@ func TestQueryDelegation(t *testing.T) { // Query redelegation redelegationTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), - val2.GetOperator(), redelegationTokens.ToDec()) + val2.GetOperator(), sdk.NewDecFromInt(redelegationTokens)) require.NoError(t, err) redel, found := app.StakingKeeper.GetRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator()) require.True(t, found) @@ -510,7 +510,7 @@ func TestQueryValidatorDelegations_Pagination(t *testing.T) { // Undelegate for _, addr := range addrs { delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - _, err := app.StakingKeeper.Undelegate(ctx, addr, val1.GetOperator(), delTokens.ToDec()) + _, err := app.StakingKeeper.Undelegate(ctx, addr, val1.GetOperator(), sdk.NewDecFromInt(delTokens)) require.NoError(t, err) } @@ -560,7 +560,7 @@ func TestQueryRedelegations(t *testing.T) { applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) rdAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), rdAmount.ToDec()) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), sdk.NewDecFromInt(rdAmount)) require.NoError(t, err) applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) @@ -632,7 +632,7 @@ func TestQueryUnbondingDelegation(t *testing.T) { // undelegate undelAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - _, err = app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), undelAmount.ToDec()) + _, err = app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), sdk.NewDecFromInt(undelAmount)) require.NoError(t, err) applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index af8fb54d..3745717a 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -113,7 +113,7 @@ func TestSlashUnbondingDelegation(t *testing.T) { // balance decreased require.Equal(t, sdk.NewInt(5), ubd.Entries[0].Balance) newUnbondedPoolBalances := app.BankKeeper.GetAllBalances(ctx, notBondedPool.GetAddress()) - diffTokens := oldUnbondedPoolBalances.Sub(newUnbondedPoolBalances) + diffTokens := oldUnbondedPoolBalances.Sub(newUnbondedPoolBalances...) require.True(t, diffTokens.AmountOf(app.StakingKeeper.BondDenom(ctx)).Equal(sdk.NewInt(5))) } @@ -181,7 +181,7 @@ func TestSlashRedelegation(t *testing.T) { // pool bonded tokens should decrease burnedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), slashAmount)) - require.Equal(t, balances.Sub(burnedCoins), app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress())) + require.Equal(t, balances.Sub(burnedCoins...), app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress())) } // tests Slash at a future height (must panic) @@ -221,7 +221,7 @@ func TestSlashAtNegativeHeight(t *testing.T) { // pool bonded shares decreased newBondedPoolBalances := app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 5).String(), diffTokens.String()) } @@ -252,7 +252,7 @@ func TestSlashValidatorAtCurrentHeight(t *testing.T) { // pool bonded shares decreased newBondedPoolBalances := app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 5).String(), diffTokens.String()) } @@ -291,7 +291,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // bonded tokens burned newBondedPoolBalances := app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 3), diffTokens) // read updated validator @@ -317,7 +317,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // bonded tokens burned again newBondedPoolBalances = app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 6), diffTokens) // read updated validator @@ -343,7 +343,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // bonded tokens burned again newBondedPoolBalances = app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 9), diffTokens) // read updated validator @@ -369,7 +369,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // just 1 bonded token burned again since that's all the validator now has newBondedPoolBalances = app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 10), diffTokens) // apply TM updates @@ -392,11 +392,11 @@ func TestSlashWithRedelegation(t *testing.T) { // set a redelegation rdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, - time.Unix(0, 0), rdTokens, rdTokens.ToDec()) + time.Unix(0, 0), rdTokens, sdk.NewDecFromInt(rdTokens)) app.StakingKeeper.SetRedelegation(ctx, rd) // set the associated delegation - del := types.NewDelegation(addrDels[0], addrVals[1], rdTokens.ToDec()) + del := types.NewDelegation(addrDels[0], addrVals[1], sdk.NewDecFromInt(rdTokens)) app.StakingKeeper.SetDelegation(ctx, del) // update bonded tokens @@ -417,7 +417,7 @@ func TestSlashWithRedelegation(t *testing.T) { require.True(t, found) require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction) }) - burnAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 10).ToDec().Mul(fraction).TruncateInt() + burnAmount := sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(fraction).TruncateInt() bondedPool = app.StakingKeeper.GetBondedPool(ctx) notBondedPool = app.StakingKeeper.GetNotBondedPool(ctx) @@ -483,7 +483,7 @@ func TestSlashWithRedelegation(t *testing.T) { require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, sdk.OneDec()) }) - burnAmount = app.StakingKeeper.TokensFromConsensusPower(ctx, 10).ToDec().Mul(sdk.OneDec()).TruncateInt() + burnAmount = sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(sdk.OneDec()).TruncateInt() burnAmount = burnAmount.Sub(sdk.OneDec().MulInt(rdTokens).TruncateInt()) // read updated pool @@ -546,11 +546,11 @@ func TestSlashBoth(t *testing.T) { rdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, - rdATokens.ToDec()) + sdk.NewDecFromInt(rdATokens)) app.StakingKeeper.SetRedelegation(ctx, rdA) // set the associated delegation - delA := types.NewDelegation(addrDels[0], addrVals[1], rdATokens.ToDec()) + delA := types.NewDelegation(addrDels[0], addrVals[1], sdk.NewDecFromInt(rdATokens)) app.StakingKeeper.SetDelegation(ctx, delA) // set an unbonding delegation with expiration timestamp (beyond which the @@ -583,7 +583,7 @@ func TestSlashBoth(t *testing.T) { app.StakingKeeper.Slash(ctx, consAddr0, 10, 10, fraction) burnedNotBondedAmount := fraction.MulInt(ubdATokens).TruncateInt() - burnedBondAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 10).ToDec().Mul(fraction).TruncateInt() + burnedBondAmount := sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(fraction).TruncateInt() burnedBondAmount = burnedBondAmount.Sub(burnedNotBondedAmount) // read updated pool diff --git a/x/staking/keeper/validator_test.go b/x/staking/keeper/validator_test.go index d130568d..852455bd 100644 --- a/x/staking/keeper/validator_test.go +++ b/x/staking/keeper/validator_test.go @@ -197,7 +197,7 @@ func TestUpdateBondedValidatorsDecreaseCliff(t *testing.T) { // validator and next in line cliff validator app.StakingKeeper.DeleteValidatorByPowerIndex(ctx, nextCliffVal) shares := app.StakingKeeper.TokensFromConsensusPower(ctx, 21) - nextCliffVal, _ = nextCliffVal.RemoveDelShares(shares.ToDec()) + nextCliffVal, _ = nextCliffVal.RemoveDelShares(sdk.NewDecFromInt(shares)) nextCliffVal = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, nextCliffVal, true) expectedValStatus := map[int]sdkstaking.BondStatus{ @@ -301,7 +301,7 @@ func TestValidatorBasics(t *testing.T) { // modify a records, save, and retrieve validators[0].Status = sdkstaking.Bonded validators[0].Tokens = app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validators[0].DelegatorShares = validators[0].Tokens.ToDec() + validators[0].DelegatorShares = sdk.NewDecFromInt(validators[0].Tokens) validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], true) resVal, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) require.True(t, found) @@ -882,8 +882,8 @@ func TestApplyAndReturnValidatorSetUpdatesPowerDecrease(t *testing.T) { // tendermintUpdate set: {c1, c3} -> {c1', c3'} delTokens1 := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) delTokens2 := app.StakingKeeper.TokensFromConsensusPower(ctx, 30) - validators[0], _ = validators[0].RemoveDelShares(delTokens1.ToDec()) - validators[1], _ = validators[1].RemoveDelShares(delTokens2.ToDec()) + validators[0], _ = validators[0].RemoveDelShares(sdk.NewDecFromInt(delTokens1)) + validators[1], _ = validators[1].RemoveDelShares(sdk.NewDecFromInt(delTokens2)) validators[0] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[0], false) validators[1] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[1], false) @@ -951,7 +951,7 @@ func TestApplyAndReturnValidatorSetUpdatesNewValidator(t *testing.T) { app.StakingKeeper.SetValidator(ctx, validator) - validator, _ = validator.RemoveDelShares(amt.ToDec()) + validator, _ = validator.RemoveDelShares(sdk.NewDecFromInt(amt)) app.StakingKeeper.SetValidator(ctx, validator) app.StakingKeeper.SetValidatorByPowerIndex(ctx, validator) diff --git a/x/staking/migrations/v036/types.go b/x/staking/migrations/v036/types.go index c954add0..0491ab0a 100644 --- a/x/staking/migrations/v036/types.go +++ b/x/staking/migrations/v036/types.go @@ -3,135 +3,3 @@ // references types from this file, so we're keeping it for now. // DONTCOVER package v036 - -import ( - "time" - - "github.com/cosmos/cosmos-sdk/codec/legacy" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" -) - -const ( - ModuleName = "staking" -) - -type ( - Commission struct { - CommissionRates `json:"commission_rates" yaml:"commission_rates"` - UpdateTime time.Time `json:"update_time" yaml:"update_time"` - } - - CommissionRates struct { - Rate sdk.Dec `json:"rate" yaml:"rate"` - MaxRate sdk.Dec `json:"max_rate" yaml:"max_rate"` - MaxChangeRate sdk.Dec `json:"max_change_rate" yaml:"max_change_rate"` - } - - Validator struct { - OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` - ConsPubKey cryptotypes.PubKey `json:"consensus_pubkey" yaml:"consensus_pubkey"` - Jailed bool `json:"jailed" yaml:"jailed"` - Status v034staking.BondStatus `json:"status" yaml:"status"` - Tokens sdk.Int `json:"tokens" yaml:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` - Description v034staking.Description `json:"description" yaml:"description"` - UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` - Commission Commission `json:"commission" yaml:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` - } - - bechValidator struct { - OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` - ConsPubKey string `json:"consensus_pubkey" yaml:"consensus_pubkey"` - Jailed bool `json:"jailed" yaml:"jailed"` - Status v034staking.BondStatus `json:"status" yaml:"status"` - Tokens sdk.Int `json:"tokens" yaml:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` - Description v034staking.Description `json:"description" yaml:"description"` - UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` - Commission Commission `json:"commission" yaml:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` - } - - Validators []Validator - - GenesisState struct { - Params v034staking.Params `json:"params"` - LastTotalPower sdk.Int `json:"last_total_power"` - LastValidatorPowers []v034staking.LastValidatorPower `json:"last_validator_powers"` - Validators Validators `json:"validators"` - Delegations v034staking.Delegations `json:"delegations"` - UnbondingDelegations []v034staking.UnbondingDelegation `json:"unbonding_delegations"` - Redelegations []v034staking.Redelegation `json:"redelegations"` - Exported bool `json:"exported"` - } -) - -func NewGenesisState( - params v034staking.Params, lastTotalPower sdk.Int, lastValPowers []v034staking.LastValidatorPower, - validators Validators, delegations v034staking.Delegations, - ubds []v034staking.UnbondingDelegation, reds []v034staking.Redelegation, exported bool, -) GenesisState { - - return GenesisState{ - Params: params, - LastTotalPower: lastTotalPower, - LastValidatorPowers: lastValPowers, - Validators: validators, - Delegations: delegations, - UnbondingDelegations: ubds, - Redelegations: reds, - Exported: exported, - } -} - -func (v Validator) MarshalJSON() ([]byte, error) { - bechConsPubKey, err := legacybech32.MarshalPubKey(legacybech32.ConsPK, v.ConsPubKey) - if err != nil { - return nil, err - } - - return legacy.Cdc.MarshalJSON(bechValidator{ - OperatorAddress: v.OperatorAddress, - ConsPubKey: bechConsPubKey, - Jailed: v.Jailed, - Status: v.Status, - Tokens: v.Tokens, - DelegatorShares: v.DelegatorShares, - Description: v.Description, - UnbondingHeight: v.UnbondingHeight, - UnbondingCompletionTime: v.UnbondingCompletionTime, - MinSelfDelegation: v.MinSelfDelegation, - Commission: v.Commission, - }) -} - -func (v *Validator) UnmarshalJSON(data []byte) error { - bv := &bechValidator{} - if err := legacy.Cdc.UnmarshalJSON(data, bv); err != nil { - return err - } - consPubKey, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, bv.ConsPubKey) - if err != nil { - return err - } - *v = Validator{ - OperatorAddress: bv.OperatorAddress, - ConsPubKey: consPubKey, - Jailed: bv.Jailed, - Tokens: bv.Tokens, - Status: bv.Status, - DelegatorShares: bv.DelegatorShares, - Description: bv.Description, - UnbondingHeight: bv.UnbondingHeight, - UnbondingCompletionTime: bv.UnbondingCompletionTime, - Commission: bv.Commission, - MinSelfDelegation: bv.MinSelfDelegation, - } - return nil -} diff --git a/x/staking/migrations/v038/types.go b/x/staking/migrations/v038/types.go index 027b3e69..b54a5b41 100644 --- a/x/staking/migrations/v038/types.go +++ b/x/staking/migrations/v038/types.go @@ -3,161 +3,3 @@ // references types from this file, so we're keeping it for now. // DONTCOVER package v038 - -import ( - "time" - - "github.com/cosmos/cosmos-sdk/codec/legacy" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32/legacybech32" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" - v036staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v036" -) - -const ( - ModuleName = "staking" -) - -type ( - Description struct { - Moniker string `json:"moniker" yaml:"moniker"` - Identity string `json:"identity" yaml:"identity"` - Website string `json:"website" yaml:"website"` - SecurityContact string `json:"security_contact" yaml:"security_contact"` - Details string `json:"details" yaml:"details"` - } - - Validator struct { - OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` - ConsPubKey cryptotypes.PubKey `json:"consensus_pubkey" yaml:"consensus_pubkey"` - Jailed bool `json:"jailed" yaml:"jailed"` - Status v034staking.BondStatus `json:"status" yaml:"status"` - Tokens sdk.Int `json:"tokens" yaml:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` - Description Description `json:"description" yaml:"description"` - UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` - Commission v036staking.Commission `json:"commission" yaml:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` - } - - bechValidator struct { - OperatorAddress sdk.ValAddress `json:"operator_address" yaml:"operator_address"` - ConsPubKey string `json:"consensus_pubkey" yaml:"consensus_pubkey"` - Jailed bool `json:"jailed" yaml:"jailed"` - Status v034staking.BondStatus `json:"status" yaml:"status"` - Tokens sdk.Int `json:"tokens" yaml:"tokens"` - DelegatorShares sdk.Dec `json:"delegator_shares" yaml:"delegator_shares"` - Description Description `json:"description" yaml:"description"` - UnbondingHeight int64 `json:"unbonding_height" yaml:"unbonding_height"` - UnbondingCompletionTime time.Time `json:"unbonding_time" yaml:"unbonding_time"` - Commission v036staking.Commission `json:"commission" yaml:"commission"` - MinSelfDelegation sdk.Int `json:"min_self_delegation" yaml:"min_self_delegation"` - } - - Validators []Validator - - Params struct { - UnbondingTime time.Duration `json:"unbonding_time" yaml:"unbonding_time"` // time duration of unbonding - MaxValidators uint16 `json:"max_validators" yaml:"max_validators"` // maximum number of validators (max uint16 = 65535) - MaxEntries uint16 `json:"max_entries" yaml:"max_entries"` // max entries for either unbonding delegation or redelegation (per pair/trio) - HistoricalEntries uint16 `json:"historical_entries" yaml:"historical_entries"` // number of historical entries to persist - BondDenom string `json:"bond_denom" yaml:"bond_denom"` // bondable coin denomination - } - - GenesisState struct { - Params Params `json:"params"` - LastTotalPower sdk.Int `json:"last_total_power"` - LastValidatorPowers []v034staking.LastValidatorPower `json:"last_validator_powers"` - Validators Validators `json:"validators"` - Delegations v034staking.Delegations `json:"delegations"` - UnbondingDelegations []v034staking.UnbondingDelegation `json:"unbonding_delegations"` - Redelegations []v034staking.Redelegation `json:"redelegations"` - Exported bool `json:"exported"` - } -) - -// NewDescription creates a new Description object -func NewDescription(moniker, identity, website, securityContact, details string) Description { - return Description{ - Moniker: moniker, - Identity: identity, - Website: website, - SecurityContact: securityContact, - Details: details, - } -} - -// NewGenesisState creates a new GenesisState object -func NewGenesisState( - params v034staking.Params, lastTotalPower sdk.Int, lastValPowers []v034staking.LastValidatorPower, - validators Validators, delegations v034staking.Delegations, - ubds []v034staking.UnbondingDelegation, reds []v034staking.Redelegation, exported bool, -) GenesisState { - - return GenesisState{ - Params: Params{ - UnbondingTime: params.UnbondingTime, - MaxValidators: params.MaxValidators, - MaxEntries: params.MaxEntries, - BondDenom: params.BondDenom, - HistoricalEntries: 0, - }, - LastTotalPower: lastTotalPower, - LastValidatorPowers: lastValPowers, - Validators: validators, - Delegations: delegations, - UnbondingDelegations: ubds, - Redelegations: reds, - Exported: exported, - } -} - -// MarshalJSON marshals the validator to JSON using Bech32 -func (v Validator) MarshalJSON() ([]byte, error) { - bechConsPubKey, err := legacybech32.MarshalPubKey(legacybech32.ConsPK, v.ConsPubKey) - if err != nil { - return nil, err - } - - return legacy.Cdc.MarshalJSON(bechValidator{ - OperatorAddress: v.OperatorAddress, - ConsPubKey: bechConsPubKey, - Jailed: v.Jailed, - Status: v.Status, - Tokens: v.Tokens, - DelegatorShares: v.DelegatorShares, - Description: v.Description, - UnbondingHeight: v.UnbondingHeight, - UnbondingCompletionTime: v.UnbondingCompletionTime, - MinSelfDelegation: v.MinSelfDelegation, - Commission: v.Commission, - }) -} - -// UnmarshalJSON unmarshals the validator from JSON using Bech32 -func (v *Validator) UnmarshalJSON(data []byte) error { - bv := &bechValidator{} - if err := legacy.Cdc.UnmarshalJSON(data, bv); err != nil { - return err - } - consPubKey, err := legacybech32.UnmarshalPubKey(legacybech32.ConsPK, bv.ConsPubKey) - if err != nil { - return err - } - *v = Validator{ - OperatorAddress: bv.OperatorAddress, - ConsPubKey: consPubKey, - Jailed: bv.Jailed, - Tokens: bv.Tokens, - Status: bv.Status, - DelegatorShares: bv.DelegatorShares, - Description: bv.Description, - UnbondingHeight: bv.UnbondingHeight, - UnbondingCompletionTime: bv.UnbondingCompletionTime, - Commission: bv.Commission, - MinSelfDelegation: bv.MinSelfDelegation, - } - return nil -} diff --git a/x/staking/migrations/v040/keys.go b/x/staking/migrations/v040/keys.go index 27e2f9ea..b031943a 100644 --- a/x/staking/migrations/v040/keys.go +++ b/x/staking/migrations/v040/keys.go @@ -1,326 +1,3 @@ // Package v040 is copy-pasted from: // https://github.com/cosmos/cosmos-sdk/blob/v0.41.0/x/staking/types/keys.go package v040 - -import ( - "bytes" - "encoding/binary" - "fmt" - "strconv" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/kv" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" - "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -const ( - // ModuleName is the name of the staking module - ModuleName = "staking" - - // StoreKey is the string store representation - StoreKey = ModuleName - - // QuerierRoute is the querier route for the staking module - QuerierRoute = ModuleName - - // RouterKey is the msg router key for the staking module - RouterKey = ModuleName -) - -var ( - // Keys for store prefixes - // Last* values are constant during a block. - LastValidatorPowerKey = []byte{0x11} // prefix for each key to a validator index, for bonded validators - LastTotalPowerKey = []byte{0x12} // prefix for the total power - - ValidatorsKey = []byte{0x21} // prefix for each key to a validator - ValidatorsByConsAddrKey = []byte{0x22} // prefix for each key to a validator index, by pubkey - ValidatorsByPowerIndexKey = []byte{0x23} // prefix for each key to a validator index, sorted by power - - DelegationKey = []byte{0x31} // key for a delegation - UnbondingDelegationKey = []byte{0x32} // key for an unbonding-delegation - UnbondingDelegationByValIndexKey = []byte{0x33} // prefix for each key for an unbonding-delegation, by validator operator - RedelegationKey = []byte{0x34} // key for a redelegation - RedelegationByValSrcIndexKey = []byte{0x35} // prefix for each key for an redelegation, by source validator operator - RedelegationByValDstIndexKey = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator - - UnbondingQueueKey = []byte{0x41} // prefix for the timestamps in unbonding queue - RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue - ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue - - HistoricalInfoKey = []byte{0x50} // prefix for the historical info -) - -// gets the key for the validator with address -// VALUE: staking/Validator -func GetValidatorKey(operatorAddr sdk.ValAddress) []byte { - return append(ValidatorsKey, operatorAddr.Bytes()...) -} - -// gets the key for the validator with pubkey -// VALUE: validator operator address ([]byte) -func GetValidatorByConsAddrKey(addr sdk.ConsAddress) []byte { - return append(ValidatorsByConsAddrKey, addr.Bytes()...) -} - -// Get the validator operator address from LastValidatorPowerKey -func AddressFromLastValidatorPowerKey(key []byte) []byte { - kv.AssertKeyAtLeastLength(key, 2) - return key[1:] // remove prefix bytes -} - -// get the validator by power index. -// Power index is the key used in the power-store, and represents the relative -// power ranking of the validator. -// VALUE: validator operator address ([]byte) -func GetValidatorsByPowerIndexKey(validator types.Validator) []byte { - // NOTE the address doesn't need to be stored because counter bytes must always be different - // NOTE the larger values are of higher value - - consensusPower := sdk.TokensToConsensusPower(validator.Tokens, sdk.DefaultPowerReduction) - consensusPowerBytes := make([]byte, 8) - binary.BigEndian.PutUint64(consensusPowerBytes, uint64(consensusPower)) - - powerBytes := consensusPowerBytes - powerBytesLen := len(powerBytes) // 8 - - // key is of format prefix || powerbytes || addrBytes - key := make([]byte, 1+powerBytesLen+v040auth.AddrLen) - - key[0] = ValidatorsByPowerIndexKey[0] - copy(key[1:powerBytesLen+1], powerBytes) - addr, err := sdk.ValAddressFromBech32(validator.OperatorAddress) - if err != nil { - panic(err) - } - operAddrInvr := sdk.CopyBytes(addr) - - for i, b := range operAddrInvr { - operAddrInvr[i] = ^b - } - - copy(key[powerBytesLen+1:], operAddrInvr) - - return key -} - -// get the bonded validator index key for an operator address -func GetLastValidatorPowerKey(operator sdk.ValAddress) []byte { - return append(LastValidatorPowerKey, operator...) -} - -// parse the validators operator address from power rank key -func ParseValidatorPowerRankKey(key []byte) (operAddr []byte) { - powerBytesLen := 8 - kv.AssertKeyLength(key, 1+powerBytesLen+v040auth.AddrLen) - - operAddr = sdk.CopyBytes(key[powerBytesLen+1:]) - - for i, b := range operAddr { - operAddr[i] = ^b - } - - return operAddr -} - -// GetValidatorQueueKey returns the prefix key used for getting a set of unbonding -// validators whose unbonding completion occurs at the given time and height. -func GetValidatorQueueKey(timestamp time.Time, height int64) []byte { - heightBz := sdk.Uint64ToBigEndian(uint64(height)) - timeBz := sdk.FormatTimeBytes(timestamp) - timeBzL := len(timeBz) - prefixL := len(ValidatorQueueKey) - - bz := make([]byte, prefixL+8+timeBzL+8) - - // copy the prefix - copy(bz[:prefixL], ValidatorQueueKey) - - // copy the encoded time bytes length - copy(bz[prefixL:prefixL+8], sdk.Uint64ToBigEndian(uint64(timeBzL))) - - // copy the encoded time bytes - copy(bz[prefixL+8:prefixL+8+timeBzL], timeBz) - - // copy the encoded height - copy(bz[prefixL+8+timeBzL:], heightBz) - - return bz -} - -// ParseValidatorQueueKey returns the encoded time and height from a key created -// from GetValidatorQueueKey. -func ParseValidatorQueueKey(bz []byte) (time.Time, int64, error) { - prefixL := len(ValidatorQueueKey) - if prefix := bz[:prefixL]; !bytes.Equal(prefix, ValidatorQueueKey) { - return time.Time{}, 0, fmt.Errorf("invalid prefix; expected: %X, got: %X", ValidatorQueueKey, prefix) - } - - timeBzL := sdk.BigEndianToUint64(bz[prefixL : prefixL+8]) - ts, err := sdk.ParseTimeBytes(bz[prefixL+8 : prefixL+8+int(timeBzL)]) - if err != nil { - return time.Time{}, 0, err - } - - height := sdk.BigEndianToUint64(bz[prefixL+8+int(timeBzL):]) - - return ts, int64(height), nil -} - -// gets the key for delegator bond with validator -// VALUE: staking/Delegation -func GetDelegationKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append(GetDelegationsKey(delAddr), valAddr.Bytes()...) -} - -// gets the prefix for a delegator for all validators -func GetDelegationsKey(delAddr sdk.AccAddress) []byte { - return append(DelegationKey, delAddr.Bytes()...) -} - -// gets the key for an unbonding delegation by delegator and validator addr -// VALUE: staking/UnbondingDelegation -func GetUBDKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append( - GetUBDsKey(delAddr.Bytes()), - valAddr.Bytes()...) -} - -// gets the index-key for an unbonding delegation, stored by validator-index -// VALUE: none (key rearrangement used) -func GetUBDByValIndexKey(delAddr sdk.AccAddress, valAddr sdk.ValAddress) []byte { - return append(GetUBDsByValIndexKey(valAddr), delAddr.Bytes()...) -} - -// rearranges the ValIndexKey to get the UBDKey -func GetUBDKeyFromValIndexKey(indexKey []byte) []byte { - kv.AssertKeyAtLeastLength(indexKey, 2) - addrs := indexKey[1:] // remove prefix bytes - kv.AssertKeyLength(addrs, 2*v040auth.AddrLen) - - kv.AssertKeyAtLeastLength(addrs, v040auth.AddrLen+1) - valAddr := addrs[:v040auth.AddrLen] - delAddr := addrs[v040auth.AddrLen:] - - return GetUBDKey(delAddr, valAddr) -} - -// gets the prefix for all unbonding delegations from a delegator -func GetUBDsKey(delAddr sdk.AccAddress) []byte { - return append(UnbondingDelegationKey, delAddr.Bytes()...) -} - -// gets the prefix keyspace for the indexes of unbonding delegations for a validator -func GetUBDsByValIndexKey(valAddr sdk.ValAddress) []byte { - return append(UnbondingDelegationByValIndexKey, valAddr.Bytes()...) -} - -// gets the prefix for all unbonding delegations from a delegator -func GetUnbondingDelegationTimeKey(timestamp time.Time) []byte { - bz := sdk.FormatTimeBytes(timestamp) - return append(UnbondingQueueKey, bz...) -} - -// GetREDKey returns a key prefix for indexing a redelegation from a delegator -// and source validator to a destination validator. -func GetREDKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - key := make([]byte, 1+v040auth.AddrLen*3) - - copy(key[0:v040auth.AddrLen+1], GetREDsKey(delAddr.Bytes())) - copy(key[v040auth.AddrLen+1:2*v040auth.AddrLen+1], valSrcAddr.Bytes()) - copy(key[2*v040auth.AddrLen+1:3*v040auth.AddrLen+1], valDstAddr.Bytes()) - - return key -} - -// gets the index-key for a redelegation, stored by source-validator-index -// VALUE: none (key rearrangement used) -func GetREDByValSrcIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - REDSFromValsSrcKey := GetREDsFromValSrcIndexKey(valSrcAddr) - offset := len(REDSFromValsSrcKey) - - // key is of the form REDSFromValsSrcKey || delAddr || valDstAddr - key := make([]byte, len(REDSFromValsSrcKey)+2*v040auth.AddrLen) - copy(key[0:offset], REDSFromValsSrcKey) - copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) - copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valDstAddr.Bytes()) - - return key -} - -// gets the index-key for a redelegation, stored by destination-validator-index -// VALUE: none (key rearrangement used) -func GetREDByValDstIndexKey(delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) []byte { - REDSToValsDstKey := GetREDsToValDstIndexKey(valDstAddr) - offset := len(REDSToValsDstKey) - - // key is of the form REDSToValsDstKey || delAddr || valSrcAddr - key := make([]byte, len(REDSToValsDstKey)+2*v040auth.AddrLen) - copy(key[0:offset], REDSToValsDstKey) - copy(key[offset:offset+v040auth.AddrLen], delAddr.Bytes()) - copy(key[offset+v040auth.AddrLen:offset+2*v040auth.AddrLen], valSrcAddr.Bytes()) - - return key -} - -// GetREDKeyFromValSrcIndexKey rearranges the ValSrcIndexKey to get the REDKey -func GetREDKeyFromValSrcIndexKey(indexKey []byte) []byte { - // note that first byte is prefix byte - kv.AssertKeyLength(indexKey, 3*v040auth.AddrLen+1) - - valSrcAddr := indexKey[1 : v040auth.AddrLen+1] - delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] - valDstAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] - - return GetREDKey(delAddr, valSrcAddr, valDstAddr) -} - -// GetREDKeyFromValDstIndexKey rearranges the ValDstIndexKey to get the REDKey -func GetREDKeyFromValDstIndexKey(indexKey []byte) []byte { - // note that first byte is prefix byte - kv.AssertKeyLength(indexKey, 3*v040auth.AddrLen+1) - - valDstAddr := indexKey[1 : v040auth.AddrLen+1] - delAddr := indexKey[v040auth.AddrLen+1 : 2*v040auth.AddrLen+1] - valSrcAddr := indexKey[2*v040auth.AddrLen+1 : 3*v040auth.AddrLen+1] - - return GetREDKey(delAddr, valSrcAddr, valDstAddr) -} - -// GetRedelegationTimeKey returns a key prefix for indexing an unbonding -// redelegation based on a completion time. -func GetRedelegationTimeKey(timestamp time.Time) []byte { - bz := sdk.FormatTimeBytes(timestamp) - return append(RedelegationQueueKey, bz...) -} - -// GetREDsKey returns a key prefix for indexing a redelegation from a delegator -// address. -func GetREDsKey(delAddr sdk.AccAddress) []byte { - return append(RedelegationKey, delAddr.Bytes()...) -} - -// GetREDsFromValSrcIndexKey returns a key prefix for indexing a redelegation to -// a source validator. -func GetREDsFromValSrcIndexKey(valSrcAddr sdk.ValAddress) []byte { - return append(RedelegationByValSrcIndexKey, valSrcAddr.Bytes()...) -} - -// GetREDsToValDstIndexKey returns a key prefix for indexing a redelegation to a -// destination (target) validator. -func GetREDsToValDstIndexKey(valDstAddr sdk.ValAddress) []byte { - return append(RedelegationByValDstIndexKey, valDstAddr.Bytes()...) -} - -// GetREDsByDelToValDstIndexKey returns a key prefix for indexing a redelegation -// from an address to a source validator. -func GetREDsByDelToValDstIndexKey(delAddr sdk.AccAddress, valDstAddr sdk.ValAddress) []byte { - return append(GetREDsToValDstIndexKey(valDstAddr), delAddr.Bytes()...) -} - -// GetHistoricalInfoKey returns a key prefix for indexing HistoricalInfo objects. -func GetHistoricalInfoKey(height int64) []byte { - return append(HistoricalInfoKey, []byte(strconv.FormatInt(height, 10))...) -} diff --git a/x/staking/migrations/v040/migrate.go b/x/staking/migrations/v040/migrate.go index babcb991..c2ae4953 100644 --- a/x/staking/migrations/v040/migrate.go +++ b/x/staking/migrations/v040/migrate.go @@ -1,140 +1 @@ package v040 - -import ( - "fmt" - - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" - v038staking "github.com/iqlusioninc/liquidity-staking-module/x/staking/migrations/v038" -) - -func migrateBondStatus(oldStatus v034staking.BondStatus) BondStatus { - switch oldStatus { - case v034staking.Unbonded: - return Unbonded - - case v034staking.Unbonding: - return Unbonding - - case v034staking.Bonded: - return Bonded - - default: - panic(fmt.Errorf("invalid bond status %d", oldStatus)) - } -} - -// Migrate accepts exported v0.38 x/staking genesis state and migrates it to -// v0.40 x/staking genesis state. The migration includes: -// -// - Convert addresses from bytes to bech32 strings. -// - Update BondStatus staking constants. -// - Re-encode in v0.40 GenesisState. -func Migrate(stakingState v038staking.GenesisState) *GenesisState { - newLastValidatorPowers := make([]LastValidatorPower, len(stakingState.LastValidatorPowers)) - for i, oldLastValidatorPower := range stakingState.LastValidatorPowers { - newLastValidatorPowers[i] = LastValidatorPower{ - Address: oldLastValidatorPower.Address.String(), - Power: oldLastValidatorPower.Power, - } - } - - newValidators := make([]Validator, len(stakingState.Validators)) - for i, oldValidator := range stakingState.Validators { - pkAny, err := codectypes.NewAnyWithValue(oldValidator.ConsPubKey) - if err != nil { - panic(fmt.Sprintf("Can't pack validator consensus PK as Any: %s", err)) - } - newValidators[i] = Validator{ - OperatorAddress: oldValidator.OperatorAddress.String(), - ConsensusPubkey: pkAny, - Jailed: oldValidator.Jailed, - Status: migrateBondStatus(oldValidator.Status), - Tokens: oldValidator.Tokens, - DelegatorShares: oldValidator.DelegatorShares, - Description: Description{ - Moniker: oldValidator.Description.Moniker, - Identity: oldValidator.Description.Identity, - Website: oldValidator.Description.Website, - SecurityContact: oldValidator.Description.SecurityContact, - Details: oldValidator.Description.Details, - }, - UnbondingHeight: oldValidator.UnbondingHeight, - UnbondingTime: oldValidator.UnbondingCompletionTime, - Commission: Commission{ - CommissionRates: CommissionRates{ - Rate: oldValidator.Commission.Rate, - MaxRate: oldValidator.Commission.MaxRate, - MaxChangeRate: oldValidator.Commission.MaxChangeRate, - }, - UpdateTime: oldValidator.Commission.UpdateTime, - }, - MinSelfDelegation: oldValidator.MinSelfDelegation, - } - } - - newDelegations := make([]Delegation, len(stakingState.Delegations)) - for i, oldDelegation := range stakingState.Delegations { - newDelegations[i] = Delegation{ - DelegatorAddress: oldDelegation.DelegatorAddress.String(), - ValidatorAddress: oldDelegation.ValidatorAddress.String(), - Shares: oldDelegation.Shares, - } - } - - newUnbondingDelegations := make([]UnbondingDelegation, len(stakingState.UnbondingDelegations)) - for i, oldUnbondingDelegation := range stakingState.UnbondingDelegations { - newEntries := make([]UnbondingDelegationEntry, len(oldUnbondingDelegation.Entries)) - for j, oldEntry := range oldUnbondingDelegation.Entries { - newEntries[j] = UnbondingDelegationEntry{ - CreationHeight: oldEntry.CreationHeight, - CompletionTime: oldEntry.CompletionTime, - InitialBalance: oldEntry.InitialBalance, - Balance: oldEntry.Balance, - } - } - - newUnbondingDelegations[i] = UnbondingDelegation{ - DelegatorAddress: oldUnbondingDelegation.DelegatorAddress.String(), - ValidatorAddress: oldUnbondingDelegation.ValidatorAddress.String(), - Entries: newEntries, - } - } - - newRedelegations := make([]Redelegation, len(stakingState.Redelegations)) - for i, oldRedelegation := range stakingState.Redelegations { - newEntries := make([]RedelegationEntry, len(oldRedelegation.Entries)) - for j, oldEntry := range oldRedelegation.Entries { - newEntries[j] = RedelegationEntry{ - CreationHeight: oldEntry.CreationHeight, - CompletionTime: oldEntry.CompletionTime, - InitialBalance: oldEntry.InitialBalance, - SharesDst: oldEntry.SharesDst, - } - } - - newRedelegations[i] = Redelegation{ - DelegatorAddress: oldRedelegation.DelegatorAddress.String(), - ValidatorSrcAddress: oldRedelegation.ValidatorSrcAddress.String(), - ValidatorDstAddress: oldRedelegation.ValidatorDstAddress.String(), - Entries: newEntries, - } - } - - return &GenesisState{ - Params: Params{ - UnbondingTime: stakingState.Params.UnbondingTime, - MaxValidators: uint32(stakingState.Params.MaxValidators), - MaxEntries: uint32(stakingState.Params.MaxEntries), - HistoricalEntries: uint32(stakingState.Params.HistoricalEntries), - BondDenom: stakingState.Params.BondDenom, - }, - LastTotalPower: stakingState.LastTotalPower, - LastValidatorPowers: newLastValidatorPowers, - Validators: newValidators, - Delegations: newDelegations, - UnbondingDelegations: newUnbondingDelegations, - Redelegations: newRedelegations, - Exported: stakingState.Exported, - } -} diff --git a/x/staking/migrations/v040/migrate_test.go b/x/staking/migrations/v040/migrate_test.go index 6835c975..2208ec60 100644 --- a/x/staking/migrations/v040/migrate_test.go +++ b/x/staking/migrations/v040/migrate_test.go @@ -1,96 +1 @@ package v040_test - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - "github.com/cosmos/cosmos-sdk/simapp" - v034staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v034" - v038staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v038" - v040staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v040" -) - -func TestMigrate(t *testing.T) { - encodingConfig := simapp.MakeTestEncodingConfig() - clientCtx := client.Context{}. - WithInterfaceRegistry(encodingConfig.InterfaceRegistry). - WithTxConfig(encodingConfig.TxConfig). - WithLegacyAmino(encodingConfig.Amino). - WithCodec(encodingConfig.Codec) - - consPubKey := ed25519.GenPrivKeyFromSecret([]byte("val0")).PubKey() - stakingGenState := v038staking.GenesisState{ - Validators: v038staking.Validators{v038staking.Validator{ - ConsPubKey: consPubKey, - Status: v034staking.Unbonded, - }}, - } - - migrated := v040staking.Migrate(stakingGenState) - - bz, err := clientCtx.Codec.MarshalJSON(migrated) - require.NoError(t, err) - - // Indent the JSON bz correctly. - var jsonObj map[string]interface{} - err = json.Unmarshal(bz, &jsonObj) - require.NoError(t, err) - indentedBz, err := json.MarshalIndent(jsonObj, "", " ") - require.NoError(t, err) - - // Make sure about: - // - consensus_pubkey: should be an any - // - validator's status should be 1 (new unbonded) - expected := `{ - "delegations": [], - "exported": false, - "last_total_power": "0", - "last_validator_powers": [], - "params": { - "bond_denom": "", - "historical_entries": 0, - "max_entries": 0, - "max_validators": 0, - "unbonding_time": "0s" - }, - "redelegations": [], - "unbonding_delegations": [], - "validators": [ - { - "commission": { - "commission_rates": { - "max_change_rate": "0", - "max_rate": "0", - "rate": "0" - }, - "update_time": "0001-01-01T00:00:00Z" - }, - "consensus_pubkey": { - "@type": "/cosmos.crypto.ed25519.PubKey", - "key": "KTeVrjP7NJIufvgMJsQRxZjfFyD+Exda6O7x+oxIvmA=" - }, - "delegator_shares": "0", - "description": { - "details": "", - "identity": "", - "moniker": "", - "security_contact": "", - "website": "" - }, - "jailed": false, - "min_self_delegation": "0", - "operator_address": "", - "status": "BOND_STATUS_UNBONDED", - "tokens": "0", - "unbonding_height": "0", - "unbonding_time": "0001-01-01T00:00:00Z" - } - ] -}` - - require.Equal(t, expected, string(indentedBz)) -} diff --git a/x/staking/migrations/v043/store.go b/x/staking/migrations/v043/store.go index 2ebcbb86..73ef0c9c 100644 --- a/x/staking/migrations/v043/store.go +++ b/x/staking/migrations/v043/store.go @@ -1,79 +1 @@ package v043 - -import ( - "github.com/cosmos/cosmos-sdk/store/prefix" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/address" - v040auth "github.com/cosmos/cosmos-sdk/x/auth/migrations/v040" - v043distribution "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v043" - v040staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v040" - "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -// migratePrefixAddressAddressAddress is a helper function that migrates all keys of format: -// prefix_bytes | address_1_bytes | address_2_bytes | address_3_bytes -// into format: -// prefix_bytes | address_1_len (1 byte) | address_1_bytes | address_2_len (1 byte) | address_2_bytes | address_3_len (1 byte) | address_3_bytes -func migratePrefixAddressAddressAddress(store sdk.KVStore, prefixBz []byte) { - oldStore := prefix.NewStore(store, prefixBz) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - addr1 := oldStoreIter.Key()[:v040auth.AddrLen] - addr2 := oldStoreIter.Key()[v040auth.AddrLen : 2*v040auth.AddrLen] - addr3 := oldStoreIter.Key()[2*v040auth.AddrLen:] - newStoreKey := append(append(append( - prefixBz, - address.MustLengthPrefix(addr1)...), address.MustLengthPrefix(addr2)...), address.MustLengthPrefix(addr3)..., - ) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} - -const powerBytesLen = 8 - -func migrateValidatorsByPowerIndexKey(store sdk.KVStore) { - oldStore := prefix.NewStore(store, v040staking.ValidatorsByPowerIndexKey) - - oldStoreIter := oldStore.Iterator(nil, nil) - defer oldStoreIter.Close() - - for ; oldStoreIter.Valid(); oldStoreIter.Next() { - powerBytes := oldStoreIter.Key()[:powerBytesLen] - valAddr := oldStoreIter.Key()[powerBytesLen:] - newStoreKey := append(append(types.ValidatorsByPowerIndexKey, powerBytes...), address.MustLengthPrefix(valAddr)...) - - // Set new key on store. Values don't change. - store.Set(newStoreKey, oldStoreIter.Value()) - oldStore.Delete(oldStoreIter.Key()) - } -} - -// MigrateStore performs in-place store migrations from v0.40 to v0.43. The -// migration includes: -// -// - Setting the Power Reduction param in the paramstore -func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey) error { - store := ctx.KVStore(storeKey) - - v043distribution.MigratePrefixAddress(store, v040staking.LastValidatorPowerKey) - - v043distribution.MigratePrefixAddress(store, v040staking.ValidatorsKey) - v043distribution.MigratePrefixAddress(store, v040staking.ValidatorsByConsAddrKey) - migrateValidatorsByPowerIndexKey(store) - - v043distribution.MigratePrefixAddressAddress(store, v040staking.DelegationKey) - v043distribution.MigratePrefixAddressAddress(store, v040staking.UnbondingDelegationKey) - v043distribution.MigratePrefixAddressAddress(store, v040staking.UnbondingDelegationByValIndexKey) - migratePrefixAddressAddressAddress(store, v040staking.RedelegationKey) - migratePrefixAddressAddressAddress(store, v040staking.RedelegationByValSrcIndexKey) - migratePrefixAddressAddressAddress(store, v040staking.RedelegationByValDstIndexKey) - - return nil -} diff --git a/x/staking/migrations/v043/store_test.go b/x/staking/migrations/v043/store_test.go index 756590a5..596b211a 100644 --- a/x/staking/migrations/v043/store_test.go +++ b/x/staking/migrations/v043/store_test.go @@ -1,138 +1 @@ package v043_test - -import ( - "bytes" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - sdk "github.com/cosmos/cosmos-sdk/types" - v040staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v040" - v043staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v043" - "github.com/cosmos/cosmos-sdk/x/staking/teststaking" - "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -func TestStoreMigration(t *testing.T) { - stakingKey := sdk.NewKVStoreKey("staking") - tStakingKey := sdk.NewTransientStoreKey("transient_test") - ctx := testutil.DefaultContext(stakingKey, tStakingKey) - store := ctx.KVStore(stakingKey) - - _, pk1, addr1 := testdata.KeyTestPubAddr() - valAddr1 := sdk.ValAddress(addr1) - val := teststaking.NewValidator(t, valAddr1, pk1) - _, pk1, addr2 := testdata.KeyTestPubAddr() - valAddr2 := sdk.ValAddress(addr2) - _, _, addr3 := testdata.KeyTestPubAddr() - consAddr := sdk.ConsAddress(addr3.String()) - _, _, addr4 := testdata.KeyTestPubAddr() - now := time.Now() - // Use dummy value for all keys. - value := []byte("foo") - - testCases := []struct { - name string - oldKey []byte - newKey []byte - }{ - { - "LastValidatorPowerKey", - v040staking.GetLastValidatorPowerKey(valAddr1), - types.GetLastValidatorPowerKey(valAddr1), - }, - { - "LastTotalPowerKey", - v040staking.LastTotalPowerKey, - types.LastTotalPowerKey, - }, - { - "ValidatorsKey", - v040staking.GetValidatorKey(valAddr1), - types.GetValidatorKey(valAddr1), - }, - { - "ValidatorsByConsAddrKey", - v040staking.GetValidatorByConsAddrKey(consAddr), - types.GetValidatorByConsAddrKey(consAddr), - }, - { - "ValidatorsByPowerIndexKey", - v040staking.GetValidatorsByPowerIndexKey(val), - types.GetValidatorsByPowerIndexKey(val, sdk.DefaultPowerReduction), - }, - { - "DelegationKey", - v040staking.GetDelegationKey(addr4, valAddr1), - types.GetDelegationKey(addr4, valAddr1), - }, - { - "UnbondingDelegationKey", - v040staking.GetUBDKey(addr4, valAddr1), - types.GetUBDKey(addr4, valAddr1), - }, - { - "UnbondingDelegationByValIndexKey", - v040staking.GetUBDByValIndexKey(addr4, valAddr1), - types.GetUBDByValIndexKey(addr4, valAddr1), - }, - { - "RedelegationKey", - v040staking.GetREDKey(addr4, valAddr1, valAddr2), - types.GetREDKey(addr4, valAddr1, valAddr2), - }, - { - "RedelegationByValSrcIndexKey", - v040staking.GetREDByValSrcIndexKey(addr4, valAddr1, valAddr2), - types.GetREDByValSrcIndexKey(addr4, valAddr1, valAddr2), - }, - { - "RedelegationByValDstIndexKey", - v040staking.GetREDByValDstIndexKey(addr4, valAddr1, valAddr2), - types.GetREDByValDstIndexKey(addr4, valAddr1, valAddr2), - }, - { - "UnbondingQueueKey", - v040staking.GetUnbondingDelegationTimeKey(now), - types.GetUnbondingDelegationTimeKey(now), - }, - { - "RedelegationQueueKey", - v040staking.GetRedelegationTimeKey(now), - types.GetRedelegationTimeKey(now), - }, - { - "ValidatorQueueKey", - v040staking.GetValidatorQueueKey(now, 4), - types.GetValidatorQueueKey(now, 4), - }, - { - "HistoricalInfoKey", - v040staking.GetHistoricalInfoKey(4), - types.GetHistoricalInfoKey(4), - }, - } - - // Set all the old keys to the store - for _, tc := range testCases { - store.Set(tc.oldKey, value) - } - - // Run migrations. - err := v043staking.MigrateStore(ctx, stakingKey) - require.NoError(t, err) - - // Make sure the new keys are set and old keys are deleted. - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - if !bytes.Equal(tc.oldKey, tc.newKey) { - require.Nil(t, store.Get(tc.oldKey)) - } - require.Equal(t, value, store.Get(tc.newKey)) - }) - } -} diff --git a/x/staking/migrations/v046/store_test.go b/x/staking/migrations/v046/store_test.go index 6ac24a9e..a5be02bb 100644 --- a/x/staking/migrations/v046/store_test.go +++ b/x/staking/migrations/v046/store_test.go @@ -1,32 +1 @@ package v046_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/testutil" - sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - v046staking "github.com/cosmos/cosmos-sdk/x/staking/migrations/v046" - "github.com/cosmos/cosmos-sdk/x/staking/types" -) - -func TestStoreMigration(t *testing.T) { - encCfg := simapp.MakeTestEncodingConfig() - stakingKey := sdk.NewKVStoreKey("staking") - tStakingKey := sdk.NewTransientStoreKey("transient_test") - ctx := testutil.DefaultContext(stakingKey, tStakingKey) - paramstore := paramtypes.NewSubspace(encCfg.Codec, encCfg.Amino, stakingKey, tStakingKey, "staking") - - // Check no params - require.False(t, paramstore.Has(ctx, types.KeyMinCommissionRate)) - - // Run migrations. - err := v046staking.MigrateStore(ctx, stakingKey, encCfg.Codec, paramstore) - require.NoError(t, err) - - // Make sure the new params are set. - require.True(t, paramstore.Has(ctx, types.KeyMinCommissionRate)) -} diff --git a/x/staking/module.go b/x/staking/module.go index 0116406c..80f2d306 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -142,16 +142,6 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) querier := keeper.Querier{Keeper: am.keeper} types.RegisterQueryServer(cfg.QueryServer(), querier) - - m := keeper.NewMigrator(am.keeper) - err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2) - if err != nil { - panic(err) - } - err = cfg.RegisterMigration(types.ModuleName, 2, m.Migrate2to3) - if err != nil { - panic(err) - } } // InitGenesis performs genesis initialization for the staking module. It returns diff --git a/x/staking/simulation/genesis_test.go b/x/staking/simulation/genesis_test.go index 827ff1fb..545ca1e8 100644 --- a/x/staking/simulation/genesis_test.go +++ b/x/staking/simulation/genesis_test.go @@ -10,6 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/iqlusioninc/liquidity-staking-module/x/staking/simulation" @@ -32,7 +33,7 @@ func TestRandomizedGenState(t *testing.T) { Rand: r, NumBonded: 3, Accounts: simtypes.RandomAccounts(r, 3), - InitialStake: 1000, + InitialStake: sdk.NewInt(1000), GenState: make(map[string]json.RawMessage), } @@ -94,7 +95,7 @@ func TestRandomizedGenState1(t *testing.T) { Rand: r, NumBonded: 4, Accounts: simtypes.RandomAccounts(r, 3), - InitialStake: 1000, + InitialStake: sdk.NewInt(1000), GenState: make(map[string]json.RawMessage), }, "invalid memory address or nil pointer dereference"}, } From 3ae21591a2b69febd30ff17f382953d65cf9c6f7 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 20 Jul 2022 09:05:52 +0800 Subject: [PATCH 32/57] resolve genutil import issue on testsetup --- testutil/network/util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testutil/network/util.go b/testutil/network/util.go index 05931dc8..fbb598a1 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -20,8 +20,8 @@ import ( srvtypes "github.com/cosmos/cosmos-sdk/server/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" ) func startInProcess(cfg Config, val *Validator) error { From 76e362b400a544504bf43054be75102ef71fc82f Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 20 Jul 2022 09:41:56 +0800 Subject: [PATCH 33/57] genesis init/export move from module => keeper --- x/genutil/client/testutil/suite.go | 132 +++++++++++++ x/genutil/gentx_test.go | 286 +++++++++++++++++++++++++++++ x/staking/genesis.go | 214 --------------------- x/staking/genesis_test.go | 193 ------------------- x/staking/keeper/genesis.go | 202 ++++++++++++++++++++ x/staking/keeper/genesis_test.go | 220 ++++++++++++++++++++++ x/staking/module.go | 5 +- 7 files changed, 842 insertions(+), 410 deletions(-) create mode 100644 x/staking/keeper/genesis.go create mode 100644 x/staking/keeper/genesis_test.go diff --git a/x/genutil/client/testutil/suite.go b/x/genutil/client/testutil/suite.go index 110b2e6a..1b48ec8c 100644 --- a/x/genutil/client/testutil/suite.go +++ b/x/genutil/client/testutil/suite.go @@ -1 +1,133 @@ package testutil + +import ( + "context" + "fmt" + "io" + "os" + "path/filepath" + + "github.com/stretchr/testify/suite" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" + stakingcli "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +type IntegrationTestSuite struct { + suite.Suite + + cfg network.Config + network *network.Network +} + +func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite { + return &IntegrationTestSuite{cfg: cfg} +} + +func (s *IntegrationTestSuite) SetupSuite() { + s.T().Log("setting up integration test suite") + + var err error + s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg) + s.Require().NoError(err) + + _, err = s.network.WaitForHeight(1) + s.Require().NoError(err) +} + +func (s *IntegrationTestSuite) TearDownSuite() { + s.T().Log("tearing down integration test suite") + s.network.Cleanup() +} + +func (s *IntegrationTestSuite) TestGenTxCmd() { + val := s.network.Validators[0] + dir := s.T().TempDir() + + cmd := cli.GenTxCmd( + simapp.ModuleBasics, + val.ClientCtx.TxConfig, banktypes.GenesisBalancesIterator{}, val.ClientCtx.HomeDir) + + _, out := testutil.ApplyMockIO(cmd) + clientCtx := val.ClientCtx.WithOutput(out) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + + amount := sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(12)) + genTxFile := filepath.Join(dir, "myTx") + cmd.SetArgs([]string{ + fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), + fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), + val.Moniker, + amount.String(), + }) + + err := cmd.ExecuteContext(ctx) + s.Require().NoError(err) + + // validate generated transaction. + open, err := os.Open(genTxFile) + s.Require().NoError(err) + + all, err := io.ReadAll(open) + s.Require().NoError(err) + + tx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(all) + s.Require().NoError(err) + + msgs := tx.GetMsgs() + s.Require().Len(msgs, 1) + + s.Require().Equal(sdk.MsgTypeURL(&types.MsgCreateValidator{}), sdk.MsgTypeURL(msgs[0])) + s.Require().True(val.Address.Equals(msgs[0].GetSigners()[0])) + s.Require().Equal(amount, msgs[0].(*types.MsgCreateValidator).Value) + s.Require().NoError(tx.ValidateBasic()) +} + +func (s *IntegrationTestSuite) TestGenTxCmdPubkey() { + val := s.network.Validators[0] + dir := s.T().TempDir() + + cmd := cli.GenTxCmd( + simapp.ModuleBasics, + val.ClientCtx.TxConfig, + banktypes.GenesisBalancesIterator{}, + val.ClientCtx.HomeDir, + ) + + _, out := testutil.ApplyMockIO(cmd) + clientCtx := val.ClientCtx.WithOutput(out) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + + amount := sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(12)) + genTxFile := filepath.Join(dir, "myTx") + + cmd.SetArgs([]string{ + fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), + fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), + fmt.Sprintf("--%s={\"key\":\"BOIkjkFruMpfOFC9oNPhiJGfmY2pHF/gwHdLDLnrnS0=\"}", stakingcli.FlagPubKey), + val.Moniker, + amount.String(), + }) + s.Require().Error(cmd.ExecuteContext(ctx)) + + cmd.SetArgs([]string{ + fmt.Sprintf("--%s=%s", flags.FlagChainID, s.network.Config.ChainID), + fmt.Sprintf("--%s=%s", flags.FlagOutputDocument, genTxFile), + fmt.Sprintf("--%s={\"@type\":\"/cosmos.crypto.ed25519.PubKey\",\"key\":\"BOIkjkFruMpfOFC9oNPhiJGfmY2pHF/gwHdLDLnrnS0=\"}", stakingcli.FlagPubKey), + val.Moniker, + amount.String(), + }) + s.Require().NoError(cmd.ExecuteContext(ctx)) +} diff --git a/x/genutil/gentx_test.go b/x/genutil/gentx_test.go index fb44d112..c1c5c8e9 100644 --- a/x/genutil/gentx_test.go +++ b/x/genutil/gentx_test.go @@ -1 +1,287 @@ package genutil_test + +import ( + "encoding/json" + "fmt" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/suite" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/simapp/helpers" + simappparams "github.com/cosmos/cosmos-sdk/simapp/params" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/genutil/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +var ( + priv1 = secp256k1.GenPrivKey() + priv2 = secp256k1.GenPrivKey() + pk1 = priv1.PubKey() + pk2 = priv2.PubKey() + addr1 = sdk.AccAddress(pk1.Address()) + addr2 = sdk.AccAddress(pk2.Address()) + desc = stakingtypes.NewDescription("testname", "", "", "", "") + comm = stakingtypes.CommissionRates{} +) + +// GenTxTestSuite is a test suite to be used with gentx tests. +type GenTxTestSuite struct { + suite.Suite + + ctx sdk.Context + app *simapp.SimApp + encodingConfig simappparams.EncodingConfig + + msg1, msg2 *stakingtypes.MsgCreateValidator +} + +func (suite *GenTxTestSuite) SetupTest() { + checkTx := false + app := simapp.Setup(suite.T(), checkTx) + suite.ctx = app.BaseApp.NewContext(checkTx, tmproto.Header{}) + suite.app = app + suite.encodingConfig = simapp.MakeTestEncodingConfig() + + var err error + amount := sdk.NewInt64Coin(sdk.DefaultBondDenom, 50) + one := sdk.OneInt() + suite.msg1, err = stakingtypes.NewMsgCreateValidator( + sdk.ValAddress(pk1.Address()), pk1, amount, desc, comm, one) + suite.NoError(err) + suite.msg2, err = stakingtypes.NewMsgCreateValidator( + sdk.ValAddress(pk2.Address()), pk1, amount, desc, comm, one) + suite.NoError(err) +} + +func (suite *GenTxTestSuite) setAccountBalance(addr sdk.AccAddress, amount int64) json.RawMessage { + acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc) + + err := testutil.FundAccount(suite.app.BankKeeper, suite.ctx, addr, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, amount)}) + suite.Require().NoError(err) + + bankGenesisState := suite.app.BankKeeper.ExportGenesis(suite.ctx) + bankGenesis, err := suite.encodingConfig.Amino.MarshalJSON(bankGenesisState) // TODO switch this to use Marshaler + suite.Require().NoError(err) + + return bankGenesis +} + +func (suite *GenTxTestSuite) TestSetGenTxsInAppGenesisState() { + var ( + txBuilder = suite.encodingConfig.TxConfig.NewTxBuilder() + genTxs []sdk.Tx + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "one genesis transaction", + func() { + err := txBuilder.SetMsgs(suite.msg1) + suite.Require().NoError(err) + tx := txBuilder.GetTx() + genTxs = []sdk.Tx{tx} + }, + true, + }, + { + "two genesis transactions", + func() { + err := txBuilder.SetMsgs(suite.msg1, suite.msg2) + suite.Require().NoError(err) + tx := txBuilder.GetTx() + genTxs = []sdk.Tx{tx} + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() + cdc := suite.encodingConfig.Codec + txJSONEncoder := suite.encodingConfig.TxConfig.TxJSONEncoder() + + tc.malleate() + appGenesisState, err := genutil.SetGenTxsInAppGenesisState(cdc, txJSONEncoder, make(map[string]json.RawMessage), genTxs) + + if tc.expPass { + suite.Require().NoError(err) + suite.Require().NotNil(appGenesisState[types.ModuleName]) + + var genesisState types.GenesisState + err := cdc.UnmarshalJSON(appGenesisState[types.ModuleName], &genesisState) + suite.Require().NoError(err) + suite.Require().NotNil(genesisState.GenTxs) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *GenTxTestSuite) TestValidateAccountInGenesis() { + var ( + appGenesisState = make(map[string]json.RawMessage) + coins sdk.Coins + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "no accounts", + func() { + coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)} + }, + false, + }, + { + "account without balance in the genesis state", + func() { + coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)} + appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr2, 50) + }, + false, + }, + { + "account without enough funds of default bond denom", + func() { + coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 50)} + appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr1, 25) + }, + false, + }, + { + "account with enough funds of default bond denom", + func() { + coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)} + appGenesisState[banktypes.ModuleName] = suite.setAccountBalance(addr1, 25) + }, + true, + }, + } + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() + cdc := suite.encodingConfig.Codec + + suite.app.StakingKeeper.SetParams(suite.ctx, stakingtypes.DefaultParams()) + stakingGenesisState := suite.app.StakingKeeper.ExportGenesis(suite.ctx) + suite.Require().Equal(stakingGenesisState.Params, stakingtypes.DefaultParams()) + stakingGenesis, err := cdc.MarshalJSON(stakingGenesisState) // TODO switch this to use Marshaler + suite.Require().NoError(err) + appGenesisState[stakingtypes.ModuleName] = stakingGenesis + + tc.malleate() + err = genutil.ValidateAccountInGenesis( + appGenesisState, banktypes.GenesisBalancesIterator{}, + addr1, coins, cdc, + ) + + if tc.expPass { + suite.Require().NoError(err) + } else { + suite.Require().Error(err) + } + }) + } +} + +func (suite *GenTxTestSuite) TestDeliverGenTxs() { + var ( + genTxs []json.RawMessage + txBuilder = suite.encodingConfig.TxConfig.NewTxBuilder() + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "no signature supplied", + func() { + err := txBuilder.SetMsgs(suite.msg1) + suite.Require().NoError(err) + + genTxs = make([]json.RawMessage, 1) + tx, err := suite.encodingConfig.TxConfig.TxJSONEncoder()(txBuilder.GetTx()) + suite.Require().NoError(err) + genTxs[0] = tx + }, + false, + }, + { + "success", + func() { + _ = suite.setAccountBalance(addr1, 50) + _ = suite.setAccountBalance(addr2, 1) + + r := rand.New(rand.NewSource(time.Now().UnixNano())) + msg := banktypes.NewMsgSend(addr1, addr2, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1)}) + tx, err := helpers.GenSignedMockTx( + r, + suite.encodingConfig.TxConfig, + []sdk.Msg{msg}, + sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)}, + helpers.DefaultGenTxGas, + suite.ctx.ChainID(), + []uint64{7}, + []uint64{0}, + priv1, + ) + suite.Require().NoError(err) + + genTxs = make([]json.RawMessage, 1) + genTx, err := suite.encodingConfig.TxConfig.TxJSONEncoder()(tx) + suite.Require().NoError(err) + genTxs[0] = genTx + }, + true, + }, + } + + for _, tc := range testCases { + suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.SetupTest() + + tc.malleate() + + if tc.expPass { + suite.Require().NotPanics(func() { + genutil.DeliverGenTxs( + suite.ctx, genTxs, suite.app.StakingKeeper, suite.app.BaseApp.DeliverTx, + suite.encodingConfig.TxConfig, + ) + }) + } else { + _, err := genutil.DeliverGenTxs( + suite.ctx, genTxs, suite.app.StakingKeeper, suite.app.BaseApp.DeliverTx, + suite.encodingConfig.TxConfig, + ) + + suite.Require().Error(err) + } + }) + } +} + +func TestGenTxTestSuite(t *testing.T) { + suite.Run(t, new(GenTxTestSuite)) +} diff --git a/x/staking/genesis.go b/x/staking/genesis.go index d768c2b4..fa1c5979 100644 --- a/x/staking/genesis.go +++ b/x/staking/genesis.go @@ -2,9 +2,7 @@ package staking import ( "fmt" - "log" - abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" @@ -14,218 +12,6 @@ import ( "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) -// InitGenesis sets the pool and parameters for the provided keeper. For each -// validator in data, it sets that validator in the keeper along with manually -// setting the indexes. In addition, it also sets any delegations found in -// data. Finally, it updates the bonded validators. -// Returns final validator set after applying all declaration and delegations -func InitGenesis( - ctx sdk.Context, keeper keeper.Keeper, accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, data *types.GenesisState, -) (res []abci.ValidatorUpdate) { - bondedTokens := sdk.ZeroInt() - notBondedTokens := sdk.ZeroInt() - - // We need to pretend to be "n blocks before genesis", where "n" is the - // validator update delay, so that e.g. slashing periods are correctly - // initialized for the validator set e.g. with a one-block offset - the - // first TM block is at height 1, so state updates applied from - // genesis.json are in block 0. - ctx = ctx.WithBlockHeight(1 - sdk.ValidatorUpdateDelay) - - keeper.SetParams(ctx, data.Params) - keeper.SetLastTotalPower(ctx, data.LastTotalPower) - - for _, validator := range data.Validators { - keeper.SetValidator(ctx, validator) - - // Manually set indices for the first time - err := keeper.SetValidatorByConsAddr(ctx, validator) - if err != nil { - panic(err) - } - keeper.SetValidatorByPowerIndex(ctx, validator) - - // Call the creation hook if not exported - if !data.Exported { - if err := keeper.AfterValidatorCreated(ctx, validator.GetOperator()); err != nil { - panic(err) - } - } - - // update timeslice if necessary - if validator.IsUnbonding() { - keeper.InsertUnbondingValidatorQueue(ctx, validator) - } - - switch validator.GetStatus() { - case sdkstaking.Bonded: - bondedTokens = bondedTokens.Add(validator.GetTokens()) - case sdkstaking.Unbonding, sdkstaking.Unbonded: - notBondedTokens = notBondedTokens.Add(validator.GetTokens()) - default: - panic("invalid validator status") - } - } - - for _, delegation := range data.Delegations { - delegatorAddress, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) - if err != nil { - panic(err) - } - - // Call the before-creation hook if not exported - if !data.Exported { - if err := keeper.BeforeDelegationCreated(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { - panic(err) - } - } - - keeper.SetDelegation(ctx, delegation) - - // Call the after-modification hook if not exported - if !data.Exported { - if err := keeper.AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { - panic(err) - } - } - } - - for _, ubd := range data.UnbondingDelegations { - keeper.SetUnbondingDelegation(ctx, ubd) - - for _, entry := range ubd.Entries { - keeper.InsertUBDQueue(ctx, ubd, entry.CompletionTime) - notBondedTokens = notBondedTokens.Add(entry.Balance) - } - } - - for _, red := range data.Redelegations { - keeper.SetRedelegation(ctx, red) - - for _, entry := range red.Entries { - keeper.InsertRedelegationQueue(ctx, red, entry.CompletionTime) - } - } - - bondedCoins := sdk.NewCoins(sdk.NewCoin(data.Params.BondDenom, bondedTokens)) - notBondedCoins := sdk.NewCoins(sdk.NewCoin(data.Params.BondDenom, notBondedTokens)) - - // check if the unbonded and bonded pools accounts exists - bondedPool := keeper.GetBondedPool(ctx) - if bondedPool == nil { - panic(fmt.Sprintf("%s module account has not been set", types.BondedPoolName)) - } - - // TODO: remove with genesis 2-phases refactor https://github.com/cosmos/cosmos-sdk/issues/2862 - bondedBalance := bankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - if bondedBalance.IsZero() { - accountKeeper.SetModuleAccount(ctx, bondedPool) - } - - // if balance is different from bonded coins panic because genesis is most likely malformed - if !bondedBalance.IsEqual(bondedCoins) { - panic(fmt.Sprintf("bonded pool balance is different from bonded coins: %s <-> %s", bondedBalance, bondedCoins)) - } - - notBondedPool := keeper.GetNotBondedPool(ctx) - if notBondedPool == nil { - panic(fmt.Sprintf("%s module account has not been set", types.NotBondedPoolName)) - } - - notBondedBalance := bankKeeper.GetAllBalances(ctx, notBondedPool.GetAddress()) - if notBondedBalance.IsZero() { - accountKeeper.SetModuleAccount(ctx, notBondedPool) - } - - // If balance is different from non bonded coins panic because genesis is most - // likely malformed. - if !notBondedBalance.IsEqual(notBondedCoins) { - panic(fmt.Sprintf("not bonded pool balance is different from not bonded coins: %s <-> %s", notBondedBalance, notBondedCoins)) - } - - // don't need to run Tendermint updates if we exported - if data.Exported { - for _, lv := range data.LastValidatorPowers { - valAddr, err := sdk.ValAddressFromBech32(lv.Address) - if err != nil { - panic(err) - } - - keeper.SetLastValidatorPower(ctx, valAddr, lv.Power) - validator, found := keeper.GetValidator(ctx, valAddr) - - if !found { - panic(fmt.Sprintf("validator %s not found", lv.Address)) - } - - update := validator.ABCIValidatorUpdate(keeper.PowerReduction(ctx)) - update.Power = lv.Power // keep the next-val-set offset, use the last power for the first block - res = append(res, update) - } - } else { - var err error - - res, err = keeper.ApplyAndReturnValidatorSetUpdates(ctx) - if err != nil { - log.Fatal(err) - } - } - - keeper.SetLastTokenizeShareRecordId(ctx, data.LastTokenizeShareRecordId) - for _, tokenizeShareRecord := range data.TokenizeShareRecords { - if err := keeper.AddTokenizeShareRecord(ctx, tokenizeShareRecord); err != nil { - panic(err) - } - } - - return res -} - -// ExportGenesis returns a GenesisState for a given context and keeper. The -// GenesisState will contain the pool, params, validators, and bonds found in -// the keeper. -func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState { - var unbondingDelegations []types.UnbondingDelegation - - keeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd types.UnbondingDelegation) (stop bool) { - unbondingDelegations = append(unbondingDelegations, ubd) - return false - }) - - var redelegations []types.Redelegation - - keeper.IterateRedelegations(ctx, func(_ int64, red types.Redelegation) (stop bool) { - redelegations = append(redelegations, red) - return false - }) - - var lastValidatorPowers []types.LastValidatorPower - - keeper.IterateLastValidatorPowers(ctx, func(addr sdk.ValAddress, power int64) (stop bool) { - lastValidatorPowers = append(lastValidatorPowers, types.LastValidatorPower{Address: addr.String(), Power: power}) - return false - }) - - var tokenizeShareRecords []types.TokenizeShareRecord - for _, tokenizeShareRecord := range keeper.GetAllTokenizeShareRecords(ctx) { - tokenizeShareRecords = append(tokenizeShareRecords, tokenizeShareRecord) - } - - return &types.GenesisState{ - Params: keeper.GetParams(ctx), - LastTotalPower: keeper.GetLastTotalPower(ctx), - LastValidatorPowers: lastValidatorPowers, - Validators: keeper.GetAllValidators(ctx), - Delegations: keeper.GetAllDelegations(ctx), - UnbondingDelegations: unbondingDelegations, - Redelegations: redelegations, - Exported: true, - TokenizeShareRecords: tokenizeShareRecords, - LastTokenizeShareRecordId: keeper.GetLastTokenizeShareRecordId(ctx), - } -} - // WriteValidators returns a slice of bonded genesis validators. func WriteValidators(ctx sdk.Context, keeper keeper.Keeper) (vals []tmtypes.GenesisValidator, err error) { keeper.IterateLastValidators(ctx, func(_ int64, validator sdkstaking.ValidatorI) (stop bool) { diff --git a/x/staking/genesis_test.go b/x/staking/genesis_test.go index b588500e..5790a48b 100644 --- a/x/staking/genesis_test.go +++ b/x/staking/genesis_test.go @@ -1,19 +1,12 @@ package staking_test import ( - "fmt" - "log" "testing" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - abci "github.com/tendermint/tendermint/abci/types" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/bank/testutil" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/staking" @@ -28,192 +21,6 @@ func bootstrapGenesisTest(t *testing.T, numAddrs int) (*simapp.SimApp, sdk.Conte return app, ctx, addrDels } -func TestInitGenesis(t *testing.T) { - app, ctx, addrs := bootstrapGenesisTest(t, 10) - - valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) - - params := app.StakingKeeper.GetParams(ctx) - validators := app.StakingKeeper.GetAllValidators(ctx) - require.Len(t, validators, 1) - var delegations []types.Delegation - - pk0, err := codectypes.NewAnyWithValue(PKs[0]) - require.NoError(t, err) - - pk1, err := codectypes.NewAnyWithValue(PKs[1]) - require.NoError(t, err) - - // initialize the validators - bondedVal1 := types.Validator{ - OperatorAddress: sdk.ValAddress(addrs[0]).String(), - ConsensusPubkey: pk0, - Status: sdkstaking.Bonded, - Tokens: valTokens, - DelegatorShares: sdk.NewDecFromInt(valTokens), - Description: types.NewDescription("hoop", "", "", "", ""), - } - bondedVal2 := types.Validator{ - OperatorAddress: sdk.ValAddress(addrs[1]).String(), - ConsensusPubkey: pk1, - Status: sdkstaking.Bonded, - Tokens: valTokens, - DelegatorShares: sdk.NewDecFromInt(valTokens), - Description: types.NewDescription("bloop", "", "", "", ""), - } - - // append new bonded validators to the list - validators = append(validators, bondedVal1, bondedVal2) - log.Printf("%#v", len(validators)) - // mint coins in the bonded pool representing the validators coins - i2 := len(validators) - 1 // -1 to exclude genesis validator - require.NoError(t, - testutil.FundModuleAccount( - app.BankKeeper, - ctx, - types.BondedPoolName, - sdk.NewCoins( - sdk.NewCoin(params.BondDenom, valTokens.MulRaw((int64)(i2))), - ), - ), - ) - genesisDelegations := app.StakingKeeper.GetAllDelegations(ctx) - delegations = append(delegations, genesisDelegations...) - - genesisState := types.NewGenesisState(params, validators, delegations) - vals := staking.InitGenesis(ctx, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, genesisState) - - actualGenesis := staking.ExportGenesis(ctx, app.StakingKeeper) - require.Equal(t, genesisState.Params, actualGenesis.Params) - require.Equal(t, genesisState.Delegations, actualGenesis.Delegations) - require.EqualValues(t, app.StakingKeeper.GetAllValidators(ctx), actualGenesis.Validators) - - // Ensure validators have addresses. - vals2, err := staking.WriteValidators(ctx, app.StakingKeeper) - require.NoError(t, err) - for _, val := range vals2 { - require.NotEmpty(t, val.Address) - } - - // now make sure the validators are bonded and intra-tx counters are correct - resVal, found := app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addrs[0])) - require.True(t, found) - require.Equal(t, sdkstaking.Bonded, resVal.Status) - - resVal, found = app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addrs[1])) - require.True(t, found) - require.Equal(t, sdkstaking.Bonded, resVal.Status) - - abcivals := make([]abci.ValidatorUpdate, len(vals)) - - validators = validators[1:] // remove genesis validator - for i, val := range validators { - abcivals[i] = val.ABCIValidatorUpdate(app.StakingKeeper.PowerReduction(ctx)) - } - - require.Equal(t, abcivals, vals) -} - -func TestInitGenesis_PoolsBalanceMismatch(t *testing.T) { - app := simapp.Setup(t, false) - ctx := app.NewContext(false, tmproto.Header{}) - - consPub, err := codectypes.NewAnyWithValue(PKs[0]) - require.NoError(t, err) - - // create mock validator - validator := types.Validator{ - OperatorAddress: sdk.ValAddress("12345678901234567890").String(), - ConsensusPubkey: consPub, - Jailed: false, - Tokens: sdk.NewInt(10), - DelegatorShares: sdk.NewDecFromInt(sdk.NewInt(10)), - Description: types.NewDescription("bloop", "", "", "", ""), - } - // valid params - params := types.Params{ - UnbondingTime: 10000, - MaxValidators: 1, - MaxEntries: 10, - BondDenom: "stake", - } - - // test - - require.Panics(t, func() { - // setting validator status to bonded so the balance counts towards bonded pool - validator.Status = sdkstaking.Bonded - staking.InitGenesis(ctx, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, &types.GenesisState{ - Params: params, - Validators: []types.Validator{validator}, - }) - }, "should panic because bonded pool balance is different from bonded pool coins") - - require.Panics(t, func() { - // setting validator status to unbonded so the balance counts towards not bonded pool - validator.Status = sdkstaking.Unbonded - staking.InitGenesis(ctx, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, &types.GenesisState{ - Params: params, - Validators: []types.Validator{validator}, - }) - }, "should panic because not bonded pool balance is different from not bonded pool coins") -} - -func TestInitGenesisLargeValidatorSet(t *testing.T) { - size := 200 - require.True(t, size > 100) - - app, ctx, addrs := bootstrapGenesisTest(t, 200) - genesisValidators := app.StakingKeeper.GetAllValidators(ctx) - - params := app.StakingKeeper.GetParams(ctx) - delegations := []types.Delegation{} - validators := make([]types.Validator, size) - var err error - - bondedPoolAmt := sdk.ZeroInt() - for i := range validators { - validators[i], err = types.NewValidator(sdk.ValAddress(addrs[i]), - PKs[i], types.NewDescription(fmt.Sprintf("#%d", i), "", "", "", "")) - require.NoError(t, err) - validators[i].Status = sdkstaking.Bonded - - tokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) - if i < 100 { - tokens = app.StakingKeeper.TokensFromConsensusPower(ctx, 2) - } - validators[i].Tokens = tokens - validators[i].DelegatorShares = sdk.NewDecFromInt(tokens) - // add bonded coins - bondedPoolAmt = bondedPoolAmt.Add(tokens) - } - - validators = append(validators, genesisValidators...) - - genesisState := types.NewGenesisState(params, validators, delegations) - - // mint coins in the bonded pool representing the validators coins - require.NoError(t, - testutil.FundModuleAccount( - app.BankKeeper, - ctx, - types.BondedPoolName, - sdk.NewCoins(sdk.NewCoin(params.BondDenom, bondedPoolAmt)), - ), - ) - - vals := staking.InitGenesis(ctx, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, genesisState) - - abcivals := make([]abci.ValidatorUpdate, 100) - for i, val := range validators[:100] { - abcivals[i] = val.ABCIValidatorUpdate(app.StakingKeeper.PowerReduction(ctx)) - } - - // remove genesis validator - vals = vals[:100] - require.Equal(t, abcivals, vals) -} - func TestValidateGenesis(t *testing.T) { genValidators1 := make([]types.Validator, 1, 5) pk := ed25519.GenPrivKey().PubKey() diff --git a/x/staking/keeper/genesis.go b/x/staking/keeper/genesis.go new file mode 100644 index 00000000..4cf6dd8d --- /dev/null +++ b/x/staking/keeper/genesis.go @@ -0,0 +1,202 @@ +package keeper + +import ( + "fmt" + + abci "github.com/tendermint/tendermint/abci/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +// InitGenesis sets the pool and parameters for the provided keeper. For each +// validator in data, it sets that validator in the keeper along with manually +// setting the indexes. In addition, it also sets any delegations found in +// data. Finally, it updates the bonded validators. +// Returns final validator set after applying all declaration and delegations +func (k Keeper) InitGenesis(ctx sdk.Context, data *types.GenesisState) (res []abci.ValidatorUpdate) { + bondedTokens := sdk.ZeroInt() + notBondedTokens := sdk.ZeroInt() + + // We need to pretend to be "n blocks before genesis", where "n" is the + // validator update delay, so that e.g. slashing periods are correctly + // initialized for the validator set e.g. with a one-block offset - the + // first TM block is at height 1, so state updates applied from + // genesis.json are in block 0. + ctx = ctx.WithBlockHeight(1 - sdk.ValidatorUpdateDelay) + + k.SetParams(ctx, data.Params) + k.SetLastTotalPower(ctx, data.LastTotalPower) + + for _, validator := range data.Validators { + k.SetValidator(ctx, validator) + + // Manually set indices for the first time + k.SetValidatorByConsAddr(ctx, validator) + k.SetValidatorByPowerIndex(ctx, validator) + + // Call the creation hook if not exported + if !data.Exported { + if err := k.AfterValidatorCreated(ctx, validator.GetOperator()); err != nil { + panic(err) + } + } + + // update timeslice if necessary + if validator.IsUnbonding() { + k.InsertUnbondingValidatorQueue(ctx, validator) + } + + switch validator.GetStatus() { + case sdkstaking.Bonded: + bondedTokens = bondedTokens.Add(validator.GetTokens()) + + case sdkstaking.Unbonding, sdkstaking.Unbonded: + notBondedTokens = notBondedTokens.Add(validator.GetTokens()) + + default: + panic("invalid validator status") + } + } + + for _, delegation := range data.Delegations { + delegatorAddress := sdk.MustAccAddressFromBech32(delegation.DelegatorAddress) + + // Call the before-creation hook if not exported + if !data.Exported { + if err := k.BeforeDelegationCreated(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + panic(err) + } + } + + k.SetDelegation(ctx, delegation) + + // Call the after-modification hook if not exported + if !data.Exported { + if err := k.AfterDelegationModified(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { + panic(err) + } + } + } + + for _, ubd := range data.UnbondingDelegations { + k.SetUnbondingDelegation(ctx, ubd) + + for _, entry := range ubd.Entries { + k.InsertUBDQueue(ctx, ubd, entry.CompletionTime) + notBondedTokens = notBondedTokens.Add(entry.Balance) + } + } + + for _, red := range data.Redelegations { + k.SetRedelegation(ctx, red) + + for _, entry := range red.Entries { + k.InsertRedelegationQueue(ctx, red, entry.CompletionTime) + } + } + + bondedCoins := sdk.NewCoins(sdk.NewCoin(data.Params.BondDenom, bondedTokens)) + notBondedCoins := sdk.NewCoins(sdk.NewCoin(data.Params.BondDenom, notBondedTokens)) + + // check if the unbonded and bonded pools accounts exists + bondedPool := k.GetBondedPool(ctx) + if bondedPool == nil { + panic(fmt.Sprintf("%s module account has not been set", types.BondedPoolName)) + } + + // TODO: remove with genesis 2-phases refactor https://github.com/cosmos/cosmos-sdk/issues/2862 + bondedBalance := k.bankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) + if bondedBalance.IsZero() { + k.authKeeper.SetModuleAccount(ctx, bondedPool) + } + + // if balance is different from bonded coins panic because genesis is most likely malformed + if !bondedBalance.IsEqual(bondedCoins) { + panic(fmt.Sprintf("bonded pool balance is different from bonded coins: %s <-> %s", bondedBalance, bondedCoins)) + } + + notBondedPool := k.GetNotBondedPool(ctx) + if notBondedPool == nil { + panic(fmt.Sprintf("%s module account has not been set", types.NotBondedPoolName)) + } + + notBondedBalance := k.bankKeeper.GetAllBalances(ctx, notBondedPool.GetAddress()) + if notBondedBalance.IsZero() { + k.authKeeper.SetModuleAccount(ctx, notBondedPool) + } + + // If balance is different from non bonded coins panic because genesis is most + // likely malformed. + if !notBondedBalance.IsEqual(notBondedCoins) { + panic(fmt.Sprintf("not bonded pool balance is different from not bonded coins: %s <-> %s", notBondedBalance, notBondedCoins)) + } + + // don't need to run Tendermint updates if we exported + if data.Exported { + for _, lv := range data.LastValidatorPowers { + valAddr, err := sdk.ValAddressFromBech32(lv.Address) + if err != nil { + panic(err) + } + + k.SetLastValidatorPower(ctx, valAddr, lv.Power) + validator, found := k.GetValidator(ctx, valAddr) + + if !found { + panic(fmt.Sprintf("validator %s not found", lv.Address)) + } + + update := validator.ABCIValidatorUpdate(k.PowerReduction(ctx)) + update.Power = lv.Power // keep the next-val-set offset, use the last power for the first block + res = append(res, update) + } + } else { + var err error + + res, err = k.ApplyAndReturnValidatorSetUpdates(ctx) + if err != nil { + panic(err) + } + } + + return res +} + +// ExportGenesis returns a GenesisState for a given context and keeper. The +// GenesisState will contain the pool, params, validators, and bonds found in +// the keeper. +func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { + var unbondingDelegations []types.UnbondingDelegation + + k.IterateUnbondingDelegations(ctx, func(_ int64, ubd types.UnbondingDelegation) (stop bool) { + unbondingDelegations = append(unbondingDelegations, ubd) + return false + }) + + var redelegations []types.Redelegation + + k.IterateRedelegations(ctx, func(_ int64, red types.Redelegation) (stop bool) { + redelegations = append(redelegations, red) + return false + }) + + var lastValidatorPowers []types.LastValidatorPower + + k.IterateLastValidatorPowers(ctx, func(addr sdk.ValAddress, power int64) (stop bool) { + lastValidatorPowers = append(lastValidatorPowers, types.LastValidatorPower{Address: addr.String(), Power: power}) + return false + }) + + return &types.GenesisState{ + Params: k.GetParams(ctx), + LastTotalPower: k.GetLastTotalPower(ctx), + LastValidatorPowers: lastValidatorPowers, + Validators: k.GetAllValidators(ctx), + Delegations: k.GetAllDelegations(ctx), + UnbondingDelegations: unbondingDelegations, + Redelegations: redelegations, + Exported: true, + } +} diff --git a/x/staking/keeper/genesis_test.go b/x/staking/keeper/genesis_test.go new file mode 100644 index 00000000..440542b7 --- /dev/null +++ b/x/staking/keeper/genesis_test.go @@ -0,0 +1,220 @@ +package keeper_test + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/bank/testutil" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/staking" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +func bootstrapGenesisTest(t *testing.T, numAddrs int) (*simapp.SimApp, sdk.Context, []sdk.AccAddress) { + app := simapp.Setup(t, false) + ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + + addrDels, _ := generateAddresses(app, ctx, numAddrs) + return app, ctx, addrDels +} + +func TestInitGenesis(t *testing.T) { + app, ctx, addrs := bootstrapGenesisTest(t, 10) + + valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) + + params := app.StakingKeeper.GetParams(ctx) + validators := app.StakingKeeper.GetAllValidators(ctx) + require.Len(t, validators, 1) + var delegations []types.Delegation + + pk0, err := codectypes.NewAnyWithValue(PKs[0]) + require.NoError(t, err) + + pk1, err := codectypes.NewAnyWithValue(PKs[1]) + require.NoError(t, err) + + // initialize the validators + bondedVal1 := types.Validator{ + OperatorAddress: sdk.ValAddress(addrs[0]).String(), + ConsensusPubkey: pk0, + Status: sdkstaking.Bonded, + Tokens: valTokens, + DelegatorShares: sdk.NewDecFromInt(valTokens), + Description: types.NewDescription("hoop", "", "", "", ""), + } + bondedVal2 := types.Validator{ + OperatorAddress: sdk.ValAddress(addrs[1]).String(), + ConsensusPubkey: pk1, + Status: sdkstaking.Bonded, + Tokens: valTokens, + DelegatorShares: sdk.NewDecFromInt(valTokens), + Description: types.NewDescription("bloop", "", "", "", ""), + } + + // append new bonded validators to the list + validators = append(validators, bondedVal1, bondedVal2) + + // mint coins in the bonded pool representing the validators coins + i2 := len(validators) - 1 // -1 to exclude genesis validator + require.NoError(t, + testutil.FundModuleAccount( + app.BankKeeper, + ctx, + types.BondedPoolName, + sdk.NewCoins( + sdk.NewCoin(params.BondDenom, valTokens.MulRaw((int64)(i2))), + ), + ), + ) + + genesisDelegations := app.StakingKeeper.GetAllDelegations(ctx) + delegations = append(delegations, genesisDelegations...) + + genesisState := types.NewGenesisState(params, validators, delegations) + vals := app.StakingKeeper.InitGenesis(ctx, genesisState) + + actualGenesis := app.StakingKeeper.ExportGenesis(ctx) + require.Equal(t, genesisState.Params, actualGenesis.Params) + require.Equal(t, genesisState.Delegations, actualGenesis.Delegations) + require.EqualValues(t, app.StakingKeeper.GetAllValidators(ctx), actualGenesis.Validators) + + // Ensure validators have addresses. + vals2, err := staking.WriteValidators(ctx, app.StakingKeeper) + require.NoError(t, err) + + for _, val := range vals2 { + require.NotEmpty(t, val.Address) + } + + // now make sure the validators are bonded and intra-tx counters are correct + resVal, found := app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addrs[0])) + require.True(t, found) + require.Equal(t, sdkstaking.Bonded, resVal.Status) + + resVal, found = app.StakingKeeper.GetValidator(ctx, sdk.ValAddress(addrs[1])) + require.True(t, found) + require.Equal(t, sdkstaking.Bonded, resVal.Status) + + abcivals := make([]abci.ValidatorUpdate, len(vals)) + + validators = validators[1:] // remove genesis validator + for i, val := range validators { + abcivals[i] = val.ABCIValidatorUpdate(app.StakingKeeper.PowerReduction(ctx)) + } + + require.Equal(t, abcivals, vals) +} + +func TestInitGenesis_PoolsBalanceMismatch(t *testing.T) { + app := simapp.Setup(t, false) + ctx := app.NewContext(false, tmproto.Header{}) + + consPub, err := codectypes.NewAnyWithValue(PKs[0]) + require.NoError(t, err) + + validator := types.Validator{ + OperatorAddress: sdk.ValAddress("12345678901234567890").String(), + ConsensusPubkey: consPub, + Jailed: false, + Tokens: sdk.NewInt(10), + DelegatorShares: sdk.NewDecFromInt(sdk.NewInt(10)), + Description: types.NewDescription("bloop", "", "", "", ""), + } + + params := types.Params{ + UnbondingTime: 10000, + MaxValidators: 1, + MaxEntries: 10, + BondDenom: "stake", + } + + require.Panics(t, func() { + // setting validator status to bonded so the balance counts towards bonded pool + validator.Status = sdkstaking.Bonded + app.StakingKeeper.InitGenesis(ctx, &types.GenesisState{ + Params: params, + Validators: []types.Validator{validator}, + }) + }, + "should panic because bonded pool balance is different from bonded pool coins", + ) + + require.Panics(t, func() { + // setting validator status to unbonded so the balance counts towards not bonded pool + validator.Status = sdkstaking.Unbonded + app.StakingKeeper.InitGenesis(ctx, &types.GenesisState{ + Params: params, + Validators: []types.Validator{validator}, + }) + }, + "should panic because not bonded pool balance is different from not bonded pool coins", + ) +} + +func TestInitGenesisLargeValidatorSet(t *testing.T) { + size := 200 + require.True(t, size > 100) + + app, ctx, addrs := bootstrapGenesisTest(t, 200) + genesisValidators := app.StakingKeeper.GetAllValidators(ctx) + + params := app.StakingKeeper.GetParams(ctx) + delegations := []types.Delegation{} + validators := make([]types.Validator, size) + + var err error + + bondedPoolAmt := sdk.ZeroInt() + for i := range validators { + validators[i], err = types.NewValidator( + sdk.ValAddress(addrs[i]), + PKs[i], + types.NewDescription(fmt.Sprintf("#%d", i), "", "", "", ""), + ) + require.NoError(t, err) + validators[i].Status = sdkstaking.Bonded + + tokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) + if i < 100 { + tokens = app.StakingKeeper.TokensFromConsensusPower(ctx, 2) + } + + validators[i].Tokens = tokens + validators[i].DelegatorShares = sdk.NewDecFromInt(tokens) + + // add bonded coins + bondedPoolAmt = bondedPoolAmt.Add(tokens) + } + + validators = append(validators, genesisValidators...) + genesisState := types.NewGenesisState(params, validators, delegations) + + // mint coins in the bonded pool representing the validators coins + require.NoError(t, + testutil.FundModuleAccount( + app.BankKeeper, + ctx, + types.BondedPoolName, + sdk.NewCoins(sdk.NewCoin(params.BondDenom, bondedPoolAmt)), + ), + ) + + vals := app.StakingKeeper.InitGenesis(ctx, genesisState) + + abcivals := make([]abci.ValidatorUpdate, 100) + for i, val := range validators[:100] { + abcivals[i] = val.ABCIValidatorUpdate(app.StakingKeeper.PowerReduction(ctx)) + } + + // remove genesis validator + vals = vals[:100] + require.Equal(t, abcivals, vals) +} diff --git a/x/staking/module.go b/x/staking/module.go index 80f2d306..8963ca26 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -151,14 +151,13 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json. cdc.MustUnmarshalJSON(data, &genesisState) - return InitGenesis(ctx, am.keeper, am.accountKeeper, am.bankKeeper, &genesisState) + return am.keeper.InitGenesis(ctx, &genesisState) } // ExportGenesis returns the exported genesis state as raw bytes for the staking // module. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return cdc.MustMarshalJSON(gs) + return cdc.MustMarshalJSON(am.keeper.ExportGenesis(ctx)) } // ConsensusVersion implements AppModule/ConsensusVersion. From dad008a0308d9aa972892315b1399776980c36d9 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 20 Jul 2022 10:19:15 +0800 Subject: [PATCH 34/57] resolve genutils --- app/app.go | 4 +-- cmd/liquidstakingd/cmd/root.go | 3 +- start.sh | 13 ++++++++- testutil/network/util.go | 2 +- x/genutil/client/cli/collect.go | 2 +- x/genutil/client/cli/gentx.go | 2 +- x/genutil/client/cli/init.go | 5 ++-- x/genutil/client/cli/init_test.go | 3 +- x/genutil/collect.go | 9 +++--- x/genutil/collect_test.go | 2 +- x/genutil/genesis.go | 2 +- x/genutil/gentx.go | 11 +++---- x/genutil/gentx_test.go | 2 +- x/genutil/module.go | 2 +- x/genutil/types/genesis_state.go | 42 +++++++++++++++++---------- x/genutil/types/genesis_state_test.go | 2 +- 16 files changed, 61 insertions(+), 45 deletions(-) diff --git a/app/app.go b/app/app.go index bbc0552d..0c51f685 100644 --- a/app/app.go +++ b/app/app.go @@ -57,8 +57,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/feegrant" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/gov" govclient "github.com/cosmos/cosmos-sdk/x/gov/client" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" @@ -83,6 +81,8 @@ import ( distrclient "github.com/iqlusioninc/liquidity-staking-module/x/distribution/client" distrkeeper "github.com/iqlusioninc/liquidity-staking-module/x/distribution/keeper" distrtypes "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + genutiltypes "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" "github.com/iqlusioninc/liquidity-staking-module/x/slashing" slashingkeeper "github.com/iqlusioninc/liquidity-staking-module/x/slashing/keeper" slashingtypes "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" diff --git a/cmd/liquidstakingd/cmd/root.go b/cmd/liquidstakingd/cmd/root.go index 58866c8f..f6ccca17 100644 --- a/cmd/liquidstakingd/cmd/root.go +++ b/cmd/liquidstakingd/cmd/root.go @@ -32,8 +32,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/crisis" - genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" simapp "github.com/iqlusioninc/liquidity-staking-module/app" + genutilcli "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" ) // NewRootCmd creates a new root command for simd. It is called once in the @@ -159,7 +159,6 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { rootCmd.AddCommand( genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome), genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), - genutilcli.MigrateGenesisCmd(), genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), genutilcli.ValidateGenesisCmd(simapp.ModuleBasics), AddGenesisAccountCmd(simapp.DefaultNodeHome), diff --git a/start.sh b/start.sh index 54ecba95..8ad81006 100644 --- a/start.sh +++ b/start.sh @@ -1 +1,12 @@ -liquidstakingd start --home=home --mode=validator +rm -rf ~/.simapp + +set -o errexit -o nounset + +liquidstakingd init --chain-id test test +liquidstakingd keys add validator --keyring-backend="test" +liquidstakingd add-genesis-account $(liquidstakingd keys show validator -a --keyring-backend="test") 100000000000000stake +liquidstakingd gentx validator 100000000stake --keyring-backend="test" --chain-id test +liquidstakingd collect-gentxs + +liquidstakingd start +# liquidstakingd start --home=home --mode=validator diff --git a/testutil/network/util.go b/testutil/network/util.go index fbb598a1..6e11968a 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -20,8 +20,8 @@ import ( srvtypes "github.com/cosmos/cosmos-sdk/server/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + genutiltypes "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) func startInProcess(cfg Config, val *Validator) error { diff --git a/x/genutil/client/cli/collect.go b/x/genutil/client/cli/collect.go index 532f171d..f0d4f159 100644 --- a/x/genutil/client/cli/collect.go +++ b/x/genutil/client/cli/collect.go @@ -11,8 +11,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) const flagGenTxDir = "gentx-dir" diff --git a/x/genutil/client/cli/gentx.go b/x/genutil/client/cli/gentx.go index b5619f21..1577d49d 100644 --- a/x/genutil/client/cli/gentx.go +++ b/x/genutil/client/cli/gentx.go @@ -23,8 +23,8 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" - "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/client/cli" ) diff --git a/x/genutil/client/cli/init.go b/x/genutil/client/cli/init.go index 07cb4e61..5dc7ebef 100644 --- a/x/genutil/client/cli/init.go +++ b/x/genutil/client/cli/init.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "os" + "path/filepath" "github.com/cosmos/go-bip39" "github.com/pkg/errors" @@ -163,12 +164,12 @@ func InitCmd(mbm module.BasicManager, defaultNodeHome string) *cobra.Command { genDoc.AppState = appState if err = genutil.ExportGenesisFile(genDoc, genFile); err != nil { - return errors.Wrap(err, "Failed to export gensis file") + return errors.Wrap(err, "Failed to export genesis file") } toPrint := newPrintInfo(config.Moniker, chainID, nodeID, "", appState) - cfg.WriteConfigFile(config.RootDir, config) + cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) return displayInfo(toPrint) }, } diff --git a/x/genutil/client/cli/init_test.go b/x/genutil/client/cli/init_test.go index f3d70a6a..de4720fd 100644 --- a/x/genutil/client/cli/init_test.go +++ b/x/genutil/client/cli/init_test.go @@ -87,7 +87,6 @@ func TestInitCmd(t *testing.T) { } }) } - } func TestInitRecover(t *testing.T) { @@ -286,7 +285,7 @@ func TestInitConfig(t *testing.T) { // custom tx codec func makeCodec() *codec.LegacyAmino { - var cdc = codec.NewLegacyAmino() + cdc := codec.NewLegacyAmino() sdk.RegisterLegacyAminoCodec(cdc) cryptocodec.RegisterCrypto(cdc) return cdc diff --git a/x/genutil/collect.go b/x/genutil/collect.go index 699a32c5..f21c1abd 100644 --- a/x/genutil/collect.go +++ b/x/genutil/collect.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" - "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -27,7 +27,6 @@ import ( func GenAppStateFromConfig(cdc codec.JSONCodec, txEncodingConfig client.TxEncodingConfig, config *cfg.Config, initCfg types.InitConfig, genDoc tmtypes.GenesisDoc, genBalIterator types.GenesisBalancesIterator, ) (appState json.RawMessage, err error) { - // process genesis transactions, else create default genesis.json appGenTxs, persistentPeers, err := CollectTxs( cdc, txEncodingConfig.TxJSONDecoder(), config.Moniker, initCfg.GenTxsDir, genDoc, genBalIterator, @@ -37,7 +36,7 @@ func GenAppStateFromConfig(cdc codec.JSONCodec, txEncodingConfig client.TxEncodi } config.P2P.PersistentPeers = persistentPeers - cfg.WriteConfigFile(config.RootDir, config) + cfg.WriteConfigFile(filepath.Join(config.RootDir, "config", "config.toml"), config) // if there are no gen txs to be processed, return the default empty state if len(appGenTxs) == 0 { @@ -111,8 +110,8 @@ func CollectTxs(cdc codec.JSONCodec, txJSONDecoder sdk.TxDecoder, moniker, genTx return appGenTxs, persistentPeers, err } - var genTx sdk.Tx - if genTx, err = txJSONDecoder(jsonRawTx); err != nil { + genTx, err := types.ValidateAndGetGenTx(jsonRawTx, txJSONDecoder) + if err != nil { return appGenTxs, persistentPeers, err } diff --git a/x/genutil/collect_test.go b/x/genutil/collect_test.go index 92bdceca..cd256931 100644 --- a/x/genutil/collect_test.go +++ b/x/genutil/collect_test.go @@ -15,8 +15,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/types" bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" - gtypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + gtypes "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) type doNothingUnmarshalJSON struct { diff --git a/x/genutil/genesis.go b/x/genutil/genesis.go index c6d17edb..0a58556b 100644 --- a/x/genutil/genesis.go +++ b/x/genutil/genesis.go @@ -5,7 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) // InitGenesis - initialize accounts and deliver genesis transactions diff --git a/x/genutil/gentx.go b/x/genutil/gentx.go index 6b1de66a..e407ce69 100644 --- a/x/genutil/gentx.go +++ b/x/genutil/gentx.go @@ -10,7 +10,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" - "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -18,7 +18,6 @@ import ( func SetGenTxsInAppGenesisState( cdc codec.JSONCodec, txJSONEncoder sdk.TxEncoder, appGenesisState map[string]json.RawMessage, genTxs []sdk.Tx, ) (map[string]json.RawMessage, error) { - genesisState := types.GetGenesisStateFromAppState(cdc, appGenesisState) genTxsBz := make([]json.RawMessage, 0, len(genTxs)) @@ -41,7 +40,6 @@ func ValidateAccountInGenesis( appGenesisState map[string]json.RawMessage, genBalIterator types.GenesisBalancesIterator, addr sdk.Address, coins sdk.Coins, cdc codec.JSONCodec, ) error { - var stakingData stakingtypes.GenesisState cdc.MustUnmarshalJSON(appGenesisState[stakingtypes.ModuleName], &stakingData) bondDenom := stakingData.Params.BondDenom @@ -96,21 +94,20 @@ func DeliverGenTxs( stakingKeeper types.StakingKeeper, deliverTx deliverTxfn, txEncodingConfig client.TxEncodingConfig, ) ([]abci.ValidatorUpdate, error) { - for _, genTx := range genTxs { tx, err := txEncodingConfig.TxJSONDecoder()(genTx) if err != nil { - panic(err) + return nil, fmt.Errorf("failed to decode GenTx '%s': %s", genTx, err) } bz, err := txEncodingConfig.TxEncoder()(tx) if err != nil { - panic(err) + return nil, fmt.Errorf("failed to encode GenTx '%s': %s", genTx, err) } res := deliverTx(abci.RequestDeliverTx{Tx: bz}) if !res.IsOK() { - panic(res.Log) + return nil, fmt.Errorf("failed to execute DelverTx for '%s': %s", genTx, res.Log) } } diff --git a/x/genutil/gentx_test.go b/x/genutil/gentx_test.go index c1c5c8e9..2e571534 100644 --- a/x/genutil/gentx_test.go +++ b/x/genutil/gentx_test.go @@ -16,9 +16,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/bank/testutil" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) diff --git a/x/genutil/module.go b/x/genutil/module.go index db3071ca..cfc9cfae 100644 --- a/x/genutil/module.go +++ b/x/genutil/module.go @@ -15,7 +15,7 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) var ( diff --git a/x/genutil/types/genesis_state.go b/x/genutil/types/genesis_state.go index a78458b3..4c2b5215 100644 --- a/x/genutil/types/genesis_state.go +++ b/x/genutil/types/genesis_state.go @@ -2,7 +2,6 @@ package types import ( "encoding/json" - "errors" "fmt" tmos "github.com/tendermint/tendermint/libs/os" @@ -58,7 +57,6 @@ func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.R func SetGenesisStateInAppState( cdc codec.JSONCodec, appState map[string]json.RawMessage, genesisState *GenesisState, ) map[string]json.RawMessage { - genesisStateBz := cdc.MustMarshalJSON(genesisState) appState[ModuleName] = genesisStateBz return appState @@ -96,24 +94,36 @@ func GenesisStateFromGenFile(genFile string) (genesisState map[string]json.RawMe // ValidateGenesis validates GenTx transactions func ValidateGenesis(genesisState *GenesisState, txJSONDecoder sdk.TxDecoder) error { - for i, genTx := range genesisState.GenTxs { - var tx sdk.Tx - tx, err := txJSONDecoder(genTx) + for _, genTx := range genesisState.GenTxs { + _, err := ValidateAndGetGenTx(genTx, txJSONDecoder) if err != nil { return err } + } + return nil +} - msgs := tx.GetMsgs() - if len(msgs) != 1 { - return errors.New( - "must provide genesis Tx with exactly 1 CreateValidator message") - } +// ValidateAndGetGenTx validates the genesis transaction and returns GenTx if valid +// it cannot verify the signature as it is stateless validation +func ValidateAndGetGenTx(genTx json.RawMessage, txJSONDecoder sdk.TxDecoder) (sdk.Tx, error) { + tx, err := txJSONDecoder(genTx) + if err != nil { + return tx, fmt.Errorf("failed to decode gentx: %s, error: %s", genTx, err) + } - // TODO: abstract back to staking - if _, ok := msgs[0].(*stakingtypes.MsgCreateValidator); !ok { - return fmt.Errorf( - "genesis transaction %v does not contain a MsgCreateValidator", i) - } + msgs := tx.GetMsgs() + if len(msgs) != 1 { + return tx, fmt.Errorf("unexpected number of GenTx messages; got: %d, expected: 1", len(msgs)) } - return nil + + // TODO: abstract back to staking + if _, ok := msgs[0].(*stakingtypes.MsgCreateValidator); !ok { + return tx, fmt.Errorf("unexpected GenTx message type; expected: MsgCreateValidator, got: %T", msgs[0]) + } + + if err := msgs[0].ValidateBasic(); err != nil { + return tx, fmt.Errorf("invalid GenTx '%s': %s", msgs[0], err) + } + + return tx, nil } diff --git a/x/genutil/types/genesis_state_test.go b/x/genutil/types/genesis_state_test.go index 348dc9b0..a97b0d71 100644 --- a/x/genutil/types/genesis_state_test.go +++ b/x/genutil/types/genesis_state_test.go @@ -9,8 +9,8 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/genutil/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) From eb7b67184c1ba1fb75daf5914512829a8cfbe02f Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 20 Jul 2022 10:23:14 +0800 Subject: [PATCH 35/57] resolve integration tests --- x/distribution/client/testutil/suite.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/distribution/client/testutil/suite.go b/x/distribution/client/testutil/suite.go index 0fe7ad6d..6a1ed373 100644 --- a/x/distribution/client/testutil/suite.go +++ b/x/distribution/client/testutil/suite.go @@ -767,7 +767,7 @@ func (s *IntegrationTestSuite) TestGetCmdSubmitProposal() { } } -func (s *IntegrationTestSuite) TestNewWithdrawTokenizeShareRecordRewardCmd() { +func (s *IntegrationTestSuite) TestNewWithdrawAllTokenizeShareRecordRewardCmd() { val := s.network.Validators[0] testCases := []struct { @@ -793,7 +793,7 @@ func (s *IntegrationTestSuite) TestNewWithdrawTokenizeShareRecordRewardCmd() { tc := tc s.Run(tc.name, func() { - cmd := cli.NewWithdrawTokenizeShareRecordRewardCmd() + cmd := cli.NewWithdrawAllTokenizeShareRecordRewardCmd() clientCtx := val.ClientCtx out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) From c2e6f4faa86b98f55d96dc6e3604a4c5eae9ee78 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Mon, 25 Jul 2022 23:18:52 +0800 Subject: [PATCH 36/57] update staking module with sdk v046-rc2 line by line check --- proto/staking/v1beta1/tx.proto | 26 + x/staking/keeper/delegation.go | 252 ++++++---- x/staking/keeper/invariants.go | 28 +- x/staking/keeper/msg_server.go | 128 ++++- x/staking/keeper/querier.go | 7 +- x/staking/keeper/slash.go | 11 +- x/staking/keeper/val_state_change.go | 12 +- x/staking/keeper/validator.go | 12 +- x/staking/types/codec.go | 1 + x/staking/types/msg.go | 56 +++ x/staking/types/tx.pb.go | 689 +++++++++++++++++++++------ 11 files changed, 946 insertions(+), 276 deletions(-) diff --git a/proto/staking/v1beta1/tx.proto b/proto/staking/v1beta1/tx.proto index 5a39d25b..36b86cf8 100644 --- a/proto/staking/v1beta1/tx.proto +++ b/proto/staking/v1beta1/tx.proto @@ -31,6 +31,12 @@ service Msg { // delegate and a validator. rpc Undelegate(MsgUndelegate) returns (MsgUndelegateResponse); + // CancelUnbondingDelegation defines a method for performing canceling the unbonding delegation + // and delegate back to previous validator. + // + // Since: cosmos-sdk 0.46 + rpc CancelUnbondingDelegation(MsgCancelUnbondingDelegation) returns (MsgCancelUnbondingDelegationResponse); + // TokenizeShares defines a method for tokenizing shares from a validator. rpc TokenizeShares(MsgTokenizeShares) returns (MsgTokenizeSharesResponse); @@ -138,6 +144,26 @@ message MsgUndelegateResponse { google.protobuf.Timestamp completion_time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; } +// MsgCancelUnbondingDelegation defines the SDK message for performing a cancel unbonding delegation for delegator +// +// Since: cosmos-sdk 0.46 +message MsgCancelUnbondingDelegation{ + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; + string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; + // amount is always less than or equal to unbonding delegation entry balance + cosmos.base.v1beta1.Coin amount = 3 [(gogoproto.nullable) = false]; + // creation_height is the height which the unbonding took place. + int64 creation_height = 4; +} + +// MsgCancelUnbondingDelegationResponse +// +// Since: cosmos-sdk 0.46 +message MsgCancelUnbondingDelegationResponse{} + message MsgTokenizeShares { option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index 419546e9..105935b6 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -11,9 +11,8 @@ import ( "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) -// return a specific delegation -func (k Keeper) GetDelegation(ctx sdk.Context, - delAddr sdk.AccAddress, valAddr sdk.ValAddress) (delegation types.Delegation, found bool) { +// GetDelegation returns a specific delegation. +func (k Keeper) GetDelegation(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (delegation types.Delegation, found bool) { store := ctx.KVStore(k.storeKey) key := types.GetDelegationKey(delAddr, valAddr) @@ -27,7 +26,7 @@ func (k Keeper) GetDelegation(ctx sdk.Context, return delegation, true } -// IterateAllDelegations iterate through all of the delegations +// IterateAllDelegations iterates through all of the delegations. func (k Keeper) IterateAllDelegations(ctx sdk.Context, cb func(delegation types.Delegation) (stop bool)) { store := ctx.KVStore(k.storeKey) @@ -42,7 +41,7 @@ func (k Keeper) IterateAllDelegations(ctx sdk.Context, cb func(delegation types. } } -// GetAllDelegations returns all delegations used during genesis dump +// GetAllDelegations returns all delegations used during genesis dump. func (k Keeper) GetAllDelegations(ctx sdk.Context) (delegations []types.Delegation) { k.IterateAllDelegations(ctx, func(delegation types.Delegation) bool { delegations = append(delegations, delegation) @@ -52,7 +51,8 @@ func (k Keeper) GetAllDelegations(ctx sdk.Context) (delegations []types.Delegati return delegations } -// return all delegations to a specific validator. Useful for querier. +// GetValidatorDelegations returns all delegations to a specific validator. +// Useful for querier. func (k Keeper) GetValidatorDelegations(ctx sdk.Context, valAddr sdk.ValAddress) (delegations []types.Delegation) { //nolint:interfacer store := ctx.KVStore(k.storeKey) @@ -69,9 +69,9 @@ func (k Keeper) GetValidatorDelegations(ctx sdk.Context, valAddr sdk.ValAddress) return delegations } -// return a given amount of all the delegations from a delegator -func (k Keeper) GetDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAddress, - maxRetrieve uint16) (delegations []types.Delegation) { +// GetDelegatorDelegations returns a given amount of all the delegations from a +// delegator. +func (k Keeper) GetDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAddress, maxRetrieve uint16) (delegations []types.Delegation) { delegations = make([]types.Delegation, maxRetrieve) store := ctx.KVStore(k.storeKey) delegatorPrefixKey := types.GetDelegationsKey(delegator) @@ -89,24 +89,19 @@ func (k Keeper) GetDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAddres return delegations[:i] // trim if the array length < maxRetrieve } -// set a delegation +// SetDelegation sets a delegation. func (k Keeper) SetDelegation(ctx sdk.Context, delegation types.Delegation) { - delegatorAddress, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(delegation.DelegatorAddress) store := ctx.KVStore(k.storeKey) b := types.MustMarshalDelegation(k.cdc, delegation) store.Set(types.GetDelegationKey(delegatorAddress, delegation.GetValidatorAddr()), b) } -// remove a delegation +// RemoveDelegation removes a delegation func (k Keeper) RemoveDelegation(ctx sdk.Context, delegation types.Delegation) error { - delegatorAddress, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(delegation.DelegatorAddress) + // TODO: Consider calling hooks outside of the store wrapper functions, it's unobvious. if err := k.BeforeDelegationRemoved(ctx, delegatorAddress, delegation.GetValidatorAddr()); err != nil { return err @@ -117,9 +112,8 @@ func (k Keeper) RemoveDelegation(ctx sdk.Context, delegation types.Delegation) e return nil } -// return a given amount of all the delegator unbonding-delegations -func (k Keeper) GetUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAddress, - maxRetrieve uint16) (unbondingDelegations []types.UnbondingDelegation) { +// GetUnbondingDelegations returns a given amount of all the delegator unbonding-delegations. +func (k Keeper) GetUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAddress, maxRetrieve uint16) (unbondingDelegations []types.UnbondingDelegation) { unbondingDelegations = make([]types.UnbondingDelegation, maxRetrieve) store := ctx.KVStore(k.storeKey) @@ -138,10 +132,8 @@ func (k Keeper) GetUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAddres return unbondingDelegations[:i] // trim if the array length < maxRetrieve } -// return a unbonding delegation -func (k Keeper) GetUnbondingDelegation( - ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress, -) (ubd types.UnbondingDelegation, found bool) { +// GetUnbondingDelegation returns a unbonding delegation. +func (k Keeper) GetUnbondingDelegation(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) (ubd types.UnbondingDelegation, found bool) { store := ctx.KVStore(k.storeKey) key := types.GetUBDKey(delAddr, valAddr) value := store.Get(key) @@ -155,7 +147,8 @@ func (k Keeper) GetUnbondingDelegation( return ubd, true } -// return all unbonding delegations from a particular validator +// GetUnbondingDelegationsFromValidator returns all unbonding delegations from a +// particular validator. func (k Keeper) GetUnbondingDelegationsFromValidator(ctx sdk.Context, valAddr sdk.ValAddress) (ubds []types.UnbondingDelegation) { store := ctx.KVStore(k.storeKey) @@ -172,7 +165,7 @@ func (k Keeper) GetUnbondingDelegationsFromValidator(ctx sdk.Context, valAddr sd return ubds } -// iterate through all of the unbonding delegations +// IterateUnbondingDelegations iterates through all of the unbonding delegations. func (k Keeper) IterateUnbondingDelegations(ctx sdk.Context, fn func(index int64, ubd types.UnbondingDelegation) (stop bool)) { store := ctx.KVStore(k.storeKey) @@ -188,9 +181,86 @@ func (k Keeper) IterateUnbondingDelegations(ctx sdk.Context, fn func(index int64 } } -// HasMaxUnbondingDelegationEntries - check if unbonding delegation has maximum number of entries -func (k Keeper) HasMaxUnbondingDelegationEntries(ctx sdk.Context, - delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) bool { +// GetDelegatorUnbonding returns the total amount a delegator has unbonding. +func (k Keeper) GetDelegatorUnbonding(ctx sdk.Context, delegator sdk.AccAddress) sdk.Int { + unbonding := sdk.ZeroInt() + k.IterateDelegatorUnbondingDelegations(ctx, delegator, func(ubd types.UnbondingDelegation) bool { + for _, entry := range ubd.Entries { + unbonding = unbonding.Add(entry.Balance) + } + return false + }) + return unbonding +} + +// IterateDelegatorUnbondingDelegations iterates through a delegator's unbonding delegations. +func (k Keeper) IterateDelegatorUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAddress, cb func(ubd types.UnbondingDelegation) (stop bool)) { + store := ctx.KVStore(k.storeKey) + + iterator := sdk.KVStorePrefixIterator(store, types.GetUBDsKey(delegator)) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + ubd := types.MustUnmarshalUBD(k.cdc, iterator.Value()) + if cb(ubd) { + break + } + } +} + +// GetDelegatorBonded returs the total amount a delegator has bonded. +func (k Keeper) GetDelegatorBonded(ctx sdk.Context, delegator sdk.AccAddress) sdk.Int { + bonded := sdk.ZeroDec() + + k.IterateDelegatorDelegations(ctx, delegator, func(delegation types.Delegation) bool { + validatorAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress) + if err != nil { + panic(err) // shouldn't happen + } + validator, found := k.GetValidator(ctx, validatorAddr) + if found { + shares := delegation.Shares + tokens := validator.TokensFromSharesTruncated(shares) + bonded = bonded.Add(tokens) + } + return false + }) + return bonded.RoundInt() +} + +// IterateDelegatorDelegations iterates through one delegator's delegations. +func (k Keeper) IterateDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAddress, cb func(delegation types.Delegation) (stop bool)) { + store := ctx.KVStore(k.storeKey) + delegatorPrefixKey := types.GetDelegationsKey(delegator) + iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) + if cb(delegation) { + break + } + } +} + +// IterateDelegatorRedelegations iterates through one delegator's redelegations. +func (k Keeper) IterateDelegatorRedelegations(ctx sdk.Context, delegator sdk.AccAddress, cb func(red types.Redelegation) (stop bool)) { + store := ctx.KVStore(k.storeKey) + delegatorPrefixKey := types.GetREDsKey(delegator) + + iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + red := types.MustUnmarshalRED(k.cdc, iterator.Value()) + if cb(red) { + break + } + } +} + +// HasMaxUnbondingDelegationEntries - check if unbonding delegation has maximum number of entries. +func (k Keeper) HasMaxUnbondingDelegationEntries(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress) bool { ubd, found := k.GetUnbondingDelegation(ctx, delegatorAddr, validatorAddr) if !found { return false @@ -199,12 +269,10 @@ func (k Keeper) HasMaxUnbondingDelegationEntries(ctx sdk.Context, return len(ubd.Entries) >= int(k.MaxEntries(ctx)) } -// set the unbonding delegation and associated index +// SetUnbondingDelegation sets the unbonding delegation and associated index. func (k Keeper) SetUnbondingDelegation(ctx sdk.Context, ubd types.UnbondingDelegation) { - delegatorAddress, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(ubd.DelegatorAddress) + store := ctx.KVStore(k.storeKey) bz := types.MustMarshalUBD(k.cdc, ubd) addr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) @@ -216,12 +284,9 @@ func (k Keeper) SetUnbondingDelegation(ctx sdk.Context, ubd types.UnbondingDeleg store.Set(types.GetUBDByValIndexKey(delegatorAddress, addr), []byte{}) // index, store empty bytes } -// remove the unbonding delegation object and associated index +// RemoveUnbondingDelegation removes the unbonding delegation object and associated index. func (k Keeper) RemoveUnbondingDelegation(ctx sdk.Context, ubd types.UnbondingDelegation) { - delegatorAddress, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(ubd.DelegatorAddress) store := ctx.KVStore(k.storeKey) addr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) @@ -234,7 +299,7 @@ func (k Keeper) RemoveUnbondingDelegation(ctx sdk.Context, ubd types.UnbondingDe } // SetUnbondingDelegationEntry adds an entry to the unbonding delegation at -// the given addresses. It creates the unbonding delegation if it does not exist +// the given addresses. It creates the unbonding delegation if it does not exist. func (k Keeper) SetUnbondingDelegationEntry( ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, creationHeight int64, minTime time.Time, balance sdk.Int, @@ -253,8 +318,9 @@ func (k Keeper) SetUnbondingDelegationEntry( // unbonding delegation queue timeslice operations -// gets a specific unbonding queue timeslice. A timeslice is a slice of DVPairs -// corresponding to unbonding delegations that expire at a certain time. +// GetUBDQueueTimeSlice gets a specific unbonding queue timeslice. A timeslice +// is a slice of DVPairs corresponding to unbonding delegations that expire at a +// certain time. func (k Keeper) GetUBDQueueTimeSlice(ctx sdk.Context, timestamp time.Time) (dvPairs []types.DVPair) { store := ctx.KVStore(k.storeKey) @@ -269,16 +335,16 @@ func (k Keeper) GetUBDQueueTimeSlice(ctx sdk.Context, timestamp time.Time) (dvPa return pairs.Pairs } -// Sets a specific unbonding queue timeslice. +// SetUBDQueueTimeSlice sets a specific unbonding queue timeslice. func (k Keeper) SetUBDQueueTimeSlice(ctx sdk.Context, timestamp time.Time, keys []types.DVPair) { store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshal(&types.DVPairs{Pairs: keys}) store.Set(types.GetUnbondingDelegationTimeKey(timestamp), bz) } -// Insert an unbonding delegation to the appropriate timeslice in the unbonding queue -func (k Keeper) InsertUBDQueue(ctx sdk.Context, ubd types.UnbondingDelegation, - completionTime time.Time) { +// InsertUBDQueue inserts an unbonding delegation to the appropriate timeslice +// in the unbonding queue. +func (k Keeper) InsertUBDQueue(ctx sdk.Context, ubd types.UnbondingDelegation, completionTime time.Time) { dvPair := types.DVPair{DelegatorAddress: ubd.DelegatorAddress, ValidatorAddress: ubd.ValidatorAddress} timeSlice := k.GetUBDQueueTimeSlice(ctx, completionTime) @@ -290,20 +356,20 @@ func (k Keeper) InsertUBDQueue(ctx sdk.Context, ubd types.UnbondingDelegation, } } -// Returns all the unbonding queue timeslices from time 0 until endTime +// UBDQueueIterator returns all the unbonding queue timeslices from time 0 until endTime. func (k Keeper) UBDQueueIterator(ctx sdk.Context, endTime time.Time) sdk.Iterator { store := ctx.KVStore(k.storeKey) return store.Iterator(types.UnbondingQueueKey, sdk.InclusiveEndBytes(types.GetUnbondingDelegationTimeKey(endTime))) } -// Returns a concatenated list of all the timeslices inclusively previous to -// currTime, and deletes the timeslices from the queue +// DequeueAllMatureUBDQueue returns a concatenated list of all the timeslices inclusively previous to +// currTime, and deletes the timeslices from the queue. func (k Keeper) DequeueAllMatureUBDQueue(ctx sdk.Context, currTime time.Time) (matureUnbonds []types.DVPair) { store := ctx.KVStore(k.storeKey) // gets an iterator for all timeslices from time 0 until the current Blockheader time - unbondingTimesliceIterator := k.UBDQueueIterator(ctx, ctx.BlockHeader().Time) + unbondingTimesliceIterator := k.UBDQueueIterator(ctx, currTime) defer unbondingTimesliceIterator.Close() for ; unbondingTimesliceIterator.Valid(); unbondingTimesliceIterator.Next() { @@ -319,9 +385,8 @@ func (k Keeper) DequeueAllMatureUBDQueue(ctx sdk.Context, currTime time.Time) (m return matureUnbonds } -// return a given amount of all the delegator redelegations -func (k Keeper) GetRedelegations(ctx sdk.Context, delegator sdk.AccAddress, - maxRetrieve uint16) (redelegations []types.Redelegation) { +// GetRedelegations returns a given amount of all the delegator redelegations. +func (k Keeper) GetRedelegations(ctx sdk.Context, delegator sdk.AccAddress, maxRetrieve uint16) (redelegations []types.Redelegation) { redelegations = make([]types.Redelegation, maxRetrieve) store := ctx.KVStore(k.storeKey) @@ -340,9 +405,8 @@ func (k Keeper) GetRedelegations(ctx sdk.Context, delegator sdk.AccAddress, return redelegations[:i] // trim if the array length < maxRetrieve } -// return a redelegation -func (k Keeper) GetRedelegation(ctx sdk.Context, - delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) (red types.Redelegation, found bool) { +// GetRedelegation returns a redelegation. +func (k Keeper) GetRedelegation(ctx sdk.Context, delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress) (red types.Redelegation, found bool) { store := ctx.KVStore(k.storeKey) key := types.GetREDKey(delAddr, valSrcAddr, valDstAddr) @@ -356,7 +420,8 @@ func (k Keeper) GetRedelegation(ctx sdk.Context, return red, true } -// return all redelegations from a particular validator +// GetRedelegationsFromSrcValidator returns all redelegations from a particular +// validator. func (k Keeper) GetRedelegationsFromSrcValidator(ctx sdk.Context, valAddr sdk.ValAddress) (reds []types.Redelegation) { store := ctx.KVStore(k.storeKey) @@ -373,9 +438,8 @@ func (k Keeper) GetRedelegationsFromSrcValidator(ctx sdk.Context, valAddr sdk.Va return reds } -// check if validator is receiving a redelegation -func (k Keeper) HasReceivingRedelegation(ctx sdk.Context, - delAddr sdk.AccAddress, valDstAddr sdk.ValAddress) bool { +// HasReceivingRedelegation checks if validator is receiving a redelegation. +func (k Keeper) HasReceivingRedelegation(ctx sdk.Context, delAddr sdk.AccAddress, valDstAddr sdk.ValAddress) bool { store := ctx.KVStore(k.storeKey) prefix := types.GetREDsByDelToValDstIndexKey(delAddr, valDstAddr) @@ -385,10 +449,8 @@ func (k Keeper) HasReceivingRedelegation(ctx sdk.Context, return iterator.Valid() } -// HasMaxRedelegationEntries - redelegation has maximum number of entries -func (k Keeper) HasMaxRedelegationEntries(ctx sdk.Context, - delegatorAddr sdk.AccAddress, validatorSrcAddr, - validatorDstAddr sdk.ValAddress) bool { +// HasMaxRedelegationEntries checks if redelegation has maximum number of entries. +func (k Keeper) HasMaxRedelegationEntries(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress) bool { red, found := k.GetRedelegation(ctx, delegatorAddr, validatorSrcAddr, validatorDstAddr) if !found { return false @@ -397,12 +459,9 @@ func (k Keeper) HasMaxRedelegationEntries(ctx sdk.Context, return len(red.Entries) >= int(k.MaxEntries(ctx)) } -// set a redelegation and associated index +// SetRedelegation set a redelegation and associated index. func (k Keeper) SetRedelegation(ctx sdk.Context, red types.Redelegation) { - delegatorAddress, err := sdk.AccAddressFromBech32(red.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(red.DelegatorAddress) store := ctx.KVStore(k.storeKey) bz := types.MustMarshalRED(k.cdc, red) @@ -420,13 +479,14 @@ func (k Keeper) SetRedelegation(ctx sdk.Context, red types.Redelegation) { store.Set(types.GetREDByValDstIndexKey(delegatorAddress, valSrcAddr, valDestAddr), []byte{}) } -// SetUnbondingDelegationEntry adds an entry to the unbonding delegation at -// the given addresses. It creates the unbonding delegation if it does not exist +// SetRedelegationEntry adds an entry to the unbonding delegation at the given +// addresses. It creates the unbonding delegation if it does not exist. func (k Keeper) SetRedelegationEntry(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, creationHeight int64, minTime time.Time, balance sdk.Int, - sharesSrc, sharesDst sdk.Dec) types.Redelegation { + sharesSrc, sharesDst sdk.Dec, +) types.Redelegation { red, found := k.GetRedelegation(ctx, delegatorAddr, validatorSrcAddr, validatorDstAddr) if found { red.AddEntry(creationHeight, minTime, balance, sharesDst) @@ -440,7 +500,7 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, return red } -// iterate through all redelegations +// IterateRedelegations iterates through all redelegations. func (k Keeper) IterateRedelegations(ctx sdk.Context, fn func(index int64, red types.Redelegation) (stop bool)) { store := ctx.KVStore(k.storeKey) @@ -456,12 +516,10 @@ func (k Keeper) IterateRedelegations(ctx sdk.Context, fn func(index int64, red t } } -// remove a redelegation object and associated index +// RemoveRedelegation removes a redelegation object and associated index. func (k Keeper) RemoveRedelegation(ctx sdk.Context, red types.Redelegation) { - delegatorAddress, err := sdk.AccAddressFromBech32(red.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(red.DelegatorAddress) + store := ctx.KVStore(k.storeKey) valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) if err != nil { @@ -479,8 +537,9 @@ func (k Keeper) RemoveRedelegation(ctx sdk.Context, red types.Redelegation) { // redelegation queue timeslice operations -// Gets a specific redelegation queue timeslice. A timeslice is a slice of DVVTriplets corresponding to redelegations -// that expire at a certain time. +// GetRedelegationQueueTimeSlice gets a specific redelegation queue timeslice. A +// timeslice is a slice of DVVTriplets corresponding to redelegations that +// expire at a certain time. func (k Keeper) GetRedelegationQueueTimeSlice(ctx sdk.Context, timestamp time.Time) (dvvTriplets []types.DVVTriplet) { store := ctx.KVStore(k.storeKey) @@ -495,21 +554,22 @@ func (k Keeper) GetRedelegationQueueTimeSlice(ctx sdk.Context, timestamp time.Ti return triplets.Triplets } -// Sets a specific redelegation queue timeslice. +// SetRedelegationQueueTimeSlice sets a specific redelegation queue timeslice. func (k Keeper) SetRedelegationQueueTimeSlice(ctx sdk.Context, timestamp time.Time, keys []types.DVVTriplet) { store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshal(&types.DVVTriplets{Triplets: keys}) store.Set(types.GetRedelegationTimeKey(timestamp), bz) } -// Insert an redelegation delegation to the appropriate timeslice in the redelegation queue -func (k Keeper) InsertRedelegationQueue(ctx sdk.Context, red types.Redelegation, - completionTime time.Time) { +// InsertRedelegationQueue insert an redelegation delegation to the appropriate +// timeslice in the redelegation queue. +func (k Keeper) InsertRedelegationQueue(ctx sdk.Context, red types.Redelegation, completionTime time.Time) { timeSlice := k.GetRedelegationQueueTimeSlice(ctx, completionTime) dvvTriplet := types.DVVTriplet{ DelegatorAddress: red.DelegatorAddress, ValidatorSrcAddress: red.ValidatorSrcAddress, - ValidatorDstAddress: red.ValidatorDstAddress} + ValidatorDstAddress: red.ValidatorDstAddress, + } if len(timeSlice) == 0 { k.SetRedelegationQueueTimeSlice(ctx, completionTime, []types.DVVTriplet{dvvTriplet}) @@ -519,14 +579,16 @@ func (k Keeper) InsertRedelegationQueue(ctx sdk.Context, red types.Redelegation, } } -// Returns all the redelegation queue timeslices from time 0 until endTime +// RedelegationQueueIterator returns all the redelegation queue timeslices from +// time 0 until endTime. func (k Keeper) RedelegationQueueIterator(ctx sdk.Context, endTime time.Time) sdk.Iterator { store := ctx.KVStore(k.storeKey) return store.Iterator(types.RedelegationQueueKey, sdk.InclusiveEndBytes(types.GetRedelegationTimeKey(endTime))) } -// Returns a concatenated list of all the timeslices inclusively previous to -// currTime, and deletes the timeslices from the queue +// DequeueAllMatureRedelegationQueue returns a concatenated list of all the +// timeslices inclusively previous to currTime, and deletes the timeslices from +// the queue. func (k Keeper) DequeueAllMatureRedelegationQueue(ctx sdk.Context, currTime time.Time) (matureRedelegations []types.DVVTriplet) { store := ctx.KVStore(k.storeKey) @@ -577,10 +639,7 @@ func (k Keeper) Delegate( return sdk.ZeroDec(), err } - delegatorAddress, err := sdk.AccAddressFromBech32(delegation.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(delegation.DelegatorAddress) // if subtractAccount is true then we are // performing a delegation and not a redelegation, thus the source tokens are @@ -637,7 +696,7 @@ func (k Keeper) Delegate( return newShares, nil } -// Unbond a particular delegation and perform associated store operations. +// Unbond unbonds a particular delegation and perform associated store operations. func (k Keeper) Unbond( ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress, shares sdk.Dec, ) (amount sdk.Int, err error) { @@ -815,7 +874,8 @@ func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAd return balances, nil } -// begin unbonding / redelegation; create a redelegation record +// BeginRedelegation begins unbonding / redelegation and creates a redelegation +// record. func (k Keeper) BeginRedelegation( ctx sdk.Context, delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress, sharesAmount sdk.Dec, ) (completionTime time.Time, err error) { diff --git a/x/staking/keeper/invariants.go b/x/staking/keeper/invariants.go index dd249f6c..296fb5e4 100644 --- a/x/staking/keeper/invariants.go +++ b/x/staking/keeper/invariants.go @@ -138,13 +138,11 @@ func PositiveDelegationInvariant(k Keeper) sdk.Invariant { for _, delegation := range delegations { if delegation.Shares.IsNegative() { count++ - msg += fmt.Sprintf("\tdelegation with negative shares: %+v\n", delegation) } if delegation.Shares.IsZero() { count++ - msg += fmt.Sprintf("\tdelegation with zero shares: %+v\n", delegation) } } @@ -167,20 +165,30 @@ func DelegatorSharesInvariant(k Keeper) sdk.Invariant { ) validators := k.GetAllValidators(ctx) + validatorsDelegationShares := map[string]sdk.Dec{} + + // initialize a map: validator -> its delegation shares for _, validator := range validators { - valTotalDelShares := validator.GetDelegatorShares() - totalDelShares := sdk.ZeroDec() + validatorsDelegationShares[validator.GetOperator().String()] = sdk.ZeroDec() + } - delegations := k.GetValidatorDelegations(ctx, validator.GetOperator()) - for _, delegation := range delegations { - totalDelShares = totalDelShares.Add(delegation.Shares) - } + // iterate through all the delegations to calculate the total delegation shares for each validator + delegations := k.GetAllDelegations(ctx) + for _, delegation := range delegations { + delegationValidatorAddr := delegation.GetValidatorAddr().String() + validatorDelegationShares := validatorsDelegationShares[delegationValidatorAddr] + validatorsDelegationShares[delegationValidatorAddr] = validatorDelegationShares.Add(delegation.Shares) + } - if !valTotalDelShares.Equal(totalDelShares) { + // for each validator, check if its total delegation shares calculated from the step above equals to its expected delegation shares + for _, validator := range validators { + expValTotalDelShares := validator.GetDelegatorShares() + calculatedValTotalDelShares := validatorsDelegationShares[validator.GetOperator().String()] + if !calculatedValTotalDelShares.Equal(expValTotalDelShares) { broken = true msg += fmt.Sprintf("broken delegator shares invariance:\n"+ "\tvalidator.DelegatorShares: %v\n"+ - "\tsum of Delegator.Shares: %v\n", valTotalDelShares, totalDelShares) + "\tsum of Delegator.Shares: %v\n", expValTotalDelShares, calculatedValTotalDelShares) } } diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index acda5060..a54f63f1 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -3,10 +3,12 @@ package keeper import ( "context" "fmt" + "strconv" "time" metrics "github.com/armon/go-metrics" - tmstrings "github.com/tendermint/tendermint/libs/strings" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/telemetry" @@ -70,7 +72,15 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa cp := ctx.ConsensusParams() if cp != nil && cp.Validator != nil { - if !tmstrings.StringInSlice(pk.Type(), cp.Validator.PubKeyTypes) { + pkType := pk.Type() + hasKeyType := false + for _, keyType := range cp.Validator.PubKeyTypes { + if pkType == keyType { + hasKeyType = true + break + } + } + if !hasKeyType { return nil, sdkerrors.Wrapf( sdkstaking.ErrValidatorPubKeyTypeNotSupported, "got: %s, expected: %s", pk.Type(), cp.Validator.PubKeyTypes, @@ -101,10 +111,7 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa validator.MinSelfDelegation = msg.MinSelfDelegation k.SetValidator(ctx, validator) - err = k.SetValidatorByConsAddr(ctx, validator) - if err != nil { - return nil, err - } + k.SetValidatorByConsAddr(ctx, validator) k.SetNewValidatorByPowerIndex(ctx, validator) // call the after-creation hook @@ -180,7 +187,7 @@ func (k msgServer) EditValidator(goCtx context.Context, msg *types.MsgEditValida return nil, sdkstaking.ErrSelfDelegationBelowMinimum } - validator.MinSelfDelegation = (*msg.MinSelfDelegation) + validator.MinSelfDelegation = *msg.MinSelfDelegation } k.SetValidator(ctx, validator) @@ -389,6 +396,113 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( }, nil } +// CancelUnbondingDelegation defines a method for canceling the unbonding delegation +// and delegate back to the validator. +func (k msgServer) CancelUnbondingDelegation(goCtx context.Context, msg *types.MsgCancelUnbondingDelegation) (*types.MsgCancelUnbondingDelegationResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + if err != nil { + return nil, err + } + + delegatorAddress, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + return nil, err + } + + bondDenom := k.BondDenom(ctx) + if msg.Amount.Denom != bondDenom { + return nil, sdkerrors.Wrapf( + sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Amount.Denom, bondDenom, + ) + } + + validator, found := k.GetValidator(ctx, valAddr) + if !found { + return nil, sdkstaking.ErrNoValidatorFound + } + + // In some situations, the exchange rate becomes invalid, e.g. if + // Validator loses all tokens due to slashing. In this case, + // make all future delegations invalid. + if validator.InvalidExRate() { + return nil, sdkstaking.ErrDelegatorShareExRateInvalid + } + + if validator.IsJailed() { + return nil, sdkstaking.ErrValidatorJailed + } + + ubd, found := k.GetUnbondingDelegation(ctx, delegatorAddress, valAddr) + if !found { + return nil, status.Errorf( + codes.NotFound, + "unbonding delegation with delegator %s not found for validator %s", + msg.DelegatorAddress, msg.ValidatorAddress, + ) + } + + var ( + unbondEntry types.UnbondingDelegationEntry + unbondEntryIndex int64 = -1 + ) + + for i, entry := range ubd.Entries { + if entry.CreationHeight == msg.CreationHeight { + unbondEntry = entry + unbondEntryIndex = int64(i) + break + } + } + if unbondEntryIndex == -1 { + return nil, sdkerrors.ErrNotFound.Wrapf("unbonding delegation entry is not found at block height %d", msg.CreationHeight) + } + + if unbondEntry.Balance.LT(msg.Amount.Amount) { + return nil, sdkerrors.ErrInvalidRequest.Wrap("amount is greater than the unbonding delegation entry balance") + } + + if unbondEntry.CompletionTime.Before(ctx.BlockTime()) { + return nil, sdkerrors.ErrInvalidRequest.Wrap("unbonding delegation is already processed") + } + + // delegate back the unbonding delegation amount to the validator + _, err = k.Keeper.Delegate(ctx, delegatorAddress, msg.Amount.Amount, sdkstaking.Unbonding, validator, false) + if err != nil { + return nil, err + } + + amount := unbondEntry.Balance.Sub(msg.Amount.Amount) + if amount.IsZero() { + ubd.RemoveEntry(unbondEntryIndex) + } else { + // update the unbondingDelegationEntryBalance and InitialBalance for ubd entry + unbondEntry.Balance = amount + unbondEntry.InitialBalance = unbondEntry.InitialBalance.Sub(msg.Amount.Amount) + ubd.Entries[unbondEntryIndex] = unbondEntry + } + + // set the unbonding delegation or remove it if there are no more entries + if len(ubd.Entries) == 0 { + k.RemoveUnbondingDelegation(ctx, ubd) + } else { + k.SetUnbondingDelegation(ctx, ubd) + } + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + sdkstaking.EventTypeCancelUnbondingDelegation, + sdk.NewAttribute(sdk.AttributeKeyAmount, msg.Amount.String()), + sdk.NewAttribute(types.AttributeKeyValidator, msg.ValidatorAddress), + sdk.NewAttribute(types.AttributeKeyDelegator, msg.DelegatorAddress), + sdk.NewAttribute(sdkstaking.AttributeKeyCreationHeight, strconv.FormatInt(msg.CreationHeight, 10)), + ), + ) + + return &types.MsgCancelUnbondingDelegationResponse{}, nil +} + func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeShares) (*types.MsgTokenizeSharesResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) diff --git a/x/staking/keeper/querier.go b/x/staking/keeper/querier.go index e82bfc02..96cacafd 100644 --- a/x/staking/keeper/querier.go +++ b/x/staking/keeper/querier.go @@ -191,7 +191,6 @@ func queryDelegatorDelegations(ctx sdk.Context, req abci.RequestQuery, k Keeper, delegations := k.GetAllDelegatorDelegations(ctx, params.DelegatorAddr) delegationResps, err := DelegationsToDelegationResponses(ctx, k, delegations) - if err != nil { return nil, err } @@ -498,10 +497,8 @@ func RedelegationsToRedelegationResponses( panic(err) } - delegatorAddress, err := sdk.AccAddressFromBech32(redel.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(redel.DelegatorAddress) + val, found := k.GetValidator(ctx, valDstAddr) if !found { return nil, sdkstaking.ErrNoValidatorFound diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index 0fe9316f..ed222f6a 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -166,7 +166,8 @@ func (k Keeper) Unjail(ctx sdk.Context, consAddr sdk.ConsAddress) { // (the amount actually slashed may be less if there's // insufficient stake remaining) func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation types.UnbondingDelegation, - infractionHeight int64, slashFactor sdk.Dec) (totalSlashAmount sdk.Int) { + infractionHeight int64, slashFactor sdk.Dec, +) (totalSlashAmount sdk.Int) { now := ctx.BlockHeader().Time totalSlashAmount = sdk.ZeroInt() burnedAmount := sdk.ZeroInt() @@ -219,7 +220,8 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty // insufficient stake remaining) // NOTE this is only slashing for prior infractions from the source validator func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, redelegation types.Redelegation, - infractionHeight int64, slashFactor sdk.Dec) (totalSlashAmount sdk.Int) { + infractionHeight int64, slashFactor sdk.Dec, +) (totalSlashAmount sdk.Int) { now := ctx.BlockHeader().Time totalSlashAmount = sdk.ZeroInt() bondedBurnedAmount, notBondedBurnedAmount := sdk.ZeroInt(), sdk.ZeroInt() @@ -252,10 +254,7 @@ func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, panic(err) } - delegatorAddress, err := sdk.AccAddressFromBech32(redelegation.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(redelegation.DelegatorAddress) delegation, found := k.GetDelegation(ctx, delegatorAddress, valDstAddr) if !found { diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 9d2f35ed..2809d553 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -40,10 +40,8 @@ func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { if err != nil { panic(err) } - delegatorAddress, err := sdk.AccAddressFromBech32(dvPair.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(dvPair.DelegatorAddress) + balances, err := k.CompleteUnbonding(ctx, delegatorAddress, addr) if err != nil { continue @@ -70,10 +68,8 @@ func (k Keeper) BlockValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { if err != nil { panic(err) } - delegatorAddress, err := sdk.AccAddressFromBech32(dvvTriplet.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(dvvTriplet.DelegatorAddress) + balances, err := k.CompleteRedelegation( ctx, delegatorAddress, diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index fd5aa5bf..aa44e95f 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -96,7 +96,8 @@ func (k Keeper) SetNewValidatorByPowerIndex(ctx sdk.Context, validator types.Val // Update the tokens of an existing validator, update the validators power index key func (k Keeper) AddValidatorTokensAndShares(ctx sdk.Context, validator types.Validator, - tokensToAdd sdk.Int) (valOut types.Validator, addedShares sdk.Dec) { + tokensToAdd sdk.Int, +) (valOut types.Validator, addedShares sdk.Dec) { k.DeleteValidatorByPowerIndex(ctx, validator) validator, addedShares = validator.AddTokensFromDel(tokensToAdd) k.SetValidator(ctx, validator) @@ -107,7 +108,8 @@ func (k Keeper) AddValidatorTokensAndShares(ctx sdk.Context, validator types.Val // Update the tokens of an existing validator, update the validators power index key func (k Keeper) RemoveValidatorTokensAndShares(ctx sdk.Context, validator types.Validator, - sharesToRemove sdk.Dec) (valOut types.Validator, removedTokens sdk.Int) { + sharesToRemove sdk.Dec, +) (valOut types.Validator, removedTokens sdk.Int) { k.DeleteValidatorByPowerIndex(ctx, validator) validator, removedTokens = validator.RemoveDelShares(sharesToRemove) k.SetValidator(ctx, validator) @@ -118,7 +120,8 @@ func (k Keeper) RemoveValidatorTokensAndShares(ctx sdk.Context, validator types. // Update the tokens of an existing validator, update the validators power index key func (k Keeper) RemoveValidatorTokens(ctx sdk.Context, - validator types.Validator, tokensToRemove sdk.Int) types.Validator { + validator types.Validator, tokensToRemove sdk.Int, +) types.Validator { k.DeleteValidatorByPowerIndex(ctx, validator) validator = validator.RemoveTokens(tokensToRemove) k.SetValidator(ctx, validator) @@ -130,7 +133,8 @@ func (k Keeper) RemoveValidatorTokens(ctx sdk.Context, // UpdateValidatorCommission attempts to update a validator's commission rate. // An error is returned if the new commission rate is invalid. func (k Keeper) UpdateValidatorCommission(ctx sdk.Context, - validator types.Validator, newRate sdk.Dec) (types.Commission, error) { + validator types.Validator, newRate sdk.Dec, +) (types.Commission, error) { commission := validator.Commission blockTime := ctx.BlockHeader().Time diff --git a/x/staking/types/codec.go b/x/staking/types/codec.go index 62f2f9f4..4f081fad 100644 --- a/x/staking/types/codec.go +++ b/x/staking/types/codec.go @@ -35,6 +35,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &MsgDelegate{}, &MsgUndelegate{}, &MsgBeginRedelegate{}, + &MsgCancelUnbondingDelegation{}, &MsgTokenizeShares{}, &MsgRedeemTokensforShares{}, &MsgTransferTokenizeShareRecord{}, diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index 18e31d41..cb90ef51 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -16,6 +16,7 @@ const ( TypeMsgCreateValidator = "create_validator" TypeMsgDelegate = "delegate" TypeMsgBeginRedelegate = "begin_redelegate" + TypeMsgCancelUnbondingDelegation = "cancel_unbond" TypeMsgTokenizeShares = "tokenize_shares" TypeMsgRedeemTokensforShares = "redeem_tokens_for_shares" TypeMsgTransferTokenizeShareRecord = "transfer_tokenize_share_record" @@ -32,6 +33,7 @@ var ( _ sdk.Msg = &MsgTokenizeShares{} _ sdk.Msg = &MsgRedeemTokensforShares{} _ sdk.Msg = &MsgTransferTokenizeShareRecord{} + _ sdk.Msg = &MsgCancelUnbondingDelegation{} ) // NewMsgCreateValidator creates a new MsgCreateValidator instance. @@ -448,3 +450,57 @@ func (msg MsgTransferTokenizeShareRecord) ValidateBasic() error { return nil } + +// NewMsgCancelUnbondingDelegation creates a new MsgCancelUnbondingDelegation instance. +//nolint:interfacer +func NewMsgCancelUnbondingDelegation(delAddr sdk.AccAddress, valAddr sdk.ValAddress, creationHeight int64, amount sdk.Coin) *MsgCancelUnbondingDelegation { + return &MsgCancelUnbondingDelegation{ + DelegatorAddress: delAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: amount, + CreationHeight: creationHeight, + } +} + +// Route implements the sdk.Msg interface. +func (msg MsgCancelUnbondingDelegation) Route() string { return RouterKey } + +// Type implements the sdk.Msg interface. +func (msg MsgCancelUnbondingDelegation) Type() string { return TypeMsgCancelUnbondingDelegation } + +// GetSigners implements the sdk.Msg interface. +func (msg MsgCancelUnbondingDelegation) GetSigners() []sdk.AccAddress { + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + return []sdk.AccAddress{delegator} +} + +// GetSignBytes implements the sdk.Msg interface. +func (msg MsgCancelUnbondingDelegation) GetSignBytes() []byte { + return sdk.MustSortJSON(legacy.Cdc.MustMarshalJSON(&msg)) +} + +// ValidateBasic implements the sdk.Msg interface. +func (msg MsgCancelUnbondingDelegation) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) + } + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) + } + + if !msg.Amount.IsValid() || !msg.Amount.Amount.IsPositive() { + return sdkerrors.Wrap( + sdkerrors.ErrInvalidRequest, + "invalid amount", + ) + } + + if msg.CreationHeight <= 0 { + return sdkerrors.Wrap( + sdkerrors.ErrInvalidRequest, + "invalid height", + ) + } + + return nil +} diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index 99f64214..a47da85b 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -450,6 +450,90 @@ func (m *MsgUndelegateResponse) GetCompletionTime() time.Time { return time.Time{} } +// MsgCancelUnbondingDelegation defines the SDK message for performing a cancel unbonding delegation for delegator +// +// Since: cosmos-sdk 0.46 +type MsgCancelUnbondingDelegation struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` + // amount is always less than or equal to unbonding delegation entry balance + Amount types1.Coin `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount"` + // creation_height is the height which the unbonding took place. + CreationHeight int64 `protobuf:"varint,4,opt,name=creation_height,json=creationHeight,proto3" json:"creation_height,omitempty"` +} + +func (m *MsgCancelUnbondingDelegation) Reset() { *m = MsgCancelUnbondingDelegation{} } +func (m *MsgCancelUnbondingDelegation) String() string { return proto.CompactTextString(m) } +func (*MsgCancelUnbondingDelegation) ProtoMessage() {} +func (*MsgCancelUnbondingDelegation) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{10} +} +func (m *MsgCancelUnbondingDelegation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCancelUnbondingDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCancelUnbondingDelegation.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 *MsgCancelUnbondingDelegation) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCancelUnbondingDelegation.Merge(m, src) +} +func (m *MsgCancelUnbondingDelegation) XXX_Size() int { + return m.Size() +} +func (m *MsgCancelUnbondingDelegation) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCancelUnbondingDelegation.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCancelUnbondingDelegation proto.InternalMessageInfo + +// MsgCancelUnbondingDelegationResponse +// +// Since: cosmos-sdk 0.46 +type MsgCancelUnbondingDelegationResponse struct { +} + +func (m *MsgCancelUnbondingDelegationResponse) Reset() { *m = MsgCancelUnbondingDelegationResponse{} } +func (m *MsgCancelUnbondingDelegationResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCancelUnbondingDelegationResponse) ProtoMessage() {} +func (*MsgCancelUnbondingDelegationResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{11} +} +func (m *MsgCancelUnbondingDelegationResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCancelUnbondingDelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCancelUnbondingDelegationResponse.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 *MsgCancelUnbondingDelegationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCancelUnbondingDelegationResponse.Merge(m, src) +} +func (m *MsgCancelUnbondingDelegationResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCancelUnbondingDelegationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCancelUnbondingDelegationResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCancelUnbondingDelegationResponse proto.InternalMessageInfo + type MsgTokenizeShares struct { DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` @@ -461,7 +545,7 @@ func (m *MsgTokenizeShares) Reset() { *m = MsgTokenizeShares{} } func (m *MsgTokenizeShares) String() string { return proto.CompactTextString(m) } func (*MsgTokenizeShares) ProtoMessage() {} func (*MsgTokenizeShares) Descriptor() ([]byte, []int) { - return fileDescriptor_dc1f14f20335eae7, []int{10} + return fileDescriptor_dc1f14f20335eae7, []int{12} } func (m *MsgTokenizeShares) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -498,7 +582,7 @@ func (m *MsgTokenizeSharesResponse) Reset() { *m = MsgTokenizeSharesResp func (m *MsgTokenizeSharesResponse) String() string { return proto.CompactTextString(m) } func (*MsgTokenizeSharesResponse) ProtoMessage() {} func (*MsgTokenizeSharesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_dc1f14f20335eae7, []int{11} + return fileDescriptor_dc1f14f20335eae7, []int{13} } func (m *MsgTokenizeSharesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -543,7 +627,7 @@ func (m *MsgRedeemTokensforShares) Reset() { *m = MsgRedeemTokensforShar func (m *MsgRedeemTokensforShares) String() string { return proto.CompactTextString(m) } func (*MsgRedeemTokensforShares) ProtoMessage() {} func (*MsgRedeemTokensforShares) Descriptor() ([]byte, []int) { - return fileDescriptor_dc1f14f20335eae7, []int{12} + return fileDescriptor_dc1f14f20335eae7, []int{14} } func (m *MsgRedeemTokensforShares) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -580,7 +664,7 @@ func (m *MsgRedeemTokensforSharesResponse) Reset() { *m = MsgRedeemToken func (m *MsgRedeemTokensforSharesResponse) String() string { return proto.CompactTextString(m) } func (*MsgRedeemTokensforSharesResponse) ProtoMessage() {} func (*MsgRedeemTokensforSharesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_dc1f14f20335eae7, []int{13} + return fileDescriptor_dc1f14f20335eae7, []int{15} } func (m *MsgRedeemTokensforSharesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -626,7 +710,7 @@ func (m *MsgTransferTokenizeShareRecord) Reset() { *m = MsgTransferToken func (m *MsgTransferTokenizeShareRecord) String() string { return proto.CompactTextString(m) } func (*MsgTransferTokenizeShareRecord) ProtoMessage() {} func (*MsgTransferTokenizeShareRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_dc1f14f20335eae7, []int{14} + return fileDescriptor_dc1f14f20335eae7, []int{16} } func (m *MsgTransferTokenizeShareRecord) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -664,7 +748,7 @@ func (m *MsgTransferTokenizeShareRecordResponse) Reset() { func (m *MsgTransferTokenizeShareRecordResponse) String() string { return proto.CompactTextString(m) } func (*MsgTransferTokenizeShareRecordResponse) ProtoMessage() {} func (*MsgTransferTokenizeShareRecordResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_dc1f14f20335eae7, []int{15} + return fileDescriptor_dc1f14f20335eae7, []int{17} } func (m *MsgTransferTokenizeShareRecordResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -704,6 +788,8 @@ func init() { proto.RegisterType((*MsgBeginRedelegateResponse)(nil), "liquidstaking.staking.v1beta1.MsgBeginRedelegateResponse") proto.RegisterType((*MsgUndelegate)(nil), "liquidstaking.staking.v1beta1.MsgUndelegate") proto.RegisterType((*MsgUndelegateResponse)(nil), "liquidstaking.staking.v1beta1.MsgUndelegateResponse") + proto.RegisterType((*MsgCancelUnbondingDelegation)(nil), "liquidstaking.staking.v1beta1.MsgCancelUnbondingDelegation") + proto.RegisterType((*MsgCancelUnbondingDelegationResponse)(nil), "liquidstaking.staking.v1beta1.MsgCancelUnbondingDelegationResponse") proto.RegisterType((*MsgTokenizeShares)(nil), "liquidstaking.staking.v1beta1.MsgTokenizeShares") proto.RegisterType((*MsgTokenizeSharesResponse)(nil), "liquidstaking.staking.v1beta1.MsgTokenizeSharesResponse") proto.RegisterType((*MsgRedeemTokensforShares)(nil), "liquidstaking.staking.v1beta1.MsgRedeemTokensforShares") @@ -715,78 +801,83 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/tx.proto", fileDescriptor_dc1f14f20335eae7) } var fileDescriptor_dc1f14f20335eae7 = []byte{ - // 1126 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcf, 0x6e, 0xdb, 0xc6, - 0x13, 0x16, 0x65, 0xc7, 0x3f, 0x67, 0xfd, 0x8b, 0xff, 0xd0, 0x76, 0x20, 0x33, 0x8e, 0x68, 0xf0, - 0x10, 0x18, 0x41, 0x4d, 0xd6, 0x6e, 0x0b, 0xb7, 0x01, 0x0a, 0x23, 0x8a, 0x53, 0xd4, 0x68, 0x85, - 0x16, 0xb4, 0x5b, 0xa0, 0xed, 0x41, 0xa0, 0xc8, 0x15, 0xb3, 0x15, 0xc9, 0x55, 0xb8, 0x2b, 0xdb, - 0x2a, 0x02, 0xe4, 0x9a, 0x5b, 0x73, 0x2c, 0x7a, 0x0a, 0xd0, 0x4b, 0x1f, 0xa0, 0x4f, 0xd0, 0x53, - 0xd0, 0x43, 0x91, 0x63, 0xd1, 0x02, 0x6a, 0x61, 0x03, 0x45, 0xce, 0x7a, 0x82, 0x82, 0xcb, 0xe5, - 0x8a, 0xa2, 0x64, 0x4b, 0x72, 0xe2, 0x4b, 0x4e, 0x16, 0x77, 0x67, 0xbe, 0x99, 0xf9, 0xe6, 0xdb, - 0xe1, 0xd2, 0xa0, 0x40, 0xa8, 0x55, 0x47, 0x81, 0x6b, 0x1c, 0x6e, 0x56, 0x21, 0xb5, 0x36, 0x0d, - 0x7a, 0xac, 0x37, 0x42, 0x4c, 0xb1, 0x7c, 0xd3, 0x43, 0x0f, 0x9b, 0xc8, 0xe1, 0xfb, 0x7a, 0xf2, - 0x97, 0xdb, 0x29, 0x2b, 0x2e, 0xc6, 0xae, 0x07, 0x0d, 0x66, 0x5c, 0x6d, 0xd6, 0x0c, 0x2b, 0x68, - 0xc5, 0x9e, 0x8a, 0x9a, 0xdd, 0xa2, 0xc8, 0x87, 0x84, 0x5a, 0x7e, 0x83, 0x1b, 0x2c, 0xb9, 0xd8, - 0xc5, 0xec, 0xa7, 0x11, 0xfd, 0xe2, 0xab, 0x2b, 0x36, 0x26, 0x3e, 0x26, 0x95, 0x78, 0x23, 0x7e, - 0xe0, 0x5b, 0xc5, 0xf8, 0xc9, 0xa8, 0x5a, 0x04, 0x8a, 0x4c, 0x6d, 0x8c, 0x02, 0xbe, 0x7f, 0x33, - 0x5b, 0x45, 0x92, 0x2d, 0xdb, 0xd6, 0xfe, 0x9a, 0x04, 0x72, 0x99, 0xb8, 0xf7, 0x42, 0x68, 0x51, - 0xf8, 0xa5, 0xe5, 0x21, 0xc7, 0xa2, 0x38, 0x94, 0x4d, 0x30, 0xe3, 0x40, 0x62, 0x87, 0xa8, 0x41, - 0x11, 0x0e, 0x0a, 0xd2, 0x9a, 0xb4, 0x3e, 0xb3, 0x75, 0x5b, 0x3f, 0xb7, 0x6e, 0x7d, 0xb7, 0xeb, - 0x51, 0x9a, 0x7c, 0xde, 0x56, 0x73, 0x66, 0x1a, 0x44, 0x3e, 0x00, 0xc0, 0xc6, 0xbe, 0x8f, 0x08, - 0x89, 0x20, 0xf3, 0x0c, 0x52, 0x1f, 0x02, 0x79, 0x4f, 0x38, 0x98, 0x16, 0x85, 0x84, 0xc3, 0xa6, - 0x70, 0xe4, 0x47, 0x60, 0xd1, 0x47, 0x41, 0x85, 0x40, 0xaf, 0x56, 0x71, 0xa0, 0x07, 0x5d, 0x8b, - 0x65, 0x3c, 0xb1, 0x26, 0xad, 0x5f, 0x2d, 0x7d, 0x1a, 0x99, 0xff, 0xd9, 0x56, 0x6f, 0xb9, 0x88, - 0x3e, 0x68, 0x56, 0x75, 0x1b, 0xfb, 0x9c, 0x3d, 0xfe, 0x67, 0x83, 0x38, 0x75, 0x83, 0xb6, 0x1a, - 0x90, 0xe8, 0x7b, 0x01, 0xed, 0xb4, 0x55, 0xa5, 0x65, 0xf9, 0xde, 0x1d, 0x6d, 0x00, 0xa4, 0x66, - 0x2e, 0xf8, 0x28, 0xd8, 0x87, 0x5e, 0x6d, 0x57, 0xac, 0xc9, 0x7b, 0x60, 0x81, 0x5b, 0xe0, 0xb0, - 0x62, 0x39, 0x4e, 0x08, 0x09, 0x29, 0x4c, 0xb2, 0xd8, 0xab, 0x9d, 0xb6, 0x5a, 0x88, 0xd1, 0xfa, - 0x4c, 0x34, 0x73, 0x5e, 0xac, 0xdd, 0x8d, 0x97, 0x22, 0xa8, 0xc3, 0x84, 0x7f, 0x01, 0x75, 0x25, - 0x0b, 0xd5, 0x67, 0xa2, 0x99, 0xf3, 0x62, 0x2d, 0x81, 0xfa, 0x08, 0x4c, 0x35, 0x9a, 0xd5, 0x3a, - 0x6c, 0x15, 0xa6, 0x18, 0xcb, 0x4b, 0x7a, 0x2c, 0x3b, 0x3d, 0x91, 0x9d, 0x7e, 0x37, 0x68, 0x95, - 0x0a, 0xbf, 0xfd, 0xb2, 0xb1, 0xc4, 0xb5, 0x64, 0x87, 0xad, 0x06, 0xc5, 0xfa, 0xe7, 0xcd, 0xea, - 0x27, 0xb0, 0x65, 0x72, 0x6f, 0xf9, 0x3d, 0x70, 0xe5, 0xd0, 0xf2, 0x9a, 0xb0, 0xf0, 0x3f, 0x06, - 0xb3, 0xa2, 0x73, 0xeb, 0x48, 0x6b, 0xa9, 0x16, 0xa1, 0xa4, 0xdd, 0xb1, 0xf5, 0x9d, 0xe9, 0x27, - 0xcf, 0xd4, 0xdc, 0xcb, 0x67, 0x6a, 0x4e, 0x5b, 0x05, 0x4a, 0xbf, 0xb8, 0x4c, 0x48, 0x1a, 0x38, - 0x20, 0x50, 0xfb, 0x71, 0x02, 0xcc, 0x97, 0x89, 0x7b, 0xdf, 0x41, 0xf4, 0x72, 0x95, 0xb7, 0x33, - 0x88, 0xda, 0x3c, 0xa3, 0x56, 0xee, 0xb4, 0xd5, 0xd9, 0x98, 0xda, 0x73, 0x08, 0xf5, 0xc1, 0x5c, - 0x57, 0x72, 0x95, 0xd0, 0xa2, 0x90, 0x0b, 0x6c, 0x77, 0x44, 0x71, 0xed, 0x42, 0xbb, 0xd3, 0x56, - 0xaf, 0xc7, 0x81, 0x32, 0x50, 0x9a, 0x39, 0x6b, 0xf7, 0xc8, 0x5c, 0x3e, 0x1e, 0xac, 0xe9, 0x58, - 0x57, 0x1f, 0x5f, 0xa2, 0x9e, 0x53, 0xad, 0x53, 0x40, 0x21, 0xdb, 0x1b, 0xd1, 0xb8, 0x7f, 0x25, - 0x30, 0x53, 0x26, 0x2e, 0xf7, 0x83, 0x83, 0x4f, 0x81, 0xf4, 0xfa, 0x4e, 0x41, 0xfe, 0x42, 0xa7, - 0x60, 0x1b, 0x4c, 0x59, 0x3e, 0x6e, 0x06, 0x94, 0xf5, 0x6a, 0x04, 0xf9, 0x72, 0xf3, 0x14, 0x09, - 0xcb, 0x60, 0x31, 0x55, 0xa7, 0xa8, 0xff, 0xf7, 0x3c, 0x1b, 0x9a, 0x25, 0xe8, 0xa2, 0xc0, 0x84, - 0xce, 0x25, 0xd0, 0x70, 0x00, 0x96, 0xbb, 0x35, 0x92, 0xd0, 0xce, 0x50, 0xb1, 0xd6, 0x69, 0xab, - 0xab, 0x59, 0x2a, 0x52, 0x66, 0x9a, 0xb9, 0x28, 0xd6, 0xf7, 0x43, 0x7b, 0x20, 0xaa, 0x43, 0xa8, - 0x40, 0x9d, 0x38, 0x1b, 0x35, 0x65, 0x96, 0x46, 0xdd, 0x25, 0xb4, 0x9f, 0xe7, 0xc9, 0x8b, 0xf2, - 0x5c, 0x67, 0x73, 0x22, 0xc3, 0x67, 0x42, 0xb7, 0x5c, 0x66, 0xa7, 0xaf, 0xe1, 0xc1, 0x48, 0xa2, - 0x95, 0xe8, 0x8d, 0xc9, 0xc7, 0x82, 0xd2, 0x37, 0xd7, 0x0e, 0x92, 0xd7, 0x69, 0x69, 0x3a, 0x0a, - 0xf5, 0xf4, 0x6f, 0x55, 0x62, 0xa7, 0x8b, 0x3b, 0x47, 0xdb, 0xda, 0x4b, 0x09, 0x5c, 0x2b, 0x13, - 0xf7, 0x8b, 0xc0, 0x79, 0xe3, 0xf5, 0x5b, 0x03, 0xcb, 0x3d, 0x95, 0x5e, 0x16, 0xa5, 0xbf, 0xe6, - 0xc1, 0x42, 0x99, 0xb8, 0x07, 0xb8, 0x0e, 0x03, 0xf4, 0x1d, 0xdc, 0x7f, 0x60, 0x85, 0x90, 0xbc, - 0x61, 0xb4, 0x46, 0xa7, 0x87, 0xf2, 0x02, 0x9d, 0x0a, 0x89, 0x4a, 0xac, 0xe0, 0xa3, 0x00, 0x86, - 0x7c, 0x2e, 0xa7, 0x4e, 0xcf, 0x40, 0x33, 0xcd, 0x5c, 0x14, 0xeb, 0x8c, 0xa0, 0xcf, 0xa2, 0xd5, - 0x54, 0xb3, 0x0e, 0xc0, 0x4a, 0x1f, 0x87, 0xa2, 0x61, 0xdd, 0xac, 0xa5, 0xb1, 0xb2, 0xd6, 0x7e, - 0x96, 0xd8, 0x20, 0x8f, 0x8e, 0x15, 0xf4, 0x19, 0x38, 0xa9, 0xe1, 0xf0, 0xf5, 0x77, 0xa8, 0x9b, - 0x60, 0xfe, 0xa2, 0x6a, 0xfd, 0x06, 0xac, 0x9d, 0x95, 0xe9, 0xab, 0xf3, 0xf0, 0x83, 0x04, 0x8a, - 0x11, 0xbd, 0xa1, 0x15, 0x90, 0x1a, 0x0c, 0x7b, 0x68, 0x36, 0xa1, 0x8d, 0x43, 0x47, 0xde, 0x06, - 0x85, 0xa4, 0x43, 0xbc, 0x71, 0x21, 0xdb, 0xa8, 0x20, 0x87, 0x45, 0x9b, 0x34, 0x85, 0x00, 0x52, - 0x6e, 0x7b, 0x8e, 0x7c, 0x1d, 0x4c, 0x11, 0x18, 0x38, 0x30, 0x8c, 0x25, 0x69, 0xf2, 0x27, 0xf9, - 0x06, 0xb8, 0x1a, 0xc0, 0x23, 0xae, 0x12, 0x36, 0x63, 0xcd, 0xe9, 0x00, 0x1e, 0x65, 0x1b, 0xbf, - 0x0e, 0x6e, 0x9d, 0x9f, 0x59, 0x52, 0xfd, 0xd6, 0xf7, 0xd3, 0x60, 0xa2, 0x4c, 0x5c, 0xf9, 0x31, - 0x98, 0xcb, 0xde, 0xd8, 0x37, 0x87, 0x5c, 0x91, 0xfa, 0xef, 0x61, 0xca, 0x07, 0x63, 0xbb, 0x88, - 0x36, 0xb4, 0xc0, 0xb5, 0xde, 0x6b, 0x9b, 0x31, 0x1c, 0xab, 0xc7, 0x41, 0xd9, 0x1e, 0xd3, 0x41, - 0x84, 0xfe, 0x16, 0x4c, 0x8b, 0x8b, 0xc7, 0xed, 0xe1, 0x20, 0x89, 0xad, 0xb2, 0x35, 0xba, 0xad, - 0x88, 0xf5, 0x18, 0xcc, 0x65, 0x5f, 0xf2, 0x23, 0xf0, 0x9c, 0x71, 0x19, 0x85, 0xe7, 0xb3, 0x5e, - 0x7d, 0x0d, 0x00, 0x52, 0xef, 0xa9, 0xb7, 0x86, 0x03, 0x75, 0xad, 0x95, 0x77, 0xc7, 0xb1, 0x16, - 0x11, 0x1f, 0x81, 0xd9, 0xcc, 0x18, 0x7f, 0x7b, 0x38, 0x4e, 0xaf, 0x87, 0xf2, 0xfe, 0xb8, 0x1e, - 0x22, 0xfa, 0x13, 0x09, 0xfc, 0x3f, 0x3d, 0x00, 0xe4, 0x11, 0x64, 0x32, 0x70, 0x60, 0x28, 0x3b, - 0x17, 0x74, 0x14, 0xa9, 0xfc, 0x24, 0x81, 0x1b, 0xe7, 0x4d, 0x8b, 0x0f, 0x47, 0x28, 0xf2, 0x6c, - 0x77, 0xe5, 0xfe, 0x2b, 0xb9, 0x27, 0x59, 0x96, 0xbe, 0x7a, 0x7e, 0x52, 0x94, 0x5e, 0x9c, 0x14, - 0xa5, 0x7f, 0x4e, 0x8a, 0xd2, 0xd3, 0xd3, 0x62, 0xee, 0xc5, 0x69, 0x31, 0xf7, 0xc7, 0x69, 0x31, - 0xf7, 0xf5, 0x4e, 0xea, 0x1b, 0x01, 0x3d, 0xf4, 0x9a, 0xd1, 0xd7, 0x05, 0x0a, 0x6c, 0x23, 0x0e, - 0x8b, 0x68, 0x6b, 0x83, 0x87, 0xdc, 0xf0, 0xb1, 0xd3, 0xf4, 0xa0, 0x71, 0x9c, 0xfc, 0x6b, 0x20, - 0xfe, 0x80, 0xa8, 0x4e, 0xb1, 0x2b, 0xc0, 0x3b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x74, 0xa1, - 0xc9, 0x5c, 0x08, 0x11, 0x00, 0x00, + // 1201 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0x8e, 0xd3, 0x6e, 0x69, 0xa7, 0x6c, 0x7f, 0xb8, 0xed, 0x2a, 0xf5, 0x76, 0x93, 0xca, 0x42, + 0xa5, 0x5a, 0x51, 0x87, 0x16, 0x50, 0x61, 0x11, 0xaa, 0x36, 0xed, 0xa2, 0xad, 0x20, 0x02, 0xb9, + 0x59, 0x24, 0xe0, 0x10, 0x39, 0xf6, 0xc4, 0x1d, 0x6a, 0xcf, 0x64, 0x3d, 0x4e, 0xdb, 0xa0, 0x95, + 0xf6, 0xba, 0xc7, 0x3d, 0x22, 0x24, 0xa4, 0x4a, 0x5c, 0xb8, 0x71, 0xe1, 0x2f, 0xe0, 0xb4, 0xe2, + 0x80, 0xf6, 0x88, 0x40, 0x0a, 0xa8, 0x95, 0xd0, 0x9e, 0xfb, 0x17, 0x20, 0x8f, 0xc7, 0x13, 0xc7, + 0x49, 0x9a, 0xb4, 0xdd, 0x1e, 0xd8, 0x53, 0xec, 0x99, 0xf7, 0xbe, 0x79, 0xf3, 0xbd, 0x6f, 0xde, + 0x1b, 0x07, 0x64, 0xa8, 0x6f, 0xec, 0x21, 0x6c, 0xe7, 0xf7, 0x57, 0x2b, 0xd0, 0x37, 0x56, 0xf3, + 0xfe, 0xa1, 0x56, 0xf3, 0x88, 0x4f, 0xe4, 0x5b, 0x0e, 0x7a, 0x58, 0x47, 0x16, 0x9f, 0xd7, 0xa2, + 0x5f, 0x6e, 0xa7, 0xcc, 0xdb, 0x84, 0xd8, 0x0e, 0xcc, 0x33, 0xe3, 0x4a, 0xbd, 0x9a, 0x37, 0x70, + 0x23, 0xf4, 0x54, 0x72, 0xc9, 0x29, 0x1f, 0xb9, 0x90, 0xfa, 0x86, 0x5b, 0xe3, 0x06, 0xb3, 0x36, + 0xb1, 0x09, 0x7b, 0xcc, 0x07, 0x4f, 0x7c, 0x74, 0xde, 0x24, 0xd4, 0x25, 0xb4, 0x1c, 0x4e, 0x84, + 0x2f, 0x7c, 0x2a, 0x1b, 0xbe, 0xe5, 0x2b, 0x06, 0x85, 0x22, 0x52, 0x93, 0x20, 0xcc, 0xe7, 0x6f, + 0x25, 0x77, 0x11, 0x45, 0xcb, 0xa6, 0xd5, 0xbf, 0x86, 0x81, 0x5c, 0xa4, 0xf6, 0xa6, 0x07, 0x0d, + 0x1f, 0x7e, 0x61, 0x38, 0xc8, 0x32, 0x7c, 0xe2, 0xc9, 0x3a, 0x18, 0xb7, 0x20, 0x35, 0x3d, 0x54, + 0xf3, 0x11, 0xc1, 0x19, 0x69, 0x51, 0x5a, 0x1e, 0x5f, 0xbb, 0xad, 0x9d, 0xb9, 0x6f, 0x6d, 0xab, + 0xe5, 0x51, 0x18, 0x7e, 0xd6, 0xcc, 0xa5, 0xf4, 0x38, 0x88, 0x5c, 0x02, 0xc0, 0x24, 0xae, 0x8b, + 0x28, 0x0d, 0x20, 0xd3, 0x0c, 0x52, 0xeb, 0x03, 0xb9, 0x29, 0x1c, 0x74, 0xc3, 0x87, 0x94, 0xc3, + 0xc6, 0x70, 0xe4, 0x47, 0x60, 0xc6, 0x45, 0xb8, 0x4c, 0xa1, 0x53, 0x2d, 0x5b, 0xd0, 0x81, 0xb6, + 0xc1, 0x22, 0x1e, 0x5a, 0x94, 0x96, 0xc7, 0x0a, 0x9f, 0x06, 0xe6, 0x7f, 0x36, 0x73, 0x4b, 0x36, + 0xf2, 0x77, 0xeb, 0x15, 0xcd, 0x24, 0x2e, 0x67, 0x8f, 0xff, 0xac, 0x50, 0x6b, 0x2f, 0xef, 0x37, + 0x6a, 0x90, 0x6a, 0xdb, 0xd8, 0x3f, 0x6d, 0xe6, 0x94, 0x86, 0xe1, 0x3a, 0x77, 0xd4, 0x2e, 0x90, + 0xaa, 0x3e, 0xed, 0x22, 0xbc, 0x03, 0x9d, 0xea, 0x96, 0x18, 0x93, 0xb7, 0xc1, 0x34, 0xb7, 0x20, + 0x5e, 0xd9, 0xb0, 0x2c, 0x0f, 0x52, 0x9a, 0x19, 0x66, 0x6b, 0x2f, 0x9c, 0x36, 0x73, 0x99, 0x10, + 0xad, 0xc3, 0x44, 0xd5, 0xa7, 0xc4, 0xd8, 0xdd, 0x70, 0x28, 0x80, 0xda, 0x8f, 0xf8, 0x17, 0x50, + 0xd7, 0x92, 0x50, 0x1d, 0x26, 0xaa, 0x3e, 0x25, 0xc6, 0x22, 0xa8, 0x8f, 0xc1, 0x48, 0xad, 0x5e, + 0xd9, 0x83, 0x8d, 0xcc, 0x08, 0x63, 0x79, 0x56, 0x0b, 0x65, 0xa7, 0x45, 0xb2, 0xd3, 0xee, 0xe2, + 0x46, 0x21, 0xf3, 0xdb, 0x2f, 0x2b, 0xb3, 0x5c, 0x4b, 0xa6, 0xd7, 0xa8, 0xf9, 0x44, 0xfb, 0xbc, + 0x5e, 0xf9, 0x04, 0x36, 0x74, 0xee, 0x2d, 0xbf, 0x07, 0xae, 0xed, 0x1b, 0x4e, 0x1d, 0x66, 0x5e, + 0x63, 0x30, 0xf3, 0x1a, 0xb7, 0x0e, 0xb4, 0x16, 0x4b, 0x11, 0x8a, 0xd2, 0x1d, 0x5a, 0xdf, 0x19, + 0x7d, 0x72, 0x94, 0x4b, 0xbd, 0x38, 0xca, 0xa5, 0xd4, 0x05, 0xa0, 0x74, 0x8a, 0x4b, 0x87, 0xb4, + 0x46, 0x30, 0x85, 0xea, 0xf7, 0x43, 0x60, 0xaa, 0x48, 0xed, 0x7b, 0x16, 0xf2, 0xaf, 0x56, 0x79, + 0x1b, 0xdd, 0xa8, 0x4d, 0x33, 0x6a, 0xe5, 0xd3, 0x66, 0x6e, 0x22, 0xa4, 0xf6, 0x0c, 0x42, 0x5d, + 0x30, 0xd9, 0x92, 0x5c, 0xd9, 0x33, 0x7c, 0xc8, 0x05, 0xb6, 0x35, 0xa0, 0xb8, 0xb6, 0xa0, 0x79, + 0xda, 0xcc, 0xdd, 0x08, 0x17, 0x4a, 0x40, 0xa9, 0xfa, 0x84, 0xd9, 0x26, 0x73, 0xf9, 0xb0, 0xbb, + 0xa6, 0x43, 0x5d, 0xdd, 0xbf, 0x42, 0x3d, 0xc7, 0x52, 0xa7, 0x80, 0x4c, 0x32, 0x37, 0x22, 0x71, + 0xff, 0x4a, 0x60, 0xbc, 0x48, 0x6d, 0xee, 0x07, 0xbb, 0x9f, 0x02, 0xe9, 0xe5, 0x9d, 0x82, 0xf4, + 0x85, 0x4e, 0xc1, 0x3a, 0x18, 0x31, 0x5c, 0x52, 0xc7, 0x3e, 0xcb, 0xd5, 0x00, 0xf2, 0xe5, 0xe6, + 0x31, 0x12, 0xe6, 0xc0, 0x4c, 0x6c, 0x9f, 0x62, 0xff, 0xbf, 0xa7, 0x59, 0xd1, 0x2c, 0x40, 0x1b, + 0x61, 0x1d, 0x5a, 0x57, 0x40, 0x43, 0x09, 0xcc, 0xb5, 0xf6, 0x48, 0x3d, 0x33, 0x41, 0xc5, 0xe2, + 0x69, 0x33, 0xb7, 0x90, 0xa4, 0x22, 0x66, 0xa6, 0xea, 0x33, 0x62, 0x7c, 0xc7, 0x33, 0xbb, 0xa2, + 0x5a, 0xd4, 0x17, 0xa8, 0x43, 0xbd, 0x51, 0x63, 0x66, 0x71, 0xd4, 0x2d, 0xea, 0x77, 0xf2, 0x3c, + 0x7c, 0x51, 0x9e, 0xf7, 0x58, 0x9d, 0x48, 0xf0, 0x19, 0xd1, 0x2d, 0x17, 0xd9, 0xe9, 0xab, 0x39, + 0x30, 0x90, 0x68, 0x39, 0xe8, 0x98, 0xbc, 0x2c, 0x28, 0x1d, 0x75, 0xad, 0x14, 0xb5, 0xd3, 0xc2, + 0x68, 0xb0, 0xd4, 0xd3, 0xbf, 0x73, 0x12, 0x3b, 0x5d, 0xdc, 0x39, 0x98, 0x56, 0x5f, 0x48, 0xe0, + 0x7a, 0x91, 0xda, 0x0f, 0xb0, 0xf5, 0xca, 0xeb, 0xb7, 0x0a, 0xe6, 0xda, 0x76, 0x7a, 0x55, 0x94, + 0x1e, 0xa5, 0xc1, 0x42, 0x50, 0xe8, 0x0d, 0x6c, 0x42, 0xe7, 0x01, 0xae, 0x10, 0x6c, 0x21, 0x6c, + 0xf7, 0xeb, 0x93, 0xff, 0x5b, 0x86, 0xe5, 0x37, 0xc1, 0xa4, 0x19, 0x34, 0xb5, 0x80, 0xbc, 0x5d, + 0x88, 0xec, 0xdd, 0x50, 0xfb, 0x43, 0xfa, 0x44, 0x34, 0x7c, 0x9f, 0x8d, 0xc6, 0x52, 0xb1, 0x04, + 0xde, 0x38, 0x8b, 0x21, 0x51, 0x5b, 0x7e, 0x4d, 0x83, 0xe9, 0x22, 0xb5, 0x4b, 0x64, 0x0f, 0x62, + 0xf4, 0x2d, 0xdc, 0xd9, 0x35, 0x3c, 0x48, 0x5f, 0x35, 0xfe, 0x4a, 0x60, 0xce, 0xe7, 0x1b, 0xb4, + 0xca, 0x34, 0xd8, 0x62, 0x99, 0x1c, 0x60, 0xe8, 0xf1, 0x16, 0x17, 0x2b, 0x44, 0x5d, 0xcd, 0x54, + 0x7d, 0x46, 0x8c, 0x33, 0x82, 0x3e, 0x0b, 0x46, 0x63, 0x64, 0x97, 0xc0, 0x7c, 0x07, 0x87, 0x42, + 0xfb, 0xad, 0xa8, 0xa5, 0x73, 0x45, 0xad, 0xfe, 0x24, 0xb1, 0x9e, 0x18, 0x54, 0x28, 0xe8, 0x32, + 0x70, 0x5a, 0x25, 0xde, 0xcb, 0xcf, 0x50, 0x2b, 0xc0, 0xf4, 0x45, 0x0f, 0xfe, 0xd7, 0x60, 0xb1, + 0x57, 0xa4, 0x97, 0xe7, 0xe1, 0x3b, 0x09, 0x64, 0x03, 0x7a, 0x3d, 0x03, 0xd3, 0x2a, 0xf4, 0xda, + 0x68, 0xd6, 0xa1, 0x49, 0x3c, 0x4b, 0x5e, 0x07, 0x99, 0x28, 0x43, 0x3c, 0x71, 0x1e, 0x9b, 0x28, + 0x23, 0x8b, 0xad, 0x36, 0xac, 0x0b, 0x01, 0xc4, 0xdc, 0xb6, 0x2d, 0xf9, 0x06, 0x18, 0xa1, 0x10, + 0x5b, 0xd0, 0x0b, 0x25, 0xa9, 0xf3, 0x37, 0xf9, 0x26, 0x18, 0xc3, 0xf0, 0x80, 0xab, 0x84, 0xb5, + 0x2b, 0x7d, 0x14, 0xc3, 0x83, 0x64, 0xe2, 0x97, 0xc1, 0xd2, 0xd9, 0x91, 0x45, 0xbb, 0x5f, 0xfb, + 0x79, 0x0c, 0x0c, 0x15, 0xa9, 0x2d, 0x3f, 0x06, 0x93, 0xc9, 0x8f, 0x9f, 0xd5, 0x3e, 0xb7, 0xcd, + 0xce, 0x2b, 0xad, 0xf2, 0xc1, 0xb9, 0x5d, 0x44, 0x1a, 0x1a, 0xe0, 0x7a, 0xfb, 0x0d, 0x38, 0xdf, + 0x1f, 0xab, 0xcd, 0x41, 0x59, 0x3f, 0xa7, 0x83, 0x58, 0xfa, 0x1b, 0x30, 0x2a, 0xee, 0x70, 0xb7, + 0xfb, 0x83, 0x44, 0xb6, 0xca, 0xda, 0xe0, 0xb6, 0x62, 0xad, 0xc7, 0x60, 0x32, 0x79, 0x5f, 0x1a, + 0x80, 0xe7, 0x84, 0xcb, 0x20, 0x3c, 0xf7, 0xba, 0x45, 0xd4, 0x00, 0x88, 0xb5, 0xfc, 0xb7, 0xfa, + 0x03, 0xb5, 0xac, 0x95, 0x77, 0xcf, 0x63, 0x2d, 0x56, 0xfc, 0x41, 0x02, 0xf3, 0xbd, 0x5b, 0xe2, + 0x87, 0x03, 0x48, 0xa6, 0x97, 0xb3, 0xb2, 0x79, 0x09, 0x67, 0x11, 0xdf, 0x23, 0x30, 0x91, 0x68, + 0x33, 0x6f, 0xf7, 0x87, 0x6d, 0xf7, 0x50, 0xde, 0x3f, 0xaf, 0x87, 0x58, 0xfd, 0x89, 0x04, 0x5e, + 0x8f, 0x17, 0x28, 0x79, 0x00, 0x19, 0x77, 0x2d, 0x68, 0xca, 0xc6, 0x05, 0x1d, 0x45, 0x28, 0x3f, + 0x4a, 0xe0, 0xe6, 0x59, 0xd5, 0xec, 0xa3, 0x01, 0x36, 0xd9, 0xdb, 0x5d, 0xb9, 0x77, 0x29, 0xf7, + 0x28, 0xca, 0xc2, 0x97, 0xcf, 0x8e, 0xb3, 0xd2, 0xf3, 0xe3, 0xac, 0xf4, 0xcf, 0x71, 0x56, 0x7a, + 0x7a, 0x92, 0x4d, 0x3d, 0x3f, 0xc9, 0xa6, 0xfe, 0x38, 0xc9, 0xa6, 0xbe, 0xda, 0x88, 0x7d, 0x0e, + 0xa2, 0x87, 0x4e, 0x3d, 0xf8, 0x90, 0x44, 0xd8, 0xcc, 0x87, 0xcb, 0x22, 0xbf, 0xb1, 0xc2, 0x97, + 0x5c, 0x71, 0x89, 0x55, 0x77, 0x60, 0xfe, 0x30, 0xfa, 0x17, 0x28, 0xfc, 0x56, 0xac, 0x8c, 0xb0, + 0xdb, 0xde, 0x3b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x71, 0xf3, 0x21, 0xa4, 0xf3, 0x12, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -814,6 +905,11 @@ type MsgClient interface { // Undelegate defines a method for performing an undelegation from a // delegate and a validator. Undelegate(ctx context.Context, in *MsgUndelegate, opts ...grpc.CallOption) (*MsgUndelegateResponse, error) + // CancelUnbondingDelegation defines a method for performing canceling the unbonding delegation + // and delegate back to previous validator. + // + // Since: cosmos-sdk 0.46 + CancelUnbondingDelegation(ctx context.Context, in *MsgCancelUnbondingDelegation, opts ...grpc.CallOption) (*MsgCancelUnbondingDelegationResponse, error) // TokenizeShares defines a method for tokenizing shares from a validator. TokenizeShares(ctx context.Context, in *MsgTokenizeShares, opts ...grpc.CallOption) (*MsgTokenizeSharesResponse, error) // RedeemTokens defines a method for redeeming tokens from a validator for @@ -877,6 +973,15 @@ func (c *msgClient) Undelegate(ctx context.Context, in *MsgUndelegate, opts ...g return out, nil } +func (c *msgClient) CancelUnbondingDelegation(ctx context.Context, in *MsgCancelUnbondingDelegation, opts ...grpc.CallOption) (*MsgCancelUnbondingDelegationResponse, error) { + out := new(MsgCancelUnbondingDelegationResponse) + err := c.cc.Invoke(ctx, "/liquidstaking.staking.v1beta1.Msg/CancelUnbondingDelegation", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *msgClient) TokenizeShares(ctx context.Context, in *MsgTokenizeShares, opts ...grpc.CallOption) (*MsgTokenizeSharesResponse, error) { out := new(MsgTokenizeSharesResponse) err := c.cc.Invoke(ctx, "/liquidstaking.staking.v1beta1.Msg/TokenizeShares", in, out, opts...) @@ -919,6 +1024,11 @@ type MsgServer interface { // Undelegate defines a method for performing an undelegation from a // delegate and a validator. Undelegate(context.Context, *MsgUndelegate) (*MsgUndelegateResponse, error) + // CancelUnbondingDelegation defines a method for performing canceling the unbonding delegation + // and delegate back to previous validator. + // + // Since: cosmos-sdk 0.46 + CancelUnbondingDelegation(context.Context, *MsgCancelUnbondingDelegation) (*MsgCancelUnbondingDelegationResponse, error) // TokenizeShares defines a method for tokenizing shares from a validator. TokenizeShares(context.Context, *MsgTokenizeShares) (*MsgTokenizeSharesResponse, error) // RedeemTokens defines a method for redeeming tokens from a validator for @@ -948,6 +1058,9 @@ func (*UnimplementedMsgServer) BeginRedelegate(ctx context.Context, req *MsgBegi func (*UnimplementedMsgServer) Undelegate(ctx context.Context, req *MsgUndelegate) (*MsgUndelegateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Undelegate not implemented") } +func (*UnimplementedMsgServer) CancelUnbondingDelegation(ctx context.Context, req *MsgCancelUnbondingDelegation) (*MsgCancelUnbondingDelegationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CancelUnbondingDelegation not implemented") +} func (*UnimplementedMsgServer) TokenizeShares(ctx context.Context, req *MsgTokenizeShares) (*MsgTokenizeSharesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TokenizeShares not implemented") } @@ -1052,6 +1165,24 @@ func _Msg_Undelegate_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _Msg_CancelUnbondingDelegation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCancelUnbondingDelegation) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CancelUnbondingDelegation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/liquidstaking.staking.v1beta1.Msg/CancelUnbondingDelegation", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CancelUnbondingDelegation(ctx, req.(*MsgCancelUnbondingDelegation)) + } + return interceptor(ctx, in, info, handler) +} + func _Msg_TokenizeShares_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MsgTokenizeShares) if err := dec(in); err != nil { @@ -1130,6 +1261,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "Undelegate", Handler: _Msg_Undelegate_Handler, }, + { + MethodName: "CancelUnbondingDelegation", + Handler: _Msg_CancelUnbondingDelegation_Handler, + }, { MethodName: "TokenizeShares", Handler: _Msg_TokenizeShares_Handler, @@ -1579,6 +1714,81 @@ func (m *MsgUndelegateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *MsgCancelUnbondingDelegation) 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 *MsgCancelUnbondingDelegation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCancelUnbondingDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CreationHeight != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.CreationHeight)) + i-- + dAtA[i] = 0x20 + } + { + size, err := m.Amount.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.ValidatorAddress) > 0 { + i -= len(m.ValidatorAddress) + copy(dAtA[i:], m.ValidatorAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.ValidatorAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCancelUnbondingDelegationResponse) 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 *MsgCancelUnbondingDelegationResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCancelUnbondingDelegationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *MsgTokenizeShares) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1977,6 +2187,37 @@ func (m *MsgUndelegateResponse) Size() (n int) { return n } +func (m *MsgCancelUnbondingDelegation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ValidatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Amount.Size() + n += 1 + l + sovTx(uint64(l)) + if m.CreationHeight != 0 { + n += 1 + sovTx(uint64(m.CreationHeight)) + } + return n +} + +func (m *MsgCancelUnbondingDelegationResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *MsgTokenizeShares) Size() (n int) { if m == nil { return 0 @@ -2340,10 +2581,7 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -2393,10 +2631,7 @@ func (m *MsgCreateValidatorResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -2583,10 +2818,7 @@ func (m *MsgEditValidator) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -2636,10 +2868,7 @@ func (m *MsgEditValidatorResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -2786,10 +3015,7 @@ func (m *MsgDelegate) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -2839,10 +3065,7 @@ func (m *MsgDelegateResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3021,10 +3244,7 @@ func (m *MsgBeginRedelegate) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3107,10 +3327,7 @@ func (m *MsgBeginRedelegateResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3257,10 +3474,7 @@ func (m *MsgUndelegate) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3343,10 +3557,223 @@ func (m *MsgUndelegateResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCancelUnbondingDelegation) 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: MsgCancelUnbondingDelegation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCancelUnbondingDelegation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", 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.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", 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.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", 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 err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreationHeight", wireType) + } + m.CreationHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CreationHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } - if (iNdEx + skippy) < 0 { + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCancelUnbondingDelegationResponse) 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: MsgCancelUnbondingDelegationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCancelUnbondingDelegationResponse: 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) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3525,10 +3952,7 @@ func (m *MsgTokenizeShares) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3611,10 +4035,7 @@ func (m *MsgTokenizeSharesResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3729,10 +4150,7 @@ func (m *MsgRedeemTokensforShares) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3815,10 +4233,7 @@ func (m *MsgRedeemTokensforSharesResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -3951,10 +4366,7 @@ func (m *MsgTransferTokenizeShareRecord) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { @@ -4004,10 +4416,7 @@ func (m *MsgTransferTokenizeShareRecordResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTx } if (iNdEx + skippy) > l { From d0e1fc48b6c100622a7107b59be79b983fc3c0b0 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Mon, 25 Jul 2022 23:41:19 +0800 Subject: [PATCH 37/57] line by line code updates for slashing module --- x/slashing/{ => keeper}/genesis.go | 12 +++---- x/slashing/{ => keeper}/genesis_test.go | 8 ++--- x/slashing/keeper/hooks.go | 25 ++++++++++---- x/slashing/keeper/infractions.go | 3 +- x/slashing/keeper/keeper_test.go | 45 +++++++++++++------------ x/slashing/keeper/signing_info.go | 8 ++--- x/slashing/module.go | 4 +-- 7 files changed, 59 insertions(+), 46 deletions(-) rename x/slashing/{ => keeper}/genesis.go (83%) rename x/slashing/{ => keeper}/genesis_test.go (90%) diff --git a/x/slashing/genesis.go b/x/slashing/keeper/genesis.go similarity index 83% rename from x/slashing/genesis.go rename to x/slashing/keeper/genesis.go index 1d015962..621b647c 100644 --- a/x/slashing/genesis.go +++ b/x/slashing/keeper/genesis.go @@ -1,25 +1,21 @@ -package slashing +package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" ) // InitGenesis initialize default parameters // and the keeper's address to pubkey map -func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, stakingKeeper types.StakingKeeper, data *types.GenesisState) { +func (keeper Keeper) InitGenesis(ctx sdk.Context, stakingKeeper types.StakingKeeper, data *types.GenesisState) { stakingKeeper.IterateValidators(ctx, func(index int64, validator sdkstaking.ValidatorI) bool { consPk, err := validator.ConsPubKey() if err != nil { panic(err) } - err = keeper.AddPubkey(ctx, consPk) - if err != nil { - panic(err) - } + keeper.AddPubkey(ctx, consPk) return false }, ) @@ -48,7 +44,7 @@ func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, stakingKeeper types.Stak // ExportGenesis writes the current store values // to a genesis file, which can be imported again // with InitGenesis -func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) (data *types.GenesisState) { +func (keeper Keeper) ExportGenesis(ctx sdk.Context) (data *types.GenesisState) { params := keeper.GetParams(ctx) signingInfos := make([]types.SigningInfo, 0) missedBlocks := make([]types.ValidatorMissedBlocks, 0) diff --git a/x/slashing/genesis_test.go b/x/slashing/keeper/genesis_test.go similarity index 90% rename from x/slashing/genesis_test.go rename to x/slashing/keeper/genesis_test.go index efae2535..aebc6194 100644 --- a/x/slashing/genesis_test.go +++ b/x/slashing/keeper/genesis_test.go @@ -1,4 +1,4 @@ -package slashing_test +package keeper_test import ( "testing" @@ -9,7 +9,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" - "github.com/iqlusioninc/liquidity-staking-module/x/slashing" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/testslashing" "github.com/iqlusioninc/liquidity-staking-module/x/slashing/types" ) @@ -29,7 +28,7 @@ func TestExportAndInitGenesis(t *testing.T) { app.SlashingKeeper.SetValidatorSigningInfo(ctx, sdk.ConsAddress(addrDels[0]), info1) app.SlashingKeeper.SetValidatorSigningInfo(ctx, sdk.ConsAddress(addrDels[1]), info2) - genesisState := slashing.ExportGenesis(ctx, app.SlashingKeeper) + genesisState := app.SlashingKeeper.ExportGenesis(ctx) require.Equal(t, genesisState.Params, testslashing.TestParams()) require.Len(t, genesisState.SigningInfos, 2) @@ -45,7 +44,8 @@ func TestExportAndInitGenesis(t *testing.T) { newInfo1, ok := app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(addrDels[0])) require.NotEqual(t, info1, newInfo1) // Initialise genesis with genesis state before tombstone - slashing.InitGenesis(ctx, app.SlashingKeeper, app.StakingKeeper, genesisState) + + app.SlashingKeeper.InitGenesis(ctx, app.StakingKeeper, genesisState) // Validator isTombstoned should return false as GenesisState is initialised ok = app.SlashingKeeper.IsTombstoned(ctx, sdk.ConsAddress(addrDels[0])) diff --git a/x/slashing/keeper/hooks.go b/x/slashing/keeper/hooks.go index 36363f7d..36f72f6c 100644 --- a/x/slashing/keeper/hooks.go +++ b/x/slashing/keeper/hooks.go @@ -11,9 +11,11 @@ import ( func (k Keeper) AfterValidatorBonded(ctx sdk.Context, address sdk.ConsAddress, _ sdk.ValAddress) error { // Update the signing info start height or create a new signing info - _, found := k.GetValidatorSigningInfo(ctx, address) - if !found { - signingInfo := types.NewValidatorSigningInfo( + signingInfo, found := k.GetValidatorSigningInfo(ctx, address) + if found { + signingInfo.StartHeight = ctx.BlockHeight() + } else { + signingInfo = types.NewValidatorSigningInfo( address, ctx.BlockHeight(), 0, @@ -21,9 +23,10 @@ func (k Keeper) AfterValidatorBonded(ctx sdk.Context, address sdk.ConsAddress, _ false, 0, ) - k.SetValidatorSigningInfo(ctx, address, signingInfo) } + k.SetValidatorSigningInfo(ctx, address, signingInfo) + return nil } @@ -79,17 +82,27 @@ func (h Hooks) BeforeTokenizeShareRecordRemoved(ctx sdk.Context, recordId uint64 func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) error { return nil } -func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) error { return nil } + +func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) error { + return nil +} + func (h Hooks) BeforeDelegationCreated(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { return nil } + func (h Hooks) BeforeDelegationSharesModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { return nil } + func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { return nil } + func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { return nil } -func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) error { return nil } + +func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) error { + return nil +} diff --git a/x/slashing/keeper/infractions.go b/x/slashing/keeper/infractions.go index a00f3dd7..9375531d 100644 --- a/x/slashing/keeper/infractions.go +++ b/x/slashing/keeper/infractions.go @@ -84,6 +84,7 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre // That's fine since this is just used to filter unbonding delegations & redelegations. distributionHeight := height - sdk.ValidatorUpdateDelay - 1 + coinsBurned := k.sk.Slash(ctx, consAddr, distributionHeight, power, k.SlashFractionDowntime(ctx)) ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, @@ -91,9 +92,9 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre sdk.NewAttribute(types.AttributeKeyPower, fmt.Sprintf("%d", power)), sdk.NewAttribute(types.AttributeKeyReason, types.AttributeValueMissingSignature), sdk.NewAttribute(types.AttributeKeyJailed, consAddr.String()), + sdk.NewAttribute(types.AttributeKeyBurnedCoins, coinsBurned.String()), ), ) - k.sk.Slash(ctx, consAddr, distributionHeight, power, k.SlashFractionDowntime(ctx)) k.sk.Jail(ctx, consAddr) signInfo.JailedUntil = ctx.BlockHeader().Time.Add(k.DowntimeJailDuration(ctx)) diff --git a/x/slashing/keeper/keeper_test.go b/x/slashing/keeper/keeper_test.go index c5169c91..421efbf7 100644 --- a/x/slashing/keeper/keeper_test.go +++ b/x/slashing/keeper/keeper_test.go @@ -179,7 +179,6 @@ func TestHandleAlreadyJailed(t *testing.T) { // Ensure that missed blocks are tracked correctly and that // the start height of the signing info is reset correctly func TestValidatorDippingInAndOut(t *testing.T) { - // initial setup // TestParams set the SignedBlocksWindow to 1000 and MaxMissedBlocksPerWindow to 500 app := simapp.Setup(t, false) @@ -200,7 +199,9 @@ func TestValidatorDippingInAndOut(t *testing.T) { valAddr := sdk.ValAddress(addr) tstaking.CreateValidatorWithValPower(valAddr, val, power, true) - staking.EndBlocker(ctx, app.StakingKeeper) + validatorUpdates := staking.EndBlocker(ctx, app.StakingKeeper) + require.Equal(t, 2, len(validatorUpdates)) + tstaking.CheckValidator(valAddr, sdkstaking.Bonded, false) // 100 first blocks OK height := int64(0) @@ -210,22 +211,23 @@ func TestValidatorDippingInAndOut(t *testing.T) { } // kick first validator out of validator set - tstaking.CreateValidatorWithValPower(sdk.ValAddress(pks[1].Address()), pks[1], 101, true) - validatorUpdates := staking.EndBlocker(ctx, app.StakingKeeper) + tstaking.CreateValidatorWithValPower(sdk.ValAddress(pks[1].Address()), pks[1], power+1, true) + validatorUpdates = staking.EndBlocker(ctx, app.StakingKeeper) require.Equal(t, 2, len(validatorUpdates)) + tstaking.CheckValidator(sdk.ValAddress(pks[1].Address()), sdkstaking.Bonded, false) tstaking.CheckValidator(valAddr, sdkstaking.Unbonding, false) // 600 more blocks happened - height = 700 + height = height + 600 ctx = ctx.WithBlockHeight(height) // validator added back in - tstaking.DelegateWithPower(sdk.AccAddress(pks[2].Address()), sdk.ValAddress(pks[0].Address()), 50) + tstaking.DelegateWithPower(sdk.AccAddress(pks[2].Address()), valAddr, 50) validatorUpdates = staking.EndBlocker(ctx, app.StakingKeeper) require.Equal(t, 2, len(validatorUpdates)) tstaking.CheckValidator(valAddr, sdkstaking.Bonded, false) - newPower := int64(150) + newPower := power + 50 // validator misses a block app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), newPower, false) @@ -234,9 +236,9 @@ func TestValidatorDippingInAndOut(t *testing.T) { // shouldn't be jailed/kicked yet tstaking.CheckValidator(valAddr, sdkstaking.Bonded, false) - // validator misses 500 more blocks, 501 total - latest := height - for ; height < latest+500; height++ { + // validator misses an additional 500 more blocks, after the cooling off period of SignedBlockWindow (here 1000 blocks). + latest := app.SlashingKeeper.SignedBlocksWindow(ctx) + height + for ; height < latest+app.SlashingKeeper.MinSignedPerWindow(ctx); height++ { ctx = ctx.WithBlockHeight(height) app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), newPower, false) } @@ -248,13 +250,9 @@ func TestValidatorDippingInAndOut(t *testing.T) { // check all the signing information signInfo, found := app.SlashingKeeper.GetValidatorSigningInfo(ctx, consAddr) require.True(t, found) - require.Equal(t, int64(0), signInfo.MissedBlocksCounter) - require.Equal(t, int64(0), signInfo.IndexOffset) - // array should be cleared - for offset := int64(0); offset < app.SlashingKeeper.SignedBlocksWindow(ctx); offset++ { - missed := app.SlashingKeeper.GetValidatorMissedBlockBitArray(ctx, consAddr, offset) - require.False(t, missed) - } + require.Equal(t, int64(700), signInfo.StartHeight) + require.Equal(t, int64(499), signInfo.MissedBlocksCounter) + require.Equal(t, int64(499), signInfo.IndexOffset) // some blocks pass height = int64(5000) @@ -262,16 +260,21 @@ func TestValidatorDippingInAndOut(t *testing.T) { // validator rejoins and starts signing again app.StakingKeeper.Unjail(ctx, consAddr) + app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), newPower, true) - height++ // validator should not be kicked since we reset counter/array when it was jailed staking.EndBlocker(ctx, app.StakingKeeper) tstaking.CheckValidator(valAddr, sdkstaking.Bonded, false) - // validator misses 501 blocks - latest = height - for ; height < latest+501; height++ { + // check start height is correctly set + signInfo, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, consAddr) + require.True(t, found) + require.Equal(t, height, signInfo.StartHeight) + + // validator misses 501 blocks after SignedBlockWindow period (1000 blocks) + latest = app.SlashingKeeper.SignedBlocksWindow(ctx) + height + for ; height < latest+app.SlashingKeeper.MinSignedPerWindow(ctx); height++ { ctx = ctx.WithBlockHeight(height) app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), newPower, false) } diff --git a/x/slashing/keeper/signing_info.go b/x/slashing/keeper/signing_info.go index 15e8b58e..4479da7c 100644 --- a/x/slashing/keeper/signing_info.go +++ b/x/slashing/keeper/signing_info.go @@ -39,8 +39,8 @@ func (k Keeper) SetValidatorSigningInfo(ctx sdk.Context, address sdk.ConsAddress // IterateValidatorSigningInfos iterates over the stored ValidatorSigningInfo func (k Keeper) IterateValidatorSigningInfos(ctx sdk.Context, - handler func(address sdk.ConsAddress, info types.ValidatorSigningInfo) (stop bool)) { - + handler func(address sdk.ConsAddress, info types.ValidatorSigningInfo) (stop bool), +) { store := ctx.KVStore(k.storeKey) iter := sdk.KVStorePrefixIterator(store, types.ValidatorSigningInfoKeyPrefix) defer iter.Close() @@ -71,8 +71,8 @@ func (k Keeper) GetValidatorMissedBlockBitArray(ctx sdk.Context, address sdk.Con // IterateValidatorMissedBlockBitArray iterates over the signed blocks window // and performs a callback function func (k Keeper) IterateValidatorMissedBlockBitArray(ctx sdk.Context, - address sdk.ConsAddress, handler func(index int64, missed bool) (stop bool)) { - + address sdk.ConsAddress, handler func(index int64, missed bool) (stop bool), +) { store := ctx.KVStore(k.storeKey) index := int64(0) // Array may be sparse diff --git a/x/slashing/module.go b/x/slashing/module.go index 93b27951..5cb2b375 100644 --- a/x/slashing/module.go +++ b/x/slashing/module.go @@ -151,14 +151,14 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, am.stakingKeeper, &genesisState) + am.keeper.InitGenesis(ctx, am.stakingKeeper, &genesisState) return []abci.ValidatorUpdate{} } // ExportGenesis returns the exported genesis state as raw bytes for the slashing // module. func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) + gs := am.keeper.ExportGenesis(ctx) return cdc.MustMarshalJSON(gs) } From 47601403c82620af433dc0081e1f20ffe2e2cc73 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Mon, 25 Jul 2022 23:59:15 +0800 Subject: [PATCH 38/57] distribution line by line check and fix --- x/distribution/keeper/allocation.go | 1 - x/distribution/keeper/delegation.go | 3 ++- x/distribution/keeper/genesis.go | 17 ++++------------- x/distribution/keeper/hooks.go | 2 ++ x/distribution/keeper/keeper.go | 3 --- x/distribution/keeper/proposal_handler.go | 1 - x/distribution/keeper/store.go | 3 ++- 7 files changed, 10 insertions(+), 20 deletions(-) diff --git a/x/distribution/keeper/allocation.go b/x/distribution/keeper/allocation.go index 2ac7d7d8..59981e86 100644 --- a/x/distribution/keeper/allocation.go +++ b/x/distribution/keeper/allocation.go @@ -17,7 +17,6 @@ func (k Keeper) AllocateTokens( ctx sdk.Context, sumPreviousPrecommitPower, totalPreviousPower int64, previousProposer sdk.ConsAddress, bondedVotes []abci.VoteInfo, ) { - logger := k.Logger(ctx) // fetch and clear the collected fees for distribution, since this is diff --git a/x/distribution/keeper/delegation.go b/x/distribution/keeper/delegation.go index d1a276bb..9fb4611f 100644 --- a/x/distribution/keeper/delegation.go +++ b/x/distribution/keeper/delegation.go @@ -30,7 +30,8 @@ func (k Keeper) initializeDelegation(ctx sdk.Context, val sdk.ValAddress, del sd // calculate the rewards accrued by a delegation between two periods func (k Keeper) calculateDelegationRewardsBetween(ctx sdk.Context, val sdkstaking.ValidatorI, - startingPeriod, endingPeriod uint64, stake sdk.Dec) (rewards sdk.DecCoins) { + startingPeriod, endingPeriod uint64, stake sdk.Dec, +) (rewards sdk.DecCoins) { // sanity check if startingPeriod > endingPeriod { panic("startingPeriod cannot be greater than endingPeriod") diff --git a/x/distribution/keeper/genesis.go b/x/distribution/keeper/genesis.go index bbf02469..a6a42e57 100644 --- a/x/distribution/keeper/genesis.go +++ b/x/distribution/keeper/genesis.go @@ -15,15 +15,8 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { k.SetParams(ctx, data.Params) for _, dwi := range data.DelegatorWithdrawInfos { - delegatorAddress, err := sdk.AccAddressFromBech32(dwi.DelegatorAddress) - if err != nil { - panic(err) - } - withdrawAddress, err := sdk.AccAddressFromBech32(dwi.WithdrawAddress) - if err != nil { - panic(err) - } - + delegatorAddress := sdk.MustAccAddressFromBech32(dwi.DelegatorAddress) + withdrawAddress := sdk.MustAccAddressFromBech32(dwi.WithdrawAddress) k.SetDelegatorWithdrawAddr(ctx, delegatorAddress, withdrawAddress) } @@ -72,10 +65,8 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { if err != nil { panic(err) } - delegatorAddress, err := sdk.AccAddressFromBech32(del.DelegatorAddress) - if err != nil { - panic(err) - } + delegatorAddress := sdk.MustAccAddressFromBech32(del.DelegatorAddress) + k.SetDelegatorStartingInfo(ctx, valAddr, delegatorAddress, del.StartingInfo) } for _, evt := range data.ValidatorSlashEvents { diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index 1c324931..1cdebfa2 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -121,9 +121,11 @@ func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) error { func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) error { return nil } + func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) error { return nil } + func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { return nil } diff --git a/x/distribution/keeper/keeper.go b/x/distribution/keeper/keeper.go index cb68db69..cfd535a8 100644 --- a/x/distribution/keeper/keeper.go +++ b/x/distribution/keeper/keeper.go @@ -23,8 +23,6 @@ type Keeper struct { bankKeeper types.BankKeeper stakingKeeper types.StakingKeeper - blockedAddrs map[string]bool - feeCollectorName string // name of the FeeCollector ModuleAccount } @@ -34,7 +32,6 @@ func NewKeeper( ak types.AccountKeeper, bk types.BankKeeper, sk types.StakingKeeper, feeCollectorName string, ) Keeper { - // ensure distribution module account is set if addr := ak.GetModuleAddress(types.ModuleName); addr == nil { panic(fmt.Sprintf("%s module account has not been set", types.ModuleName)) diff --git a/x/distribution/keeper/proposal_handler.go b/x/distribution/keeper/proposal_handler.go index ecbf75a0..262fa916 100644 --- a/x/distribution/keeper/proposal_handler.go +++ b/x/distribution/keeper/proposal_handler.go @@ -8,7 +8,6 @@ import ( // HandleCommunityPoolSpendProposal is a handler for executing a passed community spend proposal func HandleCommunityPoolSpendProposal(ctx sdk.Context, k Keeper, p *types.CommunityPoolSpendProposal) error { - recipient, addrErr := sdk.AccAddressFromBech32(p.Recipient) if addrErr != nil { return addrErr diff --git a/x/distribution/keeper/store.go b/x/distribution/keeper/store.go index 107b9481..d608d878 100644 --- a/x/distribution/keeper/store.go +++ b/x/distribution/keeper/store.go @@ -331,7 +331,8 @@ func (k Keeper) SetValidatorSlashEvent(ctx sdk.Context, val sdk.ValAddress, heig // iterate over slash events between heights, inclusive func (k Keeper) IterateValidatorSlashEventsBetween(ctx sdk.Context, val sdk.ValAddress, startingHeight uint64, endingHeight uint64, - handler func(height uint64, event types.ValidatorSlashEvent) (stop bool)) { + handler func(height uint64, event types.ValidatorSlashEvent) (stop bool), +) { store := ctx.KVStore(k.storeKey) iter := store.Iterator( types.GetValidatorSlashEventKeyPrefix(val, startingHeight), From 0d0930c6f3f6cdeceb9f34857b4c13b60f532bbe Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 26 Jul 2022 21:35:50 +0800 Subject: [PATCH 39/57] protobuf changes --- proto/staking/v1beta1/staking.proto | 15 +- proto/staking/v1beta1/tx.proto | 13 +- x/staking/types/msg.go | 7 + x/staking/types/staking.pb.go | 1758 ++++++++++++++------------- x/staking/types/tx.pb.go | 481 ++++++-- 5 files changed, 1329 insertions(+), 945 deletions(-) diff --git a/proto/staking/v1beta1/staking.proto b/proto/staking/v1beta1/staking.proto index d8960e09..77b72802 100644 --- a/proto/staking/v1beta1/staking.proto +++ b/proto/staking/v1beta1/staking.proto @@ -111,10 +111,15 @@ message Validator { [(gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"unbonding_time\""]; // commission defines the commission parameters. Commission commission = 10 [(gogoproto.nullable) = false]; - // min_self_delegation is the validator's self declared minimum self delegation. - string min_self_delegation = 11 [ - (gogoproto.moretags) = "yaml:\"min_self_delegation\"", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + // Number of shares marked_exempt_to_this_validator + string total_exempt_shares = 11[ + (gogoproto.moretags) = "yaml:\"total_exempt_shares\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false + ]; + string total_tokenized_shares = 12[ + (gogoproto.moretags) = "yaml:\"total_tokenized_shares\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false ]; } @@ -191,6 +196,8 @@ message Delegation { string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; // shares define the delegation shares received. string shares = 3 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; + // has this delegation been marked as exempt. + bool exempt = 4; } // UnbondingDelegation stores all of a single delegator's unbonding bonds diff --git a/proto/staking/v1beta1/tx.proto b/proto/staking/v1beta1/tx.proto index 36b86cf8..862106f4 100644 --- a/proto/staking/v1beta1/tx.proto +++ b/proto/staking/v1beta1/tx.proto @@ -203,4 +203,15 @@ message MsgTransferTokenizeShareRecord { string new_owner = 3; } -message MsgTransferTokenizeShareRecordResponse {} \ No newline at end of file +message MsgTransferTokenizeShareRecordResponse {} + +// MsgExemptDelegation defines a SDK message for performing exemption of delegated coins +// from a delegator to a validator. +message MsgExemptDelegation { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; + string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; +} +message MsgExemptDelegationResponse {} diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index cb90ef51..39a9f598 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -504,3 +504,10 @@ func (msg MsgCancelUnbondingDelegation) ValidateBasic() error { return nil } + +// Core business logic +// Remove min self delegation from the code base and all logic that uses it. +// MsgTokenizeShares must check the total exempt delegation from the validator, the governance parameter and the total tokenized shares to see if a tokenization is permitted +// MsgExemptDelegation increases the sum of total exempt delegation. +// Calls to MsgRedelegate a Delegation that is Exempt always fails. +// Calls to MsgUndelegate must check if the (exempt_shares - undelegated shares) * exemption_factor >= total_tokeniz_shares diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 0b339437..059ef64b 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -333,8 +333,9 @@ type Validator struct { UnbondingTime time.Time `protobuf:"bytes,9,opt,name=unbonding_time,json=unbondingTime,proto3,stdtime" json:"unbonding_time" yaml:"unbonding_time"` // commission defines the commission parameters. Commission Commission `protobuf:"bytes,10,opt,name=commission,proto3" json:"commission"` - // min_self_delegation is the validator's self declared minimum self delegation. - MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation" yaml:"min_self_delegation"` + // Number of shares marked_exempt_to_this_validator + TotalExemptShares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,11,opt,name=total_exempt_shares,json=totalExemptShares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"total_exempt_shares" yaml:"total_exempt_shares"` + TotalTokenizedShares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,12,opt,name=total_tokenized_shares,json=totalTokenizedShares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"total_tokenized_shares" yaml:"total_tokenized_shares"` } func (m *Validator) Reset() { *m = Validator{} } @@ -595,6 +596,8 @@ type Delegation struct { ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` // shares define the delegation shares received. Shares github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=shares,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares"` + // has this delegation been marked as exempt. + Exempt bool `protobuf:"varint,4,opt,name=exempt,proto3" json:"exempt,omitempty"` } func (m *Delegation) Reset() { *m = Delegation{} } @@ -1208,125 +1211,128 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/staking.proto", fileDescriptor_76a7656dabf68054) } var fileDescriptor_76a7656dabf68054 = []byte{ - // 1881 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x76, 0x3b, 0x9e, 0xc4, 0x7e, 0x4e, 0xe2, 0xa4, 0x26, 0xb3, 0xeb, 0x31, 0x33, 0xb6, 0x69, - 0x69, 0x57, 0x99, 0x85, 0xb1, 0xd9, 0xac, 0xb4, 0xc0, 0x5c, 0x50, 0x1c, 0x67, 0x48, 0xd8, 0x61, - 0x36, 0xea, 0xfc, 0x2c, 0x2c, 0x48, 0x56, 0xb9, 0xbb, 0xe2, 0x14, 0x69, 0x77, 0x7b, 0xba, 0xca, - 0xb3, 0x31, 0xda, 0x03, 0x27, 0xb4, 0x1a, 0x09, 0x31, 0x70, 0xda, 0xcb, 0x48, 0x23, 0x71, 0x43, - 0x48, 0x5c, 0x10, 0x77, 0x6e, 0x0b, 0x12, 0xd2, 0x88, 0xd3, 0x0a, 0x21, 0x83, 0x66, 0x84, 0x84, - 0x38, 0xa1, 0x9c, 0xb8, 0x81, 0xea, 0xa7, 0x7f, 0xd2, 0x9e, 0xdd, 0x8c, 0xa3, 0x3d, 0xac, 0x04, - 0x97, 0xc4, 0xf5, 0xea, 0xbd, 0xef, 0x55, 0xbd, 0xbf, 0x7a, 0xaf, 0xe1, 0x3a, 0xe3, 0xf8, 0x98, - 0x7a, 0xbd, 0xe6, 0xfd, 0xd7, 0xbb, 0x84, 0xe3, 0xd7, 0x9b, 0x7a, 0xdd, 0x18, 0x04, 0x3e, 0xf7, - 0xd1, 0x75, 0x97, 0xde, 0x1b, 0x52, 0x27, 0x24, 0x86, 0xff, 0x35, 0x73, 0x65, 0xa5, 0xe7, 0xf7, - 0x7c, 0xc9, 0xd9, 0x14, 0xbf, 0x94, 0x50, 0xe5, 0x6a, 0xcf, 0xf7, 0x7b, 0x2e, 0x69, 0xca, 0x55, - 0x77, 0x78, 0xd8, 0xc4, 0xde, 0x48, 0x6f, 0x55, 0xd3, 0x5b, 0xce, 0x30, 0xc0, 0x9c, 0xfa, 0x9e, - 0xde, 0xaf, 0xa5, 0xf7, 0x39, 0xed, 0x13, 0xc6, 0x71, 0x7f, 0x10, 0x62, 0xdb, 0x3e, 0xeb, 0xfb, - 0xac, 0xa3, 0x94, 0xaa, 0x45, 0x88, 0xad, 0x56, 0xcd, 0x2e, 0x66, 0x24, 0xba, 0x8e, 0xed, 0xd3, - 0x10, 0xfb, 0x1a, 0x27, 0x9e, 0x43, 0x82, 0x3e, 0xf5, 0x78, 0x93, 0x8f, 0x06, 0x84, 0xa9, 0xbf, - 0x6a, 0xd7, 0x7c, 0x68, 0xc0, 0xe2, 0x16, 0x65, 0xdc, 0x0f, 0xa8, 0x8d, 0xdd, 0x6d, 0xef, 0xd0, - 0x47, 0x6f, 0xc2, 0xec, 0x11, 0xc1, 0x0e, 0x09, 0xca, 0x46, 0xdd, 0x58, 0x2d, 0xae, 0x95, 0x1b, - 0x31, 0x42, 0x43, 0xc9, 0x6e, 0xc9, 0xfd, 0x56, 0xee, 0xa3, 0x71, 0x2d, 0x63, 0x69, 0x6e, 0x74, - 0x1b, 0x66, 0xef, 0x63, 0x97, 0x11, 0x5e, 0xce, 0xd6, 0x67, 0x56, 0x8b, 0x6b, 0xab, 0x8d, 0x4f, - 0xb5, 0x62, 0xe3, 0x00, 0xbb, 0xd4, 0xc1, 0xdc, 0x8f, 0x70, 0x94, 0xb4, 0xf9, 0xeb, 0x2c, 0x94, - 0x36, 0xfc, 0x7e, 0x9f, 0x32, 0x46, 0x7d, 0xcf, 0xc2, 0x9c, 0x30, 0xd4, 0x82, 0x5c, 0x80, 0x39, - 0x91, 0x27, 0x2a, 0xb4, 0x1a, 0x82, 0xff, 0xcf, 0xe3, 0xda, 0xab, 0x3d, 0xca, 0x8f, 0x86, 0xdd, - 0x86, 0xed, 0xf7, 0xb5, 0x4d, 0xf4, 0xbf, 0x9b, 0xcc, 0x39, 0xd6, 0xd7, 0x6c, 0x13, 0xdb, 0x92, - 0xb2, 0xe8, 0xfb, 0x90, 0xef, 0xe3, 0x93, 0x8e, 0xc4, 0xc9, 0x4a, 0x9c, 0xf5, 0xe9, 0x70, 0x4e, - 0xc7, 0xb5, 0xd2, 0x08, 0xf7, 0xdd, 0x5b, 0x66, 0x88, 0x63, 0x5a, 0x73, 0x7d, 0x7c, 0x22, 0x8e, - 0x88, 0x06, 0x50, 0x12, 0x54, 0xfb, 0x08, 0x7b, 0x3d, 0xa2, 0x94, 0xcc, 0x48, 0x25, 0x5b, 0x53, - 0x2b, 0x79, 0x29, 0x56, 0x92, 0x80, 0x33, 0xad, 0x85, 0x3e, 0x3e, 0xd9, 0x90, 0x04, 0xa1, 0xf1, - 0x56, 0xfe, 0xc3, 0xc7, 0xb5, 0xcc, 0x3f, 0x1e, 0xd7, 0x0c, 0xf3, 0x63, 0x03, 0x20, 0xb6, 0x18, - 0xb2, 0x61, 0xc9, 0x8e, 0x56, 0x52, 0x96, 0x69, 0x57, 0x36, 0xce, 0x71, 0x49, 0xca, 0xec, 0xad, - 0xbc, 0x38, 0xfb, 0x93, 0x71, 0xcd, 0xb0, 0x4a, 0x76, 0xca, 0x23, 0xdf, 0x83, 0xe2, 0x70, 0xe0, - 0x60, 0x4e, 0x3a, 0x22, 0x56, 0xa5, 0x41, 0x8b, 0x6b, 0x95, 0x86, 0x0a, 0xe4, 0x46, 0x18, 0xc8, - 0x8d, 0xbd, 0x30, 0x90, 0x5b, 0x55, 0x81, 0x75, 0x3a, 0xae, 0x21, 0x75, 0xbb, 0x84, 0xb0, 0xf9, - 0xf0, 0xaf, 0x35, 0xc3, 0x02, 0x45, 0x11, 0x02, 0x89, 0xab, 0xfd, 0xde, 0x80, 0x62, 0x9b, 0x30, - 0x3b, 0xa0, 0x03, 0x91, 0x2f, 0xa8, 0x0c, 0x73, 0x7d, 0xdf, 0xa3, 0xc7, 0x3a, 0x3a, 0x0b, 0x56, - 0xb8, 0x44, 0x15, 0xc8, 0x53, 0x87, 0x78, 0x9c, 0xf2, 0x91, 0x72, 0xaf, 0x15, 0xad, 0x85, 0xd4, - 0x7b, 0xa4, 0xcb, 0x68, 0xe8, 0x14, 0x2b, 0x5c, 0xa2, 0xdb, 0xb0, 0xc4, 0x88, 0x3d, 0x0c, 0x28, - 0x1f, 0x75, 0x6c, 0xdf, 0xe3, 0xd8, 0xe6, 0xe5, 0x9c, 0xf4, 0xdb, 0x17, 0x4e, 0xc7, 0xb5, 0x97, - 0xd5, 0x59, 0xd3, 0x1c, 0xa6, 0x55, 0x0a, 0x49, 0x1b, 0x8a, 0x22, 0x34, 0x38, 0x84, 0x63, 0xea, - 0xb2, 0xf2, 0x25, 0xa5, 0x41, 0x2f, 0x13, 0x77, 0xf9, 0xdd, 0x1c, 0x14, 0xa2, 0xa0, 0x17, 0x9a, - 0xfd, 0x01, 0x09, 0xc4, 0xef, 0x0e, 0x76, 0x9c, 0x80, 0x30, 0xa6, 0xc3, 0x3b, 0xa1, 0x39, 0xcd, - 0x61, 0x5a, 0xa5, 0x90, 0xb4, 0xae, 0x28, 0x88, 0x0b, 0x6f, 0x7b, 0x8c, 0x78, 0x6c, 0xc8, 0x3a, - 0x83, 0x61, 0xf7, 0x98, 0x8c, 0xb4, 0x37, 0x56, 0x26, 0xbc, 0xb1, 0xee, 0x8d, 0x5a, 0x6f, 0xc4, - 0xe8, 0x69, 0x39, 0xf3, 0x0f, 0xbf, 0xb9, 0xb9, 0xa2, 0x8b, 0x8b, 0x1d, 0x8c, 0x06, 0xdc, 0x6f, - 0xec, 0x0c, 0xbb, 0x6f, 0x91, 0x91, 0x70, 0xbf, 0x66, 0xdd, 0x91, 0x9c, 0xe8, 0x25, 0x98, 0xfd, - 0x01, 0xa6, 0x2e, 0x71, 0xa4, 0x41, 0xf3, 0x96, 0x5e, 0xa1, 0x75, 0x98, 0x65, 0x1c, 0xf3, 0x21, - 0x93, 0x56, 0x5c, 0x5c, 0xbb, 0x71, 0x4e, 0xc4, 0xb5, 0x7c, 0xcf, 0xd9, 0x95, 0x02, 0x96, 0x16, - 0x14, 0x75, 0x84, 0xfb, 0xc7, 0xc4, 0xd3, 0x96, 0x9c, 0x2a, 0xdb, 0xb7, 0x3d, 0x6e, 0x69, 0x69, - 0x61, 0x18, 0x87, 0xb8, 0xa4, 0x27, 0xed, 0xc7, 0x8e, 0x70, 0x40, 0x58, 0x79, 0x56, 0x22, 0x6e, - 0x4f, 0x9d, 0x92, 0xda, 0x60, 0x69, 0x3c, 0xd3, 0x2a, 0x45, 0xa4, 0x5d, 0x49, 0x41, 0x16, 0x14, - 0x9d, 0x38, 0x5e, 0xcb, 0x73, 0xd2, 0x13, 0xaf, 0x9d, 0x63, 0x85, 0x44, 0x84, 0xeb, 0x62, 0x98, - 0x04, 0x11, 0xa1, 0x32, 0xf4, 0xba, 0xbe, 0xe7, 0x50, 0xaf, 0xd7, 0x39, 0x22, 0xb4, 0x77, 0xc4, - 0xcb, 0xf9, 0xba, 0xb1, 0x3a, 0x93, 0x0c, 0x95, 0x34, 0x87, 0x69, 0x95, 0x22, 0xd2, 0x96, 0xa4, - 0x20, 0x07, 0x16, 0x63, 0x2e, 0x99, 0xb6, 0x85, 0x73, 0xd3, 0xf6, 0x8b, 0x3a, 0x6d, 0xaf, 0xa4, - 0xb5, 0xc4, 0x99, 0xbb, 0x10, 0x11, 0x85, 0x18, 0x7a, 0x1b, 0x20, 0x2e, 0x16, 0x65, 0x90, 0x1a, - 0x6e, 0xbc, 0x70, 0xe1, 0xd1, 0xf7, 0x4f, 0x40, 0xa0, 0xf7, 0xe1, 0x72, 0x9f, 0x7a, 0x1d, 0x46, - 0xdc, 0xc3, 0x8e, 0x36, 0xb7, 0x40, 0x2e, 0x4a, 0x5f, 0xde, 0x99, 0x2e, 0x3a, 0x4e, 0xc7, 0xb5, - 0x8a, 0x2e, 0xaf, 0x93, 0x90, 0xa6, 0xb5, 0xdc, 0xa7, 0xde, 0x2e, 0x71, 0x0f, 0xdb, 0x11, 0xed, - 0xd6, 0xfc, 0x07, 0x8f, 0x6b, 0x19, 0x9d, 0xc3, 0x19, 0xf3, 0x4d, 0x98, 0x3f, 0xc0, 0xae, 0xce, - 0x3d, 0xc2, 0xd0, 0x35, 0x28, 0xe0, 0x70, 0x51, 0x36, 0xea, 0x33, 0xab, 0x05, 0x2b, 0x26, 0xa8, - 0xdc, 0xff, 0xd1, 0x5f, 0xea, 0x86, 0xf9, 0x2b, 0x03, 0x66, 0xdb, 0x07, 0x3b, 0x98, 0x06, 0x68, - 0x1b, 0x96, 0xe3, 0x38, 0x3a, 0x9b, 0xf9, 0xd7, 0x4e, 0xc7, 0xb5, 0x72, 0x3a, 0xd4, 0xa2, 0xd4, - 0x8f, 0xc3, 0x39, 0xcc, 0xfd, 0x6d, 0x58, 0xbe, 0x1f, 0x16, 0x94, 0x08, 0x2a, 0x9b, 0x86, 0x9a, - 0x60, 0x31, 0xad, 0xa5, 0x88, 0xa6, 0xa1, 0x52, 0xd7, 0xbc, 0x03, 0x73, 0xea, 0xb4, 0x0c, 0xad, - 0xc3, 0xa5, 0x81, 0xf8, 0x21, 0x6f, 0x57, 0x5c, 0x7b, 0xe5, 0xbc, 0x50, 0x96, 0x62, 0xda, 0x8b, - 0x4a, 0xd2, 0xfc, 0x59, 0x16, 0xa0, 0x7d, 0x70, 0xb0, 0x17, 0xd0, 0x81, 0x4b, 0xf8, 0x67, 0x69, - 0x80, 0x3d, 0xb8, 0x12, 0xdf, 0x8e, 0x05, 0x76, 0xca, 0x08, 0xf5, 0xd3, 0x71, 0xed, 0x5a, 0xda, - 0x08, 0x09, 0x36, 0xd3, 0xba, 0x1c, 0xd1, 0x77, 0x03, 0xfb, 0xb9, 0xa8, 0x0e, 0xe3, 0x11, 0xea, - 0xcc, 0x27, 0xa3, 0x26, 0xd8, 0x92, 0xa8, 0x6d, 0xc6, 0x9f, 0x6f, 0xe1, 0x77, 0xa1, 0x18, 0x9b, - 0x84, 0xa1, 0xb7, 0x20, 0xcf, 0xf5, 0x6f, 0x6d, 0xe8, 0x1b, 0xe7, 0x1a, 0x3a, 0x94, 0xd6, 0xc6, - 0x8e, 0x00, 0xcc, 0x7f, 0x1b, 0x00, 0x71, 0x04, 0x7f, 0x3e, 0x03, 0x4e, 0x94, 0x79, 0x5d, 0x94, - 0x67, 0x2e, 0xd4, 0xd4, 0x69, 0xe9, 0x94, 0x59, 0x7f, 0x9e, 0x85, 0xcb, 0xfb, 0x61, 0x39, 0xfa, - 0xdc, 0xdb, 0xe0, 0x1d, 0x98, 0x23, 0x1e, 0x0f, 0xa8, 0x34, 0x82, 0x70, 0xfa, 0x57, 0xcf, 0x71, - 0xfa, 0x73, 0xae, 0xb6, 0xe9, 0xf1, 0x60, 0xa4, 0x43, 0x20, 0x44, 0x4b, 0x19, 0xe5, 0xa7, 0x33, - 0x50, 0xfe, 0x24, 0x49, 0xb4, 0x01, 0x25, 0x3b, 0x20, 0x92, 0x10, 0xbe, 0x2d, 0x86, 0x7c, 0x5b, - 0x2a, 0x71, 0x2b, 0x9a, 0x62, 0x30, 0xad, 0xc5, 0x90, 0xa2, 0x5f, 0x96, 0x1e, 0x88, 0x06, 0x51, - 0x44, 0x9f, 0xe0, 0x7a, 0xc1, 0x8e, 0xd0, 0xd4, 0x4f, 0x4b, 0xa8, 0xe4, 0x2c, 0x80, 0x7a, 0x5b, - 0x16, 0x63, 0xaa, 0x7c, 0x5c, 0xee, 0x41, 0x89, 0x7a, 0x94, 0x53, 0xec, 0x76, 0xba, 0xd8, 0xc5, - 0x9e, 0x7d, 0x91, 0x36, 0x5b, 0xbd, 0x03, 0x5a, 0x6d, 0x0a, 0xce, 0xb4, 0x16, 0x35, 0xa5, 0xa5, - 0x08, 0x68, 0x0b, 0xe6, 0x42, 0x55, 0xb9, 0x0b, 0x35, 0x24, 0xa1, 0x78, 0xa2, 0x15, 0xfc, 0xc9, - 0x0c, 0x2c, 0x5b, 0xc4, 0xf9, 0xbf, 0x2b, 0xa6, 0x73, 0xc5, 0xb7, 0x01, 0x54, 0xd6, 0x8b, 0x72, - 0x7b, 0x01, 0x6f, 0x88, 0xba, 0x51, 0x50, 0x08, 0x6d, 0xc6, 0x13, 0xfe, 0xf8, 0x7b, 0x16, 0xe6, - 0x93, 0xfe, 0xf8, 0x1f, 0x7d, 0xa3, 0xd0, 0x4e, 0x5c, 0x90, 0x72, 0xb2, 0x20, 0x7d, 0xe5, 0x9c, - 0x82, 0x34, 0x11, 0xc4, 0x9f, 0x5e, 0x89, 0x4e, 0xb3, 0x30, 0xbb, 0x83, 0x03, 0xdc, 0x67, 0xe8, - 0x5b, 0x13, 0xcd, 0xa8, 0x9a, 0x51, 0xaf, 0x4e, 0x84, 0x69, 0x5b, 0x7f, 0x2c, 0x51, 0xe3, 0xe8, - 0x87, 0xcf, 0x69, 0x39, 0x5f, 0x81, 0x45, 0x31, 0x2d, 0x47, 0x37, 0x52, 0xb6, 0x5d, 0x90, 0x13, - 0x73, 0x34, 0x71, 0x31, 0x54, 0x83, 0xa2, 0x60, 0x8b, 0x4b, 0xae, 0xe0, 0x81, 0x3e, 0x3e, 0xd9, - 0x54, 0x14, 0x74, 0x13, 0xd0, 0x51, 0xf4, 0x31, 0xa4, 0x13, 0x5b, 0x42, 0xf0, 0x2d, 0xc7, 0x3b, - 0x21, 0xfb, 0x75, 0x00, 0x71, 0x8a, 0x8e, 0x43, 0x3c, 0xbf, 0xaf, 0xe7, 0xbe, 0x82, 0xa0, 0xb4, - 0x05, 0x21, 0xec, 0x5b, 0x53, 0xb3, 0xb8, 0x9e, 0x41, 0xee, 0x4c, 0x3d, 0x83, 0x24, 0xfa, 0xd6, - 0x14, 0xa4, 0xea, 0x5b, 0xcf, 0x0e, 0xef, 0x89, 0xe0, 0xfe, 0xa5, 0x01, 0x28, 0xae, 0xfa, 0x16, - 0x61, 0x03, 0x31, 0xcc, 0x89, 0x3e, 0x3d, 0xd1, 0x4d, 0x1b, 0x2f, 0xd4, 0xa7, 0xc7, 0x30, 0x61, - 0x9f, 0x9e, 0xc8, 0x99, 0xaf, 0xc7, 0x85, 0x32, 0xab, 0x5d, 0xa9, 0x87, 0xc9, 0x2e, 0x66, 0x24, - 0xd1, 0xeb, 0xd3, 0x50, 0x7a, 0xa2, 0x32, 0x66, 0xcc, 0x3f, 0x19, 0x70, 0x75, 0x22, 0xa8, 0xa2, - 0x33, 0x13, 0x40, 0x41, 0x62, 0x53, 0xba, 0x68, 0xa4, 0xcf, 0x7e, 0xd1, 0x50, 0x5d, 0x0e, 0x26, - 0x0a, 0xf1, 0x67, 0x57, 0xf2, 0x73, 0xd2, 0x03, 0x7f, 0x34, 0x60, 0x25, 0xa9, 0x3e, 0xba, 0xcf, - 0x3e, 0xcc, 0x27, 0xb5, 0xeb, 0x9b, 0x7c, 0x69, 0x8a, 0x9b, 0xe8, 0x4b, 0x9c, 0x81, 0x41, 0xdf, - 0x89, 0xd3, 0x58, 0x7d, 0x8b, 0xfb, 0xda, 0xb4, 0xb6, 0x09, 0x4f, 0x98, 0x4e, 0xe7, 0x9c, 0x74, - 0xd2, 0x7f, 0x0c, 0xc8, 0xed, 0xf8, 0xbe, 0x8b, 0x7c, 0x58, 0xf6, 0x7c, 0xde, 0x11, 0x31, 0x4f, - 0x9c, 0x8e, 0x1e, 0xdb, 0x55, 0x99, 0xdc, 0x98, 0xce, 0x64, 0xff, 0x1c, 0xd7, 0x26, 0xa1, 0xac, - 0x92, 0xe7, 0xf3, 0x96, 0xa4, 0xec, 0xa9, 0xa1, 0xfe, 0x7d, 0x58, 0x38, 0xab, 0x4c, 0x15, 0xd1, - 0x77, 0xa6, 0x56, 0x76, 0x16, 0xe6, 0x74, 0x5c, 0x5b, 0x51, 0xe9, 0x75, 0x86, 0x6c, 0x5a, 0xf3, - 0xdd, 0x84, 0xf6, 0x5b, 0x79, 0xe1, 0xcd, 0x7f, 0x09, 0x8f, 0xfe, 0xd8, 0x80, 0xcb, 0x92, 0x48, - 0x7f, 0x48, 0xe4, 0xe4, 0x6f, 0x11, 0xdb, 0x0f, 0x1c, 0xb4, 0x08, 0x59, 0xea, 0x48, 0x0b, 0xe4, - 0xac, 0x2c, 0x75, 0xd0, 0x0a, 0x5c, 0xf2, 0xdf, 0xf3, 0x48, 0xa0, 0x3f, 0x49, 0xa9, 0x85, 0xac, - 0x57, 0xbe, 0x33, 0x74, 0x49, 0x07, 0xdb, 0xb6, 0x3f, 0xf4, 0xb8, 0xfe, 0x2c, 0xb5, 0xa0, 0xa8, - 0xeb, 0x8a, 0x28, 0x86, 0xcb, 0xa8, 0xa4, 0xa9, 0x40, 0xb4, 0x62, 0x82, 0x0a, 0xad, 0xd7, 0x7e, - 0x6b, 0x00, 0xc4, 0x1f, 0x51, 0xd0, 0x97, 0xe1, 0xe5, 0xd6, 0xdb, 0x77, 0xdb, 0x9d, 0xdd, 0xbd, - 0xf5, 0xbd, 0xfd, 0xdd, 0xce, 0xfe, 0xdd, 0xdd, 0x9d, 0xcd, 0x8d, 0xed, 0xdb, 0xdb, 0x9b, 0xed, - 0xa5, 0x4c, 0xa5, 0xf4, 0xe0, 0x51, 0xbd, 0xb8, 0xef, 0xb1, 0x01, 0xb1, 0xe9, 0x21, 0x25, 0x0e, - 0x7a, 0x15, 0x56, 0xce, 0x72, 0x8b, 0xd5, 0x66, 0x7b, 0xc9, 0xa8, 0xcc, 0x3f, 0x78, 0x54, 0xcf, - 0xab, 0x9e, 0x91, 0x38, 0x68, 0x15, 0xae, 0x4c, 0xf2, 0x6d, 0xdf, 0xfd, 0xe6, 0x52, 0xb6, 0xb2, - 0xf0, 0xe0, 0x51, 0xbd, 0x10, 0x35, 0x97, 0xc8, 0x04, 0x94, 0xe4, 0xd4, 0x78, 0x33, 0x15, 0x78, - 0xf0, 0xa8, 0x3e, 0xab, 0x3c, 0x59, 0xc9, 0x7d, 0xf0, 0x8b, 0x6a, 0xa6, 0xf5, 0xdd, 0x8f, 0x9e, - 0x56, 0x8d, 0x27, 0x4f, 0xab, 0xc6, 0xdf, 0x9e, 0x56, 0x8d, 0x87, 0xcf, 0xaa, 0x99, 0x27, 0xcf, - 0xaa, 0x99, 0x8f, 0x9f, 0x55, 0x33, 0xef, 0x7e, 0x23, 0xe1, 0x44, 0x7a, 0xcf, 0x1d, 0x8a, 0x92, - 0x46, 0x3d, 0xbb, 0xa9, 0x42, 0x98, 0xf2, 0xd1, 0x4d, 0x1d, 0xbe, 0x37, 0x95, 0xb9, 0x9a, 0x27, - 0xe1, 0xe7, 0x7b, 0xe5, 0xe1, 0xee, 0xac, 0x7c, 0x3a, 0xde, 0xf8, 0x6f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xf9, 0xf1, 0x36, 0x6f, 0xe6, 0x17, 0x00, 0x00, + // 1925 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xdd, 0x6f, 0x63, 0x47, + 0x15, 0xf7, 0x75, 0xbc, 0x89, 0x73, 0x9c, 0xc4, 0xc9, 0x6c, 0x76, 0xeb, 0x35, 0xbb, 0xb1, 0xb9, + 0x52, 0xab, 0x6c, 0x61, 0x6d, 0x9a, 0x4a, 0x05, 0xf6, 0x05, 0xc5, 0x71, 0x96, 0x98, 0x96, 0xdd, + 0xe8, 0xe6, 0xa3, 0x50, 0x90, 0xac, 0xf1, 0xbd, 0xb3, 0xce, 0x10, 0xdf, 0x7b, 0xbd, 0x77, 0xc6, + 0xdb, 0x18, 0xf5, 0x81, 0x17, 0x50, 0xb5, 0x12, 0x62, 0xe1, 0xa9, 0x2f, 0x2b, 0xad, 0xc4, 0x1b, + 0x42, 0xe2, 0x05, 0xf1, 0x37, 0x14, 0x24, 0xa4, 0x15, 0x4f, 0x15, 0x42, 0x06, 0xed, 0x0a, 0x09, + 0xf1, 0x84, 0xf2, 0x0f, 0x80, 0xe6, 0xe3, 0x7e, 0xe4, 0x3a, 0xad, 0xeb, 0xa8, 0x0f, 0x95, 0xe8, + 0x4b, 0x7c, 0xe7, 0xcc, 0x39, 0xbf, 0x33, 0xf3, 0x3b, 0x67, 0xce, 0x7c, 0x04, 0x6e, 0x30, 0x8e, + 0x8f, 0xa9, 0xd7, 0xad, 0x3f, 0x7c, 0xad, 0x43, 0x38, 0x7e, 0xad, 0xae, 0xdb, 0xb5, 0x7e, 0xe0, + 0x73, 0x1f, 0xdd, 0xe8, 0xd1, 0x07, 0x03, 0xea, 0x84, 0xc2, 0xf0, 0x57, 0x2b, 0x97, 0x57, 0xbb, + 0x7e, 0xd7, 0x97, 0x9a, 0x75, 0xf1, 0xa5, 0x8c, 0xca, 0xd7, 0xba, 0xbe, 0xdf, 0xed, 0x91, 0xba, + 0x6c, 0x75, 0x06, 0xf7, 0xeb, 0xd8, 0x1b, 0xea, 0xae, 0xb5, 0x74, 0x97, 0x33, 0x08, 0x30, 0xa7, + 0xbe, 0xa7, 0xfb, 0x2b, 0xe9, 0x7e, 0x4e, 0x5d, 0xc2, 0x38, 0x76, 0xfb, 0x21, 0xb6, 0xed, 0x33, + 0xd7, 0x67, 0x6d, 0xe5, 0x54, 0x35, 0x42, 0x6c, 0xd5, 0xaa, 0x77, 0x30, 0x23, 0xd1, 0x74, 0x6c, + 0x9f, 0x86, 0xd8, 0xd7, 0x39, 0xf1, 0x1c, 0x12, 0xb8, 0xd4, 0xe3, 0x75, 0x3e, 0xec, 0x13, 0xa6, + 0xfe, 0xaa, 0x5e, 0xf3, 0xb1, 0x01, 0x4b, 0x3b, 0x94, 0x71, 0x3f, 0xa0, 0x36, 0xee, 0xb5, 0xbc, + 0xfb, 0x3e, 0x7a, 0x03, 0x66, 0x8f, 0x08, 0x76, 0x48, 0x50, 0x32, 0xaa, 0xc6, 0x7a, 0x61, 0xa3, + 0x54, 0x8b, 0x11, 0x6a, 0xca, 0x76, 0x47, 0xf6, 0x37, 0x72, 0x1f, 0x8e, 0x2a, 0x19, 0x4b, 0x6b, + 0xa3, 0x3b, 0x30, 0xfb, 0x10, 0xf7, 0x18, 0xe1, 0xa5, 0x6c, 0x75, 0x66, 0xbd, 0xb0, 0xb1, 0x5e, + 0xfb, 0x44, 0x16, 0x6b, 0x87, 0xb8, 0x47, 0x1d, 0xcc, 0xfd, 0x08, 0x47, 0x59, 0x9b, 0xbf, 0xcb, + 0x42, 0x71, 0xcb, 0x77, 0x5d, 0xca, 0x18, 0xf5, 0x3d, 0x0b, 0x73, 0xc2, 0x50, 0x03, 0x72, 0x01, + 0xe6, 0x44, 0x8e, 0x68, 0xbe, 0x51, 0x13, 0xfa, 0x7f, 0x1d, 0x55, 0x5e, 0xe9, 0x52, 0x7e, 0x34, + 0xe8, 0xd4, 0x6c, 0xdf, 0xd5, 0x9c, 0xe8, 0x9f, 0x5b, 0xcc, 0x39, 0xd6, 0xd3, 0x6c, 0x12, 0xdb, + 0x92, 0xb6, 0xe8, 0x87, 0x90, 0x77, 0xf1, 0x49, 0x5b, 0xe2, 0x64, 0x25, 0xce, 0xe6, 0x74, 0x38, + 0xa7, 0xa3, 0x4a, 0x71, 0x88, 0xdd, 0xde, 0x6d, 0x33, 0xc4, 0x31, 0xad, 0x39, 0x17, 0x9f, 0x88, + 0x21, 0xa2, 0x3e, 0x14, 0x85, 0xd4, 0x3e, 0xc2, 0x5e, 0x97, 0x28, 0x27, 0x33, 0xd2, 0xc9, 0xce, + 0xd4, 0x4e, 0xae, 0xc6, 0x4e, 0x12, 0x70, 0xa6, 0xb5, 0xe8, 0xe2, 0x93, 0x2d, 0x29, 0x10, 0x1e, + 0x6f, 0xe7, 0x3f, 0x78, 0x5a, 0xc9, 0xfc, 0xeb, 0x69, 0xc5, 0x30, 0x3f, 0x32, 0x00, 0x62, 0xc6, + 0x90, 0x0d, 0xcb, 0x76, 0xd4, 0x92, 0xb6, 0x4c, 0x87, 0xb2, 0x36, 0x21, 0x24, 0x29, 0xda, 0x1b, + 0x79, 0x31, 0xf6, 0x67, 0xa3, 0x8a, 0x61, 0x15, 0xed, 0x54, 0x44, 0x7e, 0x00, 0x85, 0x41, 0xdf, + 0xc1, 0x9c, 0xb4, 0x45, 0xae, 0x4a, 0x42, 0x0b, 0x1b, 0xe5, 0x9a, 0x4a, 0xe4, 0x5a, 0x98, 0xc8, + 0xb5, 0xfd, 0x30, 0x91, 0x1b, 0x6b, 0x02, 0xeb, 0x74, 0x54, 0x41, 0x6a, 0x76, 0x09, 0x63, 0xf3, + 0xf1, 0xdf, 0x2b, 0x86, 0x05, 0x4a, 0x22, 0x0c, 0x12, 0x53, 0xfb, 0xa3, 0x01, 0x85, 0x26, 0x61, + 0x76, 0x40, 0xfb, 0x62, 0xbd, 0xa0, 0x12, 0xcc, 0xb9, 0xbe, 0x47, 0x8f, 0x75, 0x76, 0xce, 0x5b, + 0x61, 0x13, 0x95, 0x21, 0x4f, 0x1d, 0xe2, 0x71, 0xca, 0x87, 0x2a, 0xbc, 0x56, 0xd4, 0x16, 0x56, + 0xef, 0x92, 0x0e, 0xa3, 0x61, 0x50, 0xac, 0xb0, 0x89, 0xee, 0xc0, 0x32, 0x23, 0xf6, 0x20, 0xa0, + 0x7c, 0xd8, 0xb6, 0x7d, 0x8f, 0x63, 0x9b, 0x97, 0x72, 0x32, 0x6e, 0x5f, 0x3a, 0x1d, 0x55, 0x5e, + 0x52, 0x63, 0x4d, 0x6b, 0x98, 0x56, 0x31, 0x14, 0x6d, 0x29, 0x89, 0xf0, 0xe0, 0x10, 0x8e, 0x69, + 0x8f, 0x95, 0x2e, 0x29, 0x0f, 0xba, 0x99, 0x9c, 0x4b, 0x1e, 0xe6, 0xa3, 0xa4, 0x17, 0x9e, 0xfd, + 0x3e, 0x09, 0xc4, 0x77, 0x1b, 0x3b, 0x4e, 0x40, 0x18, 0xd3, 0xe9, 0x9d, 0xf0, 0x9c, 0xd6, 0x30, + 0xad, 0x62, 0x28, 0xda, 0x54, 0x12, 0xc4, 0x45, 0xb4, 0x3d, 0x46, 0x3c, 0x36, 0x60, 0xed, 0xfe, + 0xa0, 0x73, 0x4c, 0x86, 0x3a, 0x1a, 0xab, 0x63, 0xd1, 0xd8, 0xf4, 0x86, 0x8d, 0xd7, 0x63, 0xf4, + 0xb4, 0x9d, 0xf9, 0xa7, 0xdf, 0xdf, 0x5a, 0xd5, 0xc5, 0xc5, 0x0e, 0x86, 0x7d, 0xee, 0xd7, 0x76, + 0x07, 0x9d, 0x37, 0xc9, 0x50, 0x84, 0x5f, 0xab, 0xee, 0x4a, 0x4d, 0x74, 0x15, 0x66, 0x7f, 0x84, + 0x69, 0x8f, 0x38, 0x92, 0xd0, 0xbc, 0xa5, 0x5b, 0x68, 0x13, 0x66, 0x19, 0xc7, 0x7c, 0xc0, 0x24, + 0x8b, 0x4b, 0x1b, 0x37, 0x27, 0x64, 0x5c, 0xc3, 0xf7, 0x9c, 0x3d, 0x69, 0x60, 0x69, 0x43, 0x51, + 0x47, 0xb8, 0x7f, 0x4c, 0x3c, 0xcd, 0xe4, 0x54, 0xab, 0xbd, 0xe5, 0x71, 0x4b, 0x5b, 0x0b, 0x62, + 0x1c, 0xd2, 0x23, 0x5d, 0xc9, 0x1f, 0x3b, 0xc2, 0x01, 0x61, 0xa5, 0x59, 0x89, 0xd8, 0x9a, 0x7a, + 0x49, 0x6a, 0xc2, 0xd2, 0x78, 0xa6, 0x55, 0x8c, 0x44, 0x7b, 0x52, 0x82, 0x2c, 0x28, 0x38, 0x71, + 0xbe, 0x96, 0xe6, 0x64, 0x24, 0x5e, 0x9d, 0xc0, 0x42, 0x22, 0xc3, 0x75, 0x31, 0x4c, 0x82, 0x88, + 0x54, 0x19, 0x78, 0x1d, 0xdf, 0x73, 0xa8, 0xd7, 0x6d, 0x1f, 0x11, 0xda, 0x3d, 0xe2, 0xa5, 0x7c, + 0xd5, 0x58, 0x9f, 0x49, 0xa6, 0x4a, 0x5a, 0xc3, 0xb4, 0x8a, 0x91, 0x68, 0x47, 0x4a, 0x90, 0x03, + 0x4b, 0xb1, 0x96, 0x5c, 0xb6, 0xf3, 0x13, 0x97, 0xed, 0x97, 0xf5, 0xb2, 0xbd, 0x92, 0xf6, 0x12, + 0xaf, 0xdc, 0xc5, 0x48, 0x28, 0xcc, 0xd0, 0x3d, 0x80, 0xb8, 0x58, 0x94, 0x40, 0x7a, 0xb8, 0xf9, + 0xa9, 0x0b, 0x8f, 0x9e, 0x7f, 0x02, 0x02, 0xbd, 0x07, 0x97, 0xb9, 0xcf, 0x71, 0xaf, 0x4d, 0x4e, + 0x88, 0xdb, 0xe7, 0x61, 0x2c, 0x0b, 0x32, 0x96, 0x6f, 0x4d, 0x1d, 0xcb, 0xb2, 0x9a, 0xc9, 0x39, + 0x90, 0xa6, 0xb5, 0x22, 0xa5, 0xdb, 0x52, 0xa8, 0x03, 0xfa, 0x53, 0x03, 0xae, 0x2a, 0x5d, 0x99, + 0x57, 0xf4, 0xc7, 0xc4, 0x09, 0x47, 0xb0, 0x20, 0x47, 0x70, 0x6f, 0xea, 0x11, 0xdc, 0x48, 0x8e, + 0x20, 0x8d, 0x6a, 0x5a, 0xab, 0xb2, 0x63, 0x3f, 0x94, 0xab, 0x71, 0xdc, 0x5e, 0x78, 0xff, 0x69, + 0x25, 0xa3, 0x6b, 0x49, 0xc6, 0x7c, 0x03, 0x16, 0x0e, 0x71, 0x4f, 0xd7, 0x00, 0xc2, 0xd0, 0x75, + 0x98, 0xc7, 0x61, 0xa3, 0x64, 0x54, 0x67, 0xd6, 0xe7, 0xad, 0x58, 0xa0, 0x6a, 0xd0, 0x4f, 0xfe, + 0x56, 0x35, 0xcc, 0xdf, 0x1a, 0x30, 0xdb, 0x3c, 0xdc, 0xc5, 0x34, 0x40, 0x2d, 0x58, 0x89, 0xf3, + 0xf9, 0x6c, 0x05, 0xba, 0x7e, 0x3a, 0xaa, 0x94, 0xd2, 0x29, 0x1f, 0x95, 0xa0, 0x78, 0x59, 0x85, + 0x35, 0xa8, 0x05, 0x2b, 0x0f, 0xc3, 0xc2, 0x16, 0x41, 0x65, 0xd3, 0x50, 0x63, 0x2a, 0xa6, 0xb5, + 0x1c, 0xc9, 0x34, 0x54, 0x6a, 0x9a, 0x6f, 0xc1, 0x9c, 0x1a, 0x2d, 0x43, 0x9b, 0x70, 0xa9, 0x2f, + 0x3e, 0xe4, 0xec, 0x0a, 0x1b, 0x2f, 0x4f, 0x5a, 0x52, 0xd2, 0x4c, 0x67, 0x93, 0xb2, 0x34, 0x7f, + 0x99, 0x05, 0x68, 0x1e, 0x1e, 0xee, 0x07, 0xb4, 0xdf, 0x23, 0xfc, 0xb3, 0x24, 0x60, 0x1f, 0xae, + 0xc4, 0xb3, 0x63, 0x81, 0x9d, 0x22, 0xa1, 0x7a, 0x3a, 0xaa, 0x5c, 0x4f, 0x93, 0x90, 0x50, 0x33, + 0xad, 0xcb, 0x91, 0x7c, 0x2f, 0xb0, 0xcf, 0x45, 0x75, 0x18, 0x8f, 0x50, 0x67, 0x3e, 0x1e, 0x35, + 0xa1, 0x96, 0x44, 0x6d, 0x32, 0x7e, 0x3e, 0xc3, 0xef, 0x40, 0x21, 0xa6, 0x84, 0xa1, 0x37, 0x21, + 0xcf, 0xf5, 0xb7, 0x26, 0xfa, 0xe6, 0x44, 0xa2, 0x43, 0x6b, 0x4d, 0x76, 0x04, 0x60, 0x3e, 0x16, + 0x7c, 0x2b, 0xaa, 0xc4, 0x3a, 0xfe, 0x5c, 0x26, 0x9c, 0xd8, 0x6e, 0xf4, 0x72, 0x9e, 0xb9, 0xd0, + 0xe1, 0x52, 0x5b, 0x8b, 0x1d, 0x51, 0x15, 0x13, 0xb9, 0xf3, 0xe5, 0x2d, 0xdd, 0x4a, 0xd1, 0xfd, + 0xab, 0x2c, 0x5c, 0x3e, 0x08, 0xcb, 0xe5, 0xe7, 0x9e, 0x9b, 0xb7, 0x61, 0x8e, 0x78, 0x3c, 0xa0, + 0x92, 0x1c, 0x91, 0x0c, 0x5f, 0x9f, 0x90, 0x0c, 0xe7, 0x4c, 0x6d, 0xdb, 0xe3, 0xc1, 0x50, 0xa7, + 0x46, 0x88, 0x96, 0x22, 0xe5, 0x17, 0x33, 0x50, 0xfa, 0x38, 0x4b, 0xb4, 0x05, 0x45, 0x3b, 0x20, + 0x52, 0x10, 0xee, 0x7d, 0x86, 0xdc, 0xfb, 0xca, 0xf1, 0x51, 0x39, 0xa5, 0x60, 0x5a, 0x4b, 0xa1, + 0x44, 0xef, 0x7c, 0x5d, 0x10, 0x07, 0x58, 0x91, 0x95, 0x42, 0xeb, 0x53, 0x9e, 0x58, 0x4d, 0xbd, + 0xf5, 0x85, 0x4e, 0xce, 0x02, 0xa8, 0xbd, 0x6f, 0x29, 0x96, 0xca, 0xcd, 0xef, 0x01, 0x14, 0xa9, + 0x47, 0x39, 0xc5, 0xbd, 0x76, 0x07, 0xf7, 0xb0, 0x67, 0x5f, 0xe4, 0x1a, 0xd0, 0xf2, 0x78, 0xec, + 0x36, 0x05, 0x67, 0x5a, 0x4b, 0x5a, 0xd2, 0x50, 0x02, 0xb4, 0x03, 0x73, 0xa1, 0xab, 0xdc, 0x85, + 0x0e, 0x4c, 0xa1, 0x79, 0xe2, 0xa8, 0xfa, 0xf3, 0x19, 0x58, 0xb1, 0x88, 0xf3, 0x45, 0x28, 0xa6, + 0x0b, 0xc5, 0x77, 0x01, 0x54, 0x35, 0x10, 0x65, 0xf8, 0x02, 0xd1, 0x10, 0xf5, 0x64, 0x5e, 0x21, + 0x34, 0x19, 0x4f, 0xc4, 0xe3, 0x9f, 0x59, 0x58, 0x48, 0xc6, 0xe3, 0xff, 0x74, 0xef, 0x42, 0xbb, + 0x71, 0x41, 0xca, 0xc9, 0x82, 0xf4, 0xb5, 0x09, 0x05, 0x69, 0x2c, 0x89, 0x3f, 0xb9, 0x12, 0x9d, + 0x66, 0x61, 0x76, 0x17, 0x07, 0xd8, 0x65, 0xe8, 0x3b, 0x63, 0x87, 0x65, 0x75, 0x87, 0xbe, 0x36, + 0x96, 0xa6, 0x4d, 0xfd, 0x98, 0xa3, 0xae, 0xcb, 0x1f, 0x9c, 0x73, 0x24, 0x7e, 0x19, 0x96, 0xc4, + 0x6d, 0x3e, 0x9a, 0x91, 0xe2, 0x76, 0x51, 0xde, 0xe8, 0xa3, 0x1b, 0x21, 0x43, 0x15, 0x28, 0x08, + 0xb5, 0xb8, 0xe4, 0x0a, 0x1d, 0x70, 0xf1, 0xc9, 0xb6, 0x92, 0xa0, 0x5b, 0x80, 0x8e, 0xa2, 0xc7, + 0x9a, 0x76, 0xcc, 0x84, 0xd0, 0x5b, 0x89, 0x7b, 0x42, 0xf5, 0x1b, 0x00, 0x62, 0x14, 0x6d, 0x87, + 0x78, 0xbe, 0xab, 0xef, 0xa5, 0xf3, 0x42, 0xd2, 0x14, 0x02, 0x71, 0xae, 0x76, 0xa9, 0xd7, 0x4e, + 0xbd, 0x15, 0xe8, 0x3b, 0xd2, 0x85, 0xcf, 0xd5, 0xe7, 0x40, 0x9a, 0xd6, 0x8a, 0x4b, 0xbd, 0xb3, + 0x8f, 0x0b, 0x89, 0xe4, 0xfe, 0x8d, 0x01, 0x28, 0xae, 0xfa, 0x16, 0x61, 0x7d, 0x71, 0xd9, 0x14, + 0xf7, 0x88, 0x38, 0x76, 0x9a, 0xfc, 0x89, 0x87, 0x91, 0xc8, 0x20, 0xbc, 0x47, 0x24, 0xd6, 0xcc, + 0x37, 0xe3, 0x42, 0x99, 0xd5, 0xa1, 0xd4, 0x97, 0xdd, 0x0e, 0x66, 0x24, 0x71, 0x17, 0xa1, 0xa1, + 0xf5, 0x58, 0x65, 0xcc, 0x98, 0x7f, 0x31, 0xe0, 0xda, 0x58, 0x52, 0x45, 0x63, 0x26, 0x80, 0x82, + 0x44, 0xa7, 0x0c, 0xd1, 0x50, 0x8f, 0xfd, 0xa2, 0xa9, 0xba, 0x12, 0x8c, 0x15, 0xe2, 0xcf, 0xae, + 0xe4, 0xe7, 0x64, 0x04, 0xfe, 0x6c, 0xc0, 0x6a, 0xd2, 0x7d, 0x34, 0x9f, 0x03, 0x58, 0x48, 0x7a, + 0xd7, 0x33, 0xf9, 0xca, 0x14, 0x33, 0xd1, 0x93, 0x38, 0x03, 0x83, 0xbe, 0x17, 0x2f, 0x63, 0xf5, + 0x56, 0xf8, 0x8d, 0x69, 0xb9, 0x09, 0x47, 0x98, 0x5e, 0xce, 0x39, 0x19, 0xa4, 0xff, 0x1a, 0x90, + 0xdb, 0xf5, 0xfd, 0x1e, 0xf2, 0x61, 0xc5, 0xf3, 0x79, 0x5b, 0xe4, 0x3c, 0x71, 0xda, 0xfa, 0x59, + 0x41, 0x95, 0xc9, 0xad, 0xe9, 0x28, 0xfb, 0xf7, 0xa8, 0x32, 0x0e, 0x65, 0x15, 0x3d, 0x9f, 0x37, + 0xa4, 0x64, 0x5f, 0x3d, 0x3a, 0xbc, 0x07, 0x8b, 0x67, 0x9d, 0xa9, 0x22, 0xfa, 0xf6, 0xd4, 0xce, + 0xce, 0xc2, 0x9c, 0x8e, 0x2a, 0xab, 0x6a, 0x79, 0x9d, 0x11, 0x9b, 0xd6, 0x42, 0x27, 0xe1, 0xfd, + 0x76, 0x5e, 0x44, 0xf3, 0x3f, 0x22, 0xa2, 0x3f, 0x33, 0xe0, 0x72, 0x78, 0x83, 0x94, 0x17, 0x48, + 0x8b, 0xd8, 0x7e, 0xe0, 0xa0, 0x25, 0xc8, 0x52, 0x47, 0x32, 0x90, 0xb3, 0xb2, 0xd4, 0x41, 0xab, + 0x70, 0xc9, 0x7f, 0xd7, 0x23, 0x81, 0x7e, 0x32, 0x53, 0x0d, 0x59, 0xaf, 0x7c, 0x67, 0xd0, 0x23, + 0x6d, 0x6c, 0xdb, 0xfe, 0xc0, 0xe3, 0xfa, 0xd9, 0x6c, 0x51, 0x49, 0x37, 0x95, 0x50, 0x5c, 0x3a, + 0xa3, 0x92, 0xa6, 0x12, 0xd1, 0x8a, 0x05, 0x2a, 0xb5, 0x5e, 0xfd, 0x83, 0x01, 0x10, 0x3f, 0xf2, + 0xa0, 0xaf, 0xc2, 0x4b, 0x8d, 0x7b, 0x77, 0x9b, 0xed, 0xbd, 0xfd, 0xcd, 0xfd, 0x83, 0xbd, 0xf6, + 0xc1, 0xdd, 0xbd, 0xdd, 0xed, 0xad, 0xd6, 0x9d, 0xd6, 0x76, 0x73, 0x39, 0x53, 0x2e, 0x3e, 0x7a, + 0x52, 0x2d, 0x1c, 0x78, 0xac, 0x4f, 0x6c, 0x7a, 0x9f, 0x12, 0x07, 0xbd, 0x02, 0xab, 0x67, 0xb5, + 0x45, 0x6b, 0xbb, 0xb9, 0x6c, 0x94, 0x17, 0x1e, 0x3d, 0xa9, 0xe6, 0xd5, 0x99, 0x91, 0x38, 0x68, + 0x1d, 0xae, 0x8c, 0xeb, 0xb5, 0xee, 0x7e, 0x7b, 0x39, 0x5b, 0x5e, 0x7c, 0xf4, 0xa4, 0x3a, 0x1f, + 0x1d, 0x2e, 0x91, 0x09, 0x28, 0xa9, 0xa9, 0xf1, 0x66, 0xca, 0xf0, 0xe8, 0x49, 0x75, 0x56, 0x45, + 0xb2, 0x9c, 0x7b, 0xff, 0xd7, 0x6b, 0x99, 0xc6, 0xf7, 0x3f, 0x7c, 0xbe, 0x66, 0x3c, 0x7b, 0xbe, + 0x66, 0xfc, 0xe3, 0xf9, 0x9a, 0xf1, 0xf8, 0xc5, 0x5a, 0xe6, 0xd9, 0x8b, 0xb5, 0xcc, 0x47, 0x2f, + 0xd6, 0x32, 0xef, 0x7c, 0x2b, 0x11, 0x44, 0xfa, 0xa0, 0x37, 0x10, 0x25, 0x8d, 0x7a, 0x76, 0x5d, + 0xa5, 0x30, 0xe5, 0xc3, 0x5b, 0x3a, 0x7d, 0x6f, 0x29, 0xba, 0xea, 0x27, 0xe1, 0xbf, 0x17, 0x54, + 0x84, 0x3b, 0xb3, 0x72, 0xeb, 0x78, 0xfd, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x92, 0xe5, + 0x0e, 0x86, 0x18, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1335,660 +1341,668 @@ 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{ - // 10447 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x18, 0x66, 0x77, 0x01, 0xec, 0x3e, 0x7c, 0x2d, 0x1a, 0xb8, 0xbb, 0xbd, 0xbd, 0x3b, 0x00, - 0x1c, 0x92, 0x77, 0xc7, 0x23, 0x0f, 0x20, 0x8f, 0xbc, 0x0f, 0xe2, 0x44, 0x9e, 0x76, 0x81, 0x3d, - 0x1c, 0x48, 0x7c, 0x71, 0x00, 0x1c, 0x29, 0x2a, 0xae, 0xcd, 0x60, 0xb7, 0xb1, 0x18, 0x62, 0x77, - 0x66, 0x38, 0x33, 0x7b, 0x07, 0x9c, 0xa4, 0x32, 0xfd, 0x4d, 0xd3, 0x51, 0xf4, 0x61, 0x97, 0x2d, - 0x53, 0x3a, 0x45, 0xb2, 0x94, 0x48, 0x61, 0xec, 0x58, 0x96, 0x64, 0x25, 0x8e, 0xf3, 0x43, 0x72, - 0x95, 0x13, 0x59, 0x55, 0x71, 0x24, 0xa7, 0x12, 0x29, 0x4e, 0x72, 0x92, 0x29, 0xc5, 0x51, 0x14, - 0x25, 0x56, 0x18, 0xa9, 0xe2, 0x2a, 0x55, 0x2a, 0xa9, 0xfe, 0x9a, 0xaf, 0xdd, 0xc5, 0xec, 0xe2, - 0xee, 0x28, 0xd9, 0xce, 0x2f, 0xa0, 0xbb, 0xdf, 0x7b, 0xfd, 0xfa, 0xf5, 0xeb, 0xd7, 0xef, 0xbd, - 0xee, 0x9e, 0x85, 0x0f, 0x5e, 0x84, 0x89, 0x8a, 0x61, 0x54, 0xaa, 0x78, 0xca, 0xb4, 0x0c, 0xc7, - 0xd8, 0xa8, 0x6f, 0x4e, 0x95, 0xb1, 0x5d, 0xb2, 0x34, 0xd3, 0x31, 0xac, 0x49, 0x5a, 0x87, 0x86, - 0x18, 0xc4, 0xa4, 0x80, 0x90, 0x17, 0x61, 0xf8, 0xb2, 0x56, 0xc5, 0xb3, 0x2e, 0xe0, 0x2a, 0x76, - 0xd0, 0x05, 0x48, 0x6c, 0x6a, 0x55, 0x9c, 0x91, 0x26, 0xe2, 0x27, 0xfb, 0xce, 0xdc, 0x37, 0x19, - 0x42, 0x9a, 0x0c, 0x62, 0xac, 0x90, 0x6a, 0x85, 0x62, 0xc8, 0xdf, 0x4a, 0xc0, 0x48, 0x93, 0x56, - 0x84, 0x20, 0xa1, 0xab, 0x35, 0x42, 0x51, 0x3a, 0x99, 0x52, 0xe8, 0xff, 0x28, 0x03, 0xbd, 0xa6, - 0x5a, 0xda, 0x56, 0x2b, 0x38, 0x13, 0xa3, 0xd5, 0xa2, 0x88, 0xc6, 0x00, 0xca, 0xd8, 0xc4, 0x7a, - 0x19, 0xeb, 0xa5, 0xdd, 0x4c, 0x7c, 0x22, 0x7e, 0x32, 0xa5, 0xf8, 0x6a, 0xd0, 0x83, 0x30, 0x6c, - 0xd6, 0x37, 0xaa, 0x5a, 0xa9, 0xe8, 0x03, 0x83, 0x89, 0xf8, 0xc9, 0x6e, 0x25, 0xcd, 0x1a, 0x66, - 0x3d, 0xe0, 0x13, 0x30, 0x74, 0x1d, 0xab, 0xdb, 0x7e, 0xd0, 0x3e, 0x0a, 0x3a, 0x48, 0xaa, 0x7d, - 0x80, 0x33, 0xd0, 0x5f, 0xc3, 0xb6, 0xad, 0x56, 0x70, 0xd1, 0xd9, 0x35, 0x71, 0x26, 0x41, 0x47, - 0x3f, 0xd1, 0x30, 0xfa, 0xf0, 0xc8, 0xfb, 0x38, 0xd6, 0xda, 0xae, 0x89, 0x51, 0x0e, 0x52, 0x58, - 0xaf, 0xd7, 0x18, 0x85, 0xee, 0x16, 0xf2, 0x2b, 0xe8, 0xf5, 0x5a, 0x98, 0x4a, 0x92, 0xa0, 0x71, - 0x12, 0xbd, 0x36, 0xb6, 0xae, 0x69, 0x25, 0x9c, 0xe9, 0xa1, 0x04, 0x4e, 0x34, 0x10, 0x58, 0x65, - 0xed, 0x61, 0x1a, 0x02, 0x0f, 0xcd, 0x40, 0x0a, 0xef, 0x38, 0x58, 0xb7, 0x35, 0x43, 0xcf, 0xf4, - 0x52, 0x22, 0xf7, 0x37, 0x99, 0x45, 0x5c, 0x2d, 0x87, 0x49, 0x78, 0x78, 0xe8, 0x1c, 0xf4, 0x1a, - 0xa6, 0xa3, 0x19, 0xba, 0x9d, 0x49, 0x4e, 0x48, 0x27, 0xfb, 0xce, 0x1c, 0x6d, 0xaa, 0x08, 0xcb, - 0x0c, 0x46, 0x11, 0xc0, 0x68, 0x1e, 0xd2, 0xb6, 0x51, 0xb7, 0x4a, 0xb8, 0x58, 0x32, 0xca, 0xb8, - 0xa8, 0xe9, 0x9b, 0x46, 0x26, 0x45, 0x09, 0x8c, 0x37, 0x0e, 0x84, 0x02, 0xce, 0x18, 0x65, 0x3c, - 0xaf, 0x6f, 0x1a, 0xca, 0xa0, 0x1d, 0x28, 0xa3, 0x83, 0xd0, 0x63, 0xef, 0xea, 0x8e, 0xba, 0x93, - 0xe9, 0xa7, 0x1a, 0xc2, 0x4b, 0xf2, 0xef, 0xf5, 0xc0, 0x50, 0x3b, 0x2a, 0x76, 0x11, 0xba, 0x37, - 0xc9, 0x28, 0x33, 0xb1, 0x4e, 0x64, 0xc0, 0x70, 0x82, 0x42, 0xec, 0xd9, 0xa7, 0x10, 0x73, 0xd0, - 0xa7, 0x63, 0xdb, 0xc1, 0x65, 0xa6, 0x11, 0xf1, 0x36, 0x75, 0x0a, 0x18, 0x52, 0xa3, 0x4a, 0x25, - 0xf6, 0xa5, 0x52, 0xcf, 0xc1, 0x90, 0xcb, 0x52, 0xd1, 0x52, 0xf5, 0x8a, 0xd0, 0xcd, 0xa9, 0x28, - 0x4e, 0x26, 0x0b, 0x02, 0x4f, 0x21, 0x68, 0xca, 0x20, 0x0e, 0x94, 0xd1, 0x2c, 0x80, 0xa1, 0x63, - 0x63, 0xb3, 0x58, 0xc6, 0xa5, 0x6a, 0x26, 0xd9, 0x42, 0x4a, 0xcb, 0x04, 0xa4, 0x41, 0x4a, 0x06, - 0xab, 0x2d, 0x55, 0xd1, 0xe3, 0x9e, 0xaa, 0xf5, 0xb6, 0xd0, 0x94, 0x45, 0xb6, 0xc8, 0x1a, 0xb4, - 0x6d, 0x1d, 0x06, 0x2d, 0x4c, 0xf4, 0x1e, 0x97, 0xf9, 0xc8, 0x52, 0x94, 0x89, 0xc9, 0xc8, 0x91, - 0x29, 0x1c, 0x8d, 0x0d, 0x6c, 0xc0, 0xf2, 0x17, 0xd1, 0xbd, 0xe0, 0x56, 0x14, 0xa9, 0x5a, 0x01, - 0xb5, 0x42, 0xfd, 0xa2, 0x72, 0x49, 0xad, 0xe1, 0xec, 0x0d, 0x18, 0x0c, 0x8a, 0x07, 0x8d, 0x42, - 0xb7, 0xed, 0xa8, 0x96, 0x43, 0xb5, 0xb0, 0x5b, 0x61, 0x05, 0x94, 0x86, 0x38, 0xd6, 0xcb, 0xd4, - 0xca, 0x75, 0x2b, 0xe4, 0x5f, 0xf4, 0x56, 0x6f, 0xc0, 0x71, 0x3a, 0xe0, 0xe3, 0x8d, 0x33, 0x1a, - 0xa0, 0x1c, 0x1e, 0x77, 0xf6, 0x3c, 0x0c, 0x04, 0x06, 0xd0, 0x6e, 0xd7, 0xf2, 0x3b, 0xe1, 0x40, - 0x53, 0xd2, 0xe8, 0x39, 0x18, 0xad, 0xeb, 0x9a, 0xee, 0x60, 0xcb, 0xb4, 0x30, 0xd1, 0x58, 0xd6, - 0x55, 0xe6, 0xbf, 0xf4, 0xb6, 0xd0, 0xb9, 0x75, 0x3f, 0x34, 0xa3, 0xa2, 0x8c, 0xd4, 0x1b, 0x2b, - 0x4f, 0xa5, 0x92, 0xdf, 0xee, 0x4d, 0xbf, 0xf4, 0xd2, 0x4b, 0x2f, 0xc5, 0xe4, 0x0f, 0xf4, 0xc0, - 0x68, 0xb3, 0x35, 0xd3, 0x74, 0xf9, 0x1e, 0x84, 0x1e, 0xbd, 0x5e, 0xdb, 0xc0, 0x16, 0x15, 0x52, - 0xb7, 0xc2, 0x4b, 0x28, 0x07, 0xdd, 0x55, 0x75, 0x03, 0x57, 0x33, 0x89, 0x09, 0xe9, 0xe4, 0xe0, - 0x99, 0x07, 0xdb, 0x5a, 0x95, 0x93, 0x0b, 0x04, 0x45, 0x61, 0x98, 0xe8, 0x49, 0x48, 0x70, 0x13, - 0x4d, 0x28, 0x9c, 0x6a, 0x8f, 0x02, 0x59, 0x4b, 0x0a, 0xc5, 0x43, 0x47, 0x20, 0x45, 0xfe, 0x32, - 0xdd, 0xe8, 0xa1, 0x3c, 0x27, 0x49, 0x05, 0xd1, 0x0b, 0x94, 0x85, 0x24, 0x5d, 0x26, 0x65, 0x2c, - 0xb6, 0x36, 0xb7, 0x4c, 0x14, 0xab, 0x8c, 0x37, 0xd5, 0x7a, 0xd5, 0x29, 0x5e, 0x53, 0xab, 0x75, - 0x4c, 0x15, 0x3e, 0xa5, 0xf4, 0xf3, 0xca, 0xab, 0xa4, 0x0e, 0x8d, 0x43, 0x1f, 0x5b, 0x55, 0x9a, - 0x5e, 0xc6, 0x3b, 0xd4, 0x7a, 0x76, 0x2b, 0x6c, 0xa1, 0xcd, 0x93, 0x1a, 0xd2, 0xfd, 0x0b, 0xb6, - 0xa1, 0x0b, 0xd5, 0xa4, 0x5d, 0x90, 0x0a, 0xda, 0xfd, 0xf9, 0xb0, 0xe1, 0x3e, 0xd6, 0x7c, 0x78, - 0x61, 0x9d, 0x92, 0x3f, 0x17, 0x83, 0x04, 0xb5, 0x17, 0x43, 0xd0, 0xb7, 0xf6, 0xb6, 0x95, 0x42, - 0x71, 0x76, 0x79, 0x3d, 0xbf, 0x50, 0x48, 0x4b, 0x68, 0x10, 0x80, 0x56, 0x5c, 0x5e, 0x58, 0xce, - 0xad, 0xa5, 0x63, 0x6e, 0x79, 0x7e, 0x69, 0xed, 0xdc, 0x63, 0xe9, 0xb8, 0x8b, 0xb0, 0xce, 0x2a, - 0x12, 0x7e, 0x80, 0x47, 0xcf, 0xa4, 0xbb, 0x51, 0x1a, 0xfa, 0x19, 0x81, 0xf9, 0xe7, 0x0a, 0xb3, - 0xe7, 0x1e, 0x4b, 0xf7, 0x04, 0x6b, 0x1e, 0x3d, 0x93, 0xee, 0x45, 0x03, 0x90, 0xa2, 0x35, 0xf9, - 0xe5, 0xe5, 0x85, 0x74, 0xd2, 0xa5, 0xb9, 0xba, 0xa6, 0xcc, 0x2f, 0xcd, 0xa5, 0x53, 0x2e, 0xcd, - 0x39, 0x65, 0x79, 0x7d, 0x25, 0x0d, 0x2e, 0x85, 0xc5, 0xc2, 0xea, 0x6a, 0x6e, 0xae, 0x90, 0xee, - 0x73, 0x21, 0xf2, 0x6f, 0x5b, 0x2b, 0xac, 0xa6, 0xfb, 0x03, 0x6c, 0x3d, 0x7a, 0x26, 0x3d, 0xe0, - 0x76, 0x51, 0x58, 0x5a, 0x5f, 0x4c, 0x0f, 0xa2, 0x61, 0x18, 0x60, 0x5d, 0x08, 0x26, 0x86, 0x42, - 0x55, 0xe7, 0x1e, 0x4b, 0xa7, 0x3d, 0x46, 0x18, 0x95, 0xe1, 0x40, 0xc5, 0xb9, 0xc7, 0xd2, 0x48, - 0x9e, 0x81, 0x6e, 0xaa, 0x5d, 0x08, 0xc1, 0xe0, 0x42, 0x2e, 0x5f, 0x58, 0x28, 0x2e, 0xaf, 0xac, - 0xcd, 0x2f, 0x2f, 0xe5, 0x16, 0xd2, 0x92, 0x57, 0xa7, 0x14, 0x9e, 0x59, 0x9f, 0x57, 0x0a, 0xb3, - 0xe9, 0x98, 0xbf, 0x6e, 0xa5, 0x90, 0x5b, 0x2b, 0xcc, 0xa6, 0xe3, 0x72, 0x09, 0x46, 0x9b, 0xd9, - 0xc9, 0xa6, 0x2b, 0xc3, 0x37, 0xc5, 0xb1, 0x16, 0x53, 0x4c, 0x69, 0x35, 0x4c, 0xf1, 0x37, 0x63, - 0x30, 0xd2, 0x64, 0xaf, 0x68, 0xda, 0xc9, 0x25, 0xe8, 0x66, 0x2a, 0xca, 0x76, 0xcf, 0x07, 0x9a, - 0x6e, 0x3a, 0x54, 0x61, 0x1b, 0x76, 0x50, 0x8a, 0xe7, 0xf7, 0x20, 0xe2, 0x2d, 0x3c, 0x08, 0x42, - 0xa2, 0xc1, 0xa6, 0xff, 0x44, 0x83, 0x4d, 0x67, 0xdb, 0xde, 0xb9, 0x76, 0xb6, 0x3d, 0x5a, 0xd7, - 0x99, 0x6d, 0xef, 0x6e, 0x62, 0xdb, 0x2f, 0xc2, 0x70, 0x03, 0xa1, 0xb6, 0x6d, 0xec, 0xcf, 0x48, - 0x90, 0x69, 0x25, 0x9c, 0x08, 0x4b, 0x17, 0x0b, 0x58, 0xba, 0x8b, 0x61, 0x09, 0xde, 0xd3, 0x7a, - 0x12, 0x1a, 0xe6, 0xfa, 0x13, 0x12, 0x1c, 0x6c, 0xee, 0x29, 0x36, 0xe5, 0xe1, 0x49, 0xe8, 0xa9, - 0x61, 0x67, 0xcb, 0x10, 0xde, 0xd2, 0xf1, 0x26, 0x7b, 0x30, 0x69, 0x0e, 0x4f, 0x36, 0xc7, 0xf2, - 0x6f, 0xe2, 0xf1, 0x56, 0xee, 0x1e, 0xe3, 0xa6, 0x81, 0xd3, 0x5f, 0x8c, 0xc1, 0x81, 0xa6, 0xc4, - 0x9b, 0x32, 0x7a, 0x0c, 0x40, 0xd3, 0xcd, 0xba, 0xc3, 0x3c, 0x22, 0x66, 0x60, 0x53, 0xb4, 0x86, - 0x1a, 0x2f, 0x62, 0x3c, 0xeb, 0x8e, 0xdb, 0x1e, 0xa7, 0xed, 0xc0, 0xaa, 0x28, 0xc0, 0x05, 0x8f, - 0xd1, 0x04, 0x65, 0x74, 0xac, 0xc5, 0x48, 0x1b, 0x14, 0xf3, 0x61, 0x48, 0x97, 0xaa, 0x1a, 0xd6, - 0x9d, 0xa2, 0xed, 0x58, 0x58, 0xad, 0x69, 0x7a, 0x85, 0xee, 0x20, 0xc9, 0xe9, 0xee, 0x4d, 0xb5, - 0x6a, 0x63, 0x65, 0x88, 0x35, 0xaf, 0x8a, 0x56, 0x82, 0x41, 0x15, 0xc8, 0xf2, 0x61, 0xf4, 0x04, - 0x30, 0x58, 0xb3, 0x8b, 0x21, 0xbf, 0x3f, 0x05, 0x7d, 0x3e, 0xbf, 0x1a, 0xdd, 0x03, 0xfd, 0x2f, - 0xa8, 0xd7, 0xd4, 0xa2, 0x88, 0x95, 0x98, 0x24, 0xfa, 0x48, 0xdd, 0x0a, 0x8f, 0x97, 0x1e, 0x86, - 0x51, 0x0a, 0x62, 0xd4, 0x1d, 0x6c, 0x15, 0x4b, 0x55, 0xd5, 0xb6, 0xa9, 0xd0, 0x92, 0x14, 0x14, - 0x91, 0xb6, 0x65, 0xd2, 0x34, 0x23, 0x5a, 0xd0, 0x59, 0x18, 0xa1, 0x18, 0xb5, 0x7a, 0xd5, 0xd1, - 0xcc, 0x2a, 0x2e, 0x92, 0xe8, 0xcd, 0xa6, 0x3b, 0x89, 0xcb, 0xd9, 0x30, 0x81, 0x58, 0xe4, 0x00, - 0x84, 0x23, 0x1b, 0xcd, 0xc2, 0x31, 0x8a, 0x56, 0xc1, 0x3a, 0xb6, 0x54, 0x07, 0x17, 0xf1, 0x8b, - 0x75, 0xb5, 0x6a, 0x17, 0x55, 0xbd, 0x5c, 0xdc, 0x52, 0xed, 0xad, 0xcc, 0x28, 0x21, 0x90, 0x8f, - 0x65, 0x24, 0xe5, 0x30, 0x01, 0x9c, 0xe3, 0x70, 0x05, 0x0a, 0x96, 0xd3, 0xcb, 0x57, 0x54, 0x7b, - 0x0b, 0x4d, 0xc3, 0x41, 0x4a, 0xc5, 0x76, 0x2c, 0x4d, 0xaf, 0x14, 0x4b, 0x5b, 0xb8, 0xb4, 0x5d, - 0xac, 0x3b, 0x9b, 0x17, 0x32, 0x47, 0xfc, 0xfd, 0x53, 0x0e, 0x57, 0x29, 0xcc, 0x0c, 0x01, 0x59, - 0x77, 0x36, 0x2f, 0xa0, 0x55, 0xe8, 0x27, 0x93, 0x51, 0xd3, 0x6e, 0xe0, 0xe2, 0xa6, 0x61, 0xd1, - 0xad, 0x71, 0xb0, 0x89, 0x69, 0xf2, 0x49, 0x70, 0x72, 0x99, 0x23, 0x2c, 0x1a, 0x65, 0x3c, 0xdd, - 0xbd, 0xba, 0x52, 0x28, 0xcc, 0x2a, 0x7d, 0x82, 0xca, 0x65, 0xc3, 0x22, 0x0a, 0x55, 0x31, 0x5c, - 0x01, 0xf7, 0x31, 0x85, 0xaa, 0x18, 0x42, 0xbc, 0x67, 0x61, 0xa4, 0x54, 0x62, 0x63, 0xd6, 0x4a, - 0x45, 0x1e, 0x63, 0xd9, 0x99, 0x74, 0x40, 0x58, 0xa5, 0xd2, 0x1c, 0x03, 0xe0, 0x3a, 0x6e, 0xa3, - 0xc7, 0xe1, 0x80, 0x27, 0x2c, 0x3f, 0xe2, 0x70, 0xc3, 0x28, 0xc3, 0xa8, 0x67, 0x61, 0xc4, 0xdc, - 0x6d, 0x44, 0x44, 0x81, 0x1e, 0xcd, 0xdd, 0x30, 0xda, 0x79, 0x18, 0x35, 0xb7, 0xcc, 0x46, 0xbc, - 0x53, 0x7e, 0x3c, 0x64, 0x6e, 0x99, 0x61, 0xc4, 0xfb, 0x69, 0xc0, 0x6d, 0xe1, 0x92, 0xea, 0xe0, - 0x72, 0xe6, 0x90, 0x1f, 0xdc, 0xd7, 0x80, 0xa6, 0x20, 0x5d, 0x2a, 0x15, 0xb1, 0xae, 0x6e, 0x54, - 0x71, 0x51, 0xb5, 0xb0, 0xae, 0xda, 0x99, 0x71, 0x3f, 0xf0, 0x60, 0xa9, 0x54, 0xa0, 0xad, 0x39, - 0xda, 0x88, 0x4e, 0xc1, 0xb0, 0xb1, 0xf1, 0x42, 0x89, 0xa9, 0x64, 0xd1, 0xb4, 0xf0, 0xa6, 0xb6, - 0x93, 0xb9, 0x8f, 0xca, 0x77, 0x88, 0x34, 0x50, 0x85, 0x5c, 0xa1, 0xd5, 0xe8, 0x01, 0x48, 0x97, - 0xec, 0x2d, 0xd5, 0x32, 0xa9, 0x4d, 0xb6, 0x4d, 0xb5, 0x84, 0x33, 0xf7, 0x33, 0x50, 0x56, 0xbf, - 0x24, 0xaa, 0xc9, 0x92, 0xb0, 0xaf, 0x6b, 0x9b, 0x8e, 0xa0, 0x78, 0x82, 0x2d, 0x09, 0x5a, 0xc7, - 0xa9, 0x9d, 0x84, 0x34, 0x11, 0x45, 0xa0, 0xe3, 0x93, 0x14, 0x6c, 0xd0, 0xdc, 0x32, 0xfd, 0xfd, - 0xde, 0x0b, 0x03, 0x04, 0xd2, 0xeb, 0xf4, 0x01, 0xe6, 0x90, 0x99, 0x5b, 0xbe, 0x1e, 0x1f, 0x83, - 0x83, 0x04, 0xa8, 0x86, 0x1d, 0xb5, 0xac, 0x3a, 0xaa, 0x0f, 0xfa, 0x21, 0x0a, 0x4d, 0xe4, 0xbe, - 0xc8, 0x1b, 0x03, 0x7c, 0x5a, 0xf5, 0x8d, 0x5d, 0x57, 0xb3, 0x4e, 0x33, 0x3e, 0x49, 0x9d, 0xd0, - 0xad, 0xbb, 0xe6, 0x74, 0xcb, 0xd3, 0xd0, 0xef, 0x57, 0x7c, 0x94, 0x02, 0xa6, 0xfa, 0x69, 0x89, - 0x78, 0x41, 0x33, 0xcb, 0xb3, 0xc4, 0x7f, 0x79, 0xbe, 0x90, 0x8e, 0x11, 0x3f, 0x6a, 0x61, 0x7e, - 0xad, 0x50, 0x54, 0xd6, 0x97, 0xd6, 0xe6, 0x17, 0x0b, 0xe9, 0xb8, 0xcf, 0x61, 0x7f, 0x2a, 0x91, - 0x3c, 0x9e, 0x3e, 0x21, 0x7f, 0x25, 0x06, 0x83, 0xc1, 0x08, 0x0c, 0xbd, 0x05, 0x0e, 0x89, 0x74, - 0x89, 0x8d, 0x9d, 0xe2, 0x75, 0xcd, 0xa2, 0x2b, 0xb2, 0xa6, 0xb2, 0xdd, 0xd1, 0xd5, 0x89, 0x51, - 0x0e, 0xb5, 0x8a, 0x9d, 0x67, 0x35, 0x8b, 0xac, 0xb7, 0x9a, 0xea, 0xa0, 0x05, 0x18, 0xd7, 0x8d, - 0xa2, 0xed, 0xa8, 0x7a, 0x59, 0xb5, 0xca, 0x45, 0x2f, 0x51, 0x55, 0x54, 0x4b, 0x25, 0x6c, 0xdb, - 0x06, 0xdb, 0x09, 0x5d, 0x2a, 0x47, 0x75, 0x63, 0x95, 0x03, 0x7b, 0x5b, 0x44, 0x8e, 0x83, 0x86, - 0xf4, 0x37, 0xde, 0x4a, 0x7f, 0x8f, 0x40, 0xaa, 0xa6, 0x9a, 0x45, 0xac, 0x3b, 0xd6, 0x2e, 0xf5, - 0xbb, 0x93, 0x4a, 0xb2, 0xa6, 0x9a, 0x05, 0x52, 0x7e, 0x53, 0xc2, 0x9f, 0xa7, 0x12, 0xc9, 0x64, - 0x3a, 0xf5, 0x54, 0x22, 0x99, 0x4a, 0x83, 0xfc, 0x7a, 0x1c, 0xfa, 0xfd, 0x7e, 0x38, 0x09, 0x6b, - 0x4a, 0x74, 0xcb, 0x92, 0xa8, 0x51, 0xbb, 0x77, 0x4f, 0xaf, 0x7d, 0x72, 0x86, 0xec, 0x65, 0xd3, - 0x3d, 0xcc, 0x3b, 0x56, 0x18, 0x26, 0xf1, 0x23, 0x88, 0xb2, 0x61, 0xe6, 0x8d, 0x24, 0x15, 0x5e, - 0x42, 0x73, 0xd0, 0xf3, 0x82, 0x4d, 0x69, 0xf7, 0x50, 0xda, 0xf7, 0xed, 0x4d, 0xfb, 0xa9, 0x55, - 0x4a, 0x3c, 0xf5, 0xd4, 0x6a, 0x71, 0x69, 0x59, 0x59, 0xcc, 0x2d, 0x28, 0x1c, 0x1d, 0x1d, 0x86, - 0x44, 0x55, 0xbd, 0xb1, 0x1b, 0xdc, 0xf5, 0x68, 0x55, 0xbb, 0x93, 0x70, 0x18, 0x12, 0xd7, 0xb1, - 0xba, 0x1d, 0xdc, 0x6b, 0x68, 0xd5, 0x5d, 0x5c, 0x0c, 0x53, 0xd0, 0x4d, 0xe5, 0x85, 0x00, 0xb8, - 0xc4, 0xd2, 0x5d, 0x28, 0x09, 0x89, 0x99, 0x65, 0x85, 0x2c, 0x88, 0x34, 0xf4, 0xb3, 0xda, 0xe2, - 0xca, 0x7c, 0x61, 0xa6, 0x90, 0x8e, 0xc9, 0x67, 0xa1, 0x87, 0x09, 0x81, 0x2c, 0x16, 0x57, 0x0c, - 0xe9, 0x2e, 0x5e, 0xe4, 0x34, 0x24, 0xd1, 0xba, 0xbe, 0x98, 0x2f, 0x28, 0xe9, 0x58, 0x70, 0xaa, - 0x13, 0xe9, 0x6e, 0xd9, 0x86, 0x7e, 0xbf, 0x23, 0xfe, 0xe6, 0x04, 0xd9, 0x9f, 0x97, 0xa0, 0xcf, - 0xe7, 0x58, 0x13, 0x8f, 0x48, 0xad, 0x56, 0x8d, 0xeb, 0x45, 0xb5, 0xaa, 0xa9, 0x36, 0x57, 0x0d, - 0xa0, 0x55, 0x39, 0x52, 0xd3, 0xee, 0xd4, 0xbd, 0x49, 0x4b, 0xa4, 0x3b, 0xdd, 0x23, 0x7f, 0x58, - 0x82, 0x74, 0xd8, 0xb3, 0x0d, 0xb1, 0x29, 0xfd, 0x28, 0xd9, 0x94, 0x3f, 0x24, 0xc1, 0x60, 0xd0, - 0x9d, 0x0d, 0xb1, 0x77, 0xcf, 0x8f, 0x94, 0xbd, 0x6f, 0xc4, 0x60, 0x20, 0xe0, 0xc4, 0xb6, 0xcb, - 0xdd, 0x8b, 0x30, 0xac, 0x95, 0x71, 0xcd, 0x34, 0x1c, 0xac, 0x97, 0x76, 0x8b, 0x55, 0x7c, 0x0d, - 0x57, 0x33, 0x32, 0x35, 0x1a, 0x53, 0x7b, 0xbb, 0xc9, 0x93, 0xf3, 0x1e, 0xde, 0x02, 0x41, 0x9b, - 0x1e, 0x99, 0x9f, 0x2d, 0x2c, 0xae, 0x2c, 0xaf, 0x15, 0x96, 0x66, 0xde, 0x56, 0x5c, 0x5f, 0x7a, - 0x7a, 0x69, 0xf9, 0xd9, 0x25, 0x25, 0xad, 0x85, 0xc0, 0xee, 0xe2, 0xb2, 0x5f, 0x81, 0x74, 0x98, - 0x29, 0x74, 0x08, 0x9a, 0xb1, 0x95, 0xee, 0x42, 0x23, 0x30, 0xb4, 0xb4, 0x5c, 0x5c, 0x9d, 0x9f, - 0x2d, 0x14, 0x0b, 0x97, 0x2f, 0x17, 0x66, 0xd6, 0x56, 0x59, 0xe2, 0xc3, 0x85, 0x5e, 0x0b, 0x2c, - 0x70, 0xf9, 0xd5, 0x38, 0x8c, 0x34, 0xe1, 0x04, 0xe5, 0x78, 0xc8, 0xc2, 0xa2, 0xa8, 0xd3, 0xed, - 0x70, 0x3f, 0x49, 0x7c, 0x86, 0x15, 0xd5, 0x72, 0x78, 0x84, 0xf3, 0x00, 0x10, 0x29, 0xe9, 0x8e, - 0xb6, 0xa9, 0x61, 0x8b, 0xe7, 0x89, 0x58, 0x1c, 0x33, 0xe4, 0xd5, 0xb3, 0x54, 0xd1, 0x43, 0x80, - 0x4c, 0xc3, 0xd6, 0x1c, 0xed, 0x1a, 0x2e, 0x6a, 0xba, 0x48, 0x2a, 0x91, 0xb8, 0x26, 0xa1, 0xa4, - 0x45, 0xcb, 0xbc, 0xee, 0xb8, 0xd0, 0x3a, 0xae, 0xa8, 0x21, 0x68, 0x62, 0xcc, 0xe3, 0x4a, 0x5a, - 0xb4, 0xb8, 0xd0, 0xf7, 0x40, 0x7f, 0xd9, 0xa8, 0x13, 0x67, 0x8f, 0xc1, 0x91, 0xbd, 0x43, 0x52, - 0xfa, 0x58, 0x9d, 0x0b, 0xc2, 0xdd, 0x78, 0x2f, 0x9b, 0xd5, 0xaf, 0xf4, 0xb1, 0x3a, 0x06, 0x72, - 0x02, 0x86, 0xd4, 0x4a, 0xc5, 0x22, 0xc4, 0x05, 0x21, 0x16, 0x98, 0x0c, 0xba, 0xd5, 0x14, 0x30, - 0xfb, 0x14, 0x24, 0x85, 0x1c, 0xc8, 0x56, 0x4d, 0x24, 0x51, 0x34, 0x59, 0xb4, 0x1d, 0x3b, 0x99, - 0x52, 0x92, 0xba, 0x68, 0xbc, 0x07, 0xfa, 0x35, 0xbb, 0xe8, 0x25, 0xe7, 0x63, 0x13, 0xb1, 0x93, - 0x49, 0xa5, 0x4f, 0xb3, 0xdd, 0xc4, 0xa6, 0xfc, 0x89, 0x18, 0x0c, 0x06, 0x0f, 0x17, 0xd0, 0x2c, - 0x24, 0xab, 0x46, 0x49, 0xa5, 0xaa, 0xc5, 0x4e, 0xb6, 0x4e, 0x46, 0x9c, 0x47, 0x4c, 0x2e, 0x70, - 0x78, 0xc5, 0xc5, 0xcc, 0xfe, 0xb1, 0x04, 0x49, 0x51, 0x8d, 0x0e, 0x42, 0xc2, 0x54, 0x9d, 0x2d, - 0x4a, 0xae, 0x3b, 0x1f, 0x4b, 0x4b, 0x0a, 0x2d, 0x93, 0x7a, 0xdb, 0x54, 0x75, 0xaa, 0x02, 0xbc, - 0x9e, 0x94, 0xc9, 0xbc, 0x56, 0xb1, 0x5a, 0xa6, 0x51, 0x8f, 0x51, 0xab, 0x61, 0xdd, 0xb1, 0xc5, - 0xbc, 0xf2, 0xfa, 0x19, 0x5e, 0x8d, 0x1e, 0x84, 0x61, 0xc7, 0x52, 0xb5, 0x6a, 0x00, 0x36, 0x41, - 0x61, 0xd3, 0xa2, 0xc1, 0x05, 0x9e, 0x86, 0xc3, 0x82, 0x6e, 0x19, 0x3b, 0x6a, 0x69, 0x0b, 0x97, - 0x3d, 0xa4, 0x1e, 0x9a, 0xdd, 0x38, 0xc4, 0x01, 0x66, 0x79, 0xbb, 0xc0, 0x95, 0xbf, 0x22, 0xc1, - 0xb0, 0x88, 0xd3, 0xca, 0xae, 0xb0, 0x16, 0x01, 0x54, 0x5d, 0x37, 0x1c, 0xbf, 0xb8, 0x1a, 0x55, - 0xb9, 0x01, 0x6f, 0x32, 0xe7, 0x22, 0x29, 0x3e, 0x02, 0xd9, 0x1a, 0x80, 0xd7, 0xd2, 0x52, 0x6c, - 0xe3, 0xd0, 0xc7, 0x4f, 0x8e, 0xe8, 0xf1, 0x23, 0x8b, 0xec, 0x81, 0x55, 0x91, 0x80, 0x0e, 0x8d, - 0x42, 0xf7, 0x06, 0xae, 0x68, 0x3a, 0xcf, 0x07, 0xb3, 0x82, 0xc8, 0xbf, 0x24, 0xdc, 0xfc, 0x4b, - 0xfe, 0x3d, 0x12, 0x8c, 0x94, 0x8c, 0x5a, 0x98, 0xdf, 0x7c, 0x3a, 0x94, 0x5e, 0xb0, 0xaf, 0x48, - 0xcf, 0x3f, 0x59, 0xd1, 0x9c, 0xad, 0xfa, 0xc6, 0x64, 0xc9, 0xa8, 0x4d, 0x55, 0x8c, 0xaa, 0xaa, - 0x57, 0xbc, 0xf3, 0x53, 0xfa, 0x4f, 0xe9, 0x74, 0x05, 0xeb, 0xa7, 0x2b, 0x86, 0xef, 0x34, 0xf5, - 0xa2, 0xf7, 0xef, 0x5f, 0x4a, 0xd2, 0x6f, 0xc4, 0xe2, 0x73, 0x2b, 0xf9, 0xd7, 0x62, 0xd9, 0x39, - 0xd6, 0xdd, 0x8a, 0x10, 0x8f, 0x82, 0x37, 0xab, 0xb8, 0x44, 0x86, 0x0c, 0xdf, 0x79, 0x10, 0x46, - 0x2b, 0x46, 0xc5, 0xa0, 0x14, 0xa7, 0xc8, 0x7f, 0xfc, 0x44, 0x36, 0xe5, 0xd6, 0x66, 0x23, 0x8f, - 0x6f, 0xa7, 0x97, 0x60, 0x84, 0x03, 0x17, 0xe9, 0x91, 0x10, 0x0b, 0x6c, 0xd0, 0x9e, 0x69, 0xb5, - 0xcc, 0xef, 0x7c, 0x8b, 0x6e, 0xe8, 0xca, 0x30, 0x47, 0x25, 0x6d, 0x2c, 0xf6, 0x99, 0x56, 0xe0, - 0x40, 0x80, 0x1e, 0x5b, 0xb6, 0xd8, 0x8a, 0xa0, 0xf8, 0x87, 0x9c, 0xe2, 0x88, 0x8f, 0xe2, 0x2a, - 0x47, 0x9d, 0x9e, 0x81, 0x81, 0x4e, 0x68, 0xfd, 0x0b, 0x4e, 0xab, 0x1f, 0xfb, 0x89, 0xcc, 0xc1, - 0x10, 0x25, 0x52, 0xaa, 0xdb, 0x8e, 0x51, 0xa3, 0x36, 0x71, 0x6f, 0x32, 0xff, 0xf2, 0x5b, 0x6c, - 0x1d, 0x0d, 0x12, 0xb4, 0x19, 0x17, 0x6b, 0x7a, 0x1a, 0xe8, 0x29, 0x58, 0x19, 0x97, 0xaa, 0x11, - 0x14, 0xbe, 0xc8, 0x19, 0x71, 0xe1, 0xa7, 0xaf, 0xc2, 0x28, 0xf9, 0x9f, 0x9a, 0x2c, 0x3f, 0x27, - 0xd1, 0x39, 0xb8, 0xcc, 0x57, 0x7e, 0x86, 0x2d, 0xd5, 0x11, 0x97, 0x80, 0x8f, 0x27, 0xdf, 0x2c, - 0x56, 0xb0, 0xe3, 0x60, 0xcb, 0x2e, 0xaa, 0xd5, 0x66, 0xec, 0xf9, 0x92, 0x18, 0x99, 0x5f, 0xff, - 0x6e, 0x70, 0x16, 0xe7, 0x18, 0x66, 0xae, 0x5a, 0x9d, 0x5e, 0x87, 0x43, 0x4d, 0xb4, 0xa2, 0x0d, - 0x9a, 0xaf, 0x72, 0x9a, 0xa3, 0x0d, 0x9a, 0x41, 0xc8, 0xae, 0x80, 0xa8, 0x77, 0xe7, 0xb2, 0x0d, - 0x9a, 0x1f, 0xe4, 0x34, 0x11, 0xc7, 0x15, 0x53, 0x4a, 0x28, 0x3e, 0x05, 0xc3, 0xd7, 0xb0, 0xb5, - 0x61, 0xd8, 0x3c, 0x71, 0xd4, 0x06, 0xb9, 0x0f, 0x71, 0x72, 0x43, 0x1c, 0x91, 0x66, 0x92, 0x08, - 0xad, 0xc7, 0x21, 0xb9, 0xa9, 0x96, 0x70, 0x1b, 0x24, 0x6e, 0x72, 0x12, 0xbd, 0x04, 0x9e, 0xa0, - 0xe6, 0xa0, 0xbf, 0x62, 0xf0, 0x5d, 0x2b, 0x1a, 0xfd, 0xc3, 0x1c, 0xbd, 0x4f, 0xe0, 0x70, 0x12, - 0xa6, 0x61, 0xd6, 0xab, 0x64, 0x4b, 0x8b, 0x26, 0xf1, 0xf7, 0x04, 0x09, 0x81, 0xc3, 0x49, 0x74, - 0x20, 0xd6, 0x8f, 0x08, 0x12, 0xb6, 0x4f, 0x9e, 0x97, 0xa0, 0xcf, 0xd0, 0xab, 0xbb, 0x86, 0xde, - 0x0e, 0x13, 0x1f, 0xe5, 0x14, 0x80, 0xa3, 0x10, 0x02, 0x17, 0x21, 0xd5, 0xee, 0x44, 0xfc, 0xfd, - 0xef, 0x8a, 0xe5, 0x21, 0x66, 0x60, 0x0e, 0x86, 0x84, 0x81, 0xd2, 0x0c, 0xbd, 0x0d, 0x12, 0xff, - 0x80, 0x93, 0x18, 0xf4, 0xa1, 0xf1, 0x61, 0x38, 0xd8, 0x76, 0x2a, 0xb8, 0x1d, 0x22, 0x9f, 0x10, - 0xc3, 0xe0, 0x28, 0x5c, 0x94, 0x1b, 0x58, 0x2f, 0x6d, 0xb5, 0x47, 0xe1, 0x93, 0x42, 0x94, 0x02, - 0x87, 0x90, 0x98, 0x81, 0x81, 0x9a, 0x6a, 0xd9, 0x5b, 0x6a, 0xb5, 0xad, 0xe9, 0xf8, 0x87, 0x9c, - 0x46, 0xbf, 0x8b, 0xc4, 0x25, 0x52, 0xd7, 0x3b, 0x21, 0xf3, 0x9a, 0x90, 0x88, 0x0f, 0x8d, 0x2f, - 0x3d, 0xdb, 0xa1, 0x59, 0xb6, 0x4e, 0xa8, 0xfd, 0x23, 0xb1, 0xf4, 0x18, 0xee, 0xa2, 0x9f, 0xe2, - 0x45, 0x48, 0xd9, 0xda, 0x8d, 0xb6, 0xc8, 0xfc, 0xa6, 0x98, 0x69, 0x8a, 0x40, 0x90, 0xdf, 0x06, - 0x87, 0x9b, 0x6e, 0x13, 0x6d, 0x10, 0xfb, 0x2d, 0x4e, 0xec, 0x60, 0x93, 0xad, 0x82, 0x9b, 0x84, - 0x4e, 0x49, 0xfe, 0x63, 0x61, 0x12, 0x70, 0x88, 0xd6, 0x0a, 0x89, 0x23, 0x6c, 0x75, 0xb3, 0x33, - 0xa9, 0xfd, 0xb6, 0x90, 0x1a, 0xc3, 0x0d, 0x48, 0x6d, 0x0d, 0x0e, 0x72, 0x8a, 0x9d, 0xcd, 0xeb, - 0xa7, 0x84, 0x61, 0x65, 0xd8, 0xeb, 0xc1, 0xd9, 0x7d, 0x3b, 0x64, 0x5d, 0x71, 0x0a, 0x87, 0xd5, - 0x2e, 0xd6, 0x54, 0xb3, 0x0d, 0xca, 0xbf, 0xc3, 0x29, 0x0b, 0x8b, 0xef, 0x7a, 0xbc, 0xf6, 0xa2, - 0x6a, 0x12, 0xe2, 0xcf, 0x41, 0x46, 0x10, 0xaf, 0xeb, 0x16, 0x2e, 0x19, 0x15, 0x5d, 0xbb, 0x81, - 0xcb, 0x6d, 0x90, 0xfe, 0x74, 0x68, 0xaa, 0xd6, 0x7d, 0xe8, 0x84, 0xf2, 0x3c, 0xa4, 0x5d, 0x5f, - 0xa5, 0xa8, 0xd5, 0x4c, 0xc3, 0x72, 0x22, 0x28, 0x7e, 0x46, 0xcc, 0x94, 0x8b, 0x37, 0x4f, 0xd1, - 0xa6, 0x0b, 0x30, 0x48, 0x8b, 0xed, 0xaa, 0xe4, 0x67, 0x39, 0xa1, 0x01, 0x0f, 0x8b, 0x1b, 0x8e, - 0x92, 0x51, 0x33, 0x55, 0xab, 0x1d, 0xfb, 0xf7, 0xbb, 0xc2, 0x70, 0x70, 0x14, 0x6e, 0x38, 0x9c, - 0x5d, 0x13, 0x93, 0xdd, 0xbe, 0x0d, 0x0a, 0x9f, 0x13, 0x86, 0x43, 0xe0, 0x70, 0x12, 0xc2, 0x61, - 0x68, 0x83, 0xc4, 0x3f, 0x11, 0x24, 0x04, 0x0e, 0x21, 0xf1, 0x8c, 0xb7, 0xd1, 0x5a, 0xb8, 0xa2, - 0xd9, 0x8e, 0xc5, 0xdc, 0xe4, 0xbd, 0x49, 0xfd, 0xd3, 0xef, 0x06, 0x9d, 0x30, 0xc5, 0x87, 0x4a, - 0x2c, 0x11, 0x4f, 0xbb, 0xd2, 0x28, 0x2a, 0x9a, 0xb1, 0xdf, 0x13, 0x96, 0xc8, 0x87, 0x46, 0x78, - 0xf3, 0x79, 0x88, 0x44, 0xec, 0x25, 0x12, 0x3b, 0xb4, 0x41, 0xee, 0x9f, 0x85, 0x98, 0x5b, 0x15, - 0xb8, 0x84, 0xa6, 0xcf, 0xff, 0xa9, 0xeb, 0xdb, 0x78, 0xb7, 0x2d, 0xed, 0xfc, 0xfd, 0x90, 0xff, - 0xb3, 0xce, 0x30, 0x99, 0x0d, 0x19, 0x0a, 0xf9, 0x53, 0x28, 0xea, 0xfe, 0x50, 0xe6, 0xa7, 0xbe, - 0xcf, 0xc7, 0x1b, 0x74, 0xa7, 0xa6, 0x17, 0x88, 0x92, 0x07, 0x9d, 0x9e, 0x68, 0x62, 0x3f, 0xf3, - 0x7d, 0x57, 0xcf, 0x03, 0x3e, 0xcf, 0xf4, 0x65, 0x18, 0x08, 0x38, 0x3c, 0xd1, 0xa4, 0x7e, 0x96, - 0x93, 0xea, 0xf7, 0xfb, 0x3b, 0xd3, 0x67, 0x21, 0x41, 0x9c, 0x97, 0x68, 0xf4, 0x9f, 0xe3, 0xe8, - 0x14, 0x7c, 0xfa, 0x09, 0x48, 0x0a, 0xa7, 0x25, 0x1a, 0xf5, 0xe7, 0x39, 0xaa, 0x8b, 0x42, 0xd0, - 0x85, 0xc3, 0x12, 0x8d, 0xfe, 0x0b, 0x02, 0x5d, 0xa0, 0x10, 0xf4, 0xf6, 0x45, 0xf8, 0xf9, 0x5f, - 0x4a, 0xf0, 0x4d, 0x47, 0xc8, 0xee, 0x22, 0xf4, 0x72, 0x4f, 0x25, 0x1a, 0xfb, 0x17, 0x79, 0xe7, - 0x02, 0x63, 0xfa, 0x3c, 0x74, 0xb7, 0x29, 0xf0, 0x77, 0x73, 0x54, 0x06, 0x3f, 0x3d, 0x03, 0x7d, - 0x3e, 0xef, 0x24, 0x1a, 0xfd, 0xef, 0x72, 0x74, 0x3f, 0x16, 0x61, 0x9d, 0x7b, 0x27, 0xd1, 0x04, - 0xde, 0x23, 0x58, 0xe7, 0x18, 0x44, 0x6c, 0xc2, 0x31, 0x89, 0xc6, 0x7e, 0xaf, 0x90, 0xba, 0x40, - 0x99, 0xbe, 0x04, 0x29, 0x77, 0xb3, 0x89, 0xc6, 0x7f, 0x1f, 0xc7, 0xf7, 0x70, 0x88, 0x04, 0x7c, - 0x9b, 0x5d, 0x34, 0x89, 0xf7, 0x0b, 0x09, 0xf8, 0xb0, 0xc8, 0x32, 0x0a, 0x3b, 0x30, 0xd1, 0x94, - 0x7e, 0x59, 0x2c, 0xa3, 0x90, 0xff, 0x42, 0x66, 0x93, 0xda, 0xfc, 0x68, 0x12, 0xbf, 0x22, 0x66, - 0x93, 0xc2, 0x13, 0x36, 0xc2, 0x1e, 0x41, 0x34, 0x8d, 0x5f, 0x13, 0x6c, 0x84, 0x1c, 0x82, 0xe9, - 0x15, 0x40, 0x8d, 0xde, 0x40, 0x34, 0xbd, 0x0f, 0x70, 0x7a, 0xc3, 0x0d, 0xce, 0xc0, 0xf4, 0xb3, - 0x70, 0xb0, 0xb9, 0x27, 0x10, 0x4d, 0xf5, 0xd7, 0xbf, 0x1f, 0x8a, 0xdd, 0xfc, 0x8e, 0xc0, 0xf4, - 0x9a, 0xb7, 0xa5, 0xf8, 0xbd, 0x80, 0x68, 0xb2, 0xaf, 0x7e, 0x3f, 0x68, 0xb8, 0xfd, 0x4e, 0xc0, - 0x74, 0x0e, 0xc0, 0xdb, 0x80, 0xa3, 0x69, 0x7d, 0x88, 0xd3, 0xf2, 0x21, 0x91, 0xa5, 0xc1, 0xf7, - 0xdf, 0x68, 0xfc, 0x9b, 0x62, 0x69, 0x70, 0x0c, 0xb2, 0x34, 0xc4, 0xd6, 0x1b, 0x8d, 0xfd, 0x61, - 0xb1, 0x34, 0x04, 0x0a, 0xd1, 0x6c, 0xdf, 0xee, 0x16, 0x4d, 0xe1, 0xa3, 0x42, 0xb3, 0x7d, 0x58, - 0xd3, 0x4b, 0x30, 0xdc, 0xb0, 0x21, 0x46, 0x93, 0xfa, 0x0d, 0x4e, 0x2a, 0x1d, 0xde, 0x0f, 0xfd, - 0x9b, 0x17, 0xdf, 0x0c, 0xa3, 0xa9, 0x7d, 0x2c, 0xb4, 0x79, 0xf1, 0xbd, 0x70, 0xfa, 0x22, 0x24, - 0xf5, 0x7a, 0xb5, 0x4a, 0x16, 0x0f, 0xda, 0xfb, 0xce, 0x5f, 0xe6, 0xbf, 0xfe, 0x90, 0x4b, 0x47, - 0x20, 0x4c, 0x9f, 0x85, 0x6e, 0x5c, 0xdb, 0xc0, 0xe5, 0x28, 0xcc, 0xef, 0xfc, 0x50, 0x18, 0x4c, - 0x02, 0x3d, 0x7d, 0x09, 0x80, 0xa5, 0x46, 0xe8, 0xf1, 0x60, 0x04, 0xee, 0x7f, 0xfb, 0x21, 0xbf, - 0x8d, 0xe3, 0xa1, 0x78, 0x04, 0xd8, 0xdd, 0x9e, 0xbd, 0x09, 0x7c, 0x37, 0x48, 0x80, 0xce, 0xc8, - 0xe3, 0xd0, 0xfb, 0x82, 0x6d, 0xe8, 0x8e, 0x5a, 0x89, 0xc2, 0xfe, 0xef, 0x1c, 0x5b, 0xc0, 0x13, - 0x81, 0xd5, 0x0c, 0x0b, 0x3b, 0x6a, 0xc5, 0x8e, 0xc2, 0xfd, 0x1f, 0x1c, 0xd7, 0x45, 0x20, 0xc8, - 0x25, 0xd5, 0x76, 0xda, 0x19, 0xf7, 0x5f, 0x08, 0x64, 0x81, 0x40, 0x98, 0x26, 0xff, 0x6f, 0xe3, - 0xdd, 0x28, 0xdc, 0xef, 0x09, 0xa6, 0x39, 0xfc, 0xf4, 0x13, 0x90, 0x22, 0xff, 0xb2, 0x2b, 0x76, - 0x11, 0xc8, 0xff, 0x93, 0x23, 0x7b, 0x18, 0xa4, 0x67, 0xdb, 0x29, 0x3b, 0x5a, 0xb4, 0xb0, 0xdf, - 0xe0, 0x33, 0x2d, 0xe0, 0xa7, 0x73, 0xd0, 0x67, 0x3b, 0xe5, 0x72, 0x9d, 0xfb, 0xa7, 0x11, 0xe8, - 0xff, 0xeb, 0x87, 0x6e, 0xca, 0xc2, 0xc5, 0x21, 0xb3, 0x7d, 0x7d, 0xdb, 0x31, 0x0d, 0x7a, 0x04, - 0x12, 0x45, 0xe1, 0xfb, 0x9c, 0x82, 0x0f, 0x65, 0x7a, 0x06, 0xfa, 0xc9, 0x58, 0x2c, 0x6c, 0x62, - 0x7a, 0x5e, 0x15, 0x41, 0xe2, 0x07, 0x5c, 0x00, 0x01, 0xa4, 0xfc, 0x4f, 0x7c, 0xf1, 0xf5, 0x31, - 0xe9, 0xcb, 0xaf, 0x8f, 0x49, 0xdf, 0x78, 0x7d, 0x4c, 0x7a, 0xef, 0x37, 0xc7, 0xba, 0xbe, 0xfc, - 0xcd, 0xb1, 0xae, 0xaf, 0x7d, 0x73, 0xac, 0xab, 0x79, 0xda, 0x18, 0xe6, 0x8c, 0x39, 0x83, 0x25, - 0x8c, 0x9f, 0x97, 0x03, 0xe9, 0xe2, 0x8a, 0xe1, 0x65, 0x6b, 0xdd, 0x20, 0x07, 0x7e, 0x20, 0x91, - 0x80, 0x39, 0x98, 0xcb, 0x55, 0xf5, 0xdd, 0x16, 0x6f, 0x70, 0xb2, 0x4d, 0x13, 0xc3, 0xf2, 0x5b, - 0x20, 0x9e, 0xd3, 0x77, 0xd1, 0x61, 0x66, 0xf3, 0x8a, 0x75, 0xab, 0xca, 0xaf, 0x7e, 0xf5, 0x92, - 0xf2, 0xba, 0x55, 0x45, 0xa3, 0xde, 0xfd, 0x4c, 0xe9, 0x64, 0x3f, 0xbf, 0x74, 0x39, 0x9d, 0xf8, - 0xde, 0x47, 0xc7, 0xbb, 0xf2, 0xdb, 0xe1, 0x11, 0x7e, 0x3e, 0x72, 0x94, 0xc9, 0x9c, 0xbe, 0x4b, - 0x07, 0xb9, 0x22, 0x3d, 0xdf, 0x4d, 0xfa, 0xb0, 0x45, 0x62, 0x7b, 0x2c, 0x9c, 0xd8, 0x7e, 0x16, - 0x57, 0xab, 0x4f, 0xeb, 0xc6, 0x75, 0x7d, 0x8d, 0x80, 0x6d, 0xf4, 0x50, 0x1a, 0x8f, 0xc2, 0x7b, - 0x63, 0x30, 0x1e, 0x1e, 0x37, 0x51, 0x1c, 0xdb, 0x51, 0x6b, 0x66, 0xab, 0x17, 0x48, 0x17, 0x21, - 0xb5, 0x26, 0x60, 0x50, 0x06, 0x7a, 0x6d, 0x5c, 0x32, 0xf4, 0xb2, 0x4d, 0x07, 0x1b, 0x57, 0x44, - 0x91, 0x0c, 0x56, 0x57, 0x75, 0xc3, 0xe6, 0x17, 0x24, 0x59, 0x21, 0xff, 0xab, 0x52, 0x67, 0x33, - 0x39, 0xe8, 0x76, 0x25, 0x46, 0xfa, 0xe0, 0x5e, 0xe9, 0x7f, 0x2a, 0x05, 0x6f, 0x08, 0xbe, 0x5c, - 0x7f, 0xbb, 0x22, 0xf9, 0xe9, 0x38, 0x1c, 0x2e, 0x19, 0x76, 0xcd, 0xb0, 0x8b, 0x6c, 0x86, 0x59, - 0x81, 0x0b, 0xa3, 0xdf, 0xdf, 0xd4, 0x46, 0xfe, 0xff, 0x0a, 0x0c, 0xd2, 0x55, 0x40, 0x33, 0x9f, - 0xd4, 0xf0, 0x44, 0xee, 0x15, 0x7f, 0xf4, 0xef, 0xba, 0xa9, 0xd6, 0x0c, 0xb8, 0x88, 0xf4, 0x6a, - 0xc7, 0x1a, 0x8c, 0x6a, 0x35, 0xb3, 0x8a, 0xe9, 0x19, 0x50, 0xd1, 0x6d, 0x8b, 0xa6, 0xf7, 0x25, - 0x4e, 0x6f, 0xc4, 0x43, 0x9f, 0x17, 0xd8, 0xd3, 0x0b, 0x30, 0xac, 0x96, 0x4a, 0xd8, 0x0c, 0x90, - 0x8c, 0x58, 0xa1, 0x82, 0xc1, 0x34, 0xc7, 0x74, 0xa9, 0xe5, 0x2f, 0xb5, 0x9a, 0xdb, 0xe7, 0xef, - 0xf7, 0x4d, 0x9a, 0x85, 0x2b, 0x58, 0x3f, 0xad, 0x63, 0xe7, 0xba, 0x61, 0x6d, 0x73, 0xf1, 0x9e, - 0x66, 0x5d, 0x89, 0x49, 0xf8, 0xd9, 0x38, 0x8c, 0xb1, 0x86, 0xa9, 0x0d, 0xd5, 0xc6, 0x53, 0xd7, - 0x1e, 0xd9, 0xc0, 0x8e, 0xfa, 0xc8, 0x54, 0xc9, 0xd0, 0x74, 0x3e, 0x13, 0x23, 0x7c, 0x5e, 0x48, - 0xfb, 0x24, 0x6f, 0x6f, 0xb1, 0x30, 0xe7, 0x20, 0x31, 0x63, 0x68, 0x3a, 0xd1, 0xc8, 0x32, 0xd6, - 0x8d, 0x1a, 0x5f, 0x96, 0xac, 0x80, 0xee, 0x85, 0x1e, 0xb5, 0x66, 0xd4, 0x75, 0x87, 0x1d, 0x5f, - 0xe5, 0xfb, 0xbe, 0x78, 0x6b, 0xbc, 0xeb, 0x4f, 0x6f, 0x8d, 0xc7, 0xe7, 0x75, 0x47, 0xe1, 0x4d, - 0xd3, 0x89, 0x6f, 0x7f, 0x64, 0x5c, 0x92, 0x9f, 0x82, 0xde, 0x59, 0x5c, 0xda, 0x0f, 0xad, 0x59, - 0x5c, 0x0a, 0xd1, 0x7a, 0x00, 0x92, 0xf3, 0xba, 0xc3, 0xee, 0xcc, 0x1e, 0x83, 0xb8, 0xa6, 0xb3, - 0x5b, 0x58, 0xa1, 0xfe, 0x49, 0x3d, 0x01, 0x9d, 0xc5, 0x25, 0x17, 0xb4, 0x8c, 0x4b, 0x61, 0x50, - 0x42, 0x9e, 0xd4, 0xe7, 0x67, 0xbf, 0xf6, 0x67, 0x63, 0x5d, 0x2f, 0xbd, 0x3e, 0xd6, 0xd5, 0x72, - 0x26, 0xfc, 0xe6, 0x90, 0x8b, 0x98, 0x4f, 0x81, 0x5d, 0xde, 0x9e, 0x72, 0x02, 0x6b, 0xe1, 0xef, - 0xc4, 0x60, 0xac, 0x41, 0xc5, 0xf9, 0xc6, 0xd0, 0xca, 0x3a, 0x4c, 0x43, 0x72, 0x56, 0xec, 0x37, - 0x9d, 0x1a, 0x87, 0x5f, 0xe9, 0xd0, 0x38, 0x0c, 0x88, 0x9e, 0x84, 0x6d, 0x38, 0x15, 0x6d, 0x1b, - 0x04, 0xff, 0xfb, 0x30, 0x0d, 0xaf, 0x25, 0xe0, 0x18, 0x7d, 0x14, 0x62, 0xd5, 0x34, 0xdd, 0x99, - 0x2a, 0x59, 0xbb, 0xa6, 0x43, 0xb7, 0x13, 0x63, 0x93, 0x4b, 0x63, 0xd8, 0x6b, 0x9e, 0x64, 0xcd, - 0x2d, 0x54, 0x72, 0x13, 0xba, 0x57, 0x08, 0x1e, 0x11, 0x84, 0x63, 0x38, 0x6a, 0x95, 0x0b, 0x88, - 0x15, 0x48, 0x2d, 0x7b, 0x48, 0x12, 0x63, 0xb5, 0x9a, 0x78, 0x43, 0x52, 0xc5, 0xea, 0x26, 0xbb, - 0xb8, 0x1b, 0xa7, 0x5b, 0x48, 0x92, 0x54, 0xd0, 0x3b, 0xba, 0xa3, 0xd0, 0xad, 0xd6, 0xd9, 0x91, - 0x73, 0x9c, 0xec, 0x2d, 0xb4, 0x20, 0x3f, 0x0d, 0xbd, 0xfc, 0x98, 0x0b, 0xa5, 0x21, 0xbe, 0x8d, - 0x77, 0x69, 0x3f, 0xfd, 0x0a, 0xf9, 0x17, 0x4d, 0x42, 0x37, 0x65, 0x9e, 0xbf, 0x48, 0xc8, 0x4c, - 0x36, 0x70, 0x3f, 0x49, 0x99, 0x54, 0x18, 0x98, 0xfc, 0x14, 0x24, 0x67, 0x8d, 0x9a, 0xa6, 0x1b, - 0x41, 0x6a, 0x29, 0x46, 0x8d, 0xf2, 0x6c, 0xd6, 0xb9, 0xea, 0x2b, 0xac, 0x80, 0x0e, 0x42, 0x0f, - 0xbb, 0xc8, 0xcd, 0x8f, 0xcd, 0x79, 0x49, 0x9e, 0x81, 0x5e, 0x4a, 0x7b, 0xd9, 0x44, 0x88, 0xbf, - 0xec, 0xe1, 0x37, 0xc6, 0xa9, 0x95, 0xe4, 0xe4, 0x63, 0x1e, 0xb3, 0x08, 0x12, 0x65, 0xd5, 0x51, - 0xf9, 0xb8, 0xe9, 0xff, 0xf2, 0x93, 0x90, 0xe4, 0x44, 0x6c, 0x74, 0x06, 0xe2, 0x86, 0x69, 0xf3, - 0x83, 0xef, 0x6c, 0xab, 0xa1, 0x2c, 0x9b, 0xf9, 0x04, 0x59, 0x34, 0x0a, 0x01, 0xce, 0x2b, 0x2d, - 0x57, 0xc9, 0x05, 0x9f, 0x22, 0xf9, 0xa6, 0xdc, 0xf7, 0x2f, 0x9b, 0xd2, 0x06, 0x75, 0x70, 0x95, - 0xe5, 0xa3, 0x31, 0x18, 0xf3, 0xb5, 0x5e, 0xc3, 0x16, 0x89, 0xf5, 0xd8, 0x02, 0xe3, 0xda, 0x82, - 0x7c, 0x4c, 0xf2, 0xf6, 0x16, 0xea, 0xf2, 0x04, 0xc4, 0x73, 0xa6, 0x89, 0xb2, 0x90, 0x64, 0x07, - 0xdc, 0x06, 0xd3, 0x97, 0x84, 0xe2, 0x96, 0x49, 0x9b, 0x6d, 0x6c, 0x3a, 0xd7, 0x55, 0xcb, 0x7d, - 0xc2, 0x24, 0xca, 0xf2, 0xe3, 0x90, 0x9a, 0x31, 0x74, 0x1b, 0xeb, 0x76, 0x9d, 0x2e, 0xbd, 0x8d, - 0xaa, 0x51, 0xda, 0xe6, 0x14, 0x58, 0x81, 0x08, 0x5c, 0x35, 0x4d, 0x8a, 0x99, 0x50, 0xc8, 0xbf, - 0xcc, 0x4c, 0xe5, 0x57, 0x5b, 0x8a, 0xe8, 0xf1, 0xce, 0x45, 0xc4, 0x07, 0xe9, 0xca, 0xe8, 0xff, - 0x48, 0x70, 0xb4, 0x71, 0x41, 0x6d, 0xe3, 0x5d, 0xbb, 0xd3, 0xf5, 0xf4, 0x1c, 0xa4, 0x56, 0xe8, - 0x3b, 0xe2, 0xa7, 0xf1, 0x2e, 0xca, 0x42, 0x2f, 0x2e, 0x9f, 0x39, 0x7b, 0xf6, 0x91, 0xc7, 0x99, - 0xb6, 0x5f, 0xe9, 0x52, 0x44, 0x05, 0x1a, 0x83, 0x94, 0x8d, 0x4b, 0xe6, 0x99, 0xb3, 0xe7, 0xb6, - 0x1f, 0x61, 0xea, 0x75, 0xa5, 0x4b, 0xf1, 0xaa, 0xa6, 0x93, 0x64, 0xd4, 0xdf, 0xfe, 0xe8, 0xb8, - 0x94, 0xef, 0x86, 0xb8, 0x5d, 0xaf, 0xdd, 0x55, 0x1d, 0x79, 0xb5, 0x1b, 0x26, 0xfc, 0x98, 0xd4, - 0x40, 0x5d, 0x53, 0xab, 0x5a, 0x59, 0xf5, 0x5e, 0x80, 0xa7, 0x7d, 0x32, 0xa0, 0x10, 0xcd, 0x45, - 0x90, 0xdd, 0x53, 0x92, 0xf2, 0xa7, 0x25, 0xe8, 0xbf, 0x2a, 0x28, 0xaf, 0x62, 0x07, 0x5d, 0x04, - 0x70, 0x7b, 0x12, 0xcb, 0xe6, 0xc8, 0x64, 0xb8, 0xaf, 0x49, 0x17, 0x47, 0xf1, 0x81, 0xa3, 0xf3, - 0x54, 0x11, 0x4d, 0xc3, 0xe6, 0xef, 0x5f, 0x22, 0x50, 0x5d, 0x60, 0xf4, 0x10, 0x20, 0x6a, 0xe1, - 0x8a, 0xd7, 0x0c, 0x47, 0xd3, 0x2b, 0x45, 0xd3, 0xb8, 0xce, 0x1f, 0x0b, 0xc6, 0x95, 0x34, 0x6d, - 0xb9, 0x4a, 0x1b, 0x56, 0x48, 0x3d, 0x61, 0x3a, 0xe5, 0x52, 0x21, 0xbb, 0x89, 0x5a, 0x2e, 0x5b, - 0xd8, 0xb6, 0xb9, 0x11, 0x13, 0x45, 0x74, 0x11, 0x7a, 0xcd, 0xfa, 0x46, 0x51, 0x58, 0x8c, 0xbe, - 0x33, 0x47, 0x9b, 0xad, 0x7f, 0xa1, 0x1f, 0xdc, 0x02, 0xf4, 0x98, 0xf5, 0x0d, 0xa2, 0x2d, 0xf7, - 0x40, 0x7f, 0x13, 0x66, 0xfa, 0xae, 0x79, 0x7c, 0xd0, 0xe7, 0xeb, 0x7c, 0x04, 0x45, 0xd3, 0xd2, - 0x0c, 0x4b, 0x73, 0x76, 0xe9, 0xed, 0x95, 0xb8, 0x92, 0x16, 0x0d, 0x2b, 0xbc, 0x5e, 0xde, 0x86, - 0xa1, 0x55, 0xea, 0x6a, 0x79, 0x9c, 0x9f, 0xf5, 0xf8, 0x93, 0xa2, 0xf9, 0x6b, 0xc9, 0x59, 0xac, - 0x81, 0xb3, 0xfc, 0x33, 0x2d, 0xb5, 0xf3, 0x7c, 0xe7, 0xda, 0x19, 0xdc, 0xfc, 0xff, 0xe2, 0x70, - 0x60, 0x71, 0x72, 0xcf, 0xda, 0x67, 0xbe, 0xda, 0x55, 0xcc, 0xa8, 0x08, 0x23, 0xbb, 0xf7, 0xa6, - 0x9a, 0x8d, 0x30, 0xa3, 0xd9, 0xc8, 0x25, 0x24, 0x3f, 0x0e, 0x03, 0x2b, 0xaa, 0xe5, 0xac, 0x62, - 0xe7, 0x0a, 0x56, 0xcb, 0xd8, 0x0a, 0xee, 0xba, 0x03, 0x62, 0xd7, 0x45, 0x90, 0xa0, 0x5b, 0x2b, - 0xdb, 0x75, 0xe8, 0xff, 0xf2, 0x16, 0x24, 0xe8, 0x0d, 0x36, 0x77, 0x47, 0xe6, 0x18, 0x6c, 0x47, - 0x26, 0xb6, 0x74, 0xd7, 0xc1, 0xb6, 0x08, 0xe8, 0x68, 0x01, 0x3d, 0x26, 0xf6, 0xd5, 0xf8, 0xde, - 0xfb, 0x2a, 0x57, 0x44, 0xbe, 0xbb, 0x56, 0xa1, 0x37, 0x4f, 0x4c, 0xf1, 0xfc, 0xac, 0xcb, 0x88, - 0xe4, 0x31, 0x82, 0x16, 0x61, 0xc8, 0x54, 0x2d, 0x87, 0x5e, 0xdd, 0xdf, 0xa2, 0xa3, 0xe0, 0xba, - 0x3e, 0xde, 0xb8, 0xf2, 0x02, 0x83, 0xe5, 0xbd, 0x0c, 0x98, 0xfe, 0x4a, 0xf9, 0xcf, 0x13, 0xd0, - 0xc3, 0x85, 0xf1, 0x04, 0xf4, 0x72, 0xb1, 0x72, 0xed, 0x3c, 0x36, 0xd9, 0xb8, 0x31, 0x4d, 0xba, - 0x1b, 0x08, 0xa7, 0x27, 0x70, 0xd0, 0x71, 0x48, 0x96, 0xb6, 0x54, 0x4d, 0x2f, 0x6a, 0x65, 0xe1, - 0xf5, 0xbe, 0x7e, 0x6b, 0xbc, 0x77, 0x86, 0xd4, 0xcd, 0xcf, 0x2a, 0xbd, 0xb4, 0x71, 0xbe, 0x4c, - 0x3c, 0x81, 0x2d, 0xac, 0x55, 0xb6, 0x1c, 0xbe, 0xc2, 0x78, 0x09, 0x5d, 0x80, 0x04, 0x51, 0x08, - 0xfe, 0xb2, 0x2b, 0xdb, 0x10, 0x7b, 0xb8, 0x01, 0x60, 0x3e, 0x49, 0x3a, 0x7e, 0xef, 0xd7, 0xc7, - 0x25, 0x85, 0x62, 0xa0, 0x19, 0x18, 0xa8, 0xaa, 0xb6, 0x53, 0xa4, 0x3b, 0x18, 0xe9, 0xbe, 0x9b, - 0x92, 0x38, 0xdc, 0x28, 0x10, 0x2e, 0x58, 0xce, 0x7a, 0x1f, 0xc1, 0x62, 0x55, 0x65, 0x74, 0x12, - 0xd2, 0x94, 0x48, 0xc9, 0xa8, 0xd5, 0x34, 0x87, 0xf9, 0x56, 0x3d, 0x54, 0xee, 0x83, 0xa4, 0x7e, - 0x86, 0x56, 0x53, 0x0f, 0xeb, 0x08, 0xa4, 0xe8, 0x53, 0x12, 0x0a, 0xc2, 0xae, 0x4d, 0x26, 0x49, - 0x05, 0x6d, 0x3c, 0x01, 0x43, 0x9e, 0x7d, 0x64, 0x20, 0x49, 0x46, 0xc5, 0xab, 0xa6, 0x80, 0x0f, - 0xc3, 0xa8, 0x8e, 0x77, 0xe8, 0x45, 0xce, 0x00, 0x74, 0x8a, 0x42, 0x23, 0xd2, 0x76, 0x35, 0x88, - 0x71, 0x3f, 0x0c, 0x96, 0x84, 0xf0, 0x19, 0x2c, 0x50, 0xd8, 0x01, 0xb7, 0x96, 0x82, 0x1d, 0x86, - 0xa4, 0x6a, 0x9a, 0x0c, 0xa0, 0x8f, 0xdb, 0x47, 0xd3, 0xa4, 0x4d, 0xa7, 0x60, 0x98, 0x8e, 0xd1, - 0xc2, 0x76, 0xbd, 0xea, 0x70, 0x22, 0xfd, 0x14, 0x66, 0x88, 0x34, 0x28, 0xac, 0x9e, 0xc2, 0xde, - 0x0b, 0x03, 0xf8, 0x9a, 0x56, 0xc6, 0x7a, 0x09, 0x33, 0xb8, 0x01, 0x0a, 0xd7, 0x2f, 0x2a, 0x29, - 0xd0, 0x03, 0xe0, 0xda, 0xbd, 0xa2, 0xb0, 0xc9, 0x83, 0x8c, 0x9e, 0xa8, 0xcf, 0xb1, 0x6a, 0x39, - 0x03, 0x89, 0x59, 0xd5, 0x51, 0x89, 0x83, 0xe1, 0xec, 0xb0, 0x8d, 0xa6, 0x5f, 0x21, 0xff, 0xca, - 0xdf, 0x8e, 0x41, 0xe2, 0xaa, 0xe1, 0x60, 0xf4, 0xa8, 0xcf, 0x01, 0x1c, 0x6c, 0xa6, 0xcf, 0xab, - 0x5a, 0x45, 0xc7, 0xe5, 0x45, 0xbb, 0xe2, 0x7b, 0xcf, 0xed, 0xa9, 0x53, 0x2c, 0xa0, 0x4e, 0xa3, - 0xd0, 0x6d, 0x19, 0x75, 0xbd, 0x2c, 0x6e, 0x1c, 0xd2, 0x02, 0x2a, 0x40, 0xd2, 0xd5, 0x92, 0x44, - 0x94, 0x96, 0x0c, 0x11, 0x2d, 0x21, 0x3a, 0xcc, 0x2b, 0x94, 0xde, 0x0d, 0xae, 0x2c, 0x79, 0x48, - 0xb9, 0xc6, 0x8b, 0x6b, 0x5b, 0x7b, 0x0a, 0xeb, 0xa1, 0x91, 0xcd, 0xc4, 0x9d, 0x7b, 0x57, 0x78, - 0x4c, 0xe3, 0xd2, 0x6e, 0x03, 0x97, 0x5e, 0x40, 0xad, 0xf8, 0xdb, 0xf2, 0x5e, 0x3a, 0x2e, 0x4f, - 0xad, 0xd8, 0xfb, 0xf2, 0xa3, 0x90, 0xb2, 0xb5, 0x8a, 0xae, 0x3a, 0x75, 0x0b, 0x73, 0xcd, 0xf3, - 0x2a, 0xe4, 0xcf, 0x4b, 0xd0, 0xc3, 0x34, 0xd9, 0x27, 0x37, 0xa9, 0xb9, 0xdc, 0x62, 0xad, 0xe4, - 0x16, 0xdf, 0xbf, 0xdc, 0x72, 0x00, 0x2e, 0x33, 0x36, 0x7f, 0x1b, 0xdc, 0xc4, 0x63, 0x60, 0x2c, - 0xae, 0x6a, 0x15, 0xbe, 0x50, 0x7d, 0x48, 0xf2, 0x7f, 0x92, 0x88, 0x13, 0xcb, 0xdb, 0x51, 0x0e, - 0x06, 0x04, 0x5f, 0xc5, 0xcd, 0xaa, 0x5a, 0xe1, 0xba, 0x73, 0xac, 0x25, 0x73, 0x97, 0xab, 0x6a, - 0x45, 0xe9, 0xe3, 0xfc, 0x90, 0x42, 0xf3, 0x79, 0x88, 0xb5, 0x98, 0x87, 0xc0, 0xc4, 0xc7, 0xf7, - 0x37, 0xf1, 0x81, 0x29, 0x4a, 0x84, 0xa7, 0xe8, 0x33, 0x31, 0x1a, 0xcc, 0x98, 0x86, 0xad, 0x56, - 0xdf, 0x8c, 0x15, 0x71, 0x04, 0x52, 0xa6, 0x51, 0x2d, 0xb2, 0x16, 0x76, 0x13, 0x37, 0x69, 0x1a, - 0x55, 0xa5, 0x61, 0xda, 0xbb, 0xef, 0xd0, 0x72, 0xe9, 0xb9, 0x03, 0x52, 0xeb, 0x0d, 0x4b, 0xcd, - 0x82, 0x7e, 0x26, 0x0a, 0xbe, 0x97, 0x3d, 0x4c, 0x64, 0x40, 0x37, 0x47, 0xa9, 0x71, 0xef, 0x65, - 0x6c, 0x33, 0x48, 0x85, 0xc3, 0x11, 0x0c, 0x66, 0xfa, 0x9b, 0x45, 0xc1, 0x7e, 0xb5, 0x54, 0x38, - 0x9c, 0xfc, 0xab, 0x12, 0xc0, 0x02, 0x91, 0x2c, 0x1d, 0x2f, 0xd9, 0x85, 0x6c, 0xca, 0x42, 0x31, - 0xd0, 0xf3, 0x58, 0xab, 0x49, 0xe3, 0xfd, 0xf7, 0xdb, 0x7e, 0xbe, 0x67, 0x60, 0xc0, 0x53, 0x46, - 0x1b, 0x0b, 0x66, 0xc6, 0xf6, 0xf0, 0xaa, 0x57, 0xb1, 0xa3, 0xf4, 0x5f, 0xf3, 0x95, 0xe4, 0x3f, - 0x90, 0x20, 0x45, 0x79, 0x5a, 0xc4, 0x8e, 0x1a, 0x98, 0x43, 0x69, 0xff, 0x73, 0x78, 0x0c, 0x80, - 0x91, 0xb1, 0xb5, 0x1b, 0x98, 0x6b, 0x56, 0x8a, 0xd6, 0xac, 0x6a, 0x37, 0x30, 0x3a, 0xe7, 0x0a, - 0x3c, 0xbe, 0xb7, 0xc0, 0x85, 0xd7, 0xcd, 0xc5, 0x7e, 0x08, 0x7a, 0xe9, 0x27, 0x72, 0x76, 0x6c, - 0xee, 0x48, 0xf7, 0xe8, 0xf5, 0xda, 0xda, 0x8e, 0x2d, 0xbf, 0x00, 0xbd, 0x6b, 0x3b, 0x2c, 0x37, - 0x72, 0x04, 0x52, 0x96, 0x61, 0xf0, 0x3d, 0x99, 0xf9, 0x42, 0x49, 0x52, 0x41, 0xb7, 0x20, 0x91, - 0x0f, 0x88, 0x79, 0xf9, 0x00, 0x2f, 0xa1, 0x11, 0x6f, 0x2b, 0xa1, 0x71, 0xea, 0xab, 0x12, 0xf4, - 0xf9, 0xec, 0x03, 0x7a, 0x04, 0x0e, 0xe4, 0x17, 0x96, 0x67, 0x9e, 0x2e, 0xce, 0xcf, 0x16, 0x2f, - 0x2f, 0xe4, 0xe6, 0xbc, 0xb7, 0x26, 0xd9, 0x83, 0xaf, 0xdc, 0x9c, 0x40, 0x3e, 0xd8, 0x75, 0x7d, - 0x5b, 0x37, 0xae, 0xeb, 0x68, 0x0a, 0x46, 0x83, 0x28, 0xb9, 0xfc, 0x6a, 0x61, 0x69, 0x2d, 0x2d, - 0x65, 0x0f, 0xbc, 0x72, 0x73, 0x62, 0xd8, 0x87, 0x91, 0xdb, 0xb0, 0xb1, 0xee, 0x34, 0x22, 0xcc, - 0x2c, 0x2f, 0x2e, 0xce, 0xaf, 0xa5, 0x63, 0x0d, 0x08, 0xdc, 0x60, 0x3f, 0x00, 0xc3, 0x41, 0x84, - 0xa5, 0xf9, 0x85, 0x74, 0x3c, 0x8b, 0x5e, 0xb9, 0x39, 0x31, 0xe8, 0x83, 0x5e, 0xd2, 0xaa, 0xd9, - 0xe4, 0xcb, 0x1f, 0x1b, 0xeb, 0xfa, 0xe4, 0xc7, 0xc7, 0x24, 0x32, 0xb2, 0x81, 0x80, 0x8d, 0x40, - 0x0f, 0xc1, 0xa1, 0xd5, 0xf9, 0xb9, 0xa5, 0xc2, 0x6c, 0x71, 0x71, 0x75, 0xae, 0xc8, 0x3e, 0xb2, - 0xe1, 0x8e, 0x6e, 0xe8, 0x95, 0x9b, 0x13, 0x7d, 0x7c, 0x48, 0xad, 0xa0, 0x57, 0x94, 0xc2, 0xd5, - 0xe5, 0xb5, 0x42, 0x5a, 0x62, 0xd0, 0x2b, 0x16, 0xbe, 0x66, 0x38, 0xec, 0x1b, 0x5a, 0x0f, 0xc3, - 0xe1, 0x26, 0xd0, 0xee, 0xc0, 0x86, 0x5f, 0xb9, 0x39, 0x31, 0xb0, 0x62, 0x61, 0xb6, 0x7e, 0x28, - 0xc6, 0x24, 0x64, 0x1a, 0x31, 0x96, 0x57, 0x96, 0x57, 0x73, 0x0b, 0xe9, 0x89, 0x6c, 0xfa, 0x95, - 0x9b, 0x13, 0xfd, 0xc2, 0x18, 0x12, 0x78, 0x6f, 0x64, 0x77, 0x33, 0xe2, 0x79, 0xff, 0xc3, 0x70, - 0xcc, 0x76, 0xd4, 0x6d, 0x4d, 0xaf, 0xb8, 0x19, 0x67, 0x5e, 0xe6, 0x21, 0xcf, 0xb1, 0xaa, 0xf6, - 0x62, 0x5d, 0x2b, 0x8b, 0x4a, 0xf1, 0x77, 0xcf, 0xf4, 0x73, 0xb6, 0xf5, 0xc9, 0x52, 0x36, 0x22, - 0xbb, 0x1a, 0x1d, 0x3a, 0xb5, 0x3e, 0xaa, 0xc8, 0x46, 0x24, 0xd0, 0xb3, 0x7b, 0x06, 0x77, 0xf2, - 0x7b, 0x25, 0x18, 0xbc, 0xa2, 0xd9, 0x8e, 0x61, 0x69, 0x25, 0xb5, 0x4a, 0x5f, 0x98, 0x9c, 0x6b, - 0xd7, 0xb6, 0x86, 0x96, 0xfa, 0x65, 0xe8, 0xb9, 0xa6, 0x56, 0x99, 0x51, 0x63, 0x8f, 0x78, 0xf6, - 0x94, 0xa2, 0x67, 0xe1, 0x04, 0x1d, 0x86, 0x2d, 0xff, 0x76, 0x0c, 0x86, 0xe8, 0x9a, 0xb0, 0xd9, - 0x97, 0x90, 0x48, 0xa8, 0x95, 0x87, 0x84, 0xa5, 0x3a, 0x3c, 0x77, 0x98, 0x9f, 0xe4, 0xf9, 0xf0, - 0xe3, 0xd1, 0x39, 0xee, 0xc9, 0x59, 0x5c, 0x52, 0x28, 0x2e, 0xfa, 0x5b, 0x90, 0xac, 0xa9, 0x3b, - 0x45, 0x4a, 0x87, 0x05, 0x30, 0xb9, 0xce, 0xe8, 0xbc, 0x71, 0x6b, 0x7c, 0x68, 0x57, 0xad, 0x55, - 0xa7, 0x65, 0x41, 0x47, 0x56, 0x7a, 0x6b, 0xea, 0x0e, 0x61, 0x11, 0x99, 0x30, 0x44, 0x6a, 0x4b, - 0x5b, 0xaa, 0x5e, 0xc1, 0xac, 0x13, 0x9a, 0x09, 0xcd, 0x5f, 0xe9, 0xb8, 0x93, 0x83, 0x5e, 0x27, - 0x3e, 0x72, 0xb2, 0x32, 0x50, 0x53, 0x77, 0x66, 0x68, 0x05, 0xe9, 0x71, 0x3a, 0xf9, 0x81, 0x8f, - 0x8c, 0x77, 0xd1, 0x33, 0x86, 0xaf, 0x49, 0x00, 0x9e, 0xc4, 0x50, 0x09, 0xd2, 0x25, 0xb7, 0x44, - 0x71, 0x6d, 0x3e, 0x95, 0x93, 0x11, 0x53, 0x12, 0x12, 0x3b, 0xdb, 0xa9, 0xbf, 0x7c, 0x6b, 0x5c, - 0x52, 0x86, 0x4a, 0xa1, 0x19, 0x79, 0x3b, 0xf4, 0xd5, 0xcd, 0xb2, 0xea, 0xe0, 0x22, 0x8d, 0xea, - 0x62, 0x91, 0xbb, 0xfe, 0x18, 0xa1, 0xf5, 0xc6, 0xad, 0x71, 0xc4, 0x46, 0xe7, 0x43, 0x96, 0xa9, - 0x2f, 0x00, 0xac, 0x86, 0x20, 0xf8, 0x86, 0xf6, 0x47, 0x12, 0xf4, 0xcd, 0xfa, 0xee, 0x7d, 0x65, - 0xa0, 0xb7, 0x66, 0xe8, 0xda, 0x36, 0xd7, 0xce, 0x94, 0x22, 0x8a, 0x28, 0x0b, 0x49, 0xf6, 0x04, - 0xcf, 0xd9, 0x15, 0x89, 0x51, 0x51, 0x26, 0x58, 0xd7, 0xf1, 0x86, 0xad, 0x89, 0x49, 0x51, 0x44, - 0x11, 0x5d, 0x86, 0xb4, 0x8d, 0x4b, 0x75, 0x4b, 0x73, 0x76, 0x8b, 0x25, 0x43, 0x77, 0xd4, 0x92, - 0xc3, 0x1e, 0x73, 0xe5, 0x8f, 0xbc, 0x71, 0x6b, 0xfc, 0x10, 0xe3, 0x35, 0x0c, 0x21, 0x2b, 0x43, - 0xa2, 0x6a, 0x86, 0xd5, 0x90, 0x1e, 0xca, 0xd8, 0x51, 0xb5, 0xaa, 0x9d, 0x61, 0xa7, 0x66, 0xa2, - 0xe8, 0x1b, 0xcb, 0x17, 0x7a, 0xfd, 0x69, 0xae, 0xcb, 0x90, 0x36, 0x4c, 0x6c, 0x05, 0xdc, 0x52, - 0x29, 0xdc, 0x73, 0x18, 0x42, 0x56, 0x86, 0x44, 0x95, 0x70, 0x59, 0x1d, 0x32, 0xdb, 0x22, 0x6c, - 0x34, 0xeb, 0x1b, 0x5e, 0x76, 0x6c, 0xb4, 0x61, 0x36, 0x72, 0xfa, 0x6e, 0xfe, 0x51, 0x8f, 0x7a, - 0x18, 0x4f, 0xfe, 0xd2, 0x67, 0x4f, 0x8f, 0x72, 0xe3, 0xe2, 0x65, 0xab, 0x9e, 0xc6, 0xbb, 0x64, - 0xfa, 0x39, 0xe8, 0x0a, 0x85, 0x24, 0x4e, 0xe8, 0x0b, 0xaa, 0x56, 0x15, 0x8f, 0x92, 0x15, 0x5e, - 0x42, 0x39, 0xe8, 0xb1, 0x1d, 0xd5, 0xa9, 0xdb, 0xfc, 0x13, 0x60, 0x0f, 0x44, 0x68, 0x5c, 0xde, - 0xd0, 0xcb, 0xab, 0x14, 0x41, 0xe1, 0x88, 0xc4, 0x8e, 0x38, 0xc6, 0x36, 0xd6, 0xb9, 0x24, 0x3b, - 0x5a, 0xed, 0xf4, 0x2c, 0x8f, 0x61, 0x13, 0xc1, 0x94, 0x71, 0x15, 0x57, 0x98, 0xaf, 0xb5, 0xa5, - 0x92, 0x90, 0x84, 0x7e, 0x10, 0x2c, 0x3f, 0xdf, 0xf1, 0x92, 0xe4, 0x02, 0x0b, 0xd3, 0x93, 0x95, - 0x21, 0xb7, 0x6a, 0x95, 0xd6, 0x20, 0x25, 0x70, 0x4f, 0x91, 0x7f, 0x35, 0xef, 0x54, 0x84, 0x14, - 0x7c, 0x1a, 0x2e, 0x72, 0x17, 0xfe, 0xcb, 0x8e, 0x97, 0x21, 0x5d, 0xd7, 0x37, 0x0c, 0x9d, 0xbe, - 0x23, 0xe4, 0xbe, 0x3f, 0x89, 0xfd, 0xe2, 0x7e, 0x55, 0x09, 0x43, 0xc8, 0xca, 0x90, 0x5b, 0x75, - 0x85, 0x45, 0x08, 0x65, 0x18, 0xf4, 0xa0, 0xe8, 0xb2, 0x4d, 0x45, 0x2e, 0xdb, 0x7b, 0xf8, 0xb2, - 0x3d, 0x10, 0xee, 0xc5, 0x5b, 0xb9, 0x03, 0x6e, 0x25, 0x41, 0x43, 0xcb, 0x00, 0x9e, 0xb1, 0xa0, - 0x39, 0x8c, 0xbe, 0x48, 0x35, 0xf0, 0x0c, 0x8f, 0x08, 0x09, 0x3d, 0x12, 0xe8, 0x9d, 0x30, 0x52, - 0xd3, 0xf4, 0xa2, 0x8d, 0xab, 0x9b, 0x45, 0x2e, 0x6e, 0x42, 0x99, 0x7e, 0x0e, 0x26, 0xbf, 0xd0, - 0x99, 0x76, 0xbc, 0x71, 0x6b, 0x3c, 0xcb, 0xcd, 0x6b, 0x23, 0x49, 0x59, 0x19, 0xae, 0x69, 0xfa, - 0x2a, 0xae, 0x6e, 0xce, 0xba, 0x75, 0xd3, 0xfd, 0x2f, 0x7f, 0x64, 0xbc, 0x8b, 0xaf, 0xe1, 0x2e, - 0xf9, 0x1c, 0x4d, 0xaf, 0xf3, 0xb5, 0x87, 0x6d, 0x12, 0xb6, 0xa8, 0xa2, 0x40, 0x93, 0x1e, 0x29, - 0xc5, 0xab, 0x60, 0x6b, 0xff, 0xa5, 0xff, 0x38, 0x21, 0xc9, 0xbf, 0x29, 0x41, 0xcf, 0xec, 0xd5, - 0x15, 0x55, 0xb3, 0xd0, 0x3c, 0x0c, 0x7b, 0x7a, 0x14, 0x5c, 0xf9, 0x47, 0xdf, 0xb8, 0x35, 0x9e, - 0x09, 0xab, 0x9a, 0xbb, 0xf4, 0x3d, 0x75, 0x16, 0x6b, 0x7f, 0xbe, 0x55, 0x6c, 0x1b, 0x20, 0xd5, - 0x00, 0x22, 0x37, 0x46, 0xbe, 0xa1, 0x61, 0x2e, 0x40, 0x2f, 0xe3, 0x96, 0x7e, 0xfc, 0xc2, 0x24, - 0xff, 0xf0, 0xb3, 0x83, 0xfb, 0xa3, 0x54, 0x99, 0xa2, 0xb9, 0x29, 0x4f, 0x82, 0x29, 0xbf, 0x2f, - 0x06, 0x30, 0x7b, 0xf5, 0xea, 0x9a, 0xa5, 0x99, 0x55, 0xec, 0xdc, 0x49, 0x01, 0xac, 0xc1, 0x01, - 0x5f, 0x3c, 0x65, 0x95, 0x42, 0x42, 0x98, 0x78, 0xe3, 0xd6, 0xf8, 0xd1, 0xb0, 0x10, 0x7c, 0x60, - 0xb2, 0x32, 0xe2, 0x45, 0x56, 0x56, 0xa9, 0x29, 0xd5, 0xb2, 0xed, 0xb8, 0x54, 0xe3, 0xad, 0xa9, - 0xfa, 0xc0, 0xfc, 0x54, 0x67, 0x6d, 0xa7, 0xb9, 0x84, 0x9f, 0x87, 0x3e, 0x4f, 0x24, 0x36, 0x7a, - 0x1a, 0x92, 0x0e, 0xff, 0x9f, 0x0b, 0xfa, 0x81, 0x48, 0x41, 0x0b, 0x6c, 0x2e, 0x6c, 0x97, 0x80, - 0xfc, 0x97, 0x12, 0x80, 0xa7, 0xc1, 0x3f, 0x9e, 0x0a, 0x47, 0xcc, 0x3c, 0x37, 0xca, 0xf1, 0x7d, - 0x39, 0x75, 0x1c, 0x3b, 0x24, 0xd6, 0xf7, 0xc7, 0x60, 0x64, 0x5d, 0x98, 0xa3, 0x1f, 0x7b, 0x19, - 0x3c, 0x0b, 0xbd, 0x58, 0x77, 0x2c, 0x8d, 0x0a, 0x81, 0x4c, 0xfa, 0xf9, 0x88, 0x49, 0x6f, 0x32, - 0x34, 0xfa, 0x91, 0x1c, 0x91, 0xac, 0xe7, 0xd4, 0x42, 0x42, 0x79, 0x4f, 0x1c, 0x32, 0xad, 0x30, - 0xd1, 0x0c, 0x0c, 0x95, 0x2c, 0x4c, 0x2b, 0x8a, 0xfe, 0x8c, 0x61, 0x3e, 0xeb, 0xb9, 0xa2, 0x21, - 0x00, 0x59, 0x19, 0x14, 0x35, 0x7c, 0x67, 0xa9, 0x00, 0x71, 0x10, 0x89, 0xf6, 0x11, 0xa8, 0x36, - 0x3d, 0x42, 0x99, 0x6f, 0x2d, 0xa2, 0x93, 0x20, 0x01, 0xb6, 0xb7, 0x0c, 0x7a, 0xb5, 0x74, 0x73, - 0x79, 0x11, 0x86, 0x34, 0x5d, 0x73, 0x34, 0xb5, 0x5a, 0xdc, 0x50, 0xab, 0xaa, 0x5e, 0xda, 0x8f, - 0x9b, 0xcd, 0xf6, 0x01, 0xde, 0x6d, 0x88, 0x9c, 0xac, 0x0c, 0xf2, 0x9a, 0x3c, 0xab, 0x40, 0x57, - 0xa0, 0x57, 0x74, 0x95, 0xd8, 0x97, 0x43, 0x22, 0xd0, 0x7d, 0xae, 0xe0, 0xbb, 0xe3, 0x30, 0xac, - 0xe0, 0xf2, 0xff, 0x9f, 0x8a, 0xce, 0xa6, 0x62, 0x11, 0x80, 0xad, 0x7a, 0x62, 0x6e, 0xf7, 0x31, - 0x1b, 0xc4, 0x6e, 0xa4, 0x18, 0x85, 0x59, 0xdb, 0xf1, 0xcd, 0xc7, 0x7f, 0x8e, 0x41, 0xbf, 0x7f, - 0x3e, 0xfe, 0x86, 0xee, 0x51, 0x68, 0xc5, 0x33, 0x48, 0x2c, 0x7b, 0xff, 0x70, 0x84, 0x41, 0x6a, - 0x50, 0xe2, 0xbd, 0x2d, 0xd1, 0x1b, 0x31, 0xe8, 0x59, 0x51, 0x2d, 0xb5, 0x66, 0xa3, 0xa7, 0x1a, - 0x9c, 0x51, 0x91, 0xbd, 0x6c, 0xf8, 0x3e, 0x34, 0x4f, 0x96, 0xb0, 0x70, 0xf4, 0x03, 0x4d, 0x5c, - 0xce, 0xfb, 0x61, 0x90, 0x44, 0xcb, 0xbe, 0x8b, 0x0e, 0x31, 0x7a, 0x7c, 0x4b, 0x22, 0x66, 0xef, - 0x94, 0x0d, 0x8d, 0x43, 0x1f, 0x01, 0xf3, 0x4c, 0x2e, 0x81, 0x81, 0x9a, 0xba, 0x53, 0x60, 0x35, - 0xe8, 0x34, 0xa0, 0x2d, 0x37, 0x19, 0x52, 0xf4, 0x24, 0x41, 0xe0, 0x86, 0xbd, 0x16, 0x01, 0x7e, - 0x0c, 0x80, 0x70, 0x51, 0x64, 0x37, 0x04, 0x59, 0xdc, 0x97, 0x22, 0x35, 0xb3, 0xf4, 0x96, 0x20, - 0xf7, 0x5b, 0x43, 0xb1, 0x38, 0x8f, 0x41, 0x16, 0x3a, 0x8e, 0x41, 0x7c, 0x7e, 0x6b, 0x88, 0x24, - 0xf3, 0x5b, 0x83, 0xc1, 0xbb, 0x4f, 0xb9, 0x5f, 0x93, 0x00, 0x79, 0x56, 0x5f, 0xc1, 0xb6, 0x49, - 0x82, 0x39, 0xe2, 0xa7, 0xfb, 0xbc, 0x69, 0xa9, 0x2d, 0x3f, 0xdd, 0x23, 0x23, 0xfc, 0x74, 0xdf, - 0x9a, 0x79, 0xdc, 0x33, 0x94, 0x31, 0x3e, 0x95, 0x4d, 0x2e, 0x6f, 0x4e, 0xce, 0x18, 0x9a, 0xc0, - 0x6e, 0xb0, 0x8c, 0x5d, 0xf2, 0x9f, 0x48, 0x70, 0xb8, 0x41, 0xa9, 0x5c, 0x9e, 0x31, 0x20, 0xcb, - 0xd7, 0xc8, 0xbf, 0x18, 0xc7, 0x78, 0xdf, 0xaf, 0xaa, 0x0e, 0x5b, 0x0d, 0x86, 0xf8, 0xce, 0x99, - 0x7c, 0x76, 0x09, 0xf4, 0x5f, 0x49, 0x30, 0xea, 0xef, 0xde, 0x1d, 0xcf, 0x3a, 0xf4, 0xfb, 0x7b, - 0xe7, 0x23, 0x79, 0xb0, 0x83, 0x91, 0xf0, 0x41, 0x04, 0xc8, 0xa0, 0xe7, 0xbc, 0x65, 0xcc, 0x72, - 0x71, 0x17, 0x3a, 0x95, 0x8d, 0xe0, 0x30, 0xbc, 0x9c, 0x13, 0x74, 0x92, 0xfe, 0xaf, 0x04, 0x89, - 0x15, 0xc3, 0xa8, 0x22, 0x03, 0x86, 0x75, 0xc3, 0x29, 0x12, 0x9d, 0xc7, 0xe5, 0x22, 0x0f, 0xdb, - 0x99, 0x99, 0x9c, 0xe9, 0x4c, 0x64, 0xdf, 0xb9, 0x35, 0xde, 0x48, 0x4a, 0x19, 0xd2, 0x0d, 0x27, - 0x4f, 0x6b, 0xd6, 0x58, 0x50, 0xff, 0x4e, 0x18, 0x08, 0x76, 0xc6, 0x8c, 0xe8, 0xb3, 0x1d, 0x77, - 0x16, 0x24, 0xf3, 0xc6, 0xad, 0xf1, 0x51, 0xb6, 0xbc, 0x02, 0xd5, 0xb2, 0xd2, 0xbf, 0xe1, 0xeb, - 0x9d, 0xdd, 0x1a, 0xfb, 0x1e, 0x99, 0xd1, 0x4f, 0x4b, 0x30, 0x42, 0x2b, 0xb5, 0x1b, 0x98, 0x46, - 0xfe, 0x0a, 0x2e, 0x19, 0x56, 0x19, 0x0d, 0x42, 0x8c, 0x9f, 0xc3, 0x24, 0x94, 0x98, 0x56, 0x46, - 0xa3, 0xd0, 0x6d, 0x5c, 0xd7, 0xf9, 0x25, 0x8e, 0x94, 0xc2, 0x0a, 0xe8, 0x14, 0x0c, 0xd3, 0x5d, - 0x88, 0x75, 0xc3, 0xed, 0x07, 0xff, 0xde, 0x10, 0x6d, 0xa0, 0xa4, 0x99, 0x15, 0x21, 0xb6, 0xcd, - 0x28, 0xd7, 0xab, 0xb8, 0xa8, 0x96, 0x4a, 0xf4, 0xce, 0x31, 0xfb, 0x82, 0xc9, 0x00, 0xab, 0xcd, - 0xb1, 0x4a, 0x12, 0x88, 0xba, 0xe6, 0x4f, 0x98, 0x22, 0xb7, 0x82, 0xa9, 0xe1, 0xa9, 0xcf, 0x49, - 0x00, 0x5e, 0xc2, 0x05, 0x3d, 0x04, 0x87, 0xf2, 0xcb, 0x4b, 0xb3, 0xc5, 0xd5, 0xb5, 0xdc, 0xda, - 0xfa, 0x6a, 0x71, 0x7d, 0x69, 0x75, 0xa5, 0x30, 0x33, 0x7f, 0x79, 0xbe, 0x30, 0xeb, 0x1d, 0x15, - 0xd8, 0x26, 0x2e, 0x69, 0x9b, 0x1a, 0x2e, 0xa3, 0xe3, 0x30, 0x1a, 0x84, 0x26, 0xa5, 0xc2, 0x6c, - 0x5a, 0xca, 0xf6, 0xbf, 0x72, 0x73, 0x22, 0xc9, 0xfc, 0x4b, 0x5c, 0x46, 0x27, 0xe1, 0x40, 0x23, - 0xdc, 0xfc, 0xd2, 0x5c, 0x3a, 0x96, 0x1d, 0x78, 0xe5, 0xe6, 0x44, 0xca, 0x75, 0x44, 0x91, 0x0c, - 0xc8, 0x0f, 0xc9, 0xe9, 0xc5, 0xb3, 0xf0, 0xca, 0xcd, 0x89, 0x1e, 0x36, 0xeb, 0xd9, 0xc4, 0xcb, - 0x1f, 0x1b, 0xeb, 0xca, 0xbf, 0xad, 0xe5, 0x61, 0xc0, 0x25, 0xdf, 0x84, 0x6b, 0x2f, 0x56, 0xeb, - 0xc4, 0xfc, 0x69, 0x7a, 0x69, 0x8a, 0xa9, 0xbb, 0xe6, 0xec, 0x9e, 0xe6, 0xaa, 0x7e, 0x9a, 0x89, - 0x6b, 0x6a, 0x47, 0xa4, 0xfa, 0x43, 0x87, 0x02, 0x2f, 0xcb, 0x90, 0x09, 0x1f, 0x0a, 0x38, 0x3b, - 0xed, 0x9d, 0x07, 0xec, 0x91, 0xf9, 0x8f, 0xcc, 0xec, 0xb7, 0x38, 0x4b, 0xd8, 0x7f, 0xbe, 0x7f, - 0xef, 0xa3, 0x0d, 0xf9, 0x3f, 0x24, 0x00, 0x2d, 0xda, 0x95, 0x19, 0xe2, 0x34, 0xfa, 0xae, 0xae, - 0x85, 0xd2, 0x56, 0xd2, 0x9d, 0x48, 0x5b, 0xad, 0x05, 0x12, 0x41, 0xb1, 0x7d, 0x65, 0xa0, 0xdb, - 0xce, 0x06, 0xc5, 0xdf, 0x94, 0x6c, 0x50, 0x73, 0xbf, 0x30, 0x71, 0xe7, 0xe2, 0xc8, 0xee, 0xfd, - 0xc6, 0xd2, 0x3c, 0xf3, 0xdb, 0xb3, 0x47, 0xe6, 0x37, 0xd3, 0x32, 0xbd, 0xcb, 0xb1, 0xd1, 0x59, - 0xf1, 0x70, 0xa9, 0xb7, 0xbd, 0xfd, 0x9b, 0xbf, 0x6c, 0x4a, 0xbe, 0x2c, 0x76, 0xef, 0xa3, 0x90, - 0x6d, 0x54, 0x2e, 0xb1, 0x97, 0xc8, 0xaf, 0xc6, 0x21, 0xbd, 0x68, 0x57, 0x0a, 0x65, 0xcd, 0xb9, - 0xbb, 0x9a, 0x77, 0xa9, 0x75, 0x88, 0x8e, 0xde, 0xb8, 0x35, 0x3e, 0xc8, 0x44, 0xbb, 0x87, 0x40, - 0x6b, 0x30, 0x14, 0x76, 0xdb, 0x98, 0x82, 0xcd, 0xee, 0xe7, 0x24, 0xa7, 0xc1, 0x5d, 0x1b, 0x0c, - 0x9e, 0xa6, 0xa0, 0x9d, 0xe6, 0x3a, 0xcd, 0xf4, 0xea, 0xca, 0xdd, 0xcc, 0x6e, 0x7a, 0x53, 0x97, - 0x85, 0x4c, 0x78, 0x6e, 0xdc, 0x89, 0xfb, 0x73, 0x09, 0xfa, 0x16, 0x6d, 0x91, 0x3a, 0xc0, 0x3f, - 0xa6, 0xd9, 0x94, 0xf3, 0xee, 0xab, 0x9c, 0x78, 0x7b, 0xea, 0x2b, 0x5e, 0xea, 0x78, 0x42, 0x38, - 0x00, 0x23, 0xbe, 0x71, 0xba, 0xe3, 0xff, 0xe3, 0x18, 0x35, 0x9a, 0x79, 0x5c, 0xd1, 0x74, 0xd7, - 0x55, 0xc2, 0x7f, 0x53, 0x83, 0x44, 0x4f, 0xce, 0x89, 0xfd, 0xca, 0x79, 0x9b, 0xda, 0x89, 0x90, - 0x3c, 0x5d, 0xaf, 0x78, 0xb1, 0x31, 0x85, 0x21, 0x75, 0x70, 0xab, 0x28, 0x94, 0xa8, 0x90, 0xbf, - 0x2d, 0xc1, 0xc0, 0xa2, 0x5d, 0x59, 0xd7, 0xcb, 0x7f, 0xed, 0xf5, 0x77, 0x13, 0x0e, 0x04, 0x46, - 0x7a, 0xb7, 0x44, 0xfa, 0x07, 0x31, 0x18, 0x5e, 0xb4, 0x2b, 0x01, 0x0f, 0xd8, 0xfe, 0x6b, 0x26, - 0x56, 0xb2, 0x7a, 0x1c, 0x3e, 0xc0, 0x32, 0x3b, 0xf0, 0x2b, 0x32, 0x5f, 0x3e, 0x11, 0x5e, 0x3d, - 0x4d, 0xc1, 0x64, 0x65, 0xc4, 0xad, 0xa7, 0x02, 0x5a, 0x26, 0xb5, 0xbe, 0xc9, 0x5a, 0x83, 0xc3, - 0x0d, 0x32, 0x74, 0x27, 0xcc, 0xe3, 0x5a, 0xea, 0x88, 0x6b, 0xf9, 0x93, 0x12, 0x35, 0xe4, 0x64, - 0x59, 0xe1, 0x1a, 0x8b, 0x5b, 0x36, 0xdd, 0xd3, 0xc9, 0x3b, 0x38, 0x43, 0xe7, 0x03, 0x6f, 0x20, - 0xf7, 0xa5, 0xad, 0x6f, 0x87, 0x89, 0x56, 0x9c, 0xde, 0xbe, 0x1c, 0x3e, 0x20, 0xc1, 0x18, 0x11, - 0xaf, 0xa5, 0xea, 0xf6, 0x26, 0xb6, 0x9a, 0x05, 0x6b, 0xe7, 0x21, 0x23, 0x66, 0x88, 0x4f, 0x9c, - 0x45, 0x1b, 0x8a, 0x6e, 0x08, 0xe7, 0x2a, 0x80, 0x0f, 0x8d, 0xdd, 0x71, 0xb7, 0xe9, 0x9d, 0x18, - 0x1e, 0xd6, 0xf1, 0x12, 0xfd, 0x38, 0x2e, 0xbe, 0xce, 0xb5, 0x84, 0x7f, 0x59, 0x40, 0xc7, 0xd7, - 0xc3, 0x13, 0x7f, 0x12, 0x8e, 0xef, 0xcd, 0x99, 0x18, 0xfd, 0x99, 0xf7, 0x24, 0x21, 0xbe, 0x68, - 0x57, 0xd0, 0x4f, 0xc2, 0x50, 0xd8, 0x63, 0x7f, 0x24, 0xc2, 0x45, 0x6a, 0xf4, 0xc3, 0xb2, 0x8f, - 0x77, 0x8c, 0xe2, 0x4e, 0xc3, 0x2e, 0x0c, 0x04, 0xdd, 0xb6, 0xa9, 0x68, 0x5a, 0x01, 0x84, 0xec, - 0xf9, 0x0e, 0x11, 0xdc, 0xae, 0x5f, 0x80, 0xa4, 0xeb, 0x78, 0x9c, 0x8a, 0x26, 0x22, 0x60, 0xb3, - 0x67, 0xda, 0x87, 0x75, 0xfb, 0xfa, 0x49, 0x18, 0x0a, 0x6f, 0xf2, 0x6d, 0xc8, 0x39, 0x84, 0xd2, - 0x8e, 0x9c, 0x5b, 0x6d, 0x7d, 0x26, 0x80, 0x6f, 0x9f, 0x7a, 0x28, 0x9a, 0x90, 0x07, 0x9d, 0x7d, - 0xac, 0x13, 0x68, 0xb7, 0xc7, 0x77, 0xc2, 0x60, 0xc8, 0x8c, 0x3f, 0x1c, 0x4d, 0x27, 0x88, 0x91, - 0xbd, 0xd0, 0x29, 0x86, 0xdb, 0xfb, 0xcb, 0x12, 0x4b, 0xbc, 0x0b, 0x03, 0x80, 0xda, 0x50, 0x93, - 0xa6, 0x06, 0x23, 0x7b, 0x69, 0x9f, 0x88, 0x2e, 0x2b, 0x1f, 0x93, 0xe0, 0xc8, 0x5e, 0xd6, 0xe2, - 0x89, 0x36, 0x06, 0xd9, 0x1a, 0x3d, 0x5b, 0xb8, 0x2d, 0x74, 0x37, 0x1f, 0xf7, 0x26, 0xa4, 0x42, - 0xbe, 0x1e, 0x83, 0x53, 0xfe, 0x24, 0xc3, 0x8b, 0x75, 0x6c, 0xed, 0xba, 0xe9, 0x04, 0x53, 0xad, - 0x68, 0xba, 0xff, 0x69, 0xf8, 0x61, 0xbf, 0x41, 0xa6, 0xb0, 0x62, 0x4c, 0xf2, 0xcb, 0x12, 0xf4, - 0xad, 0xa8, 0x15, 0xac, 0xe0, 0x17, 0xeb, 0xd8, 0x76, 0x9a, 0xbc, 0x4d, 0x3e, 0x08, 0x3d, 0xc6, - 0xe6, 0xa6, 0xb8, 0x09, 0x9d, 0x50, 0x78, 0x09, 0x8d, 0x42, 0x77, 0x55, 0xab, 0x69, 0x6c, 0xcf, - 0x4e, 0x28, 0xac, 0x80, 0xc6, 0xa1, 0x8f, 0x66, 0xbb, 0x8a, 0xec, 0x55, 0x57, 0x42, 0x7c, 0x37, - 0xb0, 0xae, 0x3b, 0x6b, 0xf4, 0x69, 0x57, 0x06, 0x7a, 0x2d, 0x7c, 0x0d, 0x5b, 0x36, 0xfb, 0x76, - 0x7a, 0x52, 0x11, 0x45, 0xf9, 0x12, 0xf4, 0x33, 0x4e, 0xf8, 0x6c, 0x1f, 0x86, 0x24, 0x7d, 0x9f, - 0xe3, 0xf1, 0xd3, 0x4b, 0xca, 0x4f, 0xb3, 0x17, 0xce, 0x8c, 0x3e, 0x63, 0x89, 0x15, 0xf2, 0xf9, - 0x96, 0x82, 0x3f, 0x19, 0x1d, 0x9c, 0x31, 0x19, 0xba, 0x12, 0xfe, 0xc3, 0x6e, 0x38, 0xc0, 0x13, - 0x43, 0xaa, 0xa9, 0x4d, 0x6d, 0x39, 0x8e, 0xf8, 0x0a, 0x07, 0x70, 0x6f, 0x4c, 0x35, 0x35, 0x79, - 0x17, 0x12, 0x57, 0x1c, 0xc7, 0x44, 0xa7, 0xa0, 0xdb, 0xaa, 0x57, 0xb1, 0xb8, 0x18, 0xe0, 0x06, - 0xf7, 0xaa, 0xa9, 0x4d, 0x12, 0x00, 0xa5, 0x5e, 0xc5, 0x0a, 0x03, 0x41, 0x05, 0x18, 0xdf, 0xac, - 0x57, 0xab, 0xbb, 0xc5, 0x32, 0xa6, 0x3f, 0xf2, 0xea, 0xfe, 0x9e, 0x1a, 0xde, 0x31, 0x55, 0xdd, - 0x4d, 0xc4, 0x24, 0x95, 0xa3, 0x14, 0x6c, 0x96, 0x42, 0x89, 0xdf, 0x52, 0x2b, 0x08, 0x18, 0xf9, - 0x4f, 0x63, 0x90, 0x14, 0xa4, 0xe9, 0x93, 0x63, 0x5c, 0xc5, 0x25, 0xc7, 0x10, 0x97, 0xee, 0xdc, - 0x32, 0x42, 0x10, 0xaf, 0xf0, 0xc9, 0x4b, 0x5d, 0xe9, 0x52, 0x48, 0x81, 0xd4, 0xb9, 0x0f, 0xc1, - 0x49, 0x9d, 0x59, 0x27, 0xf3, 0x99, 0x30, 0x0d, 0x71, 0x66, 0x77, 0xa5, 0x4b, 0xa1, 0x25, 0x94, - 0x81, 0x1e, 0x62, 0x8f, 0x1c, 0x36, 0x5b, 0xa4, 0x9e, 0x97, 0xd1, 0x41, 0xe8, 0x36, 0x55, 0xa7, - 0xc4, 0xde, 0x68, 0x91, 0x06, 0x56, 0x24, 0xee, 0x00, 0xfb, 0xc2, 0x50, 0xf8, 0x17, 0x14, 0x89, - 0x30, 0xd8, 0xa7, 0x9c, 0x09, 0xdf, 0x2b, 0xaa, 0xe3, 0x60, 0x4b, 0x27, 0x04, 0x19, 0x38, 0x42, - 0x90, 0xd8, 0x30, 0xca, 0xbb, 0xfc, 0x57, 0x1d, 0xe9, 0xff, 0xfc, 0xf7, 0xe6, 0xa8, 0x3e, 0x14, - 0x69, 0x23, 0xfb, 0x31, 0xdb, 0x7e, 0x51, 0x99, 0x27, 0x40, 0x05, 0x18, 0x51, 0xcb, 0x65, 0x8d, - 0x28, 0xbc, 0x5a, 0x2d, 0x6e, 0x68, 0x34, 0x77, 0x69, 0xd3, 0x9f, 0x2a, 0x6e, 0x35, 0x17, 0xc8, - 0x43, 0xc8, 0x73, 0xf8, 0x7c, 0x0a, 0x7a, 0x4d, 0xc6, 0x94, 0x7c, 0x11, 0x86, 0x1b, 0x38, 0x25, - 0xfc, 0x6d, 0x6b, 0x7a, 0x59, 0xbc, 0x8e, 0x27, 0xff, 0x93, 0x3a, 0xfa, 0x39, 0x76, 0xe6, 0x64, - 0xd0, 0xff, 0xf3, 0x3f, 0xdd, 0xfa, 0xdb, 0x09, 0x83, 0xbe, 0x6f, 0x27, 0xa8, 0xa6, 0x96, 0x4f, - 0x51, 0xfa, 0xfc, 0x93, 0x09, 0x39, 0xde, 0xc0, 0x3e, 0x97, 0x30, 0x69, 0x58, 0x95, 0xa9, 0x0a, - 0xd6, 0x45, 0xe2, 0x91, 0x34, 0xa9, 0xa6, 0x66, 0x53, 0x75, 0xf4, 0x3e, 0x0f, 0x6f, 0x5f, 0xf4, - 0xfd, 0x4f, 0xbf, 0xa4, 0x90, 0x98, 0xcb, 0xad, 0xcc, 0xbb, 0x7a, 0xfc, 0x85, 0x18, 0x1c, 0xf5, - 0xe9, 0xb1, 0x0f, 0xb8, 0x51, 0x9d, 0xb3, 0xcd, 0x35, 0xbe, 0x8d, 0x8f, 0xab, 0x3c, 0x0d, 0x09, - 0x02, 0x8f, 0x22, 0x7e, 0x0d, 0x2e, 0xf3, 0xa9, 0x2f, 0xfd, 0x73, 0x39, 0x98, 0xfe, 0x0a, 0xcc, - 0x0a, 0x25, 0x92, 0xff, 0xf9, 0xf6, 0xe5, 0x97, 0xf6, 0xbe, 0x8c, 0x6f, 0xdf, 0x39, 0x31, 0x86, - 0x65, 0xf8, 0xbf, 0xe7, 0xe0, 0x48, 0x38, 0x65, 0xcb, 0xac, 0x68, 0x5b, 0xb9, 0xe7, 0x0e, 0x2c, - 0x75, 0xab, 0x07, 0xe5, 0x7b, 0xcd, 0x60, 0x44, 0x3a, 0x39, 0x2a, 0x1b, 0x2d, 0xef, 0xc0, 0xc1, - 0x67, 0x08, 0x53, 0xde, 0x29, 0xac, 0xd8, 0x0b, 0x0e, 0xba, 0x37, 0x45, 0x25, 0xee, 0x43, 0x8b, - 0xeb, 0x9f, 0xe0, 0x31, 0xce, 0x63, 0x8b, 0xe3, 0x93, 0x2d, 0xf7, 0x98, 0x49, 0xdf, 0xfe, 0xa2, - 0xf8, 0x30, 0xe5, 0x4f, 0x4b, 0x70, 0xa8, 0xa1, 0x6b, 0x6e, 0xfc, 0x97, 0x9a, 0x3c, 0x8a, 0xef, - 0xf4, 0xba, 0xba, 0xff, 0x9d, 0xfc, 0x5c, 0x13, 0x9e, 0x4f, 0x44, 0xf2, 0xcc, 0x98, 0x09, 0x30, - 0xfd, 0x24, 0x1c, 0x08, 0xf2, 0x2c, 0xa4, 0x75, 0x3f, 0x0c, 0x06, 0x83, 0x5d, 0x2e, 0xb5, 0x81, - 0x40, 0xb8, 0x2b, 0x6f, 0x86, 0xc5, 0xed, 0x0e, 0x79, 0xc1, 0x7f, 0x3e, 0xc4, 0x42, 0xa9, 0x4e, - 0x47, 0xec, 0x11, 0x90, 0xdf, 0x27, 0xc1, 0x44, 0xb0, 0x23, 0x2f, 0xa7, 0x68, 0x77, 0xc6, 0xf3, - 0x1d, 0x9b, 0xf0, 0xef, 0x49, 0x70, 0xcf, 0x1e, 0x3c, 0x71, 0x39, 0xfc, 0x94, 0x04, 0xa3, 0xbe, - 0x03, 0x64, 0x61, 0xea, 0x85, 0x16, 0x3c, 0xd2, 0xf6, 0x01, 0xb8, 0xeb, 0x91, 0x1d, 0x21, 0xc2, - 0x79, 0xed, 0xeb, 0xe3, 0x23, 0x8d, 0x6d, 0xb6, 0x32, 0xd2, 0x78, 0xe8, 0x7b, 0x07, 0xd5, 0xe5, - 0x55, 0x09, 0x1e, 0x08, 0x0e, 0xb9, 0xc9, 0x35, 0xaf, 0x1f, 0xd5, 0x7c, 0x7c, 0x43, 0x82, 0x53, - 0xed, 0x30, 0xc7, 0x27, 0x46, 0x83, 0x11, 0xef, 0x3e, 0x48, 0x78, 0x5a, 0xce, 0x74, 0x7e, 0x2f, - 0x8e, 0x2b, 0x2d, 0x72, 0x89, 0xde, 0x05, 0xf9, 0x9b, 0x7c, 0xb9, 0xf9, 0x67, 0xde, 0x95, 0x75, - 0x30, 0x8b, 0x22, 0x64, 0x1d, 0xc8, 0xa3, 0x34, 0x99, 0x92, 0x58, 0x93, 0x29, 0xf1, 0xa5, 0x0e, - 0xde, 0xc5, 0x8d, 0x5a, 0x93, 0xfb, 0x1c, 0x1b, 0x30, 0xd2, 0x44, 0xb1, 0xf9, 0x5a, 0xef, 0x5c, - 0xaf, 0x15, 0xd4, 0xa8, 0xba, 0xf2, 0x2e, 0x8c, 0xd3, 0xee, 0x9b, 0xc8, 0xfb, 0x6e, 0x8f, 0xdc, - 0xe1, 0x16, 0xa7, 0x69, 0xd7, 0x5c, 0x04, 0x2b, 0xd0, 0xc3, 0xa6, 0x9b, 0x8f, 0x7a, 0xff, 0x6a, - 0xc3, 0xe9, 0xc8, 0x1f, 0x14, 0x86, 0x6e, 0x56, 0x70, 0xdf, 0x7c, 0x61, 0xb5, 0x33, 0xe4, 0x3b, - 0xb4, 0xb0, 0x7c, 0x32, 0xf9, 0x9a, 0x30, 0x79, 0xcd, 0xb9, 0x73, 0x13, 0x28, 0x77, 0xd8, 0xe2, - 0x31, 0x11, 0xdd, 0x5d, 0xd3, 0xf6, 0x71, 0x61, 0xda, 0xdc, 0xa1, 0x45, 0x98, 0xb6, 0x1f, 0xcd, - 0x0c, 0xb8, 0x46, 0x2e, 0x82, 0xcd, 0xbf, 0xc2, 0x46, 0xee, 0x7b, 0x12, 0x1c, 0xa6, 0x43, 0xf4, - 0x5f, 0x12, 0xea, 0x54, 0xf2, 0x0f, 0x01, 0xb2, 0xad, 0x52, 0xb1, 0xe9, 0x92, 0x4f, 0xdb, 0x56, - 0xe9, 0x6a, 0x60, 0x0b, 0x7a, 0x08, 0x50, 0xd9, 0x76, 0xc2, 0xd0, 0x2c, 0xa1, 0x9a, 0x2e, 0xdb, - 0xce, 0xd5, 0x3d, 0x36, 0xac, 0xc4, 0x1d, 0x98, 0xd5, 0xaf, 0x4a, 0x90, 0x6d, 0x36, 0x64, 0x37, - 0x49, 0x77, 0x30, 0x70, 0x0b, 0x2d, 0x3c, 0x91, 0x8f, 0x76, 0x70, 0xdb, 0x2a, 0xb4, 0xa8, 0x0e, - 0x58, 0xf8, 0x6e, 0x7b, 0x0c, 0xe3, 0x41, 0x7d, 0x6d, 0xf4, 0xcc, 0x7f, 0x64, 0x8b, 0xe9, 0xf7, - 0x1b, 0x8c, 0xed, 0x5f, 0x25, 0xdf, 0x7d, 0x07, 0xc6, 0x5a, 0x30, 0x7f, 0xb7, 0xb7, 0x46, 0xa3, - 0xe5, 0x9c, 0xde, 0x25, 0xf7, 0xff, 0x31, 0xbe, 0x3c, 0x82, 0x2f, 0x87, 0x7d, 0x91, 0x5d, 0xb3, - 0x4f, 0x8f, 0xc8, 0x7f, 0x1b, 0x8e, 0x34, 0xc5, 0xe2, 0x2c, 0xe6, 0x20, 0xb1, 0xa5, 0xd9, 0xe2, - 0x9c, 0xe7, 0x74, 0x04, 0x77, 0x21, 0x22, 0x14, 0x55, 0x46, 0x90, 0xa6, 0x3d, 0xac, 0x18, 0x46, - 0x95, 0x73, 0x23, 0x2b, 0x30, 0xec, 0xab, 0xe3, 0x7d, 0x3d, 0x01, 0x09, 0xd3, 0xe0, 0x5f, 0xd7, - 0xeb, 0x3b, 0x73, 0x6f, 0x44, 0x5f, 0x04, 0x95, 0x0b, 0x81, 0xa2, 0xc9, 0xa3, 0x80, 0x18, 0x4d, - 0x7a, 0x95, 0x59, 0xf4, 0xf4, 0x3c, 0x8c, 0x04, 0x6a, 0x79, 0x5f, 0x33, 0xd0, 0x63, 0xd2, 0x1a, - 0xde, 0x5b, 0xd4, 0x0b, 0x2a, 0x86, 0xee, 0x7e, 0xbd, 0x8c, 0x96, 0xe4, 0xb3, 0x70, 0x2f, 0xa5, - 0xdd, 0x24, 0x35, 0x9c, 0xdf, 0x9d, 0x2f, 0x0b, 0xd1, 0x87, 0xae, 0x1f, 0xca, 0x3b, 0x70, 0xdf, - 0xde, 0x68, 0x9e, 0xe3, 0xc4, 0x8e, 0xbe, 0xda, 0x74, 0x9c, 0x9a, 0xd1, 0xe3, 0x0c, 0x33, 0x3a, - 0xf2, 0x93, 0x70, 0xbc, 0x75, 0xcf, 0xf4, 0x66, 0xa3, 0xe0, 0xb9, 0xe9, 0x27, 0x56, 0xe5, 0x77, - 0xc0, 0x89, 0x48, 0xfc, 0xbb, 0xc6, 0xfc, 0x13, 0x70, 0x7f, 0xab, 0xce, 0xed, 0xe5, 0xeb, 0x3a, - 0x2e, 0xfb, 0x78, 0x67, 0x87, 0x7d, 0x92, 0xef, 0x7a, 0xa7, 0xfc, 0xce, 0xd6, 0x63, 0x17, 0xe8, - 0x9c, 0x75, 0x05, 0x7a, 0x59, 0x97, 0xed, 0xfa, 0x00, 0xad, 0x79, 0x17, 0x84, 0xe4, 0xfb, 0xb9, - 0xaa, 0xe4, 0xaa, 0xd5, 0x66, 0x0c, 0x08, 0x6d, 0xbd, 0xc1, 0x55, 0xa3, 0x25, 0xd8, 0x5d, 0x64, - 0xf1, 0x04, 0x97, 0xef, 0x82, 0x6a, 0x3b, 0x6b, 0xcd, 0x4e, 0x58, 0x05, 0x93, 0x17, 0xb8, 0x24, - 0xf7, 0x00, 0xe4, 0x6c, 0x86, 0x35, 0xff, 0x84, 0x3b, 0x85, 0x8e, 0x1a, 0x1c, 0x60, 0x39, 0x67, - 0xdb, 0xd8, 0x71, 0xe5, 0x50, 0x74, 0x27, 0xab, 0x25, 0x20, 0xef, 0xc2, 0xbd, 0x1d, 0x27, 0x75, - 0x72, 0x3b, 0xee, 0xcc, 0x67, 0xc6, 0xa1, 0x9b, 0xf6, 0x80, 0x3e, 0x21, 0x01, 0xf8, 0x9e, 0x23, - 0x9c, 0x8d, 0x10, 0x64, 0xf3, 0xc4, 0x59, 0xf6, 0x5c, 0xa7, 0x68, 0x3c, 0x76, 0x3b, 0xf5, 0xd3, - 0xff, 0xe6, 0x5b, 0xbf, 0x1c, 0xbb, 0x0f, 0xc9, 0xe2, 0x90, 0x22, 0x9c, 0xd9, 0xf3, 0x6d, 0x8a, - 0xbf, 0x1b, 0xf8, 0x22, 0xe3, 0x63, 0x1d, 0xf5, 0x28, 0xf8, 0x3c, 0xdb, 0x21, 0x16, 0x67, 0xf3, - 0x22, 0x65, 0xf3, 0x2c, 0x7a, 0x34, 0x9a, 0xcd, 0xa9, 0x77, 0x04, 0xf7, 0xc9, 0x77, 0xa1, 0xd7, - 0x25, 0x18, 0x6d, 0x96, 0xfe, 0x41, 0x97, 0x3a, 0x62, 0xa6, 0x31, 0xc2, 0xc8, 0xbe, 0x75, 0xff, - 0x04, 0xf8, 0xc0, 0xe6, 0xe8, 0xc0, 0x72, 0xe8, 0xd2, 0x3e, 0x06, 0x36, 0xe5, 0x73, 0x43, 0xd1, - 0x2f, 0xc4, 0xe0, 0xd8, 0x9e, 0x39, 0x15, 0x74, 0xa5, 0x23, 0x66, 0xf7, 0x08, 0xac, 0xb2, 0xf3, - 0x77, 0x80, 0x12, 0x1f, 0xff, 0x33, 0x74, 0xfc, 0x4f, 0xa3, 0xf9, 0xfd, 0x8c, 0xdf, 0x8b, 0x9a, - 0xfc, 0x92, 0xf8, 0xb7, 0xc1, 0x87, 0xae, 0x6d, 0x69, 0x5c, 0x43, 0xc6, 0xa2, 0xbd, 0x05, 0xd5, - 0x18, 0x06, 0xcb, 0xcf, 0xd1, 0x01, 0x29, 0x68, 0xe5, 0x36, 0x27, 0x74, 0xea, 0x1d, 0x41, 0xaf, - 0xf0, 0x5d, 0xe8, 0xe7, 0x5a, 0xbc, 0x62, 0x7d, 0xb2, 0x1d, 0x4e, 0x5b, 0xe7, 0x66, 0xb2, 0x97, - 0xf6, 0x8d, 0xcf, 0x87, 0x5c, 0xa3, 0x43, 0xae, 0x20, 0x7c, 0xa7, 0x87, 0xdc, 0x74, 0x82, 0xd1, - 0x57, 0x25, 0x18, 0x6d, 0x96, 0xda, 0x68, 0x6f, 0x39, 0xef, 0x91, 0xb2, 0x69, 0x6f, 0x39, 0xef, - 0x95, 0x55, 0x91, 0xdf, 0x42, 0x45, 0x71, 0x0e, 0x3d, 0xd6, 0x4a, 0x14, 0x7b, 0xce, 0x30, 0x59, - 0xc3, 0x7b, 0xa6, 0x0c, 0xda, 0x5b, 0xc3, 0xed, 0x24, 0x47, 0xda, 0x5b, 0xc3, 0x6d, 0xe5, 0x2f, - 0xa2, 0xd7, 0xb0, 0x3b, 0xce, 0x36, 0xa7, 0xd8, 0x46, 0xff, 0x5a, 0x82, 0x81, 0x40, 0x98, 0x8d, - 0x2e, 0xb4, 0xc3, 0x6f, 0xb3, 0x64, 0x44, 0xe4, 0xc5, 0x9b, 0xd6, 0x31, 0xbd, 0x3c, 0x4f, 0x47, - 0x36, 0x83, 0x72, 0xfb, 0x19, 0x99, 0x15, 0xe0, 0xff, 0x96, 0x04, 0x23, 0x4d, 0x22, 0xd8, 0xf6, - 0x56, 0x6f, 0xeb, 0xb8, 0x3c, 0x7b, 0x69, 0xdf, 0xf8, 0x7c, 0x8c, 0x97, 0xe9, 0x18, 0xdf, 0x8a, - 0x9e, 0xdc, 0xcf, 0x18, 0x7d, 0xde, 0xc1, 0x77, 0xbd, 0x07, 0x85, 0xbe, 0x7e, 0x22, 0x2f, 0xc8, - 0xec, 0x1d, 0x1d, 0x67, 0x9f, 0xdc, 0x2f, 0x3a, 0x1f, 0xdd, 0xb3, 0x74, 0x74, 0xcf, 0xa0, 0xe5, - 0xdb, 0x1b, 0x5d, 0xa3, 0x53, 0xf1, 0x85, 0xc6, 0x6f, 0x64, 0xb5, 0xa5, 0x68, 0x4d, 0xa3, 0xe3, - 0xec, 0xf4, 0x7e, 0x50, 0xf9, 0x10, 0x2f, 0xd0, 0x21, 0x9e, 0x41, 0x0f, 0xb7, 0x1a, 0xa2, 0xef, - 0xf5, 0xaa, 0xa6, 0x6f, 0x1a, 0x53, 0xef, 0x60, 0xa1, 0xf7, 0xbb, 0xd0, 0x7b, 0xc4, 0x8b, 0xbd, - 0xa9, 0x76, 0xba, 0xf7, 0xc5, 0xcf, 0xd9, 0x87, 0xdb, 0x47, 0xe0, 0x5c, 0xde, 0x47, 0xb9, 0x1c, - 0x43, 0x47, 0x5b, 0x71, 0x49, 0x62, 0x68, 0xf4, 0x6b, 0x92, 0xfb, 0x14, 0xf8, 0x91, 0xb6, 0xba, - 0xf0, 0xc7, 0xda, 0x91, 0x97, 0xfb, 0x9a, 0x04, 0xe2, 0xf2, 0x71, 0xca, 0xd7, 0x04, 0x1a, 0x6b, - 0xc9, 0x17, 0x63, 0xe7, 0xe3, 0x12, 0x1c, 0x6a, 0x11, 0x30, 0xa3, 0x7c, 0x3b, 0xfd, 0xee, 0x1d, - 0xa4, 0x67, 0x67, 0x6e, 0x8b, 0x06, 0x1f, 0x4c, 0x17, 0xfa, 0x2d, 0x09, 0xb2, 0xad, 0xa3, 0x63, - 0x54, 0xd8, 0x77, 0x2f, 0xfe, 0xe8, 0x3c, 0x7b, 0xf9, 0x76, 0xc9, 0xb8, 0xfc, 0xbe, 0x26, 0xc1, - 0xe1, 0x96, 0x11, 0x31, 0x9a, 0xdd, 0x67, 0x3f, 0x81, 0x78, 0x3c, 0x5b, 0xb8, 0x4d, 0x2a, 0x2e, - 0xb3, 0x44, 0x07, 0x5a, 0x44, 0xc6, 0xed, 0xe9, 0xc0, 0xde, 0xd1, 0x77, 0x7b, 0x3a, 0x10, 0x11, - 0x9a, 0x73, 0x99, 0xb6, 0x8c, 0x8d, 0xdb, 0x93, 0x69, 0x54, 0x0c, 0xde, 0x9e, 0x4c, 0x23, 0x03, - 0x74, 0x57, 0x01, 0x5a, 0x44, 0xd9, 0xed, 0x2a, 0xc0, 0xde, 0xd1, 0x7c, 0xbb, 0x0a, 0x10, 0x11, - 0xea, 0xcb, 0x6f, 0xca, 0x93, 0xd3, 0x1f, 0xf4, 0x34, 0xde, 0xfc, 0x51, 0xeb, 0xce, 0xd6, 0x8d, - 0xdb, 0xfa, 0x0a, 0xe5, 0xbe, 0x5f, 0x8e, 0xca, 0x7f, 0x16, 0x07, 0xb4, 0xea, 0xa8, 0xdb, 0x38, - 0x57, 0x77, 0xb6, 0x0c, 0x4b, 0xbb, 0xc1, 0x9c, 0x70, 0x0c, 0x50, 0x53, 0x77, 0xfc, 0x8f, 0xbb, - 0xf7, 0xcc, 0x7d, 0x3c, 0xf8, 0xda, 0xd7, 0xc7, 0x4f, 0xb4, 0xf1, 0x5c, 0x8d, 0x00, 0x2b, 0xa9, - 0x9a, 0xba, 0xc3, 0x2f, 0xfe, 0xfe, 0x04, 0x80, 0x5a, 0xad, 0x1a, 0xd7, 0x8b, 0x55, 0xcd, 0x16, - 0x6f, 0x0a, 0xde, 0x12, 0x31, 0x9b, 0x8d, 0xdc, 0x4e, 0xfa, 0x3e, 0xaa, 0xde, 0xa5, 0xa4, 0x28, - 0xc5, 0x05, 0xcd, 0x76, 0xd0, 0xdb, 0x21, 0x55, 0xc6, 0xfa, 0x2e, 0xa3, 0x1e, 0xbf, 0x23, 0xd4, - 0x93, 0x84, 0x20, 0x25, 0x5e, 0x04, 0xa4, 0xfa, 0xe1, 0xe8, 0x4f, 0x80, 0xf1, 0x2f, 0xe0, 0x45, - 0xed, 0x9f, 0x81, 0x0e, 0xe8, 0x67, 0x9e, 0x87, 0xd5, 0x70, 0x55, 0xf6, 0x78, 0x20, 0x71, 0x14, - 0xf8, 0x85, 0x8c, 0xf8, 0xc9, 0x94, 0xfb, 0x0b, 0x19, 0xd3, 0xc3, 0x7f, 0xf2, 0xd9, 0xd3, 0x03, - 0x01, 0x8a, 0xf9, 0x7e, 0xff, 0x79, 0xc9, 0xa9, 0x0f, 0x4b, 0x30, 0xdc, 0xd0, 0x23, 0x92, 0x61, - 0x2c, 0xb7, 0xbe, 0x76, 0x65, 0x59, 0x99, 0x7f, 0x3e, 0xb7, 0x36, 0xbf, 0xbc, 0x24, 0xbe, 0x1b, - 0xeb, 0x7b, 0x10, 0x8e, 0xc6, 0xe1, 0x48, 0x13, 0x98, 0xd9, 0xc2, 0x42, 0x61, 0x2e, 0xb7, 0x56, - 0x48, 0x4b, 0xe8, 0x1e, 0x38, 0xd6, 0x94, 0x88, 0x0b, 0x12, 0x6b, 0x01, 0xa2, 0x14, 0x5c, 0x90, - 0xf8, 0x9b, 0xb1, 0xee, 0xfe, 0x7d, 0xaa, 0xf1, 0xfb, 0xaf, 0x15, 0xac, 0x63, 0x5b, 0xb3, 0x6f, - 0x67, 0xe5, 0x45, 0x3c, 0xbc, 0xfe, 0x54, 0x2f, 0xf4, 0xcf, 0xb1, 0x5e, 0x56, 0x1d, 0xd5, 0xb9, - 0x33, 0xe7, 0x02, 0xc8, 0xe6, 0x3f, 0x6b, 0xc0, 0x7e, 0x6d, 0xc5, 0xfb, 0xfd, 0x90, 0xfe, 0x8e, - 0x3e, 0x72, 0xc8, 0x9e, 0x8e, 0xf2, 0x0f, 0x09, 0x86, 0xe9, 0xc9, 0xec, 0x17, 0x12, 0xa8, 0xd1, - 0x64, 0xbf, 0x93, 0xf2, 0x4b, 0x12, 0x1c, 0xa0, 0x50, 0x9e, 0xa7, 0x4c, 0x21, 0xc5, 0x57, 0xac, - 0xa2, 0xfc, 0x39, 0xb2, 0x59, 0xb8, 0xea, 0xcc, 0x7e, 0xe0, 0xe4, 0x3e, 0xfe, 0x01, 0xa2, 0xa3, - 0x3e, 0x1e, 0xc2, 0xd4, 0x65, 0x65, 0xa4, 0xda, 0x80, 0x69, 0x87, 0x0e, 0x04, 0x13, 0xb7, 0x7d, - 0x20, 0xf8, 0x0c, 0xf4, 0xf9, 0xa2, 0xb9, 0x4c, 0x77, 0x7b, 0x5f, 0x63, 0x0b, 0x1f, 0xc9, 0xfb, - 0x69, 0xa0, 0x77, 0x4b, 0x70, 0xa0, 0x69, 0xf4, 0x9b, 0xe9, 0xd9, 0xf7, 0xc9, 0x7f, 0x48, 0x62, - 0x4d, 0xc9, 0xcb, 0xca, 0x68, 0xbd, 0x59, 0x6e, 0xe1, 0x59, 0x18, 0x08, 0x84, 0xac, 0x99, 0x5e, - 0xca, 0xc6, 0x3e, 0xbe, 0x3b, 0x12, 0xa4, 0x83, 0xb2, 0x90, 0xc4, 0x3b, 0xa6, 0x61, 0x39, 0xb8, - 0x4c, 0x2f, 0x68, 0x27, 0x15, 0xb7, 0x8c, 0x74, 0x38, 0xd8, 0xf4, 0xb5, 0x95, 0x9d, 0x49, 0xdd, - 0xe6, 0xb9, 0xc2, 0xa8, 0xd3, 0xcc, 0x4d, 0x7b, 0x2b, 0x1c, 0xe3, 0xaa, 0xdc, 0xe2, 0x89, 0x17, - 0xd0, 0xc3, 0x82, 0xc3, 0xd5, 0x56, 0xae, 0x8b, 0xbc, 0x04, 0xa8, 0x51, 0x55, 0xc3, 0xbf, 0x4f, - 0xe4, 0x59, 0x5f, 0x34, 0x0a, 0xdd, 0xfe, 0x5f, 0xf0, 0x61, 0x05, 0xef, 0x9c, 0xf6, 0x4d, 0xb0, - 0x6d, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x90, 0x82, 0xf1, 0x6d, 0xa8, 0x00, 0x00, + // 10570 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0x8e, 0xd9, 0x5d, 0x00, 0xbb, 0x0f, 0x5f, 0x8b, 0x06, 0xee, 0xb8, 0xb7, 0x77, 0x07, + 0x80, 0x43, 0xf2, 0xee, 0x78, 0xe4, 0x01, 0xe4, 0x91, 0xf7, 0x41, 0x9c, 0xc8, 0xd3, 0x2e, 0xb0, + 0x87, 0x03, 0x89, 0x2f, 0x0e, 0x80, 0x23, 0x45, 0xfd, 0x5c, 0xfb, 0x1b, 0xec, 0x36, 0x16, 0x43, + 0xec, 0xce, 0x0c, 0x67, 0x66, 0xef, 0x00, 0x8a, 0x2a, 0xd3, 0x96, 0x25, 0xd3, 0x74, 0x14, 0x51, + 0xb2, 0xcb, 0x96, 0x29, 0x9d, 0x22, 0x59, 0x4a, 0xa4, 0x30, 0x76, 0x24, 0xeb, 0x2b, 0x71, 0x9c, + 0x3f, 0x64, 0x57, 0x39, 0x91, 0x55, 0x15, 0x47, 0x72, 0x2a, 0x91, 0xe2, 0x24, 0x27, 0x99, 0x52, + 0x1c, 0x45, 0x51, 0x62, 0x85, 0x91, 0x2a, 0xa9, 0x52, 0xa5, 0x92, 0xea, 0xaf, 0xf9, 0xda, 0x5d, + 0xcc, 0x2e, 0xee, 0x8e, 0x92, 0xec, 0xfc, 0x05, 0x74, 0xf7, 0x7b, 0xaf, 0x5f, 0xbf, 0x7e, 0xfd, + 0xfa, 0xbd, 0xd7, 0xdd, 0xb3, 0xf0, 0xa1, 0x0b, 0x30, 0x51, 0x31, 0x8c, 0x4a, 0x15, 0x4f, 0x99, + 0x96, 0xe1, 0x18, 0x1b, 0xf5, 0xcd, 0xa9, 0x32, 0xb6, 0x4b, 0x96, 0x66, 0x3a, 0x86, 0x35, 0x49, + 0xeb, 0xd0, 0x10, 0x83, 0x98, 0x14, 0x10, 0xf2, 0x22, 0x0c, 0x5f, 0xd2, 0xaa, 0x78, 0xd6, 0x05, + 0x5c, 0xc5, 0x0e, 0x3a, 0x0f, 0x89, 0x4d, 0xad, 0x8a, 0x33, 0xd2, 0x44, 0xfc, 0x44, 0xdf, 0xe9, + 0xbb, 0x27, 0x43, 0x48, 0x93, 0x41, 0x8c, 0x15, 0x52, 0xad, 0x50, 0x0c, 0xf9, 0x3b, 0x09, 0x18, + 0x69, 0xd2, 0x8a, 0x10, 0x24, 0x74, 0xb5, 0x46, 0x28, 0x4a, 0x27, 0x52, 0x0a, 0xfd, 0x1f, 0x65, + 0xa0, 0xd7, 0x54, 0x4b, 0xdb, 0x6a, 0x05, 0x67, 0x62, 0xb4, 0x5a, 0x14, 0xd1, 0x18, 0x40, 0x19, + 0x9b, 0x58, 0x2f, 0x63, 0xbd, 0xb4, 0x9b, 0x89, 0x4f, 0xc4, 0x4f, 0xa4, 0x14, 0x5f, 0x0d, 0xba, + 0x0f, 0x86, 0xcd, 0xfa, 0x46, 0x55, 0x2b, 0x15, 0x7d, 0x60, 0x30, 0x11, 0x3f, 0xd1, 0xad, 0xa4, + 0x59, 0xc3, 0xac, 0x07, 0x7c, 0x1c, 0x86, 0xae, 0x61, 0x75, 0xdb, 0x0f, 0xda, 0x47, 0x41, 0x07, + 0x49, 0xb5, 0x0f, 0x70, 0x06, 0xfa, 0x6b, 0xd8, 0xb6, 0xd5, 0x0a, 0x2e, 0x3a, 0xbb, 0x26, 0xce, + 0x24, 0xe8, 0xe8, 0x27, 0x1a, 0x46, 0x1f, 0x1e, 0x79, 0x1f, 0xc7, 0x5a, 0xdb, 0x35, 0x31, 0xca, + 0x41, 0x0a, 0xeb, 0xf5, 0x1a, 0xa3, 0xd0, 0xdd, 0x42, 0x7e, 0x05, 0xbd, 0x5e, 0x0b, 0x53, 0x49, + 0x12, 0x34, 0x4e, 0xa2, 0xd7, 0xc6, 0xd6, 0x55, 0xad, 0x84, 0x33, 0x3d, 0x94, 0xc0, 0xf1, 0x06, + 0x02, 0xab, 0xac, 0x3d, 0x4c, 0x43, 0xe0, 0xa1, 0x19, 0x48, 0xe1, 0x1d, 0x07, 0xeb, 0xb6, 0x66, + 0xe8, 0x99, 0x5e, 0x4a, 0xe4, 0x9e, 0x26, 0xb3, 0x88, 0xab, 0xe5, 0x30, 0x09, 0x0f, 0x0f, 0x9d, + 0x85, 0x5e, 0xc3, 0x74, 0x34, 0x43, 0xb7, 0x33, 0xc9, 0x09, 0xe9, 0x44, 0xdf, 0xe9, 0x23, 0x4d, + 0x15, 0x61, 0x99, 0xc1, 0x28, 0x02, 0x18, 0xcd, 0x43, 0xda, 0x36, 0xea, 0x56, 0x09, 0x17, 0x4b, + 0x46, 0x19, 0x17, 0x35, 0x7d, 0xd3, 0xc8, 0xa4, 0x28, 0x81, 0xf1, 0xc6, 0x81, 0x50, 0xc0, 0x19, + 0xa3, 0x8c, 0xe7, 0xf5, 0x4d, 0x43, 0x19, 0xb4, 0x03, 0x65, 0x74, 0x10, 0x7a, 0xec, 0x5d, 0xdd, + 0x51, 0x77, 0x32, 0xfd, 0x54, 0x43, 0x78, 0x49, 0xfe, 0xfd, 0x1e, 0x18, 0x6a, 0x47, 0xc5, 0x2e, + 0x40, 0xf7, 0x26, 0x19, 0x65, 0x26, 0xd6, 0x89, 0x0c, 0x18, 0x4e, 0x50, 0x88, 0x3d, 0xfb, 0x14, + 0x62, 0x0e, 0xfa, 0x74, 0x6c, 0x3b, 0xb8, 0xcc, 0x34, 0x22, 0xde, 0xa6, 0x4e, 0x01, 0x43, 0x6a, + 0x54, 0xa9, 0xc4, 0xbe, 0x54, 0xea, 0x69, 0x18, 0x72, 0x59, 0x2a, 0x5a, 0xaa, 0x5e, 0x11, 0xba, + 0x39, 0x15, 0xc5, 0xc9, 0x64, 0x41, 0xe0, 0x29, 0x04, 0x4d, 0x19, 0xc4, 0x81, 0x32, 0x9a, 0x05, + 0x30, 0x74, 0x6c, 0x6c, 0x16, 0xcb, 0xb8, 0x54, 0xcd, 0x24, 0x5b, 0x48, 0x69, 0x99, 0x80, 0x34, + 0x48, 0xc9, 0x60, 0xb5, 0xa5, 0x2a, 0x7a, 0xc4, 0x53, 0xb5, 0xde, 0x16, 0x9a, 0xb2, 0xc8, 0x16, + 0x59, 0x83, 0xb6, 0xad, 0xc3, 0xa0, 0x85, 0x89, 0xde, 0xe3, 0x32, 0x1f, 0x59, 0x8a, 0x32, 0x31, + 0x19, 0x39, 0x32, 0x85, 0xa3, 0xb1, 0x81, 0x0d, 0x58, 0xfe, 0x22, 0xba, 0x0b, 0xdc, 0x8a, 0x22, + 0x55, 0x2b, 0xa0, 0x56, 0xa8, 0x5f, 0x54, 0x2e, 0xa9, 0x35, 0x9c, 0x7d, 0x1e, 0x06, 0x83, 0xe2, + 0x41, 0xa3, 0xd0, 0x6d, 0x3b, 0xaa, 0xe5, 0x50, 0x2d, 0xec, 0x56, 0x58, 0x01, 0xa5, 0x21, 0x8e, + 0xf5, 0x32, 0xb5, 0x72, 0xdd, 0x0a, 0xf9, 0x17, 0xbd, 0xd5, 0x1b, 0x70, 0x9c, 0x0e, 0xf8, 0x58, + 0xe3, 0x8c, 0x06, 0x28, 0x87, 0xc7, 0x9d, 0x3d, 0x07, 0x03, 0x81, 0x01, 0xb4, 0xdb, 0xb5, 0xfc, + 0x02, 0x1c, 0x68, 0x4a, 0x1a, 0x3d, 0x0d, 0xa3, 0x75, 0x5d, 0xd3, 0x1d, 0x6c, 0x99, 0x16, 0x26, + 0x1a, 0xcb, 0xba, 0xca, 0xfc, 0xa7, 0xde, 0x16, 0x3a, 0xb7, 0xee, 0x87, 0x66, 0x54, 0x94, 0x91, + 0x7a, 0x63, 0xe5, 0xc9, 0x54, 0xf2, 0xbb, 0xbd, 0xe9, 0x17, 0x5f, 0x7c, 0xf1, 0xc5, 0x98, 0xfc, + 0xc1, 0x1e, 0x18, 0x6d, 0xb6, 0x66, 0x9a, 0x2e, 0xdf, 0x83, 0xd0, 0xa3, 0xd7, 0x6b, 0x1b, 0xd8, + 0xa2, 0x42, 0xea, 0x56, 0x78, 0x09, 0xe5, 0xa0, 0xbb, 0xaa, 0x6e, 0xe0, 0x6a, 0x26, 0x31, 0x21, + 0x9d, 0x18, 0x3c, 0x7d, 0x5f, 0x5b, 0xab, 0x72, 0x72, 0x81, 0xa0, 0x28, 0x0c, 0x13, 0x3d, 0x06, + 0x09, 0x6e, 0xa2, 0x09, 0x85, 0x93, 0xed, 0x51, 0x20, 0x6b, 0x49, 0xa1, 0x78, 0xe8, 0x30, 0xa4, + 0xc8, 0x5f, 0xa6, 0x1b, 0x3d, 0x94, 0xe7, 0x24, 0xa9, 0x20, 0x7a, 0x81, 0xb2, 0x90, 0xa4, 0xcb, + 0xa4, 0x8c, 0xc5, 0xd6, 0xe6, 0x96, 0x89, 0x62, 0x95, 0xf1, 0xa6, 0x5a, 0xaf, 0x3a, 0xc5, 0xab, + 0x6a, 0xb5, 0x8e, 0xa9, 0xc2, 0xa7, 0x94, 0x7e, 0x5e, 0x79, 0x85, 0xd4, 0xa1, 0x71, 0xe8, 0x63, + 0xab, 0x4a, 0xd3, 0xcb, 0x78, 0x87, 0x5a, 0xcf, 0x6e, 0x85, 0x2d, 0xb4, 0x79, 0x52, 0x43, 0xba, + 0x7f, 0xd6, 0x36, 0x74, 0xa1, 0x9a, 0xb4, 0x0b, 0x52, 0x41, 0xbb, 0x3f, 0x17, 0x36, 0xdc, 0x47, + 0x9b, 0x0f, 0x2f, 0xac, 0x53, 0xf2, 0x17, 0x63, 0x90, 0xa0, 0xf6, 0x62, 0x08, 0xfa, 0xd6, 0xde, + 0xb6, 0x52, 0x28, 0xce, 0x2e, 0xaf, 0xe7, 0x17, 0x0a, 0x69, 0x09, 0x0d, 0x02, 0xd0, 0x8a, 0x4b, + 0x0b, 0xcb, 0xb9, 0xb5, 0x74, 0xcc, 0x2d, 0xcf, 0x2f, 0xad, 0x9d, 0x7d, 0x38, 0x1d, 0x77, 0x11, + 0xd6, 0x59, 0x45, 0xc2, 0x0f, 0xf0, 0xd0, 0xe9, 0x74, 0x37, 0x4a, 0x43, 0x3f, 0x23, 0x30, 0xff, + 0x74, 0x61, 0xf6, 0xec, 0xc3, 0xe9, 0x9e, 0x60, 0xcd, 0x43, 0xa7, 0xd3, 0xbd, 0x68, 0x00, 0x52, + 0xb4, 0x26, 0xbf, 0xbc, 0xbc, 0x90, 0x4e, 0xba, 0x34, 0x57, 0xd7, 0x94, 0xf9, 0xa5, 0xb9, 0x74, + 0xca, 0xa5, 0x39, 0xa7, 0x2c, 0xaf, 0xaf, 0xa4, 0xc1, 0xa5, 0xb0, 0x58, 0x58, 0x5d, 0xcd, 0xcd, + 0x15, 0xd2, 0x7d, 0x2e, 0x44, 0xfe, 0x6d, 0x6b, 0x85, 0xd5, 0x74, 0x7f, 0x80, 0xad, 0x87, 0x4e, + 0xa7, 0x07, 0xdc, 0x2e, 0x0a, 0x4b, 0xeb, 0x8b, 0xe9, 0x41, 0x34, 0x0c, 0x03, 0xac, 0x0b, 0xc1, + 0xc4, 0x50, 0xa8, 0xea, 0xec, 0xc3, 0xe9, 0xb4, 0xc7, 0x08, 0xa3, 0x32, 0x1c, 0xa8, 0x38, 0xfb, + 0x70, 0x1a, 0xc9, 0x33, 0xd0, 0x4d, 0xb5, 0x0b, 0x21, 0x18, 0x5c, 0xc8, 0xe5, 0x0b, 0x0b, 0xc5, + 0xe5, 0x95, 0xb5, 0xf9, 0xe5, 0xa5, 0xdc, 0x42, 0x5a, 0xf2, 0xea, 0x94, 0xc2, 0x93, 0xeb, 0xf3, + 0x4a, 0x61, 0x36, 0x1d, 0xf3, 0xd7, 0xad, 0x14, 0x72, 0x6b, 0x85, 0xd9, 0x74, 0x5c, 0x2e, 0xc1, + 0x68, 0x33, 0x3b, 0xd9, 0x74, 0x65, 0xf8, 0xa6, 0x38, 0xd6, 0x62, 0x8a, 0x29, 0xad, 0x86, 0x29, + 0xfe, 0x76, 0x0c, 0x46, 0x9a, 0xec, 0x15, 0x4d, 0x3b, 0xb9, 0x08, 0xdd, 0x4c, 0x45, 0xd9, 0xee, + 0x79, 0x6f, 0xd3, 0x4d, 0x87, 0x2a, 0x6c, 0xc3, 0x0e, 0x4a, 0xf1, 0xfc, 0x1e, 0x44, 0xbc, 0x85, + 0x07, 0x41, 0x48, 0x34, 0xd8, 0xf4, 0x9f, 0x6b, 0xb0, 0xe9, 0x6c, 0xdb, 0x3b, 0xdb, 0xce, 0xb6, + 0x47, 0xeb, 0x3a, 0xb3, 0xed, 0xdd, 0x4d, 0x6c, 0xfb, 0x05, 0x18, 0x6e, 0x20, 0xd4, 0xb6, 0x8d, + 0x7d, 0x97, 0x04, 0x99, 0x56, 0xc2, 0x89, 0xb0, 0x74, 0xb1, 0x80, 0xa5, 0xbb, 0x10, 0x96, 0xe0, + 0x9d, 0xad, 0x27, 0xa1, 0x61, 0xae, 0x3f, 0x29, 0xc1, 0xc1, 0xe6, 0x9e, 0x62, 0x53, 0x1e, 0x1e, + 0x83, 0x9e, 0x1a, 0x76, 0xb6, 0x0c, 0xe1, 0x2d, 0x1d, 0x6b, 0xb2, 0x07, 0x93, 0xe6, 0xf0, 0x64, + 0x73, 0x2c, 0xff, 0x26, 0x1e, 0x6f, 0xe5, 0xee, 0x31, 0x6e, 0x1a, 0x38, 0xfd, 0x95, 0x18, 0x1c, + 0x68, 0x4a, 0xbc, 0x29, 0xa3, 0x47, 0x01, 0x34, 0xdd, 0xac, 0x3b, 0xcc, 0x23, 0x62, 0x06, 0x36, + 0x45, 0x6b, 0xa8, 0xf1, 0x22, 0xc6, 0xb3, 0xee, 0xb8, 0xed, 0x71, 0xda, 0x0e, 0xac, 0x8a, 0x02, + 0x9c, 0xf7, 0x18, 0x4d, 0x50, 0x46, 0xc7, 0x5a, 0x8c, 0xb4, 0x41, 0x31, 0x1f, 0x80, 0x74, 0xa9, + 0xaa, 0x61, 0xdd, 0x29, 0xda, 0x8e, 0x85, 0xd5, 0x9a, 0xa6, 0x57, 0xe8, 0x0e, 0x92, 0x9c, 0xee, + 0xde, 0x54, 0xab, 0x36, 0x56, 0x86, 0x58, 0xf3, 0xaa, 0x68, 0x25, 0x18, 0x54, 0x81, 0x2c, 0x1f, + 0x46, 0x4f, 0x00, 0x83, 0x35, 0xbb, 0x18, 0xf2, 0x07, 0x52, 0xd0, 0xe7, 0xf3, 0xab, 0xd1, 0x9d, + 0xd0, 0xff, 0xac, 0x7a, 0x55, 0x2d, 0x8a, 0x58, 0x89, 0x49, 0xa2, 0x8f, 0xd4, 0xad, 0xf0, 0x78, + 0xe9, 0x01, 0x18, 0xa5, 0x20, 0x46, 0xdd, 0xc1, 0x56, 0xb1, 0x54, 0x55, 0x6d, 0x9b, 0x0a, 0x2d, + 0x49, 0x41, 0x11, 0x69, 0x5b, 0x26, 0x4d, 0x33, 0xa2, 0x05, 0x9d, 0x81, 0x11, 0x8a, 0x51, 0xab, + 0x57, 0x1d, 0xcd, 0xac, 0xe2, 0x22, 0x89, 0xde, 0x6c, 0xba, 0x93, 0xb8, 0x9c, 0x0d, 0x13, 0x88, + 0x45, 0x0e, 0x40, 0x38, 0xb2, 0xd1, 0x2c, 0x1c, 0xa5, 0x68, 0x15, 0xac, 0x63, 0x4b, 0x75, 0x70, + 0x11, 0x3f, 0x57, 0x57, 0xab, 0x76, 0x51, 0xd5, 0xcb, 0xc5, 0x2d, 0xd5, 0xde, 0xca, 0x8c, 0x12, + 0x02, 0xf9, 0x58, 0x46, 0x52, 0x0e, 0x11, 0xc0, 0x39, 0x0e, 0x57, 0xa0, 0x60, 0x39, 0xbd, 0x7c, + 0x59, 0xb5, 0xb7, 0xd0, 0x34, 0x1c, 0xa4, 0x54, 0x6c, 0xc7, 0xd2, 0xf4, 0x4a, 0xb1, 0xb4, 0x85, + 0x4b, 0xdb, 0xc5, 0xba, 0xb3, 0x79, 0x3e, 0x73, 0xd8, 0xdf, 0x3f, 0xe5, 0x70, 0x95, 0xc2, 0xcc, + 0x10, 0x90, 0x75, 0x67, 0xf3, 0x3c, 0x5a, 0x85, 0x7e, 0x32, 0x19, 0x35, 0xed, 0x79, 0x5c, 0xdc, + 0x34, 0x2c, 0xba, 0x35, 0x0e, 0x36, 0x31, 0x4d, 0x3e, 0x09, 0x4e, 0x2e, 0x73, 0x84, 0x45, 0xa3, + 0x8c, 0xa7, 0xbb, 0x57, 0x57, 0x0a, 0x85, 0x59, 0xa5, 0x4f, 0x50, 0xb9, 0x64, 0x58, 0x44, 0xa1, + 0x2a, 0x86, 0x2b, 0xe0, 0x3e, 0xa6, 0x50, 0x15, 0x43, 0x88, 0xf7, 0x0c, 0x8c, 0x94, 0x4a, 0x6c, + 0xcc, 0x5a, 0xa9, 0xc8, 0x63, 0x2c, 0x3b, 0x93, 0x0e, 0x08, 0xab, 0x54, 0x9a, 0x63, 0x00, 0x5c, + 0xc7, 0x6d, 0xf4, 0x08, 0x1c, 0xf0, 0x84, 0xe5, 0x47, 0x1c, 0x6e, 0x18, 0x65, 0x18, 0xf5, 0x0c, + 0x8c, 0x98, 0xbb, 0x8d, 0x88, 0x28, 0xd0, 0xa3, 0xb9, 0x1b, 0x46, 0x3b, 0x07, 0xa3, 0xe6, 0x96, + 0xd9, 0x88, 0x77, 0xd2, 0x8f, 0x87, 0xcc, 0x2d, 0x33, 0x8c, 0x78, 0x0f, 0x0d, 0xb8, 0x2d, 0x5c, + 0x52, 0x1d, 0x5c, 0xce, 0xdc, 0xe1, 0x07, 0xf7, 0x35, 0xa0, 0x29, 0x48, 0x97, 0x4a, 0x45, 0xac, + 0xab, 0x1b, 0x55, 0x5c, 0x54, 0x2d, 0xac, 0xab, 0x76, 0x66, 0xdc, 0x0f, 0x3c, 0x58, 0x2a, 0x15, + 0x68, 0x6b, 0x8e, 0x36, 0xa2, 0x93, 0x30, 0x6c, 0x6c, 0x3c, 0x5b, 0x62, 0x2a, 0x59, 0x34, 0x2d, + 0xbc, 0xa9, 0xed, 0x64, 0xee, 0xa6, 0xf2, 0x1d, 0x22, 0x0d, 0x54, 0x21, 0x57, 0x68, 0x35, 0xba, + 0x17, 0xd2, 0x25, 0x7b, 0x4b, 0xb5, 0x4c, 0x6a, 0x93, 0x6d, 0x53, 0x2d, 0xe1, 0xcc, 0x3d, 0x0c, + 0x94, 0xd5, 0x2f, 0x89, 0x6a, 0xb2, 0x24, 0xec, 0x6b, 0xda, 0xa6, 0x23, 0x28, 0x1e, 0x67, 0x4b, + 0x82, 0xd6, 0x71, 0x6a, 0x27, 0x20, 0x4d, 0x44, 0x11, 0xe8, 0xf8, 0x04, 0x05, 0x1b, 0x34, 0xb7, + 0x4c, 0x7f, 0xbf, 0x77, 0xc1, 0x00, 0x81, 0xf4, 0x3a, 0xbd, 0x97, 0x39, 0x64, 0xe6, 0x96, 0xaf, + 0xc7, 0x87, 0xe1, 0x20, 0x01, 0xaa, 0x61, 0x47, 0x2d, 0xab, 0x8e, 0xea, 0x83, 0xbe, 0x9f, 0x42, + 0x13, 0xb9, 0x2f, 0xf2, 0xc6, 0x00, 0x9f, 0x56, 0x7d, 0x63, 0xd7, 0xd5, 0xac, 0x53, 0x8c, 0x4f, + 0x52, 0x27, 0x74, 0xeb, 0xb6, 0x39, 0xdd, 0xf2, 0x34, 0xf4, 0xfb, 0x15, 0x1f, 0xa5, 0x80, 0xa9, + 0x7e, 0x5a, 0x22, 0x5e, 0xd0, 0xcc, 0xf2, 0x2c, 0xf1, 0x5f, 0x9e, 0x29, 0xa4, 0x63, 0xc4, 0x8f, + 0x5a, 0x98, 0x5f, 0x2b, 0x14, 0x95, 0xf5, 0xa5, 0xb5, 0xf9, 0xc5, 0x42, 0x3a, 0xee, 0x73, 0xd8, + 0x1f, 0x4f, 0x24, 0x8f, 0xa5, 0x8f, 0xcb, 0x5f, 0x8b, 0xc1, 0x60, 0x30, 0x02, 0x43, 0x6f, 0x81, + 0x3b, 0x44, 0xba, 0xc4, 0xc6, 0x4e, 0xf1, 0x9a, 0x66, 0xd1, 0x15, 0x59, 0x53, 0xd9, 0xee, 0xe8, + 0xea, 0xc4, 0x28, 0x87, 0x5a, 0xc5, 0xce, 0x53, 0x9a, 0x45, 0xd6, 0x5b, 0x4d, 0x75, 0xd0, 0x02, + 0x8c, 0xeb, 0x46, 0xd1, 0x76, 0x54, 0xbd, 0xac, 0x5a, 0xe5, 0xa2, 0x97, 0xa8, 0x2a, 0xaa, 0xa5, + 0x12, 0xb6, 0x6d, 0x83, 0xed, 0x84, 0x2e, 0x95, 0x23, 0xba, 0xb1, 0xca, 0x81, 0xbd, 0x2d, 0x22, + 0xc7, 0x41, 0x43, 0xfa, 0x1b, 0x6f, 0xa5, 0xbf, 0x87, 0x21, 0x55, 0x53, 0xcd, 0x22, 0xd6, 0x1d, + 0x6b, 0x97, 0xfa, 0xdd, 0x49, 0x25, 0x59, 0x53, 0xcd, 0x02, 0x29, 0xbf, 0x29, 0xe1, 0xcf, 0xe3, + 0x89, 0x64, 0x32, 0x9d, 0x7a, 0x3c, 0x91, 0x4c, 0xa5, 0x41, 0x7e, 0x3d, 0x0e, 0xfd, 0x7e, 0x3f, + 0x9c, 0x84, 0x35, 0x25, 0xba, 0x65, 0x49, 0xd4, 0xa8, 0xdd, 0xb5, 0xa7, 0xd7, 0x3e, 0x39, 0x43, + 0xf6, 0xb2, 0xe9, 0x1e, 0xe6, 0x1d, 0x2b, 0x0c, 0x93, 0xf8, 0x11, 0x44, 0xd9, 0x30, 0xf3, 0x46, + 0x92, 0x0a, 0x2f, 0xa1, 0x39, 0xe8, 0x79, 0xd6, 0xa6, 0xb4, 0x7b, 0x28, 0xed, 0xbb, 0xf7, 0xa6, + 0xfd, 0xf8, 0x2a, 0x25, 0x9e, 0x7a, 0x7c, 0xb5, 0xb8, 0xb4, 0xac, 0x2c, 0xe6, 0x16, 0x14, 0x8e, + 0x8e, 0x0e, 0x41, 0xa2, 0xaa, 0x3e, 0xbf, 0x1b, 0xdc, 0xf5, 0x68, 0x55, 0xbb, 0x93, 0x70, 0x08, + 0x12, 0xd7, 0xb0, 0xba, 0x1d, 0xdc, 0x6b, 0x68, 0xd5, 0x6d, 0x5c, 0x0c, 0x53, 0xd0, 0x4d, 0xe5, + 0x85, 0x00, 0xb8, 0xc4, 0xd2, 0x5d, 0x28, 0x09, 0x89, 0x99, 0x65, 0x85, 0x2c, 0x88, 0x34, 0xf4, + 0xb3, 0xda, 0xe2, 0xca, 0x7c, 0x61, 0xa6, 0x90, 0x8e, 0xc9, 0x67, 0xa0, 0x87, 0x09, 0x81, 0x2c, + 0x16, 0x57, 0x0c, 0xe9, 0x2e, 0x5e, 0xe4, 0x34, 0x24, 0xd1, 0xba, 0xbe, 0x98, 0x2f, 0x28, 0xe9, + 0x58, 0x70, 0xaa, 0x13, 0xe9, 0x6e, 0xd9, 0x86, 0x7e, 0xbf, 0x23, 0xfe, 0xe6, 0x04, 0xd9, 0x5f, + 0x92, 0xa0, 0xcf, 0xe7, 0x58, 0x13, 0x8f, 0x48, 0xad, 0x56, 0x8d, 0x6b, 0x45, 0xb5, 0xaa, 0xa9, + 0x36, 0x57, 0x0d, 0xa0, 0x55, 0x39, 0x52, 0xd3, 0xee, 0xd4, 0xbd, 0x49, 0x4b, 0xa4, 0x3b, 0xdd, + 0x23, 0x7f, 0x44, 0x82, 0x74, 0xd8, 0xb3, 0x0d, 0xb1, 0x29, 0xfd, 0x24, 0xd9, 0x94, 0x3f, 0x2c, + 0xc1, 0x60, 0xd0, 0x9d, 0x0d, 0xb1, 0x77, 0xe7, 0x4f, 0x94, 0xbd, 0x6f, 0xc5, 0x60, 0x20, 0xe0, + 0xc4, 0xb6, 0xcb, 0xdd, 0x73, 0x30, 0xac, 0x95, 0x71, 0xcd, 0x34, 0x1c, 0xac, 0x97, 0x76, 0x8b, + 0x55, 0x7c, 0x15, 0x57, 0x33, 0x32, 0x35, 0x1a, 0x53, 0x7b, 0xbb, 0xc9, 0x93, 0xf3, 0x1e, 0xde, + 0x02, 0x41, 0x9b, 0x1e, 0x99, 0x9f, 0x2d, 0x2c, 0xae, 0x2c, 0xaf, 0x15, 0x96, 0x66, 0xde, 0x56, + 0x5c, 0x5f, 0x7a, 0x62, 0x69, 0xf9, 0xa9, 0x25, 0x25, 0xad, 0x85, 0xc0, 0x6e, 0xe3, 0xb2, 0x5f, + 0x81, 0x74, 0x98, 0x29, 0x74, 0x07, 0x34, 0x63, 0x2b, 0xdd, 0x85, 0x46, 0x60, 0x68, 0x69, 0xb9, + 0xb8, 0x3a, 0x3f, 0x5b, 0x28, 0x16, 0x2e, 0x5d, 0x2a, 0xcc, 0xac, 0xad, 0xb2, 0xc4, 0x87, 0x0b, + 0xbd, 0x16, 0x58, 0xe0, 0xf2, 0xab, 0x71, 0x18, 0x69, 0xc2, 0x09, 0xca, 0xf1, 0x90, 0x85, 0x45, + 0x51, 0xa7, 0xda, 0xe1, 0x7e, 0x92, 0xf8, 0x0c, 0x2b, 0xaa, 0xe5, 0xf0, 0x08, 0xe7, 0x5e, 0x20, + 0x52, 0xd2, 0x1d, 0x6d, 0x53, 0xc3, 0x16, 0xcf, 0x13, 0xb1, 0x38, 0x66, 0xc8, 0xab, 0x67, 0xa9, + 0xa2, 0xfb, 0x01, 0x99, 0x86, 0xad, 0x39, 0xda, 0x55, 0x5c, 0xd4, 0x74, 0x91, 0x54, 0x22, 0x71, + 0x4d, 0x42, 0x49, 0x8b, 0x96, 0x79, 0xdd, 0x71, 0xa1, 0x75, 0x5c, 0x51, 0x43, 0xd0, 0xc4, 0x98, + 0xc7, 0x95, 0xb4, 0x68, 0x71, 0xa1, 0xef, 0x84, 0xfe, 0xb2, 0x51, 0x27, 0xce, 0x1e, 0x83, 0x23, + 0x7b, 0x87, 0xa4, 0xf4, 0xb1, 0x3a, 0x17, 0x84, 0xbb, 0xf1, 0x5e, 0x36, 0xab, 0x5f, 0xe9, 0x63, + 0x75, 0x0c, 0xe4, 0x38, 0x0c, 0xa9, 0x95, 0x8a, 0x45, 0x88, 0x0b, 0x42, 0x2c, 0x30, 0x19, 0x74, + 0xab, 0x29, 0x60, 0xf6, 0x71, 0x48, 0x0a, 0x39, 0x90, 0xad, 0x9a, 0x48, 0xa2, 0x68, 0xb2, 0x68, + 0x3b, 0x76, 0x22, 0xa5, 0x24, 0x75, 0xd1, 0x78, 0x27, 0xf4, 0x6b, 0x76, 0xd1, 0x4b, 0xce, 0xc7, + 0x26, 0x62, 0x27, 0x92, 0x4a, 0x9f, 0x66, 0xbb, 0x89, 0x4d, 0xf9, 0x93, 0x31, 0x18, 0x0c, 0x1e, + 0x2e, 0xa0, 0x59, 0x48, 0x56, 0x8d, 0x92, 0x4a, 0x55, 0x8b, 0x9d, 0x6c, 0x9d, 0x88, 0x38, 0x8f, + 0x98, 0x5c, 0xe0, 0xf0, 0x8a, 0x8b, 0x99, 0xfd, 0x53, 0x09, 0x92, 0xa2, 0x1a, 0x1d, 0x84, 0x84, + 0xa9, 0x3a, 0x5b, 0x94, 0x5c, 0x77, 0x3e, 0x96, 0x96, 0x14, 0x5a, 0x26, 0xf5, 0xb6, 0xa9, 0xea, + 0x54, 0x05, 0x78, 0x3d, 0x29, 0x93, 0x79, 0xad, 0x62, 0xb5, 0x4c, 0xa3, 0x1e, 0xa3, 0x56, 0xc3, + 0xba, 0x63, 0x8b, 0x79, 0xe5, 0xf5, 0x33, 0xbc, 0x1a, 0xdd, 0x07, 0xc3, 0x8e, 0xa5, 0x6a, 0xd5, + 0x00, 0x6c, 0x82, 0xc2, 0xa6, 0x45, 0x83, 0x0b, 0x3c, 0x0d, 0x87, 0x04, 0xdd, 0x32, 0x76, 0xd4, + 0xd2, 0x16, 0x2e, 0x7b, 0x48, 0x3d, 0x34, 0xbb, 0x71, 0x07, 0x07, 0x98, 0xe5, 0xed, 0x02, 0x57, + 0xfe, 0x9a, 0x04, 0xc3, 0x22, 0x4e, 0x2b, 0xbb, 0xc2, 0x5a, 0x04, 0x50, 0x75, 0xdd, 0x70, 0xfc, + 0xe2, 0x6a, 0x54, 0xe5, 0x06, 0xbc, 0xc9, 0x9c, 0x8b, 0xa4, 0xf8, 0x08, 0x64, 0x6b, 0x00, 0x5e, + 0x4b, 0x4b, 0xb1, 0x8d, 0x43, 0x1f, 0x3f, 0x39, 0xa2, 0xc7, 0x8f, 0x2c, 0xb2, 0x07, 0x56, 0x45, + 0x02, 0x3a, 0x34, 0x0a, 0xdd, 0x1b, 0xb8, 0xa2, 0xe9, 0x3c, 0x1f, 0xcc, 0x0a, 0x22, 0xff, 0x92, + 0x70, 0xf3, 0x2f, 0xf9, 0xf7, 0x49, 0x30, 0x52, 0x32, 0x6a, 0x61, 0x7e, 0xf3, 0xe9, 0x50, 0x7a, + 0xc1, 0xbe, 0x2c, 0x3d, 0xf3, 0x58, 0x45, 0x73, 0xb6, 0xea, 0x1b, 0x93, 0x25, 0xa3, 0x36, 0x55, + 0x31, 0xaa, 0xaa, 0x5e, 0xf1, 0xce, 0x4f, 0xe9, 0x3f, 0xa5, 0x53, 0x15, 0xac, 0x9f, 0xaa, 0x18, + 0xbe, 0xd3, 0xd4, 0x0b, 0xde, 0xbf, 0xff, 0x4b, 0x92, 0x7e, 0x3b, 0x16, 0x9f, 0x5b, 0xc9, 0xbf, + 0x16, 0xcb, 0xce, 0xb1, 0xee, 0x56, 0x84, 0x78, 0x14, 0xbc, 0x59, 0xc5, 0x25, 0x32, 0x64, 0xf8, + 0xde, 0x7d, 0x30, 0x5a, 0x31, 0x2a, 0x06, 0xa5, 0x38, 0x45, 0xfe, 0xe3, 0x27, 0xb2, 0x29, 0xb7, + 0x36, 0x1b, 0x79, 0x7c, 0x3b, 0xbd, 0x04, 0x23, 0x1c, 0xb8, 0x48, 0x8f, 0x84, 0x58, 0x60, 0x83, + 0xf6, 0x4c, 0xab, 0x65, 0x7e, 0xef, 0x3b, 0x74, 0x43, 0x57, 0x86, 0x39, 0x2a, 0x69, 0x63, 0xb1, + 0xcf, 0xb4, 0x02, 0x07, 0x02, 0xf4, 0xd8, 0xb2, 0xc5, 0x56, 0x04, 0xc5, 0x3f, 0xe6, 0x14, 0x47, + 0x7c, 0x14, 0x57, 0x39, 0xea, 0xf4, 0x0c, 0x0c, 0x74, 0x42, 0xeb, 0x9f, 0x71, 0x5a, 0xfd, 0xd8, + 0x4f, 0x64, 0x0e, 0x86, 0x28, 0x91, 0x52, 0xdd, 0x76, 0x8c, 0x1a, 0xb5, 0x89, 0x7b, 0x93, 0xf9, + 0xe7, 0xdf, 0x61, 0xeb, 0x68, 0x90, 0xa0, 0xcd, 0xb8, 0x58, 0xd3, 0xd3, 0x40, 0x4f, 0xc1, 0xca, + 0xb8, 0x54, 0x8d, 0xa0, 0xf0, 0x65, 0xce, 0x88, 0x0b, 0x3f, 0x7d, 0x05, 0x46, 0xc9, 0xff, 0xd4, + 0x64, 0xf9, 0x39, 0x89, 0xce, 0xc1, 0x65, 0xbe, 0xf6, 0x2e, 0xb6, 0x54, 0x47, 0x5c, 0x02, 0x3e, + 0x9e, 0x7c, 0xb3, 0x58, 0xc1, 0x8e, 0x83, 0x2d, 0xbb, 0xa8, 0x56, 0x9b, 0xb1, 0xe7, 0x4b, 0x62, + 0x64, 0x7e, 0xeb, 0xfb, 0xc1, 0x59, 0x9c, 0x63, 0x98, 0xb9, 0x6a, 0x75, 0x7a, 0x1d, 0xee, 0x68, + 0xa2, 0x15, 0x6d, 0xd0, 0x7c, 0x95, 0xd3, 0x1c, 0x6d, 0xd0, 0x0c, 0x42, 0x76, 0x05, 0x44, 0xbd, + 0x3b, 0x97, 0x6d, 0xd0, 0xfc, 0x10, 0xa7, 0x89, 0x38, 0xae, 0x98, 0x52, 0x42, 0xf1, 0x71, 0x18, + 0xbe, 0x8a, 0xad, 0x0d, 0xc3, 0xe6, 0x89, 0xa3, 0x36, 0xc8, 0x7d, 0x98, 0x93, 0x1b, 0xe2, 0x88, + 0x34, 0x93, 0x44, 0x68, 0x3d, 0x02, 0xc9, 0x4d, 0xb5, 0x84, 0xdb, 0x20, 0x71, 0x9d, 0x93, 0xe8, + 0x25, 0xf0, 0x04, 0x35, 0x07, 0xfd, 0x15, 0x83, 0xef, 0x5a, 0xd1, 0xe8, 0x1f, 0xe1, 0xe8, 0x7d, + 0x02, 0x87, 0x93, 0x30, 0x0d, 0xb3, 0x5e, 0x25, 0x5b, 0x5a, 0x34, 0x89, 0xbf, 0x23, 0x48, 0x08, + 0x1c, 0x4e, 0xa2, 0x03, 0xb1, 0x7e, 0x54, 0x90, 0xb0, 0x7d, 0xf2, 0xbc, 0x08, 0x7d, 0x86, 0x5e, + 0xdd, 0x35, 0xf4, 0x76, 0x98, 0xf8, 0x18, 0xa7, 0x00, 0x1c, 0x85, 0x10, 0xb8, 0x00, 0xa9, 0x76, + 0x27, 0xe2, 0xef, 0x7e, 0x5f, 0x2c, 0x0f, 0x31, 0x03, 0x73, 0x30, 0x24, 0x0c, 0x94, 0x66, 0xe8, + 0x6d, 0x90, 0xf8, 0x7b, 0x9c, 0xc4, 0xa0, 0x0f, 0x8d, 0x0f, 0xc3, 0xc1, 0xb6, 0x53, 0xc1, 0xed, + 0x10, 0xf9, 0xa4, 0x18, 0x06, 0x47, 0xe1, 0xa2, 0xdc, 0xc0, 0x7a, 0x69, 0xab, 0x3d, 0x0a, 0x9f, + 0x12, 0xa2, 0x14, 0x38, 0x84, 0xc4, 0x0c, 0x0c, 0xd4, 0x54, 0xcb, 0xde, 0x52, 0xab, 0x6d, 0x4d, + 0xc7, 0xdf, 0xe7, 0x34, 0xfa, 0x5d, 0x24, 0x2e, 0x91, 0xba, 0xde, 0x09, 0x99, 0xd7, 0x84, 0x44, + 0x7c, 0x68, 0x7c, 0xe9, 0xd9, 0x0e, 0xcd, 0xb2, 0x75, 0x42, 0xed, 0x1f, 0x88, 0xa5, 0xc7, 0x70, + 0x17, 0xfd, 0x14, 0x2f, 0x40, 0xca, 0xd6, 0x9e, 0x6f, 0x8b, 0xcc, 0xef, 0x88, 0x99, 0xa6, 0x08, + 0x04, 0xf9, 0x6d, 0x70, 0xa8, 0xe9, 0x36, 0xd1, 0x06, 0xb1, 0xdf, 0xe5, 0xc4, 0x0e, 0x36, 0xd9, + 0x2a, 0xb8, 0x49, 0xe8, 0x94, 0xe4, 0x3f, 0x14, 0x26, 0x01, 0x87, 0x68, 0xad, 0x90, 0x38, 0xc2, + 0x56, 0x37, 0x3b, 0x93, 0xda, 0xa7, 0x85, 0xd4, 0x18, 0x6e, 0x40, 0x6a, 0x6b, 0x70, 0x90, 0x53, + 0xec, 0x6c, 0x5e, 0x3f, 0x23, 0x0c, 0x2b, 0xc3, 0x5e, 0x0f, 0xce, 0xee, 0xdb, 0x21, 0xeb, 0x8a, + 0x53, 0x38, 0xac, 0x76, 0xb1, 0xa6, 0x9a, 0x6d, 0x50, 0xfe, 0x3d, 0x4e, 0x59, 0x58, 0x7c, 0xd7, + 0xe3, 0xb5, 0x17, 0x55, 0x93, 0x10, 0x7f, 0x1a, 0x32, 0x82, 0x78, 0x5d, 0xb7, 0x70, 0xc9, 0xa8, + 0xe8, 0xda, 0xf3, 0xb8, 0xdc, 0x06, 0xe9, 0xcf, 0x86, 0xa6, 0x6a, 0xdd, 0x87, 0x4e, 0x28, 0xcf, + 0x43, 0xda, 0xf5, 0x55, 0x8a, 0x5a, 0xcd, 0x34, 0x2c, 0x27, 0x82, 0xe2, 0xe7, 0xc4, 0x4c, 0xb9, + 0x78, 0xf3, 0x14, 0x6d, 0xba, 0x00, 0x83, 0xb4, 0xd8, 0xae, 0x4a, 0x7e, 0x9e, 0x13, 0x1a, 0xf0, + 0xb0, 0xb8, 0xe1, 0x28, 0x19, 0x35, 0x53, 0xb5, 0xda, 0xb1, 0x7f, 0x5f, 0x10, 0x86, 0x83, 0xa3, + 0x70, 0xc3, 0xe1, 0xec, 0x9a, 0x98, 0xec, 0xf6, 0x6d, 0x50, 0xf8, 0xa2, 0x30, 0x1c, 0x02, 0x87, + 0x93, 0x10, 0x0e, 0x43, 0x1b, 0x24, 0xfe, 0x91, 0x20, 0x21, 0x70, 0x08, 0x89, 0x27, 0xbd, 0x8d, + 0xd6, 0xc2, 0x15, 0xcd, 0x76, 0x2c, 0xe6, 0x26, 0xef, 0x4d, 0xea, 0x1f, 0x7f, 0x3f, 0xe8, 0x84, + 0x29, 0x3e, 0x54, 0x62, 0x89, 0x78, 0xda, 0x95, 0x46, 0x51, 0xd1, 0x8c, 0xfd, 0xbe, 0xb0, 0x44, + 0x3e, 0x34, 0xc2, 0x9b, 0xcf, 0x43, 0x24, 0x62, 0x2f, 0x91, 0xd8, 0xa1, 0x0d, 0x72, 0xff, 0x24, + 0xc4, 0xdc, 0xaa, 0xc0, 0x25, 0x34, 0x7d, 0xfe, 0x4f, 0x5d, 0xdf, 0xc6, 0xbb, 0x6d, 0x69, 0xe7, + 0x1f, 0x84, 0xfc, 0x9f, 0x75, 0x86, 0xc9, 0x6c, 0xc8, 0x50, 0xc8, 0x9f, 0x42, 0x51, 0xf7, 0x87, + 0x32, 0xbf, 0xf0, 0x43, 0x3e, 0xde, 0xa0, 0x3b, 0x35, 0xbd, 0x40, 0x94, 0x3c, 0xe8, 0xf4, 0x44, + 0x13, 0x7b, 0xd7, 0x0f, 0x5d, 0x3d, 0x0f, 0xf8, 0x3c, 0xd3, 0x97, 0x60, 0x20, 0xe0, 0xf0, 0x44, + 0x93, 0xfa, 0x25, 0x4e, 0xaa, 0xdf, 0xef, 0xef, 0x4c, 0x9f, 0x81, 0x04, 0x71, 0x5e, 0xa2, 0xd1, + 0xdf, 0xcd, 0xd1, 0x29, 0xf8, 0xf4, 0xa3, 0x90, 0x14, 0x4e, 0x4b, 0x34, 0xea, 0x7b, 0x38, 0xaa, + 0x8b, 0x42, 0xd0, 0x85, 0xc3, 0x12, 0x8d, 0xfe, 0xcb, 0x02, 0x5d, 0xa0, 0x10, 0xf4, 0xf6, 0x45, + 0xf8, 0xa5, 0x5f, 0x4d, 0xf0, 0x4d, 0x47, 0xc8, 0xee, 0x02, 0xf4, 0x72, 0x4f, 0x25, 0x1a, 0xfb, + 0x57, 0x78, 0xe7, 0x02, 0x63, 0xfa, 0x1c, 0x74, 0xb7, 0x29, 0xf0, 0xf7, 0x72, 0x54, 0x06, 0x3f, + 0x3d, 0x03, 0x7d, 0x3e, 0xef, 0x24, 0x1a, 0xfd, 0x6f, 0x73, 0x74, 0x3f, 0x16, 0x61, 0x9d, 0x7b, + 0x27, 0xd1, 0x04, 0xde, 0x27, 0x58, 0xe7, 0x18, 0x44, 0x6c, 0xc2, 0x31, 0x89, 0xc6, 0x7e, 0x45, + 0x48, 0x5d, 0xa0, 0x4c, 0x5f, 0x84, 0x94, 0xbb, 0xd9, 0x44, 0xe3, 0xbf, 0x9f, 0xe3, 0x7b, 0x38, + 0x44, 0x02, 0xbe, 0xcd, 0x2e, 0x9a, 0xc4, 0x07, 0x84, 0x04, 0x7c, 0x58, 0x64, 0x19, 0x85, 0x1d, + 0x98, 0x68, 0x4a, 0xbf, 0x26, 0x96, 0x51, 0xc8, 0x7f, 0x21, 0xb3, 0x49, 0x6d, 0x7e, 0x34, 0x89, + 0x5f, 0x17, 0xb3, 0x49, 0xe1, 0x09, 0x1b, 0x61, 0x8f, 0x20, 0x9a, 0xc6, 0x6f, 0x0a, 0x36, 0x42, + 0x0e, 0xc1, 0xf4, 0x0a, 0xa0, 0x46, 0x6f, 0x20, 0x9a, 0xde, 0x07, 0x39, 0xbd, 0xe1, 0x06, 0x67, + 0x60, 0xfa, 0x29, 0x38, 0xd8, 0xdc, 0x13, 0x88, 0xa6, 0xfa, 0x5b, 0x3f, 0x0c, 0xc5, 0x6e, 0x7e, + 0x47, 0x60, 0x7a, 0xcd, 0xdb, 0x52, 0xfc, 0x5e, 0x40, 0x34, 0xd9, 0x57, 0x7f, 0x18, 0x34, 0xdc, + 0x7e, 0x27, 0x60, 0x3a, 0x07, 0xe0, 0x6d, 0xc0, 0xd1, 0xb4, 0x3e, 0xcc, 0x69, 0xf9, 0x90, 0xc8, + 0xd2, 0xe0, 0xfb, 0x6f, 0x34, 0xfe, 0x75, 0xb1, 0x34, 0x38, 0x06, 0x59, 0x1a, 0x62, 0xeb, 0x8d, + 0xc6, 0xfe, 0x88, 0x58, 0x1a, 0x02, 0x85, 0x68, 0xb6, 0x6f, 0x77, 0x8b, 0xa6, 0xf0, 0x31, 0xa1, + 0xd9, 0x3e, 0xac, 0xe9, 0x25, 0x18, 0x6e, 0xd8, 0x10, 0xa3, 0x49, 0xfd, 0x36, 0x27, 0x95, 0x0e, + 0xef, 0x87, 0xfe, 0xcd, 0x8b, 0x6f, 0x86, 0xd1, 0xd4, 0x3e, 0x1e, 0xda, 0xbc, 0xf8, 0x5e, 0x38, + 0x7d, 0x01, 0x92, 0x7a, 0xbd, 0x5a, 0x25, 0x8b, 0x07, 0xed, 0x7d, 0xe7, 0x2f, 0xf3, 0x9f, 0x7f, + 0xcc, 0xa5, 0x23, 0x10, 0xa6, 0xcf, 0x40, 0x37, 0xae, 0x6d, 0xe0, 0x72, 0x14, 0xe6, 0xf7, 0x7e, + 0x2c, 0x0c, 0x26, 0x81, 0x9e, 0xbe, 0x08, 0xc0, 0x52, 0x23, 0xf4, 0x78, 0x30, 0x02, 0xf7, 0xbf, + 0xfc, 0x98, 0xdf, 0xc6, 0xf1, 0x50, 0x3c, 0x02, 0xec, 0x6e, 0xcf, 0xde, 0x04, 0xbe, 0x1f, 0x24, + 0x40, 0x67, 0xe4, 0x11, 0xe8, 0x7d, 0xd6, 0x36, 0x74, 0x47, 0xad, 0x44, 0x61, 0xff, 0x57, 0x8e, + 0x2d, 0xe0, 0x89, 0xc0, 0x6a, 0x86, 0x85, 0x1d, 0xb5, 0x62, 0x47, 0xe1, 0xfe, 0x37, 0x8e, 0xeb, + 0x22, 0x10, 0xe4, 0x92, 0x6a, 0x3b, 0xed, 0x8c, 0xfb, 0xaf, 0x04, 0xb2, 0x40, 0x20, 0x4c, 0x93, + 0xff, 0xb7, 0xf1, 0x6e, 0x14, 0xee, 0x0f, 0x04, 0xd3, 0x1c, 0x7e, 0xfa, 0x51, 0x48, 0x91, 0x7f, + 0xd9, 0x15, 0xbb, 0x08, 0xe4, 0xff, 0xce, 0x91, 0x3d, 0x0c, 0xd2, 0xb3, 0xed, 0x94, 0x1d, 0x2d, + 0x5a, 0xd8, 0x6f, 0xf0, 0x99, 0x16, 0xf0, 0xd3, 0x39, 0xe8, 0xb3, 0x9d, 0x72, 0xb9, 0xce, 0xfd, + 0xd3, 0x08, 0xf4, 0xff, 0xf1, 0x63, 0x37, 0x65, 0xe1, 0xe2, 0x90, 0xd9, 0xbe, 0xb6, 0xed, 0x98, + 0x06, 0x3d, 0x02, 0x89, 0xa2, 0xf0, 0x43, 0x4e, 0xc1, 0x87, 0x32, 0x3d, 0x03, 0xfd, 0x64, 0x2c, + 0x16, 0x36, 0x31, 0x3d, 0xaf, 0x8a, 0x20, 0xf1, 0x23, 0x2e, 0x80, 0x00, 0x52, 0xfe, 0xe7, 0xbe, + 0xfc, 0xfa, 0x98, 0xf4, 0xd5, 0xd7, 0xc7, 0xa4, 0x6f, 0xbd, 0x3e, 0x26, 0xbd, 0xf2, 0xed, 0xb1, + 0xae, 0xaf, 0x7e, 0x7b, 0xac, 0xeb, 0x1b, 0xdf, 0x1e, 0xeb, 0x6a, 0x9e, 0x36, 0x86, 0x39, 0x63, + 0xce, 0x60, 0x09, 0xe3, 0x67, 0xe4, 0x40, 0xba, 0xb8, 0x62, 0x78, 0xd9, 0x5a, 0x37, 0xc8, 0x81, + 0x1f, 0x49, 0x24, 0x60, 0x0e, 0xe6, 0x72, 0x55, 0x7d, 0xb7, 0xc5, 0x1b, 0x9c, 0x6c, 0xd3, 0xc4, + 0xb0, 0xfc, 0x16, 0x88, 0xe7, 0xf4, 0x5d, 0x74, 0x88, 0xd9, 0xbc, 0x62, 0xdd, 0xaa, 0xf2, 0xab, + 0x5f, 0xbd, 0xa4, 0xbc, 0x6e, 0x55, 0xd1, 0xa8, 0x77, 0x3f, 0x53, 0x3a, 0xd1, 0xcf, 0x2f, 0x5d, + 0x4e, 0x27, 0x7e, 0xf0, 0xb1, 0xf1, 0xae, 0xfc, 0x76, 0x78, 0x84, 0x5f, 0x8a, 0x1c, 0x65, 0x32, + 0xa7, 0xef, 0xd2, 0x41, 0xae, 0x48, 0xcf, 0x74, 0x93, 0x3e, 0x6c, 0x91, 0xd8, 0x1e, 0x0b, 0x27, + 0xb6, 0x9f, 0xc2, 0xd5, 0xea, 0x13, 0xba, 0x71, 0x4d, 0x5f, 0x23, 0x60, 0x1b, 0x3d, 0x94, 0xc6, + 0x43, 0xf0, 0x4a, 0x0c, 0xc6, 0xc3, 0xe3, 0x26, 0x8a, 0x63, 0x3b, 0x6a, 0xcd, 0x6c, 0xf5, 0x02, + 0xe9, 0x02, 0xa4, 0xd6, 0x04, 0x0c, 0xca, 0x40, 0xaf, 0x8d, 0x4b, 0x86, 0x5e, 0xb6, 0xe9, 0x60, + 0xe3, 0x8a, 0x28, 0x92, 0xc1, 0xea, 0xaa, 0x6e, 0xd8, 0xfc, 0x82, 0x24, 0x2b, 0xe4, 0x7f, 0x43, + 0xea, 0x6c, 0x26, 0x07, 0xdd, 0xae, 0xc4, 0x48, 0xef, 0xdb, 0x2b, 0xfd, 0x4f, 0xa5, 0xe0, 0x0d, + 0xc1, 0x97, 0xeb, 0x6f, 0x57, 0x24, 0xbf, 0x18, 0x87, 0x43, 0x25, 0xc3, 0xae, 0x19, 0x76, 0x91, + 0xcd, 0x30, 0x2b, 0x70, 0x61, 0xf4, 0xfb, 0x9b, 0xda, 0xc8, 0xff, 0x5f, 0x86, 0x41, 0xba, 0x0a, + 0x68, 0xe6, 0x93, 0x1a, 0x9e, 0xc8, 0xbd, 0xe2, 0x4f, 0xfe, 0x4d, 0x37, 0xd5, 0x9a, 0x01, 0x17, + 0x91, 0x5e, 0xed, 0x58, 0x83, 0x51, 0xad, 0x66, 0x56, 0x31, 0x3d, 0x03, 0x2a, 0xba, 0x6d, 0xd1, + 0xf4, 0xbe, 0xc2, 0xe9, 0x8d, 0x78, 0xe8, 0xf3, 0x02, 0x7b, 0x7a, 0x01, 0x86, 0xd5, 0x52, 0x09, + 0x9b, 0x01, 0x92, 0x11, 0x2b, 0x54, 0x30, 0x98, 0xe6, 0x98, 0x2e, 0xb5, 0xfc, 0xc5, 0x56, 0x73, + 0xfb, 0xcc, 0x3d, 0xbe, 0x49, 0xb3, 0x70, 0x05, 0xeb, 0xa7, 0x74, 0xec, 0x5c, 0x33, 0xac, 0x6d, + 0x2e, 0xde, 0x53, 0xac, 0x2b, 0x31, 0x09, 0xbf, 0x14, 0x87, 0x31, 0xd6, 0x30, 0xb5, 0xa1, 0xda, + 0x78, 0xea, 0xea, 0x83, 0x1b, 0xd8, 0x51, 0x1f, 0x9c, 0x2a, 0x19, 0x9a, 0xce, 0x67, 0x62, 0x84, + 0xcf, 0x0b, 0x69, 0x9f, 0xe4, 0xed, 0x2d, 0x16, 0xe6, 0x1c, 0x24, 0x66, 0x0c, 0x4d, 0x27, 0x1a, + 0x59, 0xc6, 0xba, 0x51, 0xe3, 0xcb, 0x92, 0x15, 0xd0, 0x5d, 0xd0, 0xa3, 0xd6, 0x8c, 0xba, 0xee, + 0xb0, 0xe3, 0xab, 0x7c, 0xdf, 0x97, 0x6f, 0x8c, 0x77, 0xfd, 0xf9, 0x8d, 0xf1, 0xf8, 0xbc, 0xee, + 0x28, 0xbc, 0x69, 0x3a, 0xf1, 0xdd, 0x8f, 0x8e, 0x4b, 0xf2, 0xe3, 0xd0, 0x3b, 0x8b, 0x4b, 0xfb, + 0xa1, 0x35, 0x8b, 0x4b, 0x21, 0x5a, 0xf7, 0x42, 0x72, 0x5e, 0x77, 0xd8, 0x9d, 0xd9, 0xa3, 0x10, + 0xd7, 0x74, 0x76, 0x0b, 0x2b, 0xd4, 0x3f, 0xa9, 0x27, 0xa0, 0xb3, 0xb8, 0xe4, 0x82, 0x96, 0x71, + 0x29, 0x0c, 0x4a, 0xc8, 0x93, 0xfa, 0xfc, 0xec, 0x37, 0xfe, 0x62, 0xac, 0xeb, 0xc5, 0xd7, 0xc7, + 0xba, 0x5a, 0xce, 0x84, 0xdf, 0x1c, 0x72, 0x11, 0xf3, 0x29, 0xb0, 0xcb, 0xdb, 0x53, 0x4e, 0x60, + 0x2d, 0xfc, 0xad, 0x18, 0x8c, 0x35, 0xa8, 0x38, 0xdf, 0x18, 0x5a, 0x59, 0x87, 0x69, 0x48, 0xce, + 0x8a, 0xfd, 0xa6, 0x53, 0xe3, 0xf0, 0xeb, 0x1d, 0x1a, 0x87, 0x01, 0xd1, 0x93, 0xb0, 0x0d, 0x27, + 0xa3, 0x6d, 0x83, 0xe0, 0x7f, 0x1f, 0xa6, 0xe1, 0xb5, 0x04, 0x1c, 0xa5, 0x8f, 0x42, 0xac, 0x9a, + 0xa6, 0x3b, 0x53, 0x25, 0x6b, 0xd7, 0x74, 0xe8, 0x76, 0x62, 0x6c, 0x72, 0x69, 0x0c, 0x7b, 0xcd, + 0x93, 0xac, 0xb9, 0x85, 0x4a, 0x6e, 0x42, 0xf7, 0x0a, 0xc1, 0x23, 0x82, 0x70, 0x0c, 0x47, 0xad, + 0x72, 0x01, 0xb1, 0x02, 0xa9, 0x65, 0x0f, 0x49, 0x62, 0xac, 0x56, 0x13, 0x6f, 0x48, 0xaa, 0x58, + 0xdd, 0x64, 0x17, 0x77, 0xe3, 0x74, 0x0b, 0x49, 0x92, 0x0a, 0x7a, 0x47, 0x77, 0x14, 0xba, 0xd5, + 0x3a, 0x3b, 0x72, 0x8e, 0x93, 0xbd, 0x85, 0x16, 0xe4, 0x27, 0xa0, 0x97, 0x1f, 0x73, 0xa1, 0x34, + 0xc4, 0xb7, 0xf1, 0x2e, 0xed, 0xa7, 0x5f, 0x21, 0xff, 0xa2, 0x49, 0xe8, 0xa6, 0xcc, 0xf3, 0x17, + 0x09, 0x99, 0xc9, 0x06, 0xee, 0x27, 0x29, 0x93, 0x0a, 0x03, 0x93, 0x1f, 0x87, 0xe4, 0xac, 0x51, + 0xd3, 0x74, 0x23, 0x48, 0x2d, 0xc5, 0xa8, 0x51, 0x9e, 0xcd, 0x3a, 0x57, 0x7d, 0x85, 0x15, 0xd0, + 0x41, 0xe8, 0x61, 0x17, 0xb9, 0xf9, 0xb1, 0x39, 0x2f, 0xc9, 0x33, 0xd0, 0x4b, 0x69, 0x2f, 0x9b, + 0x08, 0xf1, 0x97, 0x3d, 0xfc, 0xc6, 0x38, 0xb5, 0x92, 0x9c, 0x7c, 0xcc, 0x63, 0x16, 0x41, 0xa2, + 0xac, 0x3a, 0x2a, 0x1f, 0x37, 0xfd, 0x5f, 0x7e, 0x0c, 0x92, 0x9c, 0x88, 0x8d, 0x4e, 0x43, 0xdc, + 0x30, 0x6d, 0x7e, 0xf0, 0x9d, 0x6d, 0x35, 0x94, 0x65, 0x33, 0x9f, 0x20, 0x8b, 0x46, 0x21, 0xc0, + 0x79, 0xa5, 0xe5, 0x2a, 0x39, 0xef, 0x53, 0x24, 0xdf, 0x94, 0xfb, 0xfe, 0x65, 0x53, 0xda, 0xa0, + 0x0e, 0xae, 0xb2, 0x7c, 0x2c, 0x06, 0x63, 0xbe, 0xd6, 0xab, 0xd8, 0x22, 0xb1, 0x1e, 0x5b, 0x60, + 0x5c, 0x5b, 0x90, 0x8f, 0x49, 0xde, 0xde, 0x42, 0x5d, 0x1e, 0x85, 0x78, 0xce, 0x34, 0x51, 0x16, + 0x92, 0xec, 0x80, 0xdb, 0x60, 0xfa, 0x92, 0x50, 0xdc, 0x32, 0x69, 0xb3, 0x8d, 0x4d, 0xe7, 0x9a, + 0x6a, 0xb9, 0x4f, 0x98, 0x44, 0x59, 0x7e, 0x04, 0x52, 0x33, 0x86, 0x6e, 0x63, 0xdd, 0xae, 0xd3, + 0xa5, 0xb7, 0x51, 0x35, 0x4a, 0xdb, 0x9c, 0x02, 0x2b, 0x10, 0x81, 0xab, 0xa6, 0x49, 0x31, 0x13, + 0x0a, 0xf9, 0x97, 0x99, 0xa9, 0xfc, 0x6a, 0x4b, 0x11, 0x3d, 0xd2, 0xb9, 0x88, 0xf8, 0x20, 0x5d, + 0x19, 0xfd, 0x6f, 0x09, 0x8e, 0x34, 0x2e, 0xa8, 0x6d, 0xbc, 0x6b, 0x77, 0xba, 0x9e, 0x9e, 0x86, + 0xd4, 0x0a, 0x7d, 0x47, 0xfc, 0x04, 0xde, 0x45, 0x59, 0xe8, 0xc5, 0xe5, 0xd3, 0x67, 0xce, 0x3c, + 0xf8, 0x08, 0xd3, 0xf6, 0xcb, 0x5d, 0x8a, 0xa8, 0x40, 0x63, 0x90, 0xb2, 0x71, 0xc9, 0x3c, 0x7d, + 0xe6, 0xec, 0xf6, 0x83, 0x4c, 0xbd, 0x2e, 0x77, 0x29, 0x5e, 0xd5, 0x74, 0x92, 0x8c, 0xfa, 0xbb, + 0x1f, 0x1b, 0x97, 0xf2, 0xdd, 0x10, 0xb7, 0xeb, 0xb5, 0xdb, 0xaa, 0x23, 0xaf, 0x76, 0xc3, 0x84, + 0x1f, 0x93, 0x1a, 0xa8, 0xab, 0x6a, 0x55, 0x2b, 0xab, 0xde, 0x0b, 0xf0, 0xb4, 0x4f, 0x06, 0x14, + 0xa2, 0xb9, 0x08, 0xb2, 0x7b, 0x4a, 0x52, 0xfe, 0xac, 0x04, 0xfd, 0x57, 0x04, 0xe5, 0x55, 0xec, + 0xa0, 0x0b, 0x00, 0x6e, 0x4f, 0x62, 0xd9, 0x1c, 0x9e, 0x0c, 0xf7, 0x35, 0xe9, 0xe2, 0x28, 0x3e, + 0x70, 0x74, 0x8e, 0x2a, 0xa2, 0x69, 0xd8, 0xfc, 0xfd, 0x4b, 0x04, 0xaa, 0x0b, 0x8c, 0xee, 0x07, + 0x44, 0x2d, 0x5c, 0xf1, 0xaa, 0xe1, 0x68, 0x7a, 0xa5, 0x68, 0x1a, 0xd7, 0xf8, 0x63, 0xc1, 0xb8, + 0x92, 0xa6, 0x2d, 0x57, 0x68, 0xc3, 0x0a, 0xa9, 0x27, 0x4c, 0xa7, 0x5c, 0x2a, 0x64, 0x37, 0x51, + 0xcb, 0x65, 0x0b, 0xdb, 0x36, 0x37, 0x62, 0xa2, 0x88, 0x2e, 0x40, 0xaf, 0x59, 0xdf, 0x28, 0x0a, + 0x8b, 0xd1, 0x77, 0xfa, 0x48, 0xb3, 0xf5, 0x2f, 0xf4, 0x83, 0x5b, 0x80, 0x1e, 0xb3, 0xbe, 0x41, + 0xb4, 0xe5, 0x4e, 0xe8, 0x6f, 0xc2, 0x4c, 0xdf, 0x55, 0x8f, 0x0f, 0xfa, 0x7c, 0x9d, 0x8f, 0xa0, + 0x68, 0x5a, 0x9a, 0x61, 0x69, 0xce, 0x2e, 0xbd, 0xbd, 0x12, 0x57, 0xd2, 0xa2, 0x61, 0x85, 0xd7, + 0xcb, 0xdb, 0x30, 0xb4, 0x4a, 0x5d, 0x2d, 0x8f, 0xf3, 0x33, 0x1e, 0x7f, 0x52, 0x34, 0x7f, 0x2d, + 0x39, 0x8b, 0x35, 0x70, 0x96, 0x7f, 0xb2, 0xa5, 0x76, 0x9e, 0xeb, 0x5c, 0x3b, 0x83, 0x9b, 0xff, + 0x5f, 0x1d, 0x0a, 0x2c, 0x4e, 0xee, 0x59, 0xfb, 0xcc, 0x57, 0xbb, 0x8a, 0x19, 0x15, 0x61, 0x64, + 0xf7, 0xde, 0x54, 0xb3, 0x11, 0x66, 0x34, 0x1b, 0xb9, 0x84, 0xe4, 0x47, 0x60, 0x60, 0x45, 0xb5, + 0x9c, 0x55, 0xec, 0x5c, 0xc6, 0x6a, 0x19, 0x5b, 0xc1, 0x5d, 0x77, 0x40, 0xec, 0xba, 0x08, 0x12, + 0x74, 0x6b, 0x65, 0xbb, 0x0e, 0xfd, 0x5f, 0xde, 0x82, 0x04, 0xbd, 0xc1, 0xe6, 0xee, 0xc8, 0x1c, + 0x83, 0xed, 0xc8, 0xc4, 0x96, 0xee, 0x3a, 0xd8, 0x16, 0x01, 0x1d, 0x2d, 0xa0, 0x87, 0xc5, 0xbe, + 0x1a, 0xdf, 0x7b, 0x5f, 0xe5, 0x8a, 0xc8, 0x77, 0xd7, 0x2a, 0xf4, 0xe6, 0x89, 0x29, 0x9e, 0x9f, + 0x75, 0x19, 0x91, 0x3c, 0x46, 0xd0, 0x22, 0x0c, 0x99, 0xaa, 0xe5, 0xd0, 0xab, 0xfb, 0x5b, 0x74, + 0x14, 0x5c, 0xd7, 0xc7, 0x1b, 0x57, 0x5e, 0x60, 0xb0, 0xbc, 0x97, 0x01, 0xd3, 0x5f, 0x29, 0xff, + 0x65, 0x02, 0x7a, 0xb8, 0x30, 0x1e, 0x85, 0x5e, 0x2e, 0x56, 0xae, 0x9d, 0x47, 0x27, 0x1b, 0x37, + 0xa6, 0x49, 0x77, 0x03, 0xe1, 0xf4, 0x04, 0x0e, 0x3a, 0x06, 0xc9, 0xd2, 0x96, 0xaa, 0xe9, 0x45, + 0xad, 0x2c, 0xbc, 0xde, 0xd7, 0x6f, 0x8c, 0xf7, 0xce, 0x90, 0xba, 0xf9, 0x59, 0xa5, 0x97, 0x36, + 0xce, 0x97, 0x89, 0x27, 0xb0, 0x85, 0xb5, 0xca, 0x96, 0xc3, 0x57, 0x18, 0x2f, 0xa1, 0xf3, 0x90, + 0x20, 0x0a, 0xc1, 0x5f, 0x76, 0x65, 0x1b, 0x62, 0x0f, 0x37, 0x00, 0xcc, 0x27, 0x49, 0xc7, 0xaf, + 0x7c, 0x73, 0x5c, 0x52, 0x28, 0x06, 0x9a, 0x81, 0x81, 0xaa, 0x6a, 0x3b, 0x45, 0xba, 0x83, 0x91, + 0xee, 0xbb, 0x29, 0x89, 0x43, 0x8d, 0x02, 0xe1, 0x82, 0xe5, 0xac, 0xf7, 0x11, 0x2c, 0x56, 0x55, + 0x46, 0x27, 0x20, 0x4d, 0x89, 0x94, 0x8c, 0x5a, 0x4d, 0x73, 0x98, 0x6f, 0xd5, 0x43, 0xe5, 0x3e, + 0x48, 0xea, 0x67, 0x68, 0x35, 0xf5, 0xb0, 0x0e, 0x43, 0x8a, 0x3e, 0x25, 0xa1, 0x20, 0xec, 0xda, + 0x64, 0x92, 0x54, 0xd0, 0xc6, 0xe3, 0x30, 0xe4, 0xd9, 0x47, 0x06, 0x92, 0x64, 0x54, 0xbc, 0x6a, + 0x0a, 0xf8, 0x00, 0x8c, 0xea, 0x78, 0x87, 0x5e, 0xe4, 0x0c, 0x40, 0xa7, 0x28, 0x34, 0x22, 0x6d, + 0x57, 0x82, 0x18, 0xf7, 0xc0, 0x60, 0x49, 0x08, 0x9f, 0xc1, 0x02, 0x85, 0x1d, 0x70, 0x6b, 0x29, + 0xd8, 0x21, 0x48, 0xaa, 0xa6, 0xc9, 0x00, 0xfa, 0xb8, 0x7d, 0x34, 0x4d, 0xda, 0x74, 0x12, 0x86, + 0xe9, 0x18, 0x2d, 0x6c, 0xd7, 0xab, 0x0e, 0x27, 0xd2, 0x4f, 0x61, 0x86, 0x48, 0x83, 0xc2, 0xea, + 0x29, 0xec, 0x5d, 0x30, 0x80, 0xaf, 0x6a, 0x65, 0xac, 0x97, 0x30, 0x83, 0x1b, 0xa0, 0x70, 0xfd, + 0xa2, 0x92, 0x02, 0xdd, 0x0b, 0xae, 0xdd, 0x2b, 0x0a, 0x9b, 0x3c, 0xc8, 0xe8, 0x89, 0xfa, 0x1c, + 0xab, 0x96, 0x33, 0x90, 0x98, 0x55, 0x1d, 0x95, 0x38, 0x18, 0xce, 0x0e, 0xdb, 0x68, 0xfa, 0x15, + 0xf2, 0xaf, 0xfc, 0xdd, 0x18, 0x24, 0xae, 0x18, 0x0e, 0x46, 0x0f, 0xf9, 0x1c, 0xc0, 0xc1, 0x66, + 0xfa, 0xbc, 0xaa, 0x55, 0x74, 0x5c, 0x5e, 0xb4, 0x2b, 0xbe, 0xf7, 0xdc, 0x9e, 0x3a, 0xc5, 0x02, + 0xea, 0x34, 0x0a, 0xdd, 0x96, 0x51, 0xd7, 0xcb, 0xe2, 0xc6, 0x21, 0x2d, 0xa0, 0x02, 0x24, 0x5d, + 0x2d, 0x49, 0x44, 0x69, 0xc9, 0x10, 0xd1, 0x12, 0xa2, 0xc3, 0xbc, 0x42, 0xe9, 0xdd, 0xe0, 0xca, + 0x92, 0x87, 0x94, 0x6b, 0xbc, 0xb8, 0xb6, 0xb5, 0xa7, 0xb0, 0x1e, 0x1a, 0xd9, 0x4c, 0xdc, 0xb9, + 0x77, 0x85, 0xc7, 0x34, 0x2e, 0xed, 0x36, 0x70, 0xe9, 0x05, 0xd4, 0x8a, 0xbf, 0x2d, 0xef, 0xa5, + 0xe3, 0xf2, 0xd4, 0x8a, 0xbd, 0x2f, 0x3f, 0x02, 0x29, 0x5b, 0xab, 0xe8, 0xaa, 0x53, 0xb7, 0x30, + 0xd7, 0x3c, 0xaf, 0x42, 0xfe, 0x92, 0x04, 0x3d, 0x4c, 0x93, 0x7d, 0x72, 0x93, 0x9a, 0xcb, 0x2d, + 0xd6, 0x4a, 0x6e, 0xf1, 0xfd, 0xcb, 0x2d, 0x07, 0xe0, 0x32, 0x63, 0xf3, 0xb7, 0xc1, 0x4d, 0x3c, + 0x06, 0xc6, 0xe2, 0xaa, 0x56, 0xe1, 0x0b, 0xd5, 0x87, 0x24, 0xff, 0x07, 0x89, 0x38, 0xb1, 0xbc, + 0x1d, 0xe5, 0x60, 0x40, 0xf0, 0x55, 0xdc, 0xac, 0xaa, 0x15, 0xae, 0x3b, 0x47, 0x5b, 0x32, 0x77, + 0xa9, 0xaa, 0x56, 0x94, 0x3e, 0xce, 0x0f, 0x29, 0x34, 0x9f, 0x87, 0x58, 0x8b, 0x79, 0x08, 0x4c, + 0x7c, 0x7c, 0x7f, 0x13, 0x1f, 0x98, 0xa2, 0x44, 0x78, 0x8a, 0x3e, 0x17, 0xa3, 0xc1, 0x8c, 0x69, + 0xd8, 0x6a, 0xf5, 0xcd, 0x58, 0x11, 0x87, 0x21, 0x65, 0x1a, 0xd5, 0x22, 0x6b, 0x61, 0x37, 0x71, + 0x93, 0xa6, 0x51, 0x55, 0x1a, 0xa6, 0xbd, 0xfb, 0x16, 0x2d, 0x97, 0x9e, 0x5b, 0x20, 0xb5, 0xde, + 0xb0, 0xd4, 0x2c, 0xe8, 0x67, 0xa2, 0xe0, 0x7b, 0xd9, 0x03, 0x44, 0x06, 0x74, 0x73, 0x94, 0x1a, + 0xf7, 0x5e, 0xc6, 0x36, 0x83, 0x54, 0x38, 0x1c, 0xc1, 0x60, 0xa6, 0xbf, 0x59, 0x14, 0xec, 0x57, + 0x4b, 0x85, 0xc3, 0xc9, 0xbf, 0x21, 0x01, 0x2c, 0x10, 0xc9, 0xd2, 0xf1, 0x92, 0x5d, 0xc8, 0xa6, + 0x2c, 0x14, 0x03, 0x3d, 0x8f, 0xb5, 0x9a, 0x34, 0xde, 0x7f, 0xbf, 0xed, 0xe7, 0x7b, 0x06, 0x06, + 0x3c, 0x65, 0xb4, 0xb1, 0x60, 0x66, 0x6c, 0x0f, 0xaf, 0x7a, 0x15, 0x3b, 0x4a, 0xff, 0x55, 0x5f, + 0x49, 0xfe, 0x23, 0x09, 0x52, 0x94, 0xa7, 0x45, 0xec, 0xa8, 0x81, 0x39, 0x94, 0xf6, 0x3f, 0x87, + 0x47, 0x01, 0x18, 0x19, 0x5b, 0x7b, 0x1e, 0x73, 0xcd, 0x4a, 0xd1, 0x9a, 0x55, 0xed, 0x79, 0x8c, + 0xce, 0xba, 0x02, 0x8f, 0xef, 0x2d, 0x70, 0xe1, 0x75, 0x73, 0xb1, 0xdf, 0x01, 0xbd, 0xf4, 0x13, + 0x39, 0x3b, 0x36, 0x77, 0xa4, 0x7b, 0xf4, 0x7a, 0x6d, 0x6d, 0xc7, 0x96, 0x9f, 0x85, 0xde, 0xb5, + 0x1d, 0x96, 0x1b, 0x39, 0x0c, 0x29, 0xcb, 0x30, 0xf8, 0x9e, 0xcc, 0x7c, 0xa1, 0x24, 0xa9, 0xa0, + 0x5b, 0x90, 0xc8, 0x07, 0xc4, 0xbc, 0x7c, 0x80, 0x97, 0xd0, 0x88, 0xb7, 0x95, 0xd0, 0x38, 0xf9, + 0x75, 0x09, 0xfa, 0x7c, 0xf6, 0x01, 0x3d, 0x08, 0x07, 0xf2, 0x0b, 0xcb, 0x33, 0x4f, 0x14, 0xe7, + 0x67, 0x8b, 0x97, 0x16, 0x72, 0x73, 0xde, 0x5b, 0x93, 0xec, 0xc1, 0x97, 0xaf, 0x4f, 0x20, 0x1f, + 0xec, 0xba, 0xbe, 0xad, 0x1b, 0xd7, 0x74, 0x34, 0x05, 0xa3, 0x41, 0x94, 0x5c, 0x7e, 0xb5, 0xb0, + 0xb4, 0x96, 0x96, 0xb2, 0x07, 0x5e, 0xbe, 0x3e, 0x31, 0xec, 0xc3, 0xc8, 0x6d, 0xd8, 0x58, 0x77, + 0x1a, 0x11, 0x66, 0x96, 0x17, 0x17, 0xe7, 0xd7, 0xd2, 0xb1, 0x06, 0x04, 0x6e, 0xb0, 0xef, 0x85, + 0xe1, 0x20, 0xc2, 0xd2, 0xfc, 0x42, 0x3a, 0x9e, 0x45, 0x2f, 0x5f, 0x9f, 0x18, 0xf4, 0x41, 0x2f, + 0x69, 0xd5, 0x6c, 0xf2, 0xa5, 0x8f, 0x8f, 0x75, 0x7d, 0xea, 0x13, 0x63, 0x12, 0x19, 0xd9, 0x40, + 0xc0, 0x46, 0xa0, 0xfb, 0xe1, 0x8e, 0xd5, 0xf9, 0xb9, 0xa5, 0xc2, 0x6c, 0x71, 0x71, 0x75, 0xae, + 0xc8, 0x3e, 0xb2, 0xe1, 0x8e, 0x6e, 0xe8, 0xe5, 0xeb, 0x13, 0x7d, 0x7c, 0x48, 0xad, 0xa0, 0x57, + 0x94, 0xc2, 0x95, 0xe5, 0xb5, 0x42, 0x5a, 0x62, 0xd0, 0x2b, 0x16, 0xbe, 0x6a, 0x38, 0xec, 0x1b, + 0x5a, 0x0f, 0xc0, 0xa1, 0x26, 0xd0, 0xee, 0xc0, 0x86, 0x5f, 0xbe, 0x3e, 0x31, 0xb0, 0x62, 0x61, + 0xb6, 0x7e, 0x28, 0xc6, 0x24, 0x64, 0x1a, 0x31, 0x96, 0x57, 0x96, 0x57, 0x73, 0x0b, 0xe9, 0x89, + 0x6c, 0xfa, 0xe5, 0xeb, 0x13, 0xfd, 0xc2, 0x18, 0x12, 0x78, 0x6f, 0x64, 0xb7, 0x33, 0xe2, 0x79, + 0xcf, 0x83, 0x70, 0xd4, 0x76, 0xd4, 0x6d, 0x4d, 0xaf, 0xb8, 0x19, 0x67, 0x5e, 0xe6, 0x21, 0xcf, + 0xd1, 0xaa, 0xf6, 0x5c, 0x5d, 0x2b, 0x8b, 0x4a, 0xf1, 0x77, 0xcf, 0xf4, 0x73, 0xb6, 0xf5, 0xc9, + 0x52, 0x36, 0x22, 0xbb, 0x1a, 0x1d, 0x3a, 0xb5, 0x3e, 0xaa, 0xc8, 0x46, 0x24, 0xd0, 0xb3, 0x7b, + 0x06, 0x77, 0xf2, 0x2b, 0x12, 0x0c, 0x5e, 0xd6, 0x6c, 0xc7, 0xb0, 0xb4, 0x92, 0x5a, 0xa5, 0x2f, + 0x4c, 0xce, 0xb6, 0x6b, 0x5b, 0x43, 0x4b, 0xfd, 0x12, 0xf4, 0x5c, 0x55, 0xab, 0xcc, 0xa8, 0xb1, + 0x47, 0x3c, 0x7b, 0x4a, 0xd1, 0xb3, 0x70, 0x82, 0x0e, 0xc3, 0x96, 0x3f, 0x1d, 0x83, 0x21, 0xba, + 0x26, 0x6c, 0xf6, 0x25, 0x24, 0x12, 0x6a, 0xe5, 0x21, 0x61, 0xa9, 0x0e, 0xcf, 0x1d, 0xe6, 0x27, + 0x79, 0x3e, 0xfc, 0x58, 0x74, 0x8e, 0x7b, 0x72, 0x16, 0x97, 0x14, 0x8a, 0x8b, 0xfe, 0x3f, 0x48, + 0xd6, 0xd4, 0x9d, 0x22, 0xa5, 0xc3, 0x02, 0x98, 0x5c, 0x67, 0x74, 0xde, 0xb8, 0x31, 0x3e, 0xb4, + 0xab, 0xd6, 0xaa, 0xd3, 0xb2, 0xa0, 0x23, 0x2b, 0xbd, 0x35, 0x75, 0x87, 0xb0, 0x88, 0x4c, 0x18, + 0x22, 0xb5, 0xa5, 0x2d, 0x55, 0xaf, 0x60, 0xd6, 0x09, 0xcd, 0x84, 0xe6, 0x2f, 0x77, 0xdc, 0xc9, + 0x41, 0xaf, 0x13, 0x1f, 0x39, 0x59, 0x19, 0xa8, 0xa9, 0x3b, 0x33, 0xb4, 0x82, 0xf4, 0x38, 0x9d, + 0xfc, 0xe0, 0x47, 0xc7, 0xbb, 0xe8, 0x19, 0xc3, 0x37, 0x24, 0x00, 0x4f, 0x62, 0xa8, 0x04, 0xe9, + 0x92, 0x5b, 0xa2, 0xb8, 0x36, 0x9f, 0xca, 0xc9, 0x88, 0x29, 0x09, 0x89, 0x9d, 0xed, 0xd4, 0x5f, + 0xbd, 0x31, 0x2e, 0x29, 0x43, 0xa5, 0xd0, 0x8c, 0xbc, 0x1d, 0xfa, 0xea, 0x66, 0x59, 0x75, 0x70, + 0x91, 0x46, 0x75, 0xb1, 0xc8, 0x5d, 0x7f, 0x8c, 0xd0, 0x7a, 0xe3, 0xc6, 0x38, 0x62, 0xa3, 0xf3, + 0x21, 0xcb, 0xd4, 0x17, 0x00, 0x56, 0x43, 0x10, 0x7c, 0x43, 0xfb, 0x13, 0x09, 0xfa, 0x66, 0x7d, + 0xf7, 0xbe, 0x32, 0xd0, 0x5b, 0x33, 0x74, 0x6d, 0x9b, 0x6b, 0x67, 0x4a, 0x11, 0x45, 0x94, 0x85, + 0x24, 0x7b, 0x82, 0xe7, 0xec, 0x8a, 0xc4, 0xa8, 0x28, 0x13, 0xac, 0x6b, 0x78, 0xc3, 0xd6, 0xc4, + 0xa4, 0x28, 0xa2, 0x88, 0x2e, 0x41, 0xda, 0xc6, 0xa5, 0xba, 0xa5, 0x39, 0xbb, 0xc5, 0x92, 0xa1, + 0x3b, 0x6a, 0xc9, 0x61, 0x8f, 0xb9, 0xf2, 0x87, 0xdf, 0xb8, 0x31, 0x7e, 0x07, 0xe3, 0x35, 0x0c, + 0x21, 0x2b, 0x43, 0xa2, 0x6a, 0x86, 0xd5, 0x90, 0x1e, 0xca, 0xd8, 0x51, 0xb5, 0xaa, 0x9d, 0x61, + 0xa7, 0x66, 0xa2, 0xe8, 0x1f, 0x4b, 0xd2, 0x9f, 0xe6, 0xba, 0x04, 0x69, 0xc3, 0xc4, 0x56, 0xc0, + 0x2d, 0x95, 0xc2, 0x3d, 0x87, 0x21, 0x64, 0x65, 0x48, 0x54, 0x09, 0x97, 0xd5, 0x21, 0xb3, 0x2d, + 0xc2, 0x46, 0xb3, 0xbe, 0xe1, 0x65, 0xc7, 0x46, 0x1b, 0x66, 0x23, 0xa7, 0xef, 0xe6, 0x1f, 0xf2, + 0xa8, 0x87, 0xf1, 0xe4, 0xaf, 0x7c, 0xfe, 0xd4, 0x28, 0x37, 0x2e, 0x5e, 0xb6, 0xea, 0x09, 0xbc, + 0x4b, 0xa6, 0x9f, 0x83, 0xae, 0x50, 0x48, 0xe2, 0x84, 0x3e, 0xab, 0x6a, 0x55, 0xf1, 0x28, 0x59, + 0xe1, 0x25, 0x94, 0x83, 0x1e, 0xdb, 0x51, 0x9d, 0xba, 0xcd, 0x3f, 0x01, 0x76, 0x6f, 0x84, 0xc6, + 0xe5, 0x0d, 0xbd, 0xbc, 0x4a, 0x11, 0x14, 0x8e, 0x48, 0xec, 0x88, 0x63, 0x6c, 0x63, 0x9d, 0x4b, + 0xb2, 0xa3, 0xd5, 0x4e, 0xcf, 0xf2, 0x18, 0x36, 0x11, 0x4c, 0x19, 0x57, 0x71, 0x85, 0xf9, 0x5a, + 0x5b, 0x2a, 0x09, 0x49, 0xe8, 0x07, 0xc1, 0xf2, 0xf3, 0x1d, 0x2f, 0x49, 0x2e, 0xb0, 0x30, 0x3d, + 0x59, 0x19, 0x72, 0xab, 0x56, 0x69, 0x0d, 0x52, 0x02, 0xf7, 0x14, 0xf9, 0x57, 0xf3, 0x4e, 0x46, + 0x48, 0xc1, 0xa7, 0xe1, 0x22, 0x77, 0xe1, 0xbf, 0xec, 0x78, 0x09, 0xd2, 0x75, 0x7d, 0xc3, 0xd0, + 0xe9, 0x3b, 0x42, 0xee, 0xfb, 0x93, 0xd8, 0x2f, 0xee, 0x57, 0x95, 0x30, 0x84, 0xac, 0x0c, 0xb9, + 0x55, 0x97, 0x59, 0x84, 0x50, 0x86, 0x41, 0x0f, 0x8a, 0x2e, 0xdb, 0x54, 0xe4, 0xb2, 0xbd, 0x93, + 0x2f, 0xdb, 0x03, 0xe1, 0x5e, 0xbc, 0x95, 0x3b, 0xe0, 0x56, 0x12, 0x34, 0xb4, 0x0c, 0xe0, 0x19, + 0x0b, 0x9a, 0xc3, 0xe8, 0x8b, 0x54, 0x03, 0xcf, 0xf0, 0x88, 0x90, 0xd0, 0x23, 0x81, 0x5e, 0x80, + 0x11, 0x96, 0x4c, 0xc6, 0x3b, 0xb8, 0x66, 0x3a, 0x62, 0x2e, 0xe9, 0xe7, 0x60, 0xf2, 0x0b, 0x1d, + 0xcf, 0x65, 0x96, 0x8d, 0xa4, 0x09, 0x49, 0x59, 0x19, 0xa6, 0xb5, 0x05, 0x5a, 0xc9, 0x27, 0xf4, + 0xdd, 0x12, 0x1c, 0x64, 0xb0, 0x54, 0xaf, 0xe8, 0x9d, 0x7d, 0xce, 0x01, 0xfd, 0xf6, 0x65, 0x7e, + 0xb9, 0x63, 0x0e, 0x8e, 0xfa, 0x39, 0x08, 0x53, 0x95, 0x95, 0x51, 0xda, 0xb0, 0x26, 0xea, 0x19, + 0x1f, 0xd3, 0xfd, 0x2f, 0x7d, 0x74, 0xbc, 0x8b, 0xdb, 0x92, 0x2e, 0xf9, 0x2c, 0x4d, 0xf3, 0x73, + 0x1b, 0x80, 0x6d, 0x12, 0x3e, 0xa9, 0xa2, 0x40, 0x93, 0x2f, 0x29, 0xc5, 0xab, 0x60, 0x36, 0xe8, + 0xc5, 0x7f, 0x3f, 0x21, 0xc9, 0xbf, 0x23, 0x41, 0xcf, 0xec, 0x95, 0x15, 0x55, 0xb3, 0xd0, 0x3c, + 0x0c, 0x7b, 0xfa, 0x1c, 0xb4, 0x40, 0x47, 0xde, 0xb8, 0x31, 0x9e, 0x09, 0xab, 0xbc, 0x6b, 0x82, + 0xbc, 0x65, 0x25, 0x6c, 0xd0, 0x7c, 0xab, 0x18, 0x3b, 0x40, 0xaa, 0x01, 0x44, 0x6e, 0x8c, 0xc0, + 0x43, 0xc3, 0x5c, 0x80, 0x5e, 0xc6, 0x2d, 0xfd, 0x08, 0x87, 0x49, 0xfe, 0xe1, 0x67, 0x18, 0xf7, + 0x44, 0x2d, 0x29, 0x8a, 0xe6, 0xa6, 0x5e, 0x09, 0xa6, 0xfc, 0xfe, 0x18, 0xc0, 0xec, 0x95, 0x2b, + 0x6b, 0x96, 0x66, 0x56, 0xb1, 0x73, 0x2b, 0x05, 0xb0, 0x06, 0x07, 0x7c, 0x71, 0x9d, 0x55, 0x0a, + 0x09, 0x61, 0xe2, 0x8d, 0x1b, 0xe3, 0x47, 0xc2, 0x42, 0xf0, 0x81, 0xc9, 0xca, 0x88, 0x17, 0xe1, + 0x59, 0xa5, 0xa6, 0x54, 0xcb, 0xb6, 0xe3, 0x52, 0x8d, 0xb7, 0xa6, 0xea, 0x03, 0xf3, 0x53, 0x9d, + 0xb5, 0x9d, 0xe6, 0x12, 0x7e, 0x06, 0xfa, 0x3c, 0x91, 0xd8, 0xe8, 0x09, 0x48, 0x3a, 0xfc, 0x7f, + 0x2e, 0xe8, 0x7b, 0x23, 0x05, 0x2d, 0xb0, 0xb9, 0xb0, 0x5d, 0x02, 0xf2, 0x2b, 0x44, 0xde, 0x4c, + 0x54, 0x64, 0x1d, 0xff, 0x54, 0x2a, 0x1c, 0xd9, 0x6e, 0xf8, 0x72, 0x8e, 0xef, 0xcb, 0xb9, 0xe4, + 0xd8, 0x64, 0x47, 0x64, 0xc6, 0x24, 0xc3, 0x2e, 0xcc, 0xf3, 0x52, 0x48, 0xdc, 0x1f, 0x88, 0xc1, + 0xc8, 0xba, 0x30, 0x97, 0x3f, 0xf5, 0xb2, 0x79, 0x0a, 0x7a, 0xb1, 0xee, 0x58, 0x1a, 0x15, 0x0e, + 0x51, 0x86, 0x73, 0x11, 0xca, 0xd0, 0x64, 0x68, 0xf4, 0x23, 0x3e, 0xe2, 0x30, 0x81, 0x53, 0x0b, + 0x09, 0xe5, 0x7d, 0x71, 0xc8, 0xb4, 0xc2, 0x44, 0x33, 0x30, 0x54, 0xb2, 0x30, 0xad, 0x28, 0xfa, + 0x33, 0x9a, 0xf9, 0xac, 0xe7, 0x2a, 0x87, 0x00, 0x64, 0x65, 0x50, 0xd4, 0xf0, 0x9d, 0xaf, 0x02, + 0xc4, 0x81, 0x25, 0x5a, 0x49, 0xa0, 0xda, 0xf4, 0x58, 0x65, 0xbe, 0xf5, 0x89, 0x4e, 0x82, 0x04, + 0xd8, 0xde, 0x37, 0xe8, 0xd5, 0xd2, 0xcd, 0xef, 0x39, 0x18, 0xd2, 0x74, 0xcd, 0xd1, 0xd4, 0x6a, + 0x71, 0x43, 0xad, 0xaa, 0x7a, 0x69, 0x3f, 0x61, 0xc0, 0xbc, 0xee, 0x78, 0xdd, 0x86, 0xc8, 0xc9, + 0xca, 0x20, 0xaf, 0xc9, 0xb3, 0x0a, 0x74, 0x19, 0x7a, 0x45, 0x57, 0x89, 0x7d, 0x39, 0x4c, 0x02, + 0xdd, 0xe7, 0xaa, 0xbe, 0x37, 0x0e, 0xc3, 0x0a, 0x2e, 0xff, 0xbf, 0xa9, 0xe8, 0x6c, 0x2a, 0x16, + 0x01, 0x98, 0x35, 0x20, 0x66, 0x78, 0x1f, 0xb3, 0x41, 0xec, 0x49, 0x8a, 0x51, 0x98, 0xb5, 0x1d, + 0xdf, 0x7c, 0xfc, 0xc7, 0x18, 0xf4, 0xfb, 0xe7, 0xe3, 0x6f, 0xe8, 0xde, 0x85, 0x56, 0x3c, 0x83, + 0xc4, 0x4e, 0x17, 0x1e, 0x88, 0x30, 0x48, 0x0d, 0x4a, 0xbc, 0xb7, 0x25, 0x7a, 0x23, 0x06, 0x3d, + 0x2b, 0xaa, 0xa5, 0xd6, 0x6c, 0xf4, 0x78, 0x83, 0xb3, 0x2c, 0xb2, 0xab, 0x0d, 0xdf, 0xaf, 0xe6, + 0xc9, 0x1c, 0x16, 0x2e, 0x7f, 0xb0, 0x89, 0x4b, 0x7c, 0x0f, 0x0c, 0x92, 0x68, 0xde, 0x77, 0x11, + 0x23, 0x46, 0x8f, 0x97, 0x49, 0x44, 0xef, 0x9d, 0x02, 0xa2, 0x71, 0xe8, 0x23, 0x60, 0x9e, 0xc9, + 0x25, 0x30, 0x50, 0x53, 0x77, 0x0a, 0xac, 0x06, 0x9d, 0x02, 0xb4, 0xe5, 0x26, 0x6b, 0x8a, 0x9e, + 0x24, 0x08, 0xdc, 0xb0, 0xd7, 0x22, 0xc0, 0x8f, 0x02, 0x10, 0x2e, 0x8a, 0xec, 0x06, 0x23, 0x8b, + 0x4b, 0x53, 0xa4, 0x66, 0x96, 0xde, 0x62, 0x7c, 0x01, 0x46, 0x6a, 0x9a, 0x5e, 0x0c, 0xe5, 0x0a, + 0x78, 0x8c, 0xb4, 0x6f, 0xbf, 0xba, 0x09, 0x49, 0x59, 0x19, 0xae, 0x69, 0x7a, 0x30, 0xb9, 0xe0, + 0x53, 0xee, 0xd7, 0x24, 0x40, 0x9e, 0xd5, 0x57, 0xb0, 0x6d, 0x92, 0x60, 0x93, 0xc4, 0x11, 0xde, + 0xdc, 0x71, 0xe1, 0x47, 0x3a, 0x23, 0x2e, 0x82, 0x88, 0x23, 0x7c, 0x6b, 0xe6, 0x11, 0xcf, 0x50, + 0xc6, 0xf8, 0x54, 0x36, 0xb9, 0x5c, 0x3a, 0x39, 0x63, 0x68, 0x02, 0xbb, 0xc1, 0x32, 0x76, 0xc9, + 0x7f, 0x26, 0xc1, 0xa1, 0x06, 0xa5, 0x72, 0x79, 0xc6, 0x80, 0x2c, 0x5f, 0x23, 0xff, 0xa2, 0x1d, + 0xe3, 0x7d, 0xbf, 0xaa, 0x3a, 0x6c, 0x35, 0x18, 0xe2, 0x5b, 0x67, 0xf2, 0xd9, 0x25, 0xd5, 0x7f, + 0x21, 0xc1, 0xa8, 0xbf, 0x7b, 0x77, 0x3c, 0xeb, 0xd0, 0xef, 0xef, 0x9d, 0x8f, 0xe4, 0xbe, 0x0e, + 0x46, 0xc2, 0x07, 0x11, 0x20, 0x83, 0x9e, 0xf6, 0x96, 0x31, 0xcb, 0x15, 0x9e, 0xef, 0x54, 0x36, + 0x82, 0xc3, 0xf0, 0x72, 0x4e, 0xd0, 0x49, 0xfa, 0x3f, 0x12, 0x24, 0x56, 0x0c, 0xa3, 0x8a, 0x0c, + 0x18, 0xd6, 0x0d, 0xa7, 0x48, 0x74, 0x1e, 0x97, 0x8b, 0x3c, 0xad, 0xc0, 0xcc, 0xe4, 0x4c, 0x67, + 0x22, 0xfb, 0xde, 0x8d, 0xf1, 0x46, 0x52, 0xca, 0x90, 0x6e, 0x38, 0x79, 0x5a, 0xb3, 0xc6, 0x92, + 0x0e, 0x2f, 0xc0, 0x40, 0xb0, 0x33, 0x66, 0x44, 0x9f, 0xea, 0xb8, 0xb3, 0x20, 0x99, 0x37, 0x6e, + 0x8c, 0x8f, 0xb2, 0xe5, 0x15, 0xa8, 0x96, 0x95, 0xfe, 0x0d, 0x5f, 0xef, 0xec, 0x56, 0xdb, 0x0f, + 0xc8, 0x8c, 0xbe, 0x47, 0x82, 0x11, 0x11, 0x41, 0xd2, 0x00, 0x52, 0xc1, 0x25, 0xc3, 0x2a, 0xa3, + 0x41, 0x88, 0xf1, 0x73, 0xa2, 0x84, 0x12, 0xd3, 0xca, 0x68, 0x14, 0xba, 0x8d, 0x6b, 0x3a, 0xbf, + 0x64, 0x92, 0x52, 0x58, 0x81, 0xda, 0x2b, 0xa3, 0x5c, 0xaf, 0xe2, 0xa2, 0x5a, 0x2a, 0xd1, 0x7b, + 0xce, 0x2c, 0x6d, 0x36, 0xc0, 0x6a, 0x73, 0xac, 0x92, 0x04, 0x9d, 0xae, 0x49, 0xe3, 0x9f, 0x40, + 0xf2, 0x2a, 0x98, 0x6a, 0x9d, 0xfc, 0xa2, 0x04, 0xe0, 0x25, 0x79, 0xd0, 0xfd, 0x70, 0x47, 0x7e, + 0x79, 0x69, 0xb6, 0xb8, 0xba, 0x96, 0x5b, 0x5b, 0x5f, 0x2d, 0xae, 0x2f, 0xad, 0xae, 0x14, 0x66, + 0xe6, 0x2f, 0xcd, 0x17, 0x66, 0xbd, 0xe3, 0x09, 0xdb, 0xc4, 0x25, 0x6d, 0x53, 0xc3, 0x65, 0x74, + 0x0c, 0x46, 0x83, 0xd0, 0xa4, 0x54, 0x98, 0x4d, 0x4b, 0xd9, 0xfe, 0x97, 0xaf, 0x4f, 0x24, 0x99, + 0xcf, 0x88, 0xcb, 0xe8, 0x04, 0x1c, 0x68, 0x84, 0x9b, 0x5f, 0x9a, 0x4b, 0xc7, 0xb2, 0x03, 0x2f, + 0x5f, 0x9f, 0x48, 0xb9, 0xce, 0x25, 0x92, 0x01, 0xf9, 0x21, 0x39, 0xbd, 0x78, 0x16, 0x5e, 0xbe, + 0x3e, 0xd1, 0xc3, 0x66, 0x32, 0x9b, 0x78, 0xe9, 0xe3, 0x63, 0x5d, 0xf9, 0xb7, 0xb5, 0x3c, 0x80, + 0xb8, 0xe8, 0x9b, 0x44, 0xed, 0xb9, 0x6a, 0x9d, 0x98, 0x34, 0x4d, 0x2f, 0x4d, 0x31, 0x15, 0xd6, + 0x9c, 0xdd, 0x53, 0x5c, 0x7d, 0x4f, 0x31, 0x71, 0x4d, 0xed, 0x88, 0xe3, 0x85, 0xd0, 0x41, 0xc4, + 0x57, 0x8e, 0x43, 0x26, 0x7c, 0x10, 0xe1, 0xec, 0xb4, 0x77, 0x06, 0xb1, 0xc7, 0x69, 0x43, 0xe4, + 0x69, 0x42, 0x8b, 0xf3, 0x8b, 0xfd, 0x9f, 0x31, 0xec, 0x7d, 0x9c, 0x22, 0xff, 0xbb, 0x04, 0xa0, + 0x45, 0xbb, 0x32, 0x43, 0x1c, 0x41, 0xdf, 0x75, 0xb9, 0x50, 0xaa, 0x4c, 0xba, 0x15, 0xa9, 0xb2, + 0xb5, 0x40, 0xf2, 0x29, 0xb6, 0xaf, 0xac, 0x77, 0xd3, 0x0c, 0x14, 0xd9, 0xd6, 0x6c, 0x5c, 0xdd, + 0x2c, 0xfa, 0xac, 0x61, 0xbc, 0xe3, 0x9d, 0x92, 0xb9, 0x93, 0xbe, 0x9d, 0x32, 0x44, 0x92, 0xed, + 0x94, 0xab, 0xb8, 0xba, 0x19, 0x15, 0x1b, 0x26, 0x6e, 0x5d, 0x6c, 0xd8, 0xbd, 0xdf, 0xb8, 0x99, + 0x67, 0x9b, 0x7b, 0xf6, 0xc8, 0x36, 0x67, 0x5a, 0xa6, 0x94, 0x39, 0x36, 0x3a, 0x23, 0x1e, 0x4b, + 0xf5, 0xb6, 0xb7, 0x27, 0xf3, 0xd7, 0x54, 0xc9, 0x97, 0xc4, 0x8e, 0x7c, 0x04, 0xb2, 0x8d, 0xca, + 0x25, 0xf6, 0x07, 0xf9, 0xd5, 0x38, 0xa4, 0x17, 0xed, 0x4a, 0xa1, 0xac, 0x39, 0xb7, 0x57, 0xf3, + 0x2e, 0xb6, 0x0e, 0xbb, 0xd1, 0x1b, 0x37, 0xc6, 0x07, 0x99, 0x68, 0xf7, 0x10, 0x68, 0x0d, 0x86, + 0xc2, 0xae, 0x18, 0x53, 0xb0, 0xd9, 0xfd, 0x9c, 0x1e, 0x35, 0xb8, 0x60, 0x83, 0xc1, 0x13, 0x1c, + 0xb4, 0xd3, 0x5c, 0xa7, 0x99, 0x5e, 0x5d, 0xbe, 0x8d, 0xfa, 0xec, 0x9b, 0xba, 0x2c, 0x64, 0xc2, + 0x73, 0xe3, 0x4e, 0xdc, 0x5f, 0x4a, 0xd0, 0xb7, 0x68, 0x8b, 0x74, 0x00, 0xfe, 0x29, 0xcd, 0x90, + 0x9c, 0x73, 0x5f, 0x02, 0xc5, 0xdb, 0x53, 0x5f, 0xf1, 0x3a, 0xc8, 0x13, 0xc2, 0x01, 0x18, 0xf1, + 0x8d, 0xd3, 0x1d, 0xff, 0x9f, 0xc6, 0xa8, 0xd1, 0xcc, 0xe3, 0x8a, 0xa6, 0xbb, 0xee, 0x0f, 0xfe, + 0x9b, 0x1a, 0xf8, 0x79, 0x72, 0x4e, 0xec, 0x57, 0xce, 0xdb, 0xd4, 0x4e, 0x84, 0xe4, 0xe9, 0x7a, + 0xba, 0x8b, 0x8d, 0x69, 0x09, 0xa9, 0x83, 0x9b, 0x4c, 0xa1, 0xe4, 0x83, 0xfc, 0x5d, 0x09, 0x06, + 0x16, 0xed, 0xca, 0xba, 0x5e, 0xfe, 0x6b, 0xaf, 0xbf, 0x9b, 0x70, 0x20, 0x30, 0xd2, 0xdb, 0x25, + 0xd2, 0x8f, 0xc6, 0xe0, 0x08, 0x31, 0xf4, 0x24, 0x6e, 0xa9, 0xfe, 0xec, 0xe4, 0x50, 0xf7, 0x2b, + 0x61, 0x74, 0xbc, 0x31, 0xdb, 0xc6, 0xae, 0x50, 0x85, 0x32, 0x6a, 0xbe, 0xa9, 0x38, 0x06, 0x77, + 0xef, 0x25, 0x21, 0xd7, 0xb6, 0xfc, 0x51, 0x0c, 0x86, 0x17, 0xed, 0x4a, 0x20, 0x40, 0xb0, 0xff, + 0xba, 0xc9, 0x6f, 0x0d, 0x0e, 0x84, 0xce, 0xd6, 0x8a, 0x2c, 0xd4, 0x49, 0x84, 0x0d, 0x51, 0x53, + 0x30, 0x59, 0x19, 0x71, 0x02, 0x47, 0x70, 0xcb, 0xa4, 0xd6, 0x27, 0xec, 0x35, 0x38, 0xd4, 0x20, + 0x43, 0x57, 0xf7, 0x3d, 0xae, 0xa5, 0x8e, 0xb8, 0x96, 0x3f, 0x25, 0xd1, 0x3d, 0x91, 0x58, 0x28, + 0x5c, 0x63, 0x61, 0xdd, 0xa6, 0x7b, 0xb8, 0x7c, 0x0b, 0x67, 0xe8, 0x5c, 0xe0, 0x09, 0xeb, 0xbe, + 0x16, 0xfe, 0xdb, 0x61, 0xa2, 0x15, 0xa7, 0x37, 0x2f, 0x87, 0x0f, 0x4a, 0x30, 0x46, 0xc4, 0x6b, + 0xa9, 0xba, 0xbd, 0x89, 0xad, 0x66, 0xb1, 0xec, 0x39, 0xc8, 0x88, 0x19, 0xe2, 0x13, 0x67, 0xd1, + 0x86, 0xa2, 0x1b, 0xe1, 0xba, 0x0a, 0xe0, 0x43, 0x63, 0x4f, 0x14, 0x6c, 0x7a, 0xa5, 0x89, 0x47, + 0xbd, 0xbc, 0x44, 0xbf, 0x6d, 0x8c, 0xaf, 0x71, 0x2d, 0xe1, 0x1f, 0x86, 0xd0, 0xf1, 0xb5, 0xf0, + 0xc4, 0x9f, 0x80, 0x63, 0x7b, 0x73, 0xe6, 0xae, 0xb3, 0x2f, 0x48, 0x74, 0x6f, 0x67, 0xe7, 0xc9, + 0x3f, 0xed, 0x96, 0xca, 0x37, 0xc2, 0xa3, 0x70, 0xb8, 0x09, 0xdb, 0x62, 0x58, 0xa7, 0x3f, 0x9d, + 0x82, 0xf8, 0xa2, 0x5d, 0x41, 0x3f, 0x0f, 0x43, 0xe1, 0x98, 0xee, 0xc1, 0x08, 0x27, 0xba, 0xd1, + 0x53, 0xcf, 0x3e, 0xd2, 0x31, 0x8a, 0xab, 0x5d, 0xbb, 0x30, 0x10, 0x74, 0xec, 0xa7, 0xa2, 0x69, + 0x05, 0x10, 0xb2, 0xe7, 0x3a, 0x44, 0x70, 0xbb, 0x7e, 0x16, 0x92, 0xae, 0x6b, 0x7a, 0x32, 0x9a, + 0x88, 0x80, 0xcd, 0x9e, 0x6e, 0x1f, 0xd6, 0xed, 0xeb, 0xe7, 0x61, 0x28, 0xec, 0x06, 0xb6, 0x21, + 0xe7, 0x10, 0x4a, 0x3b, 0x72, 0x6e, 0xe5, 0x1c, 0x99, 0x00, 0x3e, 0x4f, 0xe6, 0xfe, 0x68, 0x42, + 0x1e, 0x74, 0xf6, 0xe1, 0x4e, 0xa0, 0xdd, 0x1e, 0xaf, 0x4b, 0x70, 0xa8, 0xf5, 0x4e, 0x7f, 0xa1, + 0x0d, 0x95, 0x69, 0x85, 0x9c, 0x9d, 0xb9, 0x09, 0x64, 0x97, 0xbf, 0x17, 0x60, 0x30, 0xb4, 0x7b, + 0x3e, 0x10, 0x4d, 0x36, 0x88, 0x91, 0x3d, 0xdf, 0x29, 0x86, 0xdb, 0xfb, 0x4b, 0x12, 0x3b, 0x0e, + 0x12, 0x76, 0x17, 0xb5, 0xa1, 0xc6, 0x4d, 0xed, 0x74, 0xf6, 0xe2, 0x3e, 0x11, 0x5d, 0x56, 0x3e, + 0x2e, 0xc1, 0xe1, 0xbd, 0x8c, 0xf4, 0xa3, 0x6d, 0x0c, 0xb2, 0x35, 0x7a, 0xb6, 0x70, 0x53, 0xe8, + 0x6e, 0x96, 0xf8, 0x4d, 0x48, 0xe6, 0x7d, 0x33, 0x06, 0x27, 0xfd, 0x69, 0xb2, 0xe7, 0xea, 0xd8, + 0xda, 0x75, 0x13, 0x62, 0xa6, 0x5a, 0xd1, 0x74, 0xff, 0x07, 0x15, 0x0e, 0xf9, 0xf7, 0x41, 0x0a, + 0x2b, 0xc6, 0x24, 0xbf, 0x24, 0x41, 0xdf, 0x8a, 0x5a, 0xc1, 0x0a, 0x7e, 0xae, 0x8e, 0x6d, 0xa7, + 0xc9, 0x8b, 0xfe, 0x83, 0xd0, 0x63, 0x6c, 0x6e, 0x8a, 0xf7, 0x03, 0x09, 0x85, 0x97, 0xd0, 0x28, + 0x74, 0x57, 0xb5, 0x9a, 0xc6, 0x5c, 0xa5, 0x84, 0xc2, 0x0a, 0x68, 0x1c, 0xfa, 0x68, 0xbe, 0xb6, + 0xc8, 0xde, 0x42, 0x26, 0xc4, 0xd7, 0x36, 0xeb, 0xba, 0xb3, 0x46, 0x1f, 0x44, 0x66, 0xa0, 0xd7, + 0xc2, 0x57, 0xb1, 0x65, 0xb3, 0x5f, 0x1c, 0x48, 0x2a, 0xa2, 0x28, 0x5f, 0x84, 0x7e, 0xc6, 0x09, + 0x9f, 0xed, 0x43, 0x90, 0xa4, 0xaf, 0xda, 0x3c, 0x7e, 0x7a, 0x49, 0xf9, 0x09, 0xf6, 0x5d, 0x00, + 0x46, 0x9f, 0xb1, 0xc4, 0x0a, 0xf9, 0x7c, 0x4b, 0xc1, 0x9f, 0x88, 0x4e, 0x2f, 0x30, 0x19, 0xba, + 0x12, 0xfe, 0xe3, 0x6e, 0x38, 0xc0, 0x53, 0x9b, 0xaa, 0xa9, 0x4d, 0x6d, 0x39, 0x8e, 0xf8, 0x76, + 0x0d, 0xf0, 0x78, 0x42, 0x35, 0x35, 0x79, 0x17, 0x12, 0x97, 0x1d, 0xc7, 0x44, 0x27, 0xa1, 0xdb, + 0xaa, 0x57, 0xb1, 0xb8, 0xc6, 0xe2, 0xa6, 0xa7, 0x54, 0x53, 0x9b, 0x24, 0x00, 0x4a, 0xbd, 0x8a, + 0x15, 0x06, 0x82, 0x0a, 0x30, 0xbe, 0x59, 0xaf, 0x56, 0x77, 0x8b, 0x65, 0x4c, 0x7f, 0x1a, 0xd9, + 0xfd, 0x15, 0x42, 0xbc, 0x63, 0xaa, 0xba, 0x9b, 0x4a, 0x4c, 0x2a, 0x47, 0x28, 0xd8, 0x2c, 0x85, + 0x12, 0xbf, 0x40, 0x58, 0x10, 0x30, 0xf2, 0x9f, 0xc7, 0x20, 0x29, 0x48, 0xd3, 0x87, 0xfa, 0xb8, + 0x8a, 0x4b, 0x8e, 0x21, 0xae, 0xaa, 0xba, 0x65, 0x84, 0x20, 0x5e, 0xe1, 0x93, 0x97, 0xba, 0xdc, + 0xa5, 0x90, 0x02, 0xa9, 0x73, 0x3f, 0x9f, 0x40, 0xea, 0xcc, 0x3a, 0x99, 0xcf, 0x84, 0x69, 0x88, + 0x93, 0xe4, 0xcb, 0x5d, 0x0a, 0x2d, 0xa1, 0x0c, 0xf4, 0x10, 0x7b, 0xe9, 0xb0, 0xd9, 0x22, 0xf5, + 0xbc, 0x8c, 0x0e, 0x42, 0xb7, 0xa9, 0x3a, 0x25, 0xf6, 0xb2, 0x91, 0x34, 0xb0, 0x22, 0xf1, 0xc2, + 0xd8, 0x77, 0xb9, 0xc2, 0xbf, 0x3b, 0x4a, 0x84, 0xc1, 0x3e, 0x80, 0x4e, 0xf8, 0x5e, 0x51, 0x1d, + 0x07, 0x5b, 0x3a, 0x21, 0xc8, 0xc0, 0x11, 0x82, 0xc4, 0x86, 0x51, 0xde, 0xe5, 0xbf, 0x85, 0x4a, + 0xff, 0xe7, 0xbf, 0xd2, 0x48, 0xf5, 0xa1, 0x48, 0x1b, 0xd9, 0x4f, 0x40, 0xf7, 0x8b, 0xca, 0x3c, + 0x01, 0x2a, 0xc0, 0x88, 0x5a, 0x2e, 0x6b, 0x44, 0xe1, 0xd5, 0x6a, 0x71, 0x43, 0xa3, 0x76, 0xd4, + 0xa6, 0x3f, 0xf0, 0xdd, 0x6a, 0x2e, 0x90, 0x87, 0x90, 0xe7, 0xf0, 0xf9, 0x14, 0xf4, 0x9a, 0x8c, + 0x29, 0xf9, 0x02, 0x0c, 0x37, 0x70, 0x4a, 0xf8, 0xdb, 0xd6, 0xf4, 0xb2, 0xf8, 0xa6, 0x04, 0xf9, + 0x9f, 0xd4, 0xd1, 0x1f, 0x31, 0x60, 0xbe, 0x1d, 0xfd, 0x3f, 0xff, 0x8b, 0xad, 0xbf, 0x38, 0x32, + 0xe8, 0xfb, 0xe2, 0x88, 0x6a, 0x6a, 0xf9, 0x14, 0xa5, 0xcf, 0x3f, 0x34, 0x92, 0xe3, 0x0d, 0xec, + 0x23, 0x23, 0x93, 0x86, 0x55, 0x99, 0xaa, 0x60, 0x5d, 0xa4, 0xce, 0x49, 0x93, 0x6a, 0x6a, 0x36, + 0x55, 0x47, 0xef, 0x47, 0x15, 0xec, 0x0b, 0xbe, 0xff, 0xe9, 0xf7, 0x47, 0x12, 0x73, 0xb9, 0x95, + 0x79, 0x57, 0x8f, 0xff, 0x30, 0x06, 0x47, 0x7c, 0x7a, 0xec, 0x03, 0x6e, 0x54, 0xe7, 0x6c, 0x73, + 0x8d, 0x6f, 0xe3, 0x93, 0x44, 0x4f, 0x40, 0x82, 0xc0, 0xa3, 0x88, 0xdf, 0x50, 0xcc, 0x7c, 0xe6, + 0x2b, 0xff, 0x54, 0x0e, 0x26, 0x70, 0x03, 0xb3, 0x42, 0x89, 0xe4, 0xdf, 0xd3, 0xbe, 0xfc, 0xd2, + 0xde, 0xef, 0x49, 0xd8, 0xb7, 0x4e, 0x8c, 0x61, 0x19, 0xfe, 0xcf, 0x39, 0x38, 0x1c, 0x3e, 0x74, + 0x60, 0x56, 0xb4, 0xad, 0xd3, 0x93, 0x0e, 0x2c, 0x75, 0xab, 0xcf, 0x30, 0xec, 0x35, 0x83, 0x11, + 0x07, 0x22, 0x51, 0xe7, 0x29, 0xf2, 0x0e, 0x1c, 0x7c, 0x92, 0x30, 0xe5, 0xdd, 0x0d, 0x10, 0x7b, + 0xc1, 0x41, 0xf7, 0x7e, 0xb5, 0xc4, 0x43, 0x17, 0x71, 0x69, 0x1a, 0x3c, 0xc6, 0x79, 0x48, 0x77, + 0x6c, 0xb2, 0xe5, 0x1e, 0x33, 0xe9, 0xdb, 0x5f, 0x14, 0x1f, 0xa6, 0xfc, 0x59, 0x09, 0xee, 0x68, + 0xe8, 0x9a, 0x1b, 0xff, 0xa5, 0x26, 0x9f, 0x92, 0xe8, 0xf4, 0x91, 0x87, 0xff, 0xeb, 0x12, 0x73, + 0x4d, 0x78, 0x3e, 0x1e, 0xc9, 0x33, 0x63, 0x26, 0xc0, 0xf4, 0x63, 0x70, 0x20, 0xc8, 0xb3, 0x90, + 0xd6, 0x3d, 0x30, 0x18, 0x8c, 0x7c, 0xb8, 0xd4, 0x06, 0x02, 0xb1, 0x8f, 0xbc, 0x19, 0x16, 0xb7, + 0x3b, 0xe4, 0x05, 0xff, 0x09, 0x27, 0x8b, 0x60, 0x3b, 0x1d, 0xb1, 0x47, 0x40, 0x7e, 0xbf, 0x04, + 0x13, 0xc1, 0x8e, 0x3c, 0xcf, 0xd2, 0xee, 0x8c, 0xe7, 0x5b, 0x36, 0xe1, 0x3f, 0x90, 0xe0, 0xce, + 0x3d, 0x78, 0xe2, 0x72, 0xf8, 0x05, 0x09, 0x46, 0x7d, 0xd7, 0x1a, 0x84, 0xa9, 0x17, 0x5a, 0xf0, + 0x60, 0xdb, 0xd7, 0x32, 0x5c, 0x8f, 0xec, 0x30, 0x11, 0xce, 0x6b, 0xdf, 0x1c, 0x1f, 0x69, 0x6c, + 0xb3, 0x95, 0x91, 0xc6, 0xab, 0x08, 0xb7, 0x50, 0x5d, 0x5e, 0x95, 0xe0, 0xde, 0xe0, 0x90, 0x9b, + 0x78, 0xfa, 0x3f, 0xa9, 0xf9, 0xf8, 0x96, 0x04, 0x27, 0xdb, 0x61, 0x8e, 0x4f, 0x8c, 0x06, 0x23, + 0xde, 0x2d, 0xa5, 0xf0, 0xb4, 0x9c, 0xee, 0xfc, 0xb6, 0x26, 0x57, 0x5a, 0xe4, 0x12, 0xbd, 0x0d, + 0xf2, 0x37, 0xf9, 0x72, 0xf3, 0xcf, 0xbc, 0x2b, 0xeb, 0x60, 0xd2, 0x43, 0xc8, 0x3a, 0x90, 0xf6, + 0x68, 0x32, 0x25, 0xb1, 0x26, 0x53, 0xe2, 0xcb, 0x67, 0xbc, 0x93, 0x1b, 0xb5, 0x26, 0x81, 0xdc, + 0x06, 0x8c, 0x34, 0x51, 0x6c, 0xbe, 0xd6, 0x3b, 0xd7, 0x6b, 0x05, 0x35, 0xaa, 0xae, 0xbc, 0x0b, + 0xe3, 0xb4, 0xfb, 0xa6, 0x01, 0xe5, 0xed, 0x1d, 0xb9, 0xc3, 0x2d, 0xce, 0x5e, 0xb1, 0xec, 0x0a, + 0xf4, 0xb0, 0xe9, 0xe6, 0xa3, 0xde, 0xbf, 0xda, 0x70, 0x3a, 0xf2, 0x87, 0x84, 0xa1, 0x9b, 0x15, + 0xdc, 0x37, 0x5f, 0x58, 0xed, 0x0c, 0xf9, 0x16, 0x2d, 0x2c, 0x9f, 0x4c, 0xbe, 0x21, 0x4c, 0x5e, + 0x73, 0xee, 0xdc, 0x04, 0xcf, 0x2d, 0xb6, 0x78, 0x4c, 0x44, 0xb7, 0xd7, 0xb4, 0x7d, 0x42, 0x98, + 0x36, 0x77, 0x68, 0x11, 0xa6, 0xed, 0x27, 0x33, 0x03, 0xae, 0x91, 0x8b, 0x60, 0xf3, 0x67, 0xd8, + 0xc8, 0xfd, 0x40, 0x82, 0x43, 0x74, 0x88, 0xfe, 0xab, 0x6b, 0x9d, 0x4a, 0xfe, 0x7e, 0x40, 0xb6, + 0x55, 0x2a, 0x36, 0x5d, 0xf2, 0x69, 0xdb, 0x2a, 0x5d, 0x09, 0x6c, 0x41, 0xf7, 0x03, 0x2a, 0xdb, + 0x4e, 0x18, 0x9a, 0xe5, 0xb1, 0xd3, 0x65, 0xdb, 0xb9, 0xb2, 0xc7, 0x86, 0x95, 0xb8, 0x05, 0xb3, + 0xfa, 0x75, 0x09, 0xb2, 0xcd, 0x86, 0xec, 0x26, 0x11, 0x0f, 0x06, 0xee, 0x46, 0x86, 0x27, 0xf2, + 0xa1, 0x0e, 0xee, 0x00, 0x86, 0x16, 0xd5, 0x01, 0x0b, 0xdf, 0x6e, 0x8f, 0x61, 0x3c, 0xa8, 0xaf, + 0x8d, 0x9e, 0xf9, 0x4f, 0x6c, 0x31, 0xfd, 0x41, 0x83, 0xb1, 0xfd, 0x59, 0xf2, 0xdd, 0x77, 0x60, + 0xac, 0x05, 0xf3, 0xb7, 0x7b, 0x6b, 0x34, 0x5a, 0xce, 0xe9, 0x6d, 0x72, 0xff, 0x1f, 0xe6, 0xcb, + 0x23, 0xf8, 0xde, 0xde, 0x17, 0xd9, 0x35, 0xfb, 0x60, 0x8f, 0xfc, 0xff, 0xc3, 0xe1, 0xa6, 0x58, + 0x9c, 0xc5, 0x1c, 0x24, 0xb6, 0x34, 0x5b, 0x1c, 0xaf, 0x9d, 0x8a, 0xe0, 0x2e, 0x44, 0x84, 0xa2, + 0xca, 0x08, 0xd2, 0xb4, 0x87, 0x15, 0xc3, 0xa8, 0x72, 0x6e, 0x64, 0x05, 0x86, 0x7d, 0x75, 0xbc, + 0xaf, 0x47, 0x21, 0x61, 0x1a, 0xfc, 0x9b, 0x94, 0x7d, 0xa7, 0xef, 0x8a, 0xe8, 0x8b, 0xa0, 0x72, + 0x21, 0x50, 0x34, 0x79, 0x14, 0x10, 0xa3, 0x49, 0x2f, 0xd8, 0x8b, 0x9e, 0x9e, 0x81, 0x91, 0x40, + 0x2d, 0xef, 0x6b, 0x06, 0x7a, 0x4c, 0x5a, 0xc3, 0x7b, 0x8b, 0x7a, 0xef, 0xc7, 0xd0, 0xdd, 0x6f, + 0xfe, 0xd1, 0x92, 0x7c, 0x06, 0xee, 0xa2, 0xb4, 0x9b, 0xa4, 0x86, 0xf3, 0xbb, 0xf3, 0x65, 0x21, + 0xfa, 0xd0, 0xa5, 0x58, 0x79, 0x07, 0xee, 0xde, 0x1b, 0xcd, 0x73, 0x9c, 0xd8, 0x89, 0x63, 0x9b, + 0x8e, 0x53, 0x33, 0x7a, 0x9c, 0x61, 0x46, 0x47, 0x7e, 0x0c, 0x8e, 0xb5, 0xee, 0x99, 0xde, 0xda, + 0x17, 0x3c, 0x37, 0xfd, 0x30, 0xb1, 0xfc, 0x0e, 0x38, 0x1e, 0x89, 0x7f, 0xdb, 0x98, 0x7f, 0x14, + 0xee, 0x69, 0xd5, 0xb9, 0xbd, 0x7c, 0x4d, 0xc7, 0x65, 0x1f, 0xef, 0xec, 0x8c, 0x55, 0xf2, 0x5d, + 0x3a, 0x96, 0x5f, 0x68, 0x3d, 0x76, 0x81, 0xce, 0x59, 0x57, 0xa0, 0x97, 0x75, 0xd9, 0xae, 0x0f, + 0xd0, 0x9a, 0x77, 0x41, 0x48, 0xbe, 0x87, 0xab, 0x4a, 0xae, 0x5a, 0x6d, 0xc6, 0x80, 0xd0, 0xd6, + 0xe7, 0xb9, 0x6a, 0xb4, 0x04, 0xbb, 0x8d, 0x2c, 0x1e, 0xe7, 0xf2, 0x5d, 0x50, 0x6d, 0x67, 0xad, + 0xd9, 0xc1, 0xb6, 0x60, 0xf2, 0x3c, 0x97, 0xe4, 0x1e, 0x80, 0x9c, 0xcd, 0xb0, 0xe6, 0x1f, 0x77, + 0xa7, 0xd0, 0xf7, 0x02, 0x99, 0xa2, 0x96, 0x73, 0xb6, 0x8d, 0x1d, 0x57, 0x0e, 0x45, 0x77, 0xb2, + 0x5a, 0x02, 0xf2, 0x2e, 0xdc, 0xfb, 0x9d, 0x52, 0x27, 0xf7, 0x3b, 0x4f, 0x7f, 0x6e, 0x1c, 0xba, + 0x69, 0x0f, 0xe8, 0x93, 0x12, 0x80, 0xef, 0x91, 0xcc, 0x99, 0x08, 0x41, 0x36, 0x4f, 0x9c, 0x65, + 0xcf, 0x76, 0x8a, 0xc6, 0x63, 0xb7, 0x93, 0xbf, 0xf8, 0xaf, 0xbe, 0xf3, 0x6b, 0xb1, 0xbb, 0x91, + 0x2c, 0x0e, 0x29, 0xc2, 0x99, 0x3d, 0xdf, 0xa6, 0xf8, 0x85, 0xc0, 0x77, 0x4c, 0x1f, 0xee, 0xa8, + 0x47, 0xc1, 0xe7, 0x99, 0x0e, 0xb1, 0x38, 0x9b, 0x17, 0x28, 0x9b, 0x67, 0xd0, 0x43, 0xd1, 0x6c, + 0x4e, 0xbd, 0x23, 0xb8, 0x4f, 0xbe, 0x13, 0xbd, 0x2e, 0xc1, 0x68, 0xb3, 0xf4, 0x0f, 0xba, 0xd8, + 0x11, 0x33, 0x8d, 0x11, 0x46, 0xf6, 0xad, 0xfb, 0x27, 0xc0, 0x07, 0x36, 0x47, 0x07, 0x96, 0x43, + 0x17, 0xf7, 0x31, 0xb0, 0x29, 0x9f, 0x1b, 0x8a, 0x7e, 0x39, 0x06, 0x47, 0xf7, 0xcc, 0xa9, 0xa0, + 0xcb, 0x1d, 0x31, 0xbb, 0x47, 0x60, 0x95, 0x9d, 0xbf, 0x05, 0x94, 0xf8, 0xf8, 0x9f, 0xa4, 0xe3, + 0x7f, 0x02, 0xcd, 0xef, 0x67, 0xfc, 0x5e, 0xd4, 0xe4, 0x97, 0xc4, 0xbf, 0x96, 0x02, 0xcf, 0xb2, + 0xdb, 0xd2, 0xb8, 0x86, 0x8c, 0x45, 0x7b, 0x0b, 0xaa, 0xc9, 0xdd, 0xb3, 0xa7, 0xe9, 0x80, 0x14, + 0xb4, 0x72, 0x93, 0x13, 0x3a, 0xf5, 0x8e, 0xa0, 0x57, 0xf8, 0x4e, 0xf4, 0xee, 0x16, 0x6f, 0xab, + 0x1f, 0x6b, 0x87, 0xd3, 0xd6, 0xb9, 0x99, 0xec, 0xc5, 0x7d, 0xe3, 0xf3, 0x21, 0xd7, 0xe8, 0x90, + 0x2b, 0x08, 0xdf, 0xea, 0x21, 0x37, 0x9d, 0x60, 0xf4, 0x75, 0x09, 0x46, 0x9b, 0xa5, 0x36, 0xda, + 0x5b, 0xce, 0x7b, 0xa4, 0x6c, 0xda, 0x5b, 0xce, 0x7b, 0x65, 0x55, 0xe4, 0xb7, 0x50, 0x51, 0x9c, + 0x45, 0x0f, 0xb7, 0x12, 0xc5, 0x9e, 0x33, 0x4c, 0xd6, 0xf0, 0x9e, 0x29, 0x83, 0xf6, 0xd6, 0x70, + 0x3b, 0xc9, 0x91, 0xf6, 0xd6, 0x70, 0x5b, 0xf9, 0x8b, 0xe8, 0x35, 0xec, 0x8e, 0xb3, 0xcd, 0x29, + 0xb6, 0xd1, 0xbf, 0x94, 0x60, 0x20, 0x10, 0x66, 0xa3, 0xf3, 0xed, 0xf0, 0xdb, 0x2c, 0x19, 0x11, + 0x79, 0x31, 0xa8, 0x75, 0x4c, 0x2f, 0xcf, 0xd3, 0x91, 0xcd, 0xa0, 0xdc, 0x7e, 0x46, 0x66, 0x05, + 0xf8, 0xbf, 0x21, 0xc1, 0x48, 0x93, 0x08, 0xb6, 0xbd, 0xd5, 0xdb, 0x3a, 0x2e, 0xcf, 0x5e, 0xdc, + 0x37, 0x3e, 0x1f, 0xe3, 0x25, 0x3a, 0xc6, 0xb7, 0xa2, 0xc7, 0xf6, 0x33, 0x46, 0x9f, 0x77, 0xf0, + 0x7d, 0xef, 0x99, 0xab, 0xaf, 0x9f, 0xc8, 0x0b, 0x32, 0x7b, 0x47, 0xc7, 0xd9, 0xc7, 0xf6, 0x8b, + 0xce, 0x47, 0xf7, 0x14, 0x1d, 0xdd, 0x93, 0x68, 0xf9, 0xe6, 0x46, 0xd7, 0xe8, 0x54, 0xfc, 0x61, + 0xe3, 0x97, 0xe5, 0xda, 0x52, 0xb4, 0xa6, 0xd1, 0x71, 0x76, 0x7a, 0x3f, 0xa8, 0x7c, 0x88, 0xe7, + 0xe9, 0x10, 0x4f, 0xa3, 0x07, 0x5a, 0x0d, 0xd1, 0xf7, 0xa6, 0x5a, 0xd3, 0x37, 0x8d, 0xa9, 0x77, + 0xb0, 0xd0, 0xfb, 0x9d, 0xe8, 0x7d, 0xe2, 0x1d, 0xe9, 0x54, 0x3b, 0xdd, 0xfb, 0xe2, 0xe7, 0xec, + 0x03, 0xed, 0x23, 0x70, 0x2e, 0xef, 0xa6, 0x5c, 0x8e, 0xa1, 0x23, 0xad, 0xb8, 0x24, 0x31, 0x34, + 0xfa, 0x4d, 0xc9, 0x7d, 0xa0, 0xfe, 0x60, 0x5b, 0x5d, 0xf8, 0x63, 0xed, 0xc8, 0xcb, 0x87, 0x4d, + 0x02, 0x71, 0xf9, 0x18, 0xe5, 0x6b, 0x02, 0x8d, 0xb5, 0xe4, 0x8b, 0xb1, 0xf3, 0x09, 0x09, 0xee, + 0x68, 0x11, 0x30, 0xa3, 0x7c, 0x3b, 0xfd, 0xee, 0x1d, 0xa4, 0x47, 0x5e, 0xdb, 0x6b, 0x27, 0x62, + 0x97, 0xbb, 0xd0, 0xef, 0x4a, 0x90, 0x6d, 0x1d, 0x1d, 0xa3, 0xc2, 0xbe, 0x7b, 0xf1, 0x47, 0xe7, + 0xd9, 0x4b, 0x37, 0x4b, 0xc6, 0xe5, 0xf7, 0x35, 0x09, 0x0e, 0xb5, 0x8c, 0x88, 0xd1, 0xec, 0x3e, + 0xfb, 0x09, 0xc4, 0xe3, 0xd9, 0xc2, 0x4d, 0x52, 0x71, 0x99, 0x25, 0x3a, 0xd0, 0x22, 0x32, 0x6e, + 0x4f, 0x07, 0xf6, 0x8e, 0xbe, 0xdb, 0xd3, 0x81, 0x88, 0xd0, 0x9c, 0xcb, 0xb4, 0x65, 0x6c, 0xdc, + 0x9e, 0x4c, 0xa3, 0x62, 0xf0, 0xf6, 0x64, 0x1a, 0x19, 0xa0, 0xbb, 0x0a, 0xd0, 0x22, 0xca, 0x6e, + 0x57, 0x01, 0xf6, 0x8e, 0xe6, 0xdb, 0x55, 0x80, 0x88, 0x50, 0x5f, 0x7e, 0x53, 0x1e, 0x4d, 0xff, + 0xa8, 0xa7, 0xf1, 0xe6, 0x8f, 0x5a, 0x77, 0xb6, 0x9e, 0xbf, 0xa9, 0x6f, 0xb7, 0xee, 0xfb, 0xed, + 0xb3, 0xfc, 0x17, 0x71, 0x40, 0xab, 0x8e, 0xba, 0x8d, 0x73, 0x75, 0x67, 0xcb, 0xb0, 0xb4, 0xe7, + 0x99, 0x13, 0x8e, 0x01, 0x6a, 0xea, 0x8e, 0xff, 0x93, 0x03, 0x7b, 0xe6, 0x3e, 0xee, 0x7b, 0xed, + 0x9b, 0xe3, 0xc7, 0xdb, 0x78, 0x70, 0x49, 0x80, 0x95, 0x54, 0x4d, 0xdd, 0xe1, 0x17, 0x7f, 0x7f, + 0x0e, 0x40, 0xad, 0x56, 0x8d, 0x6b, 0xc5, 0xaa, 0x66, 0x8b, 0xa7, 0x1c, 0x6f, 0x89, 0x98, 0xcd, + 0x46, 0x6e, 0x27, 0x7d, 0x3f, 0x45, 0xd0, 0xa5, 0xa4, 0x28, 0xc5, 0x05, 0xcd, 0x76, 0xd0, 0xdb, + 0x21, 0x55, 0xc6, 0xfa, 0x2e, 0xa3, 0x1e, 0xbf, 0x25, 0xd4, 0x93, 0x84, 0x20, 0x25, 0x5e, 0x04, + 0xa4, 0xfa, 0xe1, 0xe8, 0x0f, 0xe7, 0xf1, 0xef, 0x46, 0x46, 0xed, 0x9f, 0x81, 0x0e, 0xe8, 0xc7, + 0xd1, 0x87, 0xd5, 0x70, 0x55, 0xf6, 0x58, 0x20, 0x71, 0x14, 0xf8, 0x5d, 0x99, 0xf8, 0x89, 0x94, + 0xfb, 0xbb, 0x32, 0xd3, 0xc3, 0x7f, 0xf6, 0xf9, 0x53, 0x03, 0x01, 0x8a, 0xf9, 0x7e, 0xff, 0x79, + 0xc9, 0xc9, 0x8f, 0x48, 0x30, 0xdc, 0xd0, 0x23, 0x92, 0x61, 0x2c, 0xb7, 0xbe, 0x76, 0x79, 0x59, + 0x99, 0x7f, 0x26, 0xb7, 0x36, 0xbf, 0xbc, 0x24, 0xbe, 0xb6, 0xec, 0xfb, 0xa4, 0x01, 0x1a, 0x87, + 0xc3, 0x4d, 0x60, 0x66, 0x0b, 0x0b, 0x85, 0xb9, 0xdc, 0x5a, 0x21, 0x2d, 0xa1, 0x3b, 0xe1, 0x68, + 0x53, 0x22, 0x2e, 0x48, 0xac, 0x05, 0x88, 0x52, 0x70, 0x41, 0xe2, 0x6f, 0xc6, 0xba, 0xfb, 0xb7, + 0xa9, 0xc6, 0xaf, 0x26, 0x57, 0xb0, 0x8e, 0x6d, 0xcd, 0xbe, 0x99, 0x95, 0x17, 0xf1, 0xe9, 0x80, + 0xcf, 0xf4, 0x42, 0xff, 0x1c, 0xeb, 0x65, 0xd5, 0x51, 0x9d, 0x5b, 0x73, 0x2e, 0x80, 0x6c, 0xfe, + 0x63, 0x20, 0xec, 0x0b, 0x8c, 0xde, 0xaf, 0xee, 0xf4, 0x77, 0xf4, 0x69, 0x50, 0xf6, 0xf8, 0x99, + 0x7f, 0x7e, 0x33, 0x4c, 0x4f, 0x66, 0xbf, 0x2b, 0x42, 0x8d, 0x26, 0xfb, 0x75, 0xa1, 0x5f, 0x95, + 0xe0, 0x00, 0x85, 0xf2, 0x3c, 0x65, 0x0a, 0x29, 0xbe, 0xad, 0x16, 0xe5, 0xcf, 0x91, 0xcd, 0xc2, + 0x55, 0x67, 0xf6, 0xb3, 0x40, 0x77, 0xf3, 0xcf, 0x62, 0x1d, 0xf1, 0xf1, 0x10, 0xa6, 0x2e, 0x2b, + 0x23, 0xd5, 0x06, 0x4c, 0x3b, 0x74, 0x20, 0x98, 0xb8, 0xe9, 0x03, 0xc1, 0x27, 0xa1, 0xcf, 0x17, + 0xcd, 0x65, 0xba, 0xdb, 0xfb, 0x76, 0x60, 0xf8, 0x48, 0xde, 0x4f, 0x03, 0xbd, 0x57, 0x82, 0x03, + 0x4d, 0xa3, 0xdf, 0x4c, 0xcf, 0xbe, 0x4f, 0xfe, 0x43, 0x12, 0x6b, 0x4a, 0x5e, 0x56, 0x46, 0xeb, + 0xcd, 0x72, 0x0b, 0x4f, 0xc1, 0x40, 0x20, 0x64, 0xcd, 0xf4, 0x52, 0x36, 0xf6, 0xf1, 0x35, 0x9c, + 0x20, 0x1d, 0x94, 0x85, 0x24, 0xde, 0x31, 0x0d, 0xcb, 0xc1, 0x65, 0x7a, 0x41, 0x3b, 0xa9, 0xb8, + 0x65, 0xa4, 0xc3, 0xc1, 0xa6, 0x8f, 0xdc, 0xec, 0x4c, 0xea, 0x26, 0xcf, 0x15, 0x46, 0x9d, 0x66, + 0x6e, 0xda, 0x5b, 0xe1, 0x28, 0x57, 0xe5, 0x16, 0x2f, 0xeb, 0x80, 0x1e, 0x16, 0x1c, 0xaa, 0xb6, + 0x72, 0x5d, 0xe4, 0x25, 0x40, 0x8d, 0xaa, 0x1a, 0xfe, 0x55, 0x2f, 0xcf, 0xfa, 0xa2, 0x51, 0xe8, + 0xf6, 0xff, 0xee, 0x15, 0x2b, 0x78, 0xe7, 0xb4, 0x6f, 0x82, 0x6d, 0xfb, 0xbf, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xaa, 0x09, 0x66, 0xf5, 0xa3, 0xab, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2509,9 +2523,19 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l { - size := m.MinSelfDelegation.Size() + size := m.TotalTokenizedShares.Size() i -= size - if _, err := m.MinSelfDelegation.MarshalTo(dAtA[i:]); err != nil { + if _, err := m.TotalTokenizedShares.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + { + size := m.TotalExemptShares.Size() + i -= size + if _, err := m.TotalExemptShares.MarshalTo(dAtA[i:]); err != nil { return 0, err } i = encodeVarintStaking(dAtA, i, uint64(size)) @@ -2815,6 +2839,16 @@ func (m *Delegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Exempt { + i-- + if m.Exempt { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } { size := m.Shares.Size() i -= size @@ -3469,7 +3503,9 @@ func (m *Validator) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.Commission.Size() n += 1 + l + sovStaking(uint64(l)) - l = m.MinSelfDelegation.Size() + l = m.TotalExemptShares.Size() + n += 1 + l + sovStaking(uint64(l)) + l = m.TotalTokenizedShares.Size() n += 1 + l + sovStaking(uint64(l)) return n } @@ -3573,6 +3609,9 @@ func (m *Delegation) Size() (n int) { } l = m.Shares.Size() n += 1 + l + sovStaking(uint64(l)) + if m.Exempt { + n += 2 + } return n } @@ -3894,10 +3933,7 @@ func (m *HistoricalInfo) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -4049,10 +4085,7 @@ func (m *CommissionRates) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -4168,10 +4201,7 @@ func (m *Commission) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -4381,10 +4411,7 @@ func (m *Description) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -4723,7 +4750,7 @@ func (m *Validator) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 11: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TotalExemptShares", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4751,7 +4778,41 @@ func (m *Validator) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.TotalExemptShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalTokenizedShares", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TotalTokenizedShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -4761,10 +4822,7 @@ func (m *Validator) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -4846,10 +4904,7 @@ func (m *ValAddresses) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -4963,10 +5018,7 @@ func (m *DVPair) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -5050,10 +5102,7 @@ func (m *DVPairs) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -5199,10 +5248,7 @@ func (m *DVVTriplet) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -5286,10 +5332,7 @@ func (m *DVVTriplets) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -5431,16 +5474,33 @@ func (m *Delegation) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Exempt", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Exempt = bool(v != 0) default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -5588,10 +5648,7 @@ func (m *UnbondingDelegation) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -5761,10 +5818,7 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -5934,10 +5988,7 @@ func (m *RedelegationEntry) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -6117,10 +6168,7 @@ func (m *Redelegation) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -6326,10 +6374,7 @@ func (m *Params) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -6445,10 +6490,7 @@ func (m *DelegationResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -6565,10 +6607,7 @@ func (m *RedelegationEntryResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -6685,10 +6724,7 @@ func (m *RedelegationResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -6806,10 +6842,7 @@ func (m *Pool) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { @@ -6974,10 +7007,7 @@ func (m *TokenizeShareRecord) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStaking - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStaking } if (iNdEx + skippy) > l { diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index a47da85b..44f529b2 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -777,6 +777,82 @@ func (m *MsgTransferTokenizeShareRecordResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgTransferTokenizeShareRecordResponse proto.InternalMessageInfo +// MsgExemptDelegation defines a SDK message for performing exemption of delegated coins +// from a delegator to a validator. +type MsgExemptDelegation struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` +} + +func (m *MsgExemptDelegation) Reset() { *m = MsgExemptDelegation{} } +func (m *MsgExemptDelegation) String() string { return proto.CompactTextString(m) } +func (*MsgExemptDelegation) ProtoMessage() {} +func (*MsgExemptDelegation) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{18} +} +func (m *MsgExemptDelegation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgExemptDelegation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgExemptDelegation.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 *MsgExemptDelegation) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgExemptDelegation.Merge(m, src) +} +func (m *MsgExemptDelegation) XXX_Size() int { + return m.Size() +} +func (m *MsgExemptDelegation) XXX_DiscardUnknown() { + xxx_messageInfo_MsgExemptDelegation.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgExemptDelegation proto.InternalMessageInfo + +type MsgExemptDelegationResponse struct { +} + +func (m *MsgExemptDelegationResponse) Reset() { *m = MsgExemptDelegationResponse{} } +func (m *MsgExemptDelegationResponse) String() string { return proto.CompactTextString(m) } +func (*MsgExemptDelegationResponse) ProtoMessage() {} +func (*MsgExemptDelegationResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{19} +} +func (m *MsgExemptDelegationResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgExemptDelegationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgExemptDelegationResponse.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 *MsgExemptDelegationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgExemptDelegationResponse.Merge(m, src) +} +func (m *MsgExemptDelegationResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgExemptDelegationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgExemptDelegationResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgExemptDelegationResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgCreateValidator)(nil), "liquidstaking.staking.v1beta1.MsgCreateValidator") proto.RegisterType((*MsgCreateValidatorResponse)(nil), "liquidstaking.staking.v1beta1.MsgCreateValidatorResponse") @@ -796,88 +872,91 @@ func init() { proto.RegisterType((*MsgRedeemTokensforSharesResponse)(nil), "liquidstaking.staking.v1beta1.MsgRedeemTokensforSharesResponse") proto.RegisterType((*MsgTransferTokenizeShareRecord)(nil), "liquidstaking.staking.v1beta1.MsgTransferTokenizeShareRecord") proto.RegisterType((*MsgTransferTokenizeShareRecordResponse)(nil), "liquidstaking.staking.v1beta1.MsgTransferTokenizeShareRecordResponse") + proto.RegisterType((*MsgExemptDelegation)(nil), "liquidstaking.staking.v1beta1.MsgExemptDelegation") + proto.RegisterType((*MsgExemptDelegationResponse)(nil), "liquidstaking.staking.v1beta1.MsgExemptDelegationResponse") } func init() { proto.RegisterFile("staking/v1beta1/tx.proto", fileDescriptor_dc1f14f20335eae7) } var fileDescriptor_dc1f14f20335eae7 = []byte{ - // 1201 bytes of a gzipped FileDescriptorProto + // 1224 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0x8e, 0xd3, 0x6e, 0x69, 0xa7, 0x6c, 0x7f, 0xb8, 0xed, 0x2a, 0xf5, 0x76, 0x93, 0xca, 0x42, - 0xa5, 0x5a, 0x51, 0x87, 0x16, 0x50, 0x61, 0x11, 0xaa, 0x36, 0xed, 0xa2, 0xad, 0x20, 0x02, 0xb9, - 0x59, 0x24, 0xe0, 0x10, 0x39, 0xf6, 0xc4, 0x1d, 0x6a, 0xcf, 0x64, 0x3d, 0x4e, 0xdb, 0xa0, 0x95, - 0xf6, 0xba, 0xc7, 0x3d, 0x22, 0x24, 0xa4, 0x4a, 0x5c, 0xb8, 0x71, 0xe1, 0x2f, 0xe0, 0xb4, 0xe2, - 0x80, 0xf6, 0x88, 0x40, 0x0a, 0xa8, 0x95, 0xd0, 0x9e, 0xfb, 0x17, 0x20, 0x8f, 0xc7, 0x13, 0xc7, - 0x49, 0x9a, 0xb4, 0xdd, 0x1e, 0xd8, 0x53, 0xec, 0x99, 0xf7, 0xbe, 0x79, 0xf3, 0xbd, 0x6f, 0xde, - 0x1b, 0x07, 0x64, 0xa8, 0x6f, 0xec, 0x21, 0x6c, 0xe7, 0xf7, 0x57, 0x2b, 0xd0, 0x37, 0x56, 0xf3, - 0xfe, 0xa1, 0x56, 0xf3, 0x88, 0x4f, 0xe4, 0x5b, 0x0e, 0x7a, 0x58, 0x47, 0x16, 0x9f, 0xd7, 0xa2, - 0x5f, 0x6e, 0xa7, 0xcc, 0xdb, 0x84, 0xd8, 0x0e, 0xcc, 0x33, 0xe3, 0x4a, 0xbd, 0x9a, 0x37, 0x70, - 0x23, 0xf4, 0x54, 0x72, 0xc9, 0x29, 0x1f, 0xb9, 0x90, 0xfa, 0x86, 0x5b, 0xe3, 0x06, 0xb3, 0x36, - 0xb1, 0x09, 0x7b, 0xcc, 0x07, 0x4f, 0x7c, 0x74, 0xde, 0x24, 0xd4, 0x25, 0xb4, 0x1c, 0x4e, 0x84, - 0x2f, 0x7c, 0x2a, 0x1b, 0xbe, 0xe5, 0x2b, 0x06, 0x85, 0x22, 0x52, 0x93, 0x20, 0xcc, 0xe7, 0x6f, - 0x25, 0x77, 0x11, 0x45, 0xcb, 0xa6, 0xd5, 0xbf, 0x86, 0x81, 0x5c, 0xa4, 0xf6, 0xa6, 0x07, 0x0d, - 0x1f, 0x7e, 0x61, 0x38, 0xc8, 0x32, 0x7c, 0xe2, 0xc9, 0x3a, 0x18, 0xb7, 0x20, 0x35, 0x3d, 0x54, - 0xf3, 0x11, 0xc1, 0x19, 0x69, 0x51, 0x5a, 0x1e, 0x5f, 0xbb, 0xad, 0x9d, 0xb9, 0x6f, 0x6d, 0xab, - 0xe5, 0x51, 0x18, 0x7e, 0xd6, 0xcc, 0xa5, 0xf4, 0x38, 0x88, 0x5c, 0x02, 0xc0, 0x24, 0xae, 0x8b, - 0x28, 0x0d, 0x20, 0xd3, 0x0c, 0x52, 0xeb, 0x03, 0xb9, 0x29, 0x1c, 0x74, 0xc3, 0x87, 0x94, 0xc3, - 0xc6, 0x70, 0xe4, 0x47, 0x60, 0xc6, 0x45, 0xb8, 0x4c, 0xa1, 0x53, 0x2d, 0x5b, 0xd0, 0x81, 0xb6, - 0xc1, 0x22, 0x1e, 0x5a, 0x94, 0x96, 0xc7, 0x0a, 0x9f, 0x06, 0xe6, 0x7f, 0x36, 0x73, 0x4b, 0x36, - 0xf2, 0x77, 0xeb, 0x15, 0xcd, 0x24, 0x2e, 0x67, 0x8f, 0xff, 0xac, 0x50, 0x6b, 0x2f, 0xef, 0x37, - 0x6a, 0x90, 0x6a, 0xdb, 0xd8, 0x3f, 0x6d, 0xe6, 0x94, 0x86, 0xe1, 0x3a, 0x77, 0xd4, 0x2e, 0x90, - 0xaa, 0x3e, 0xed, 0x22, 0xbc, 0x03, 0x9d, 0xea, 0x96, 0x18, 0x93, 0xb7, 0xc1, 0x34, 0xb7, 0x20, - 0x5e, 0xd9, 0xb0, 0x2c, 0x0f, 0x52, 0x9a, 0x19, 0x66, 0x6b, 0x2f, 0x9c, 0x36, 0x73, 0x99, 0x10, - 0xad, 0xc3, 0x44, 0xd5, 0xa7, 0xc4, 0xd8, 0xdd, 0x70, 0x28, 0x80, 0xda, 0x8f, 0xf8, 0x17, 0x50, - 0xd7, 0x92, 0x50, 0x1d, 0x26, 0xaa, 0x3e, 0x25, 0xc6, 0x22, 0xa8, 0x8f, 0xc1, 0x48, 0xad, 0x5e, - 0xd9, 0x83, 0x8d, 0xcc, 0x08, 0x63, 0x79, 0x56, 0x0b, 0x65, 0xa7, 0x45, 0xb2, 0xd3, 0xee, 0xe2, - 0x46, 0x21, 0xf3, 0xdb, 0x2f, 0x2b, 0xb3, 0x5c, 0x4b, 0xa6, 0xd7, 0xa8, 0xf9, 0x44, 0xfb, 0xbc, - 0x5e, 0xf9, 0x04, 0x36, 0x74, 0xee, 0x2d, 0xbf, 0x07, 0xae, 0xed, 0x1b, 0x4e, 0x1d, 0x66, 0x5e, - 0x63, 0x30, 0xf3, 0x1a, 0xb7, 0x0e, 0xb4, 0x16, 0x4b, 0x11, 0x8a, 0xd2, 0x1d, 0x5a, 0xdf, 0x19, - 0x7d, 0x72, 0x94, 0x4b, 0xbd, 0x38, 0xca, 0xa5, 0xd4, 0x05, 0xa0, 0x74, 0x8a, 0x4b, 0x87, 0xb4, - 0x46, 0x30, 0x85, 0xea, 0xf7, 0x43, 0x60, 0xaa, 0x48, 0xed, 0x7b, 0x16, 0xf2, 0xaf, 0x56, 0x79, - 0x1b, 0xdd, 0xa8, 0x4d, 0x33, 0x6a, 0xe5, 0xd3, 0x66, 0x6e, 0x22, 0xa4, 0xf6, 0x0c, 0x42, 0x5d, - 0x30, 0xd9, 0x92, 0x5c, 0xd9, 0x33, 0x7c, 0xc8, 0x05, 0xb6, 0x35, 0xa0, 0xb8, 0xb6, 0xa0, 0x79, - 0xda, 0xcc, 0xdd, 0x08, 0x17, 0x4a, 0x40, 0xa9, 0xfa, 0x84, 0xd9, 0x26, 0x73, 0xf9, 0xb0, 0xbb, - 0xa6, 0x43, 0x5d, 0xdd, 0xbf, 0x42, 0x3d, 0xc7, 0x52, 0xa7, 0x80, 0x4c, 0x32, 0x37, 0x22, 0x71, - 0xff, 0x4a, 0x60, 0xbc, 0x48, 0x6d, 0xee, 0x07, 0xbb, 0x9f, 0x02, 0xe9, 0xe5, 0x9d, 0x82, 0xf4, - 0x85, 0x4e, 0xc1, 0x3a, 0x18, 0x31, 0x5c, 0x52, 0xc7, 0x3e, 0xcb, 0xd5, 0x00, 0xf2, 0xe5, 0xe6, - 0x31, 0x12, 0xe6, 0xc0, 0x4c, 0x6c, 0x9f, 0x62, 0xff, 0xbf, 0xa7, 0x59, 0xd1, 0x2c, 0x40, 0x1b, - 0x61, 0x1d, 0x5a, 0x57, 0x40, 0x43, 0x09, 0xcc, 0xb5, 0xf6, 0x48, 0x3d, 0x33, 0x41, 0xc5, 0xe2, - 0x69, 0x33, 0xb7, 0x90, 0xa4, 0x22, 0x66, 0xa6, 0xea, 0x33, 0x62, 0x7c, 0xc7, 0x33, 0xbb, 0xa2, - 0x5a, 0xd4, 0x17, 0xa8, 0x43, 0xbd, 0x51, 0x63, 0x66, 0x71, 0xd4, 0x2d, 0xea, 0x77, 0xf2, 0x3c, - 0x7c, 0x51, 0x9e, 0xf7, 0x58, 0x9d, 0x48, 0xf0, 0x19, 0xd1, 0x2d, 0x17, 0xd9, 0xe9, 0xab, 0x39, - 0x30, 0x90, 0x68, 0x39, 0xe8, 0x98, 0xbc, 0x2c, 0x28, 0x1d, 0x75, 0xad, 0x14, 0xb5, 0xd3, 0xc2, - 0x68, 0xb0, 0xd4, 0xd3, 0xbf, 0x73, 0x12, 0x3b, 0x5d, 0xdc, 0x39, 0x98, 0x56, 0x5f, 0x48, 0xe0, - 0x7a, 0x91, 0xda, 0x0f, 0xb0, 0xf5, 0xca, 0xeb, 0xb7, 0x0a, 0xe6, 0xda, 0x76, 0x7a, 0x55, 0x94, - 0x1e, 0xa5, 0xc1, 0x42, 0x50, 0xe8, 0x0d, 0x6c, 0x42, 0xe7, 0x01, 0xae, 0x10, 0x6c, 0x21, 0x6c, - 0xf7, 0xeb, 0x93, 0xff, 0x5b, 0x86, 0xe5, 0x37, 0xc1, 0xa4, 0x19, 0x34, 0xb5, 0x80, 0xbc, 0x5d, - 0x88, 0xec, 0xdd, 0x50, 0xfb, 0x43, 0xfa, 0x44, 0x34, 0x7c, 0x9f, 0x8d, 0xc6, 0x52, 0xb1, 0x04, - 0xde, 0x38, 0x8b, 0x21, 0x51, 0x5b, 0x7e, 0x4d, 0x83, 0xe9, 0x22, 0xb5, 0x4b, 0x64, 0x0f, 0x62, - 0xf4, 0x2d, 0xdc, 0xd9, 0x35, 0x3c, 0x48, 0x5f, 0x35, 0xfe, 0x4a, 0x60, 0xce, 0xe7, 0x1b, 0xb4, - 0xca, 0x34, 0xd8, 0x62, 0x99, 0x1c, 0x60, 0xe8, 0xf1, 0x16, 0x17, 0x2b, 0x44, 0x5d, 0xcd, 0x54, - 0x7d, 0x46, 0x8c, 0x33, 0x82, 0x3e, 0x0b, 0x46, 0x63, 0x64, 0x97, 0xc0, 0x7c, 0x07, 0x87, 0x42, - 0xfb, 0xad, 0xa8, 0xa5, 0x73, 0x45, 0xad, 0xfe, 0x24, 0xb1, 0x9e, 0x18, 0x54, 0x28, 0xe8, 0x32, - 0x70, 0x5a, 0x25, 0xde, 0xcb, 0xcf, 0x50, 0x2b, 0xc0, 0xf4, 0x45, 0x0f, 0xfe, 0xd7, 0x60, 0xb1, - 0x57, 0xa4, 0x97, 0xe7, 0xe1, 0x3b, 0x09, 0x64, 0x03, 0x7a, 0x3d, 0x03, 0xd3, 0x2a, 0xf4, 0xda, - 0x68, 0xd6, 0xa1, 0x49, 0x3c, 0x4b, 0x5e, 0x07, 0x99, 0x28, 0x43, 0x3c, 0x71, 0x1e, 0x9b, 0x28, - 0x23, 0x8b, 0xad, 0x36, 0xac, 0x0b, 0x01, 0xc4, 0xdc, 0xb6, 0x2d, 0xf9, 0x06, 0x18, 0xa1, 0x10, - 0x5b, 0xd0, 0x0b, 0x25, 0xa9, 0xf3, 0x37, 0xf9, 0x26, 0x18, 0xc3, 0xf0, 0x80, 0xab, 0x84, 0xb5, - 0x2b, 0x7d, 0x14, 0xc3, 0x83, 0x64, 0xe2, 0x97, 0xc1, 0xd2, 0xd9, 0x91, 0x45, 0xbb, 0x5f, 0xfb, - 0x79, 0x0c, 0x0c, 0x15, 0xa9, 0x2d, 0x3f, 0x06, 0x93, 0xc9, 0x8f, 0x9f, 0xd5, 0x3e, 0xb7, 0xcd, - 0xce, 0x2b, 0xad, 0xf2, 0xc1, 0xb9, 0x5d, 0x44, 0x1a, 0x1a, 0xe0, 0x7a, 0xfb, 0x0d, 0x38, 0xdf, - 0x1f, 0xab, 0xcd, 0x41, 0x59, 0x3f, 0xa7, 0x83, 0x58, 0xfa, 0x1b, 0x30, 0x2a, 0xee, 0x70, 0xb7, - 0xfb, 0x83, 0x44, 0xb6, 0xca, 0xda, 0xe0, 0xb6, 0x62, 0xad, 0xc7, 0x60, 0x32, 0x79, 0x5f, 0x1a, - 0x80, 0xe7, 0x84, 0xcb, 0x20, 0x3c, 0xf7, 0xba, 0x45, 0xd4, 0x00, 0x88, 0xb5, 0xfc, 0xb7, 0xfa, - 0x03, 0xb5, 0xac, 0x95, 0x77, 0xcf, 0x63, 0x2d, 0x56, 0xfc, 0x41, 0x02, 0xf3, 0xbd, 0x5b, 0xe2, - 0x87, 0x03, 0x48, 0xa6, 0x97, 0xb3, 0xb2, 0x79, 0x09, 0x67, 0x11, 0xdf, 0x23, 0x30, 0x91, 0x68, - 0x33, 0x6f, 0xf7, 0x87, 0x6d, 0xf7, 0x50, 0xde, 0x3f, 0xaf, 0x87, 0x58, 0xfd, 0x89, 0x04, 0x5e, - 0x8f, 0x17, 0x28, 0x79, 0x00, 0x19, 0x77, 0x2d, 0x68, 0xca, 0xc6, 0x05, 0x1d, 0x45, 0x28, 0x3f, - 0x4a, 0xe0, 0xe6, 0x59, 0xd5, 0xec, 0xa3, 0x01, 0x36, 0xd9, 0xdb, 0x5d, 0xb9, 0x77, 0x29, 0xf7, - 0x28, 0xca, 0xc2, 0x97, 0xcf, 0x8e, 0xb3, 0xd2, 0xf3, 0xe3, 0xac, 0xf4, 0xcf, 0x71, 0x56, 0x7a, - 0x7a, 0x92, 0x4d, 0x3d, 0x3f, 0xc9, 0xa6, 0xfe, 0x38, 0xc9, 0xa6, 0xbe, 0xda, 0x88, 0x7d, 0x0e, - 0xa2, 0x87, 0x4e, 0x3d, 0xf8, 0x90, 0x44, 0xd8, 0xcc, 0x87, 0xcb, 0x22, 0xbf, 0xb1, 0xc2, 0x97, - 0x5c, 0x71, 0x89, 0x55, 0x77, 0x60, 0xfe, 0x30, 0xfa, 0x17, 0x28, 0xfc, 0x56, 0xac, 0x8c, 0xb0, - 0xdb, 0xde, 0x3b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x71, 0xf3, 0x21, 0xa4, 0xf3, 0x12, 0x00, - 0x00, + 0x14, 0x8e, 0xd3, 0x6e, 0x69, 0xa7, 0x6c, 0x7f, 0xb8, 0xed, 0x2a, 0x75, 0xdb, 0xb8, 0xb2, 0x50, + 0xa9, 0x56, 0xd4, 0xa1, 0x05, 0x54, 0x58, 0x84, 0xaa, 0x4d, 0x5b, 0xb4, 0x15, 0x44, 0x20, 0x37, + 0x8b, 0x04, 0x1c, 0x22, 0xc7, 0x9e, 0xb8, 0xa6, 0xf6, 0x4c, 0xd6, 0xe3, 0xb4, 0x0d, 0x5a, 0x69, + 0xaf, 0x7b, 0xdc, 0x23, 0x42, 0x42, 0xaa, 0xc4, 0x85, 0x1b, 0x17, 0xf8, 0x07, 0x38, 0xad, 0x38, + 0xa0, 0x3d, 0x22, 0x90, 0x02, 0x6a, 0x25, 0xb4, 0xe7, 0xfe, 0x05, 0xc8, 0xe3, 0xf1, 0xc4, 0x71, + 0x92, 0x26, 0x6d, 0xb7, 0x12, 0xec, 0x29, 0xf6, 0xcc, 0x7b, 0xdf, 0xbc, 0xf7, 0xbd, 0x6f, 0xde, + 0x8c, 0x03, 0x32, 0xc4, 0xd7, 0xf7, 0x6d, 0x64, 0xe5, 0x0e, 0x56, 0xcb, 0xd0, 0xd7, 0x57, 0x73, + 0xfe, 0x91, 0x5a, 0xf5, 0xb0, 0x8f, 0xc5, 0x05, 0xc7, 0x7e, 0x50, 0xb3, 0x4d, 0x36, 0xaf, 0x46, + 0xbf, 0xcc, 0x4e, 0x9a, 0xb5, 0x30, 0xb6, 0x1c, 0x98, 0xa3, 0xc6, 0xe5, 0x5a, 0x25, 0xa7, 0xa3, + 0x7a, 0xe8, 0x29, 0xc9, 0xc9, 0x29, 0xdf, 0x76, 0x21, 0xf1, 0x75, 0xb7, 0xca, 0x0c, 0xa6, 0x2d, + 0x6c, 0x61, 0xfa, 0x98, 0x0b, 0x9e, 0xd8, 0xe8, 0xac, 0x81, 0x89, 0x8b, 0x49, 0x29, 0x9c, 0x08, + 0x5f, 0xd8, 0x54, 0x36, 0x7c, 0xcb, 0x95, 0x75, 0x02, 0x79, 0xa4, 0x06, 0xb6, 0x11, 0x9b, 0x5f, + 0x48, 0x66, 0x11, 0x45, 0x4b, 0xa7, 0x95, 0x3f, 0x07, 0x81, 0x58, 0x20, 0xd6, 0xa6, 0x07, 0x75, + 0x1f, 0x7e, 0xa6, 0x3b, 0xb6, 0xa9, 0xfb, 0xd8, 0x13, 0x35, 0x30, 0x6a, 0x42, 0x62, 0x78, 0x76, + 0xd5, 0xb7, 0x31, 0xca, 0x08, 0x8b, 0xc2, 0xf2, 0xe8, 0xda, 0x6d, 0xf5, 0xdc, 0xbc, 0xd5, 0xad, + 0xa6, 0x47, 0x7e, 0xf0, 0x69, 0x43, 0x4e, 0x69, 0x71, 0x10, 0xb1, 0x08, 0x80, 0x81, 0x5d, 0xd7, + 0x26, 0x24, 0x80, 0x4c, 0x53, 0x48, 0xb5, 0x07, 0xe4, 0x26, 0x77, 0xd0, 0x74, 0x1f, 0x12, 0x06, + 0x1b, 0xc3, 0x11, 0x1f, 0x82, 0x29, 0xd7, 0x46, 0x25, 0x02, 0x9d, 0x4a, 0xc9, 0x84, 0x0e, 0xb4, + 0x74, 0x1a, 0xf1, 0xc0, 0xa2, 0xb0, 0x3c, 0x92, 0xff, 0x38, 0x30, 0xff, 0xa3, 0x21, 0x2f, 0x59, + 0xb6, 0xbf, 0x57, 0x2b, 0xab, 0x06, 0x76, 0x19, 0x7b, 0xec, 0x67, 0x85, 0x98, 0xfb, 0x39, 0xbf, + 0x5e, 0x85, 0x44, 0xdd, 0x41, 0xfe, 0x59, 0x43, 0x96, 0xea, 0xba, 0xeb, 0xdc, 0x51, 0x3a, 0x40, + 0x2a, 0xda, 0xa4, 0x6b, 0xa3, 0x5d, 0xe8, 0x54, 0xb6, 0xf8, 0x98, 0xb8, 0x03, 0x26, 0x99, 0x05, + 0xf6, 0x4a, 0xba, 0x69, 0x7a, 0x90, 0x90, 0xcc, 0x20, 0x5d, 0x7b, 0xfe, 0xac, 0x21, 0x67, 0x42, + 0xb4, 0x36, 0x13, 0x45, 0x9b, 0xe0, 0x63, 0x77, 0xc3, 0xa1, 0x00, 0xea, 0x20, 0xe2, 0x9f, 0x43, + 0xdd, 0x48, 0x42, 0xb5, 0x99, 0x28, 0xda, 0x04, 0x1f, 0x8b, 0xa0, 0x3e, 0x04, 0x43, 0xd5, 0x5a, + 0x79, 0x1f, 0xd6, 0x33, 0x43, 0x94, 0xe5, 0x69, 0x35, 0x94, 0x9d, 0x1a, 0xc9, 0x4e, 0xbd, 0x8b, + 0xea, 0xf9, 0xcc, 0xaf, 0x3f, 0xad, 0x4c, 0x33, 0x2d, 0x19, 0x5e, 0xbd, 0xea, 0x63, 0xf5, 0xd3, + 0x5a, 0xf9, 0x23, 0x58, 0xd7, 0x98, 0xb7, 0xf8, 0x0e, 0xb8, 0x71, 0xa0, 0x3b, 0x35, 0x98, 0x79, + 0x85, 0xc2, 0xcc, 0xaa, 0xcc, 0x3a, 0xd0, 0x5a, 0xac, 0x44, 0x76, 0x54, 0xee, 0xd0, 0xfa, 0xce, + 0xf0, 0xe3, 0x63, 0x39, 0xf5, 0xfc, 0x58, 0x4e, 0x29, 0xf3, 0x40, 0x6a, 0x17, 0x97, 0x06, 0x49, + 0x15, 0x23, 0x02, 0x95, 0x6f, 0x07, 0xc0, 0x44, 0x81, 0x58, 0xdb, 0xa6, 0xed, 0x5f, 0xaf, 0xf2, + 0x36, 0x3a, 0x51, 0x9b, 0xa6, 0xd4, 0x8a, 0x67, 0x0d, 0x79, 0x2c, 0xa4, 0xf6, 0x1c, 0x42, 0x5d, + 0x30, 0xde, 0x94, 0x5c, 0xc9, 0xd3, 0x7d, 0xc8, 0x04, 0xb6, 0xd5, 0xa7, 0xb8, 0xb6, 0xa0, 0x71, + 0xd6, 0x90, 0x6f, 0x85, 0x0b, 0x25, 0xa0, 0x14, 0x6d, 0xcc, 0x68, 0x91, 0xb9, 0x78, 0xd4, 0x59, + 0xd3, 0xa1, 0xae, 0xee, 0x5d, 0xa3, 0x9e, 0x63, 0xa5, 0x93, 0x40, 0x26, 0x59, 0x1b, 0x5e, 0xb8, + 0x7f, 0x04, 0x30, 0x5a, 0x20, 0x16, 0xf3, 0x83, 0x9d, 0x77, 0x81, 0xf0, 0xe2, 0x76, 0x41, 0xfa, + 0x52, 0xbb, 0x60, 0x1d, 0x0c, 0xe9, 0x2e, 0xae, 0x21, 0x9f, 0xd6, 0xaa, 0x0f, 0xf9, 0x32, 0xf3, + 0x18, 0x09, 0x33, 0x60, 0x2a, 0x96, 0x27, 0xcf, 0xff, 0xb7, 0x34, 0x6d, 0x9a, 0x79, 0x68, 0xd9, + 0x48, 0x83, 0xe6, 0x35, 0xd0, 0x50, 0x04, 0x33, 0xcd, 0x1c, 0x89, 0x67, 0x24, 0xa8, 0x58, 0x3c, + 0x6b, 0xc8, 0xf3, 0x49, 0x2a, 0x62, 0x66, 0x8a, 0x36, 0xc5, 0xc7, 0x77, 0x3d, 0xa3, 0x23, 0xaa, + 0x49, 0x7c, 0x8e, 0x3a, 0xd0, 0x1d, 0x35, 0x66, 0x16, 0x47, 0xdd, 0x22, 0x7e, 0x3b, 0xcf, 0x83, + 0x97, 0xe5, 0x79, 0x9f, 0xf6, 0x89, 0x04, 0x9f, 0x11, 0xdd, 0x62, 0x81, 0xee, 0xbe, 0xaa, 0x03, + 0x03, 0x89, 0x96, 0x82, 0x13, 0x93, 0xb5, 0x05, 0xa9, 0xad, 0xaf, 0x15, 0xa3, 0xe3, 0x34, 0x3f, + 0x1c, 0x2c, 0xf5, 0xe4, 0x2f, 0x59, 0xa0, 0xbb, 0x8b, 0x39, 0x07, 0xd3, 0xca, 0x73, 0x01, 0xdc, + 0x2c, 0x10, 0xeb, 0x3e, 0x32, 0x5f, 0x7a, 0xfd, 0x56, 0xc0, 0x4c, 0x4b, 0xa6, 0xd7, 0x45, 0xe9, + 0x71, 0x1a, 0xcc, 0x07, 0x8d, 0x5e, 0x47, 0x06, 0x74, 0xee, 0xa3, 0x32, 0x46, 0xa6, 0x8d, 0xac, + 0x5e, 0xe7, 0xe4, 0xff, 0x96, 0x61, 0xf1, 0x75, 0x30, 0x6e, 0x04, 0x87, 0x5a, 0x40, 0xde, 0x1e, + 0xb4, 0xad, 0xbd, 0x50, 0xfb, 0x03, 0xda, 0x58, 0x34, 0x7c, 0x8f, 0x8e, 0xc6, 0x4a, 0xb1, 0x04, + 0x5e, 0x3b, 0x8f, 0x21, 0xde, 0x5b, 0x7e, 0x49, 0x83, 0xc9, 0x02, 0xb1, 0x8a, 0x78, 0x1f, 0x22, + 0xfb, 0x6b, 0xb8, 0xbb, 0xa7, 0x7b, 0x90, 0xbc, 0x6c, 0xfc, 0x15, 0xc1, 0x8c, 0xcf, 0x12, 0x34, + 0x4b, 0x24, 0x48, 0xb1, 0x84, 0x0f, 0x11, 0xf4, 0xd8, 0x11, 0x17, 0x6b, 0x44, 0x1d, 0xcd, 0x14, + 0x6d, 0x8a, 0x8f, 0x53, 0x82, 0x3e, 0x09, 0x46, 0x63, 0x64, 0x17, 0xc1, 0x6c, 0x1b, 0x87, 0x5c, + 0xfb, 0xcd, 0xa8, 0x85, 0x0b, 0x45, 0xad, 0xfc, 0x20, 0xd0, 0x33, 0x31, 0xe8, 0x50, 0xd0, 0xa5, + 0xe0, 0xa4, 0x82, 0xbd, 0x17, 0x5f, 0xa1, 0x66, 0x80, 0xe9, 0xcb, 0x6e, 0xfc, 0x2f, 0xc1, 0x62, + 0xb7, 0x48, 0xaf, 0xce, 0xc3, 0x37, 0x02, 0xc8, 0x06, 0xf4, 0x7a, 0x3a, 0x22, 0x15, 0xe8, 0xb5, + 0xd0, 0xac, 0x41, 0x03, 0x7b, 0xa6, 0xb8, 0x0e, 0x32, 0x51, 0x85, 0x58, 0xe1, 0x3c, 0x3a, 0x51, + 0xb2, 0x4d, 0xba, 0xda, 0xa0, 0xc6, 0x05, 0x10, 0x73, 0xdb, 0x31, 0xc5, 0x5b, 0x60, 0x88, 0x40, + 0x64, 0x42, 0x2f, 0x94, 0xa4, 0xc6, 0xde, 0xc4, 0x39, 0x30, 0x82, 0xe0, 0x21, 0x53, 0x09, 0x3d, + 0xae, 0xb4, 0x61, 0x04, 0x0f, 0x93, 0x85, 0x5f, 0x06, 0x4b, 0xe7, 0x47, 0xc6, 0xf7, 0xd9, 0xcf, + 0x02, 0x3d, 0xdb, 0xb7, 0x8f, 0xa0, 0x5b, 0xf5, 0xff, 0xeb, 0x9d, 0x2a, 0x96, 0xe1, 0x02, 0x98, + 0xeb, 0x10, 0x76, 0x94, 0xd6, 0xda, 0x8f, 0x23, 0x60, 0xa0, 0x40, 0x2c, 0xf1, 0x11, 0x18, 0x4f, + 0x7e, 0xd3, 0xad, 0xf6, 0xb8, 0x44, 0xb7, 0xdf, 0xd4, 0xa5, 0xf7, 0x2e, 0xec, 0xc2, 0xd5, 0x55, + 0x07, 0x37, 0x5b, 0x2f, 0xf6, 0xb9, 0xde, 0x58, 0x2d, 0x0e, 0xd2, 0xfa, 0x05, 0x1d, 0xf8, 0xd2, + 0x5f, 0x81, 0x61, 0x7e, 0x35, 0xbd, 0xdd, 0x1b, 0x24, 0xb2, 0x95, 0xd6, 0xfa, 0xb7, 0xe5, 0x6b, + 0x3d, 0x02, 0xe3, 0xc9, 0x6b, 0x60, 0x1f, 0x3c, 0x27, 0x5c, 0xfa, 0xe1, 0xb9, 0xdb, 0xe5, 0xa8, + 0x0a, 0x40, 0xec, 0x26, 0xf3, 0x46, 0x6f, 0xa0, 0xa6, 0xb5, 0xf4, 0xf6, 0x45, 0xac, 0xf9, 0x8a, + 0xdf, 0x09, 0x60, 0xb6, 0xfb, 0x49, 0xff, 0x7e, 0x1f, 0x92, 0xe9, 0xe6, 0x2c, 0x6d, 0x5e, 0xc1, + 0x99, 0xc7, 0xf7, 0x10, 0x8c, 0x25, 0x4e, 0xcf, 0x37, 0x7b, 0xc3, 0xb6, 0x7a, 0x48, 0xef, 0x5e, + 0xd4, 0x83, 0xaf, 0xfe, 0x58, 0x00, 0xaf, 0xc6, 0xfb, 0xae, 0xd8, 0x87, 0x8c, 0x3b, 0xf6, 0x69, + 0x69, 0xe3, 0x92, 0x8e, 0x3c, 0x94, 0xef, 0x05, 0x30, 0x77, 0x5e, 0x93, 0xfe, 0xa0, 0x8f, 0x24, + 0xbb, 0xbb, 0x4b, 0xdb, 0x57, 0x72, 0x8f, 0xa2, 0xcc, 0x7f, 0xfe, 0xf4, 0x24, 0x2b, 0x3c, 0x3b, + 0xc9, 0x0a, 0x7f, 0x9f, 0x64, 0x85, 0x27, 0xa7, 0xd9, 0xd4, 0xb3, 0xd3, 0x6c, 0xea, 0xf7, 0xd3, + 0x6c, 0xea, 0x8b, 0x8d, 0xd8, 0x57, 0xae, 0xfd, 0xc0, 0xa9, 0x05, 0xdf, 0xc7, 0x36, 0x32, 0x72, + 0xe1, 0xb2, 0xb6, 0x5f, 0x5f, 0x61, 0x4b, 0xae, 0xb8, 0xd8, 0xac, 0x39, 0x30, 0x77, 0x14, 0xfd, + 0xb9, 0x15, 0x7e, 0x02, 0x97, 0x87, 0xe8, 0x25, 0xf6, 0xad, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, + 0x55, 0xae, 0x8f, 0x71, 0xca, 0x13, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2014,6 +2093,66 @@ func (m *MsgTransferTokenizeShareRecordResponse) MarshalToSizedBuffer(dAtA []byt return len(dAtA) - i, nil } +func (m *MsgExemptDelegation) 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 *MsgExemptDelegation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgExemptDelegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ValidatorAddress) > 0 { + i -= len(m.ValidatorAddress) + copy(dAtA[i:], m.ValidatorAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.ValidatorAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgExemptDelegationResponse) 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 *MsgExemptDelegationResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgExemptDelegationResponse) 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 @@ -2307,6 +2446,32 @@ func (m *MsgTransferTokenizeShareRecordResponse) Size() (n int) { return n } +func (m *MsgExemptDelegation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ValidatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgExemptDelegationResponse) 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 } @@ -4431,6 +4596,170 @@ func (m *MsgTransferTokenizeShareRecordResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgExemptDelegation) 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: MsgExemptDelegation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgExemptDelegation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", 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.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", 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.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgExemptDelegationResponse) 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: MsgExemptDelegationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgExemptDelegationResponse: 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) || (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 From 7b9b8ce02bce8aea027808f2916a22302cbd423a Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 27 Jul 2022 23:22:31 +0800 Subject: [PATCH 40/57] upgrade sdk version to final released sdk_v046 --- app/app.go | 4 +- app/app_test.go | 17 +- cmd/liquidstakingd/cmd/testnet_test.go | 6 +- go.mod | 18 +- go.sum | 227 ++++--------------------- 5 files changed, 49 insertions(+), 223 deletions(-) diff --git a/app/app.go b/app/app.go index 0c51f685..9656a46f 100644 --- a/app/app.go +++ b/app/app.go @@ -26,7 +26,7 @@ import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/store/streaming" storetypes "github.com/cosmos/cosmos-sdk/store/types" - "github.com/cosmos/cosmos-sdk/testutil/testdata_pulsar" + "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/version" @@ -414,7 +414,7 @@ func NewSimApp( app.RegisterUpgradeHandlers() // add test gRPC service for testing gRPC queries in isolation - testdata_pulsar.RegisterQueryServer(app.GRPCQueryRouter(), testdata_pulsar.QueryImpl{}) + testdata.RegisterQueryServer(app.GRPCQueryRouter(), testdata.QueryImpl{}) // create the simulation manager and define the order of the modules for deterministic simulations // diff --git a/app/app_test.go b/app/app_test.go index 23df9efc..17e8b88a 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -2,6 +2,7 @@ package simapp import ( "encoding/json" + "os" "testing" "github.com/golang/mock/gomock" @@ -19,7 +20,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" - authmiddleware "github.com/cosmos/cosmos-sdk/x/auth/middleware" "github.com/cosmos/cosmos-sdk/x/auth/vesting" authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/bank" @@ -39,7 +39,7 @@ import ( func TestSimAppExportAndBlockedAddrs(t *testing.T) { encCfg := MakeTestEncodingConfig() db := dbm.NewMemDB() - logger, _ := log.NewDefaultLogger("plain", "info", false) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) app := NewSimappWithCustomOptions(t, false, SetupOptions{ Logger: logger, DB: db, @@ -60,7 +60,7 @@ func TestSimAppExportAndBlockedAddrs(t *testing.T) { app.Commit() - logger2, _ := log.NewDefaultLogger("plain", "info", false) + logger2 := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) // Making a new app object with the db, so that initchain hasn't been called app2 := NewSimApp(logger2, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) _, err := app2.ExportAppStateAndValidators(false, []string{}) @@ -75,16 +75,15 @@ func TestGetMaccPerms(t *testing.T) { func TestRunMigrations(t *testing.T) { db := dbm.NewMemDB() encCfg := MakeTestEncodingConfig() - logger, _ := log.NewDefaultLogger("plain", "info", false) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) // Create a new baseapp and configurator for the purpose of this test. - bApp := baseapp.NewBaseApp(appName, logger, db) + bApp := baseapp.NewBaseApp(appName, logger, db, encCfg.TxConfig.TxDecoder()) bApp.SetCommitMultiStoreTracer(nil) bApp.SetInterfaceRegistry(encCfg.InterfaceRegistry) - msr := authmiddleware.NewMsgServiceRouter(encCfg.InterfaceRegistry) app.BaseApp = bApp - app.configurator = module.NewConfigurator(app.appCodec, msr, app.GRPCQueryRouter()) + app.configurator = module.NewConfigurator(app.appCodec, bApp.MsgServiceRouter(), app.GRPCQueryRouter()) // We register all modules on the Configurator, except x/bank. x/bank will // serve as the test subject on which we run the migration tests. @@ -205,7 +204,7 @@ func TestRunMigrations(t *testing.T) { func TestInitGenesisOnMigration(t *testing.T) { db := dbm.NewMemDB() encCfg := MakeTestEncodingConfig() - logger, _ := log.NewDefaultLogger("plain", "info", false) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) @@ -249,7 +248,7 @@ func TestInitGenesisOnMigration(t *testing.T) { func TestUpgradeStateOnGenesis(t *testing.T) { encCfg := MakeTestEncodingConfig() db := dbm.NewMemDB() - logger, _ := log.NewDefaultLogger("plain", "info", false) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) app := NewSimappWithCustomOptions(t, false, SetupOptions{ Logger: logger, DB: db, diff --git a/cmd/liquidstakingd/cmd/testnet_test.go b/cmd/liquidstakingd/cmd/testnet_test.go index 09134383..7761589f 100644 --- a/cmd/liquidstakingd/cmd/testnet_test.go +++ b/cmd/liquidstakingd/cmd/testnet_test.go @@ -12,10 +12,10 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/simapp" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + genutiltest "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/testutil" + genutiltypes "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) func Test_TestnetCmd(t *testing.T) { diff --git a/go.mod b/go.mod index d15b4478..2fc28ea0 100644 --- a/go.mod +++ b/go.mod @@ -3,20 +3,15 @@ module github.com/iqlusioninc/liquidity-staking-module go 1.16 require ( - cosmossdk.io/math v1.0.0-beta.2 // indirect - github.com/armon/go-metrics v0.3.11 - github.com/cosmos/cosmos-sdk v0.46.0-rc3 // indirect + cosmossdk.io/math v1.0.0-beta.2 + github.com/armon/go-metrics v0.4.0 + github.com/cosmos/cosmos-sdk v0.46.0 github.com/cosmos/go-bip39 v1.0.0 - github.com/creachadair/taskgroup v0.3.2 // indirect - github.com/creachadair/tomledit v0.0.22 // indirect github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/improbable-eng/grpc-web v0.15.0 // indirect - github.com/mroth/weightedrand v0.4.1 // indirect - github.com/oasisprotocol/curve25519-voi v0.0.0-20210609091139-0a56a4bca00b // indirect github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 @@ -26,10 +21,11 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.0 - github.com/tendermint/tendermint v0.34.20-rc1 // indirect - github.com/tendermint/tm-db v0.6.7 // indirect + github.com/tendermint/tendermint v0.34.20 + github.com/tendermint/tm-db v0.6.7 + github.com/zondax/hid v0.9.1-0.20220302062450-5552068d2266 // indirect google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd - google.golang.org/grpc v1.47.0 + google.golang.org/grpc v1.48.0 google.golang.org/protobuf v1.28.0 sigs.k8s.io/yaml v1.3.0 ) diff --git a/go.sum b/go.sum index c850b6f1..30a2367c 100644 --- a/go.sum +++ b/go.sum @@ -34,7 +34,6 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= @@ -53,8 +52,6 @@ cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wq cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= @@ -73,48 +70,29 @@ cloud.google.com/go/storage v1.14.0 h1:6RRlFMv1omScs6iq2hfE3IvgE+l6RfJPampq8UZc5 cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -cosmossdk.io/api v0.1.0-alpha8 h1:Hr+8bLI4UphF+aMiDIVklrdzRm99dFaNq2inBKGDzNU= -cosmossdk.io/api v0.1.0-alpha8/go.mod h1:gIs3NW5OSNK5wKqxF8JHnGTL82QMsXpwGeKmu2i5xFA= cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= cosmossdk.io/math v1.0.0-beta.2 h1:17hSVc9ne1c31IaLDfjRojtN+y4Rd2N8H/6Fht2sBzw= cosmossdk.io/math v1.0.0-beta.2/go.mod h1:u/MXvf8wbUbCsAEyQSSYXXMsczAsFX48e2D6JI86T4o= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.0.0-beta.2 h1:/BZRNzm8N4K4eWfK28dL4yescorxtO7YG1yun8fy+pI= -filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= -github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/Antonboom/errname v0.1.6/go.mod h1:7lz79JAnuoMNDAWE9MeeIr1/c/VpSUWatBv2FH9NYpI= -github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= @@ -134,10 +112,8 @@ github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0 github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= @@ -150,13 +126,11 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrU github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= -github.com/adlio/schema v1.1.13/go.mod h1:L5Z7tw+7lRK1Fnpi/LT/ooCP1elkXn0krMWBQHUhEDE= -github.com/adlio/schema v1.2.3 h1:GfKThfEsjS9cCz7gaF8zdXv4cpTdUqdljkKGDTbJjys= -github.com/adlio/schema v1.2.3/go.mod h1:nD7ZWmMMbwU12Pqwg+qL0rTvHBrBXfNz+5UQxTfy38M= +github.com/adlio/schema v1.3.0/go.mod h1:51QzxkpeFs6lRY11kPye26IaFPOV+HqEj01t5aXXKfs= +github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= @@ -181,15 +155,13 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.11 h1:/q4zqTAH+/mtFjimfc0SC7yuuxZshlS4TaCeBm+7sZ0= -github.com/armon/go-metrics v0.3.11/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v1.1.0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= @@ -223,28 +195,23 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blizzy78/varnamelen v0.6.0/go.mod h1:zy2Eic4qWqjrxa60jG34cfL0VXcSwzUrIx68eJPb4Q8= github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.2.2/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= -github.com/breml/errchkjson v0.2.3/go.mod h1:jZEATw/jF69cL1iy7//Yih8yp/mXp2CBoBr9GJwCAsY= github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= -github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -268,7 +235,6 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -281,7 +247,6 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= github.com/chavacava/garif v0.0.0-20220316182200-5cad0b5181d4/go.mod h1:W8EnPSQ8Nv4fUjc/v1/8tHFqhuOJXnRub0dTfuAQktU= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= @@ -312,11 +277,8 @@ github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOG github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= -github.com/coinbase/rosetta-sdk-go v0.7.2 h1:uCNrASIyt7rV9bA3gzPG3JDlxVP5v/zLgi01GWngncM= -github.com/coinbase/rosetta-sdk-go v0.7.2/go.mod h1:wk9dvjZFSZiWSNkFuj3dMleTA1adLFotg5y71PhqKB4= github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= github.com/confio/ics23/go v0.7.0 h1:00d2kukk7sPoHWL4zZBZwzxnpA2pec1NPdwbSokJ5w8= github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= @@ -325,13 +287,11 @@ github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1 github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.2.1 h1:/EeEo2EtN3umhbbgCveyjifoMYg0pS+nMMEemaYw634= github.com/containerd/continuity v0.2.1/go.mod h1:wCYX+dRqZdImhGucXOqTQn05AhX6EUDaGEMUzTFFpLg= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -346,16 +306,16 @@ github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= github.com/cosmos/cosmos-proto v1.0.0-alpha7 h1:yqYUOHF2jopwZh4dVQp3xgqwftE5/2hkrwIV6vkUbO0= github.com/cosmos/cosmos-proto v1.0.0-alpha7/go.mod h1:dosO4pSAbJF8zWCzCoTWP7nNsjcvSUBQmniFxDg5daw= -github.com/cosmos/cosmos-sdk v0.46.0-rc3 h1:BWU0YJ1RXUCYUmKY8k3kH/yEavMF/7y81Sjd+2otZpY= -github.com/cosmos/cosmos-sdk v0.46.0-rc3/go.mod h1:fWrmJ90UcB11LoaaTtF/qsqkA8HusUc8+XARAdnJfmA= +github.com/cosmos/cosmos-sdk v0.46.0 h1:TwifvVmAmqUNB70tN1clrqExryWyBU3RxbI2QZEJUJY= +github.com/cosmos/cosmos-sdk v0.46.0/go.mod h1:u6Ci6+V+srijJhzctEEPYBygUz3O2YXP5ZijPnV6mt0= github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1/go.mod h1:JUMM2MxF9wuwzRWZJjb8BjXsn1BmPmdBd3a75pIct4I= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.17.3 h1:s2N819a2olOmiauVa0WAhoIJq9EhSXE9HDBAoR9k+8Y= -github.com/cosmos/iavl v0.17.3/go.mod h1:prJoErZFABYZGDHka1R6Oay4z9PrNeFFiMKHDAMOi4w= +github.com/cosmos/iavl v0.19.0 h1:sgyrjqOkycXiN7Tuupuo4QAldKFg7Sipyfeg/IL7cps= +github.com/cosmos/iavl v0.19.0/go.mod h1:l5h9pAB3m5fihB3pXVgwYqdY8aBsMagqz7T0MUjxZeA= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 h1:DdzS1m6o/pCqeZ8VOAit/gyATedRgjvkVI+UCrLpyuU= github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76/go.mod h1:0mkLWIoZuQ7uBoospo5Q9zIpqq6rYCPJDSUdeCJvPM8= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= @@ -367,28 +327,22 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creachadair/atomicfile v0.2.6/go.mod h1:BRq8Une6ckFneYXZQ+kO7p1ZZP3I2fzVzf28JxrIkBc= -github.com/creachadair/command v0.0.0-20220426235536-a748effdf6a1/go.mod h1:bAM+qFQb/KwWyCc9MLC4U1jvn3XyakqP5QRkds5T6cY= -github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= -github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= -github.com/creachadair/tomledit v0.0.22/go.mod h1:cIu/4x5L855oSRejIqr+WRFh+mv9g4fWLiUFaApYn/Y= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/daixiang0/gci v0.3.1-0.20220208004058-76d765e3ab48/go.mod h1:jaASoJmv/ykO9dAAPy31iJnreV19248qKDdVWf3QgC4= github.com/daixiang0/gci v0.3.3/go.mod h1:1Xr2bxnQbDxCqqulUOv8qpGqkgRw9RSCGGjEC2LjF8o= -github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= @@ -396,7 +350,6 @@ github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0 github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= @@ -431,8 +384,9 @@ github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b h1:HBah4D48ypg3J7Np4N+HY/ZR76fx3HEUGxDU6Uk39oQ= github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -453,7 +407,6 @@ github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= @@ -481,17 +434,15 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fzipp/gocyclo v0.4.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/fzipp/gocyclo v0.5.1/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= @@ -499,14 +450,11 @@ github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-critic/go-critic v0.6.2/go.mod h1:td1s27kfmLpe5G/DPjlnFI7o1UCzePptwU7Az0V5iCM= github.com/go-critic/go-critic v0.6.3/go.mod h1:c6b3ZP1MQ7o6lPR7Rv3lEf7pYQUmAcx8ABHgdZCQt/k= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -534,8 +482,7 @@ github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8c github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= @@ -626,11 +573,8 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.44.2/go.mod h1:KjBgkLvsTWDkhfu12iCrv0gwL1kON5KNhbyjQ6qN7Jo= -github.com/golangci/golangci-lint v1.46.0/go.mod h1:IJpcNOUfx/XLRwE95FHQ6QtbhYwwqcm0H5QkwUfF4ZE= github.com/golangci/golangci-lint v1.46.2/go.mod h1:3DkdHnxn9eoTTrpT2gB0TEv8KSziuoqe9FitgQLHvAY= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= @@ -659,8 +603,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -698,14 +642,11 @@ github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4Mgqvf github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= @@ -743,7 +684,6 @@ github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -751,7 +691,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -766,12 +705,10 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -780,8 +717,6 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.5.11 h1:wioTuNmaBU3IE9vdFtFMcmZWj0QzLc6DYaP6sNe5onY= -github.com/hashicorp/go-getter v1.5.11/go.mod h1:9i48BP6wpWweI/0/+FBjqLrp9S8XtwUGjiu0QkWHEaY= github.com/hashicorp/go-getter v1.6.1 h1:NASsgP4q6tL94WH6nJxKWj8As2H/2kop/bB1d8JMyRY= github.com/hashicorp/go-getter v1.6.1/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= @@ -807,7 +742,6 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -830,8 +764,6 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= -github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 h1:aSVUgRRRtOrZOC1fYmY9gV0e9z/Iu+xNVSASWjsuyGU= github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3/go.mod h1:5PC6ZNPde8bBqU/ewGZig35+UIZtw9Ytxez8/q5ZyFE= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= @@ -842,7 +774,6 @@ github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbc github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= github.com/huin/goupnp v1.0.3-0.20220313090229-ca81a64b4204/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= @@ -869,7 +800,6 @@ github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19y github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= @@ -882,8 +812,7 @@ github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7 github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f/go.mod h1:qr2b5kx4HbFS7/g4uYO5qv9ei8303JMsC7ESbYiqr2Q= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.12.0 h1:1NQ4FpWMgn3by/n1X0fbeKEUxP1wBt7+Oitpv01HR10= -github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753 h1:uFlcJKZPLQd7rmOY/RrvBuUaYmAFnlFHKLivhO6cOy8= github.com/jhump/protoreflect v1.12.1-0.20220417024638-438db461d753/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= @@ -920,7 +849,6 @@ github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSX github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= @@ -935,7 +863,6 @@ github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -957,7 +884,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kulti/thelper v0.5.1/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= github.com/kulti/thelper v0.6.2/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= @@ -965,7 +891,6 @@ github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+s github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lazyledger/smt v0.2.1-0.20210709230900-03ea40719554/go.mod h1:9+Pb2/tg1PvEgW7aFx4bFhDE4bvbI03zuJ8kb7nJ9Jc= -github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= @@ -975,28 +900,22 @@ github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7s github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= -github.com/lufeee/execinquery v1.0.0/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -1015,8 +934,6 @@ github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -1039,7 +956,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0j github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.1.4/go.mod h1:ZZq2bmyssGh8MSPz3VVziqRNIMYTJXzP8MUKG90vZ9A= github.com/mgechev/revive v1.2.1/go.mod h1:+Ro3wqY4vakcYNtkBWdZC7dBg1xSB6sp054wWwmeFm0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= @@ -1068,7 +984,6 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -1091,7 +1006,6 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwd github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/mroth/weightedrand v0.4.1/go.mod h1:3p2SIcC8al1YMzGhAIoXD+r9olo/g/cdJgAD905gyNE= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= @@ -1123,13 +1037,10 @@ github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/exhaustive v0.7.11/go.mod h1:gX+MP7DWMKJmNa1HfMozK+u04hQd3na9i0hyqf3/dOI= github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oasisprotocol/curve25519-voi v0.0.0-20210609091139-0a56a4bca00b h1:MKwruh+HeCSKWphkxuzvRzU4QzDkg7yiPkDVV0cDFgI= -github.com/oasisprotocol/curve25519-voi v0.0.0-20210609091139-0a56a4bca00b/go.mod h1:TLJifjWF6eotcfzDjKZsDqWJ+73Uvj/N85MvVyrvynM= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -1153,21 +1064,17 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.0.3 h1:1hbqejyQWCJBvtKAfdO0b1FmaEf2z/bxnjqbARass5k= github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= @@ -1199,7 +1106,6 @@ github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChl github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -1235,7 +1141,6 @@ github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUI github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v0.0.0-20211125173453-6d6d39c5bb8b/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/polyfloyd/go-errorlint v1.0.0/go.mod h1:KZy4xxPJyy88/gldCe5OdW6OQRtNO3EZE7hXzmnebgA= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= @@ -1247,10 +1152,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= @@ -1269,11 +1172,9 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= @@ -1283,7 +1184,6 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= @@ -1292,17 +1192,12 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.15/go.mod h1:NhuWhnlVEM1gT1A4VJHYfy9MuYSxxwHgxWoPsn9llB4= github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a/go.mod h1:VMX+OnnSw4LicdiEGtRSD/1X8kW7GuEscjYNr4cOIT4= github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.12-0.20220101150716-969a394a9451/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.12/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.16/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.17/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.19/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/gogrep v0.0.0-20220103110004-ffaa07af02e3/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= @@ -1330,8 +1225,6 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= -github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -1340,7 +1233,6 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/sagikazarmark/crypt v0.5.0/go.mod h1:l+nzl7KWh51rpzp2h7t4MZWyiEWdhNpOAnclKvg+mdA= @@ -1353,7 +1245,6 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/securego/gosec/v2 v2.9.6/go.mod h1:EESY9Ywxo/Zc5NyF/qIj6Cop+4PSWM0F0OfGD7FdIXc= github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= @@ -1362,21 +1253,17 @@ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAm github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v3 v3.22.1/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY= github.com/shirou/gopsutil/v3 v3.22.4/go.mod h1:D01hZJ4pVHPpCTZ3m3T2+wDF2YAGfd+H4ifUguaQzHM= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/containedctx v1.0.1/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= -github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= github.com/sivchari/tenv v1.5.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -1391,20 +1278,15 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60= -github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= @@ -1418,11 +1300,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= github.com/spf13/viper v1.11.0/go.mod h1:djo0X/bA5+tYVoCn+C7cAYJGcVn/qYLFTG8gdUsX7Zk= github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= @@ -1437,8 +1315,8 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1448,13 +1326,11 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= @@ -1465,7 +1341,6 @@ github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKk github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= @@ -1473,39 +1348,30 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RM github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/tendermint v0.34.14/go.mod h1:FrwVm3TvsVicI9Z7FlucHV6Znfd5KBc/Lpp69cCwtk0= -github.com/tendermint/tendermint v0.34.20-rc1 h1:5ej9Fk5zlDF6Pa8/FJKp9j3Sto95JdCV+wVJFi94E5k= -github.com/tendermint/tendermint v0.34.20-rc1/go.mod h1:u2xI6q3IeLQQ2NdIpRKLUKBNog0o7EzBpvDCE0/OTmg= -github.com/tendermint/tendermint v0.35.8 h1:zgfeDBkN+p7XBf/Qz7hK7Y55AJk65BbS0eV0UDS9MQY= -github.com/tendermint/tendermint v0.35.8/go.mod h1:6cIWilifL392hrtTPeYL5A6CqNBwDbhvwvAZSDmQpvc= -github.com/tendermint/tm-db v0.6.4/go.mod h1:dptYhIpJ2M5kUuenLr+Yyf3zQOv1SgBZcl8/BmWlMBw= +github.com/tendermint/tendermint v0.34.19/go.mod h1:R5+wgIwSxMdKQcmOaeudL0Cjkr3HDkhpcdum6VeU3R4= +github.com/tendermint/tendermint v0.34.20 h1:/pmvJhO3IqOxhbi8iRXudTjA2YKpaMqrLwFNkyxDSzw= +github.com/tendermint/tendermint v0.34.20/go.mod h1:KtOwCLYJcsS1ymtAfnjjAtXfXClbqcqjdqzFt2Em1Ac= github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= github.com/tendermint/tm-db v0.6.7/go.mod h1:byQDzFkZV1syXr/ReXS808NxA2xvyuuVgXOJ/088L6I= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.12.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.3/go.mod h1:5WdjKx3AQMvCJ4RG6/2UYT7dLrGvJUV1x4jdTAyGvZs= github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= github.com/tomarrell/wrapcheck/v2 v2.6.1/go.mod h1:Eo+Opt6pyMW1b6cNllOcDSSoHO0aTJ+iF6BfCUbHltA= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.5.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= @@ -1534,7 +1400,6 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vektra/mockery/v2 v2.10.0/go.mod h1:m/WO2UzWzqgVX3nvqpRQq70I4Z7jbSCRhdmkgtp+Ab4= github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -1552,7 +1417,6 @@ github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1z github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= -github.com/yeya24/promlinter v0.1.1-0.20210918184747-d757024714a1/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= @@ -1572,7 +1436,6 @@ gitlab.com/bosi/decorder v0.2.1/go.mod h1:6C/nhLSbF6qZbYD8bRmISBwc6vcWdNsiIBkRvj go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -1645,7 +1508,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -1657,9 +1519,6 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= -golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220313003712-b769efc7c000/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= @@ -1770,11 +1629,9 @@ golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b h1:MWaHNqZy3KTpuTMAGvv+Kw+ylsEpmyJZizz1dqxnu28= golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1800,7 +1657,6 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= @@ -1817,9 +1673,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29 h1:w8s32wxx3sY+OjLlv9qltkLU5yvJzxjjgiHWLjdIcw4= golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1888,7 +1742,6 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1920,13 +1773,11 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1940,8 +1791,6 @@ golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1961,7 +1810,6 @@ golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM= @@ -2016,7 +1864,6 @@ golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2069,7 +1916,6 @@ golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2095,7 +1941,6 @@ golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= @@ -2141,7 +1986,6 @@ google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdr google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/api v0.63.0 h1:n2bqqK895ygnBpdPDYetfy23K7fJ22wsrZKCyfuRkkA= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= @@ -2204,7 +2048,6 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201119123407-9b1e624d6bc4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2241,9 +2084,6 @@ google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5 h1:zzNejm+EgrbLfDZ6lu9Uud2IVvHySPl8vQzf04laR5Q= -google.golang.org/genproto v0.0.0-20220118154757-00ab72f36ad5/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= @@ -2297,13 +2137,12 @@ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2318,7 +2157,6 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= @@ -2336,11 +2174,7 @@ gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w= -gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2363,7 +2197,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -2380,9 +2213,7 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -honnef.co/go/tools v0.2.2/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= honnef.co/go/tools v0.3.1/go.mod h1:vlRD9XErLMGT+mDuofSr0mMMquscM/1nQqtRSsh6m70= -mvdan.cc/gofumpt v0.2.1/go.mod h1:a/rvZPhsNaedOJBzqRD9omnwVwHZsBdJirXHa9Gh9Ig= mvdan.cc/gofumpt v0.3.1/go.mod h1:w3ymliuxvzVx8DAutBnVyDqYb1Niy/yCJt/lk821YCE= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= From cc913d35ec1abd14136dd87bc943a24d858678c4 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 28 Jul 2022 09:45:15 +0800 Subject: [PATCH 41/57] Remove min self delegation logic --- app/test_helpers.go | 21 ++- genesis.json | 5 - proto/staking/v1beta1/tx.proto | 21 ++- x/slashing/keeper/keeper_test.go | 1 - x/slashing/keeper/unjail.go | 9 -- x/slashing/simulation/operations.go | 6 +- x/staking/client/cli/flags.go | 9 -- x/staking/client/cli/tx.go | 54 +------- x/staking/client/cli/tx_test.go | 20 +-- x/staking/client/testutil/suite.go | 4 - x/staking/keeper/delegation.go | 10 -- x/staking/keeper/delegation_test.go | 62 --------- x/staking/keeper/msg_server.go | 61 +++++++-- x/staking/simulation/genesis_test.go | 1 - x/staking/spec/07_events.md | 13 +- x/staking/spec/09_client.md | 40 ++---- x/staking/types/events.go | 24 ++-- x/staking/types/exported.go | 1 - x/staking/types/msg.go | 90 +++++++----- x/staking/types/msg_test.go | 35 ++--- x/staking/types/tx.pb.go | 197 ++++++++++++++++----------- x/staking/types/validator.go | 27 ++-- 22 files changed, 304 insertions(+), 407 deletions(-) diff --git a/app/test_helpers.go b/app/test_helpers.go index cd8b7c0b..a1c77214 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -164,17 +164,16 @@ func genesisStateWithValSet(t *testing.T, pkAny, err := codectypes.NewAnyWithValue(pk) require.NoError(t, err) validator := stakingtypes.Validator{ - OperatorAddress: sdk.ValAddress(val.Address).String(), - ConsensusPubkey: pkAny, - Jailed: false, - Status: stdstaking.Bonded, - Tokens: bondAmt, - DelegatorShares: sdk.OneDec(), - Description: stakingtypes.Description{}, - UnbondingHeight: int64(0), - UnbondingTime: time.Unix(0, 0).UTC(), - Commission: stakingtypes.NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), - MinSelfDelegation: sdk.ZeroInt(), + OperatorAddress: sdk.ValAddress(val.Address).String(), + ConsensusPubkey: pkAny, + Jailed: false, + Status: stdstaking.Bonded, + Tokens: bondAmt, + DelegatorShares: sdk.OneDec(), + Description: stakingtypes.Description{}, + UnbondingHeight: int64(0), + UnbondingTime: time.Unix(0, 0).UTC(), + Commission: stakingtypes.NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), } validators = append(validators, validator) delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), sdk.OneDec())) diff --git a/genesis.json b/genesis.json index 1eed5675..52446728 100644 --- a/genesis.json +++ b/genesis.json @@ -875,7 +875,6 @@ "website": "" }, "jailed": false, - "min_self_delegation": "1", "operator_address": "cosmosvaloper1qp49fdjtlsrv6jkx3gc8urp2ncg88s6mcversm", "status": "BOND_STATUS_BONDED", "tokens": "11000000", @@ -904,7 +903,6 @@ "website": "" }, "jailed": false, - "min_self_delegation": "1", "operator_address": "cosmosvaloper1yh60qk8lp0fz05zna43zjdmwj8y32wrhsq8rzj", "status": "BOND_STATUS_BONDED", "tokens": "100000000", @@ -933,7 +931,6 @@ "website": "" }, "jailed": false, - "min_self_delegation": "1", "operator_address": "cosmosvaloper186luay4vll7yv8w6z6amhxjczf4k5yzr67tmgg", "status": "BOND_STATUS_BONDED", "tokens": "100000000", @@ -962,7 +959,6 @@ "website": "" }, "jailed": false, - "min_self_delegation": "1", "operator_address": "cosmosvaloper1sjq7jgd4r3al0875ysvpk3yw6c7250a75uk2rs", "status": "BOND_STATUS_BONDED", "tokens": "100000000", @@ -991,7 +987,6 @@ "website": "" }, "jailed": false, - "min_self_delegation": "1", "operator_address": "cosmosvaloper1jefsuvgwwt4pc0cntdwlzcjewckvdjrllh4668", "status": "BOND_STATUS_BONDED", "tokens": "100000000", diff --git a/proto/staking/v1beta1/tx.proto b/proto/staking/v1beta1/tx.proto index 862106f4..1afe90ec 100644 --- a/proto/staking/v1beta1/tx.proto +++ b/proto/staking/v1beta1/tx.proto @@ -49,6 +49,10 @@ service Msg { // TokenizeShareRecord rpc TransferTokenizeShareRecord(MsgTransferTokenizeShareRecord) returns (MsgTransferTokenizeShareRecordResponse); + + // ExemptDelegation defines a method for performing exemption of + // delegated coins from a delegator to a validator. + rpc ExemptDelegation(MsgExemptDelegation) returns (MsgExemptDelegationResponse); } // MsgCreateValidator defines a SDK message for creating a new validator. @@ -58,15 +62,10 @@ message MsgCreateValidator { Description description = 1 [(gogoproto.nullable) = false]; CommissionRates commission = 2 [(gogoproto.nullable) = false]; - string min_self_delegation = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"min_self_delegation\"", - (gogoproto.nullable) = false - ]; - string delegator_address = 4 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; - string validator_address = 5 [(gogoproto.moretags) = "yaml:\"validator_address\""]; - google.protobuf.Any pubkey = 6 [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey"]; - cosmos.base.v1beta1.Coin value = 7 [(gogoproto.nullable) = false]; + string delegator_address = 3 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; + string validator_address = 4 [(gogoproto.moretags) = "yaml:\"validator_address\""]; + google.protobuf.Any pubkey = 5 [(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey"]; + cosmos.base.v1beta1.Coin value = 6 [(gogoproto.nullable) = false]; } // MsgCreateValidatorResponse defines the Msg/CreateValidator response type. @@ -88,10 +87,6 @@ message MsgEditValidator { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"commission_rate\"" ]; - string min_self_delegation = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"min_self_delegation\"" - ]; } // MsgEditValidatorResponse defines the Msg/EditValidator response type. diff --git a/x/slashing/keeper/keeper_test.go b/x/slashing/keeper/keeper_test.go index 421efbf7..1ab69934 100644 --- a/x/slashing/keeper/keeper_test.go +++ b/x/slashing/keeper/keeper_test.go @@ -41,7 +41,6 @@ func TestUnJailNotBonded(t *testing.T) { addr, val := valAddrs[5], pks[5] amt := app.StakingKeeper.TokensFromConsensusPower(ctx, 50) msg := tstaking.CreateValidatorMsg(addr, val, amt) - msg.MinSelfDelegation = amt res, err := tstaking.CreateValidatorWithMsg(sdk.WrapSDKContext(ctx), msg) require.NoError(t, err) require.NotNil(t, res) diff --git a/x/slashing/keeper/unjail.go b/x/slashing/keeper/unjail.go index a512af58..b0930e73 100644 --- a/x/slashing/keeper/unjail.go +++ b/x/slashing/keeper/unjail.go @@ -2,7 +2,6 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" sdkslashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" ) @@ -20,14 +19,6 @@ func (k Keeper) Unjail(ctx sdk.Context, validatorAddr sdk.ValAddress) error { return sdkslashingtypes.ErrMissingSelfDelegation } - tokens := validator.TokensFromShares(selfDel.GetShares()).TruncateInt() - minSelfBond := validator.GetMinSelfDelegation() - if tokens.LT(minSelfBond) { - return sdkerrors.Wrapf( - sdkslashingtypes.ErrSelfDelegationTooLowToUnjail, "%s less than %s", tokens, minSelfBond, - ) - } - // cannot be unjailed if not jailed if !validator.IsJailed() { return sdkslashingtypes.ErrValidatorNotJailed diff --git a/x/slashing/simulation/operations.go b/x/slashing/simulation/operations.go index 5f975e71..1f7302da 100644 --- a/x/slashing/simulation/operations.go +++ b/x/slashing/simulation/operations.go @@ -109,8 +109,7 @@ func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Kee // - validator is still in jailed period // - self delegation too low if info.Tombstoned || - ctx.BlockHeader().Time.Before(info.JailedUntil) || - validator.TokensFromShares(selfDel.GetShares()).TruncateInt().LT(validator.GetMinSelfDelegation()) { + ctx.BlockHeader().Time.Before(info.JailedUntil) { if res != nil && err == nil { if info.Tombstoned { return simtypes.NewOperationMsg(msg, true, "", nil), nil, errors.New("validator should not have been unjailed if validator tombstoned") @@ -118,9 +117,6 @@ func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Kee if ctx.BlockHeader().Time.Before(info.JailedUntil) { return simtypes.NewOperationMsg(msg, true, "", nil), nil, errors.New("validator unjailed while validator still in jail period") } - if validator.TokensFromShares(selfDel.GetShares()).TruncateInt().LT(validator.GetMinSelfDelegation()) { - return simtypes.NewOperationMsg(msg, true, "", nil), nil, errors.New("validator unjailed even though self-delegation too low") - } } // msg failed as expected return simtypes.NewOperationMsg(msg, false, "", nil), nil, nil diff --git a/x/staking/client/cli/flags.go b/x/staking/client/cli/flags.go index bae3011f..fda8c2fa 100644 --- a/x/staking/client/cli/flags.go +++ b/x/staking/client/cli/flags.go @@ -26,8 +26,6 @@ const ( FlagCommissionMaxRate = "commission-max-rate" FlagCommissionMaxChangeRate = "commission-max-change-rate" - FlagMinSelfDelegation = "min-self-delegation" - FlagGenesisFormat = "genesis-format" FlagNodeID = "node-id" FlagIP = "ip" @@ -59,13 +57,6 @@ func FlagSetCommissionCreate() *flag.FlagSet { return fs } -// FlagSetMinSelfDelegation Returns the FlagSet used for minimum set delegation. -func FlagSetMinSelfDelegation() *flag.FlagSet { - fs := flag.NewFlagSet("", flag.ContinueOnError) - fs.String(FlagMinSelfDelegation, "", "The minimum self delegation required on the validator") - return fs -} - // FlagSetAmount Returns the FlagSet for amount related operations. func FlagSetAmount() *flag.FlagSet { fs := flag.NewFlagSet("", flag.ContinueOnError) diff --git a/x/staking/client/cli/tx.go b/x/staking/client/cli/tx.go index ffff4e15..6887f211 100644 --- a/x/staking/client/cli/tx.go +++ b/x/staking/client/cli/tx.go @@ -14,7 +14,6 @@ import ( "github.com/cosmos/cosmos-sdk/client/tx" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/version" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -26,7 +25,6 @@ var ( defaultCommissionRate = "0.1" defaultCommissionMaxRate = "0.2" defaultCommissionMaxChangeRate = "0.01" - defaultMinSelfDelegation = "1" ) // NewTxCmd returns a root CLI command handler for all x/staking transaction commands. @@ -78,7 +76,6 @@ func NewCreateValidatorCmd() *cobra.Command { cmd.Flags().AddFlagSet(FlagSetAmount()) cmd.Flags().AddFlagSet(flagSetDescriptionCreate()) cmd.Flags().AddFlagSet(FlagSetCommissionCreate()) - cmd.Flags().AddFlagSet(FlagSetMinSelfDelegation()) cmd.Flags().String(FlagIP, "", fmt.Sprintf("The node's public IP. It takes effect only when used in combination with --%s", flags.FlagGenerateOnly)) cmd.Flags().String(FlagNodeID, "", "The node's ID") @@ -121,19 +118,7 @@ func NewEditValidatorCmd() *cobra.Command { newRate = &rate } - var newMinSelfDelegation *sdk.Int - - minSelfDelegationString, _ := cmd.Flags().GetString(FlagMinSelfDelegation) - if minSelfDelegationString != "" { - msb, ok := sdk.NewIntFromString(minSelfDelegationString) - if !ok { - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "minimum self delegation must be a positive integer") - } - - newMinSelfDelegation = &msb - } - - msg := types.NewMsgEditValidator(sdk.ValAddress(valAddr), description, newRate, newMinSelfDelegation) + msg := types.NewMsgEditValidator(sdk.ValAddress(valAddr), description, newRate) return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) }, @@ -141,7 +126,6 @@ func NewEditValidatorCmd() *cobra.Command { cmd.Flags().AddFlagSet(flagSetDescriptionEdit()) cmd.Flags().AddFlagSet(flagSetCommissionUpdate()) - cmd.Flags().AddFlagSet(FlagSetMinSelfDelegation()) flags.AddTxFlagsToCmd(cmd) return cmd @@ -322,17 +306,8 @@ func newBuildCreateValidatorMsg(clientCtx client.Context, txf tx.Factory, fs *fl return txf, nil, err } - // get the initial validator min self delegation - msbStr, _ := fs.GetString(FlagMinSelfDelegation) - - minSelfDelegation, ok := sdk.NewIntFromString(msbStr) - if !ok { - return txf, nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "minimum self delegation must be a positive integer") - } - msg, err := types.NewMsgCreateValidator( - sdk.ValAddress(valAddr), pk, amount, description, commissionRates, minSelfDelegation, - ) + sdk.ValAddress(valAddr), pk, amount, description, commissionRates) if err != nil { return txf, nil, err } @@ -365,7 +340,6 @@ func CreateValidatorMsgFlagSet(ipDefault string) (fs *flag.FlagSet, defaultsDesc fsCreateValidator.String(FlagDetails, "", "The validator's (optional) details") fsCreateValidator.String(FlagIdentity, "", "The (optional) identity signature (ex. UPort or Keybase)") fsCreateValidator.AddFlagSet(FlagSetCommissionCreate()) - fsCreateValidator.AddFlagSet(FlagSetMinSelfDelegation()) fsCreateValidator.AddFlagSet(FlagSetAmount()) fsCreateValidator.AddFlagSet(FlagSetPublicKey()) @@ -374,10 +348,8 @@ func CreateValidatorMsgFlagSet(ipDefault string) (fs *flag.FlagSet, defaultsDesc commission rate: %s commission max rate: %s commission max change rate: %s - minimum self delegation: %s `, defaultAmount, defaultCommissionRate, - defaultCommissionMaxRate, defaultCommissionMaxChangeRate, - defaultMinSelfDelegation) + defaultCommissionMaxRate, defaultCommissionMaxChangeRate) return fsCreateValidator, defaultsDesc } @@ -392,7 +364,6 @@ type TxCreateValidatorConfig struct { CommissionRate string CommissionMaxRate string CommissionMaxChangeRate string - MinSelfDelegation string PubKey cryptotypes.PubKey @@ -460,11 +431,6 @@ func PrepareConfigForTxCreateValidator(flagSet *flag.FlagSet, moniker, nodeID, c return c, err } - c.MinSelfDelegation, err = flagSet.GetString(FlagMinSelfDelegation) - if err != nil { - return c, err - } - c.NodeID = nodeID c.PubKey = valPubKey c.Website = website @@ -490,10 +456,6 @@ func PrepareConfigForTxCreateValidator(flagSet *flag.FlagSet, moniker, nodeID, c c.CommissionMaxChangeRate = defaultCommissionMaxChangeRate } - if c.MinSelfDelegation == "" { - c.MinSelfDelegation = defaultMinSelfDelegation - } - return c, nil } @@ -525,16 +487,8 @@ func BuildCreateValidatorMsg(clientCtx client.Context, config TxCreateValidatorC return txBldr, nil, err } - // get the initial validator min self delegation - msbStr := config.MinSelfDelegation - minSelfDelegation, ok := sdk.NewIntFromString(msbStr) - - if !ok { - return txBldr, nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "minimum self delegation must be a positive integer") - } - msg, err := types.NewMsgCreateValidator( - sdk.ValAddress(valAddr), config.PubKey, amount, description, commissionRates, minSelfDelegation, + sdk.ValAddress(valAddr), config.PubKey, amount, description, commissionRates, ) if err != nil { return txBldr, msg, err diff --git a/x/staking/client/cli/tx_test.go b/x/staking/client/cli/tx_test.go index a7eb30fd..a41455e4 100644 --- a/x/staking/client/cli/tx_test.go +++ b/x/staking/client/cli/tx_test.go @@ -17,7 +17,7 @@ func TestPrepareConfigForTxCreateValidator(t *testing.T) { privKey := ed25519.GenPrivKey() valPubKey := privKey.PubKey() moniker := "DefaultMoniker" - mkTxValCfg := func(amount, commission, commissionMax, commissionMaxChange, minSelfDelegation string) TxCreateValidatorConfig { + mkTxValCfg := func(amount, commission, commissionMax, commissionMaxChange string) TxCreateValidatorConfig { return TxCreateValidatorConfig{ IP: ip, ChainID: chainID, @@ -28,7 +28,6 @@ func TestPrepareConfigForTxCreateValidator(t *testing.T) { CommissionRate: commission, CommissionMaxRate: commissionMax, CommissionMaxChangeRate: commissionMaxChange, - MinSelfDelegation: minSelfDelegation, } } @@ -42,38 +41,31 @@ func TestPrepareConfigForTxCreateValidator(t *testing.T) { fsModify: func(fs *pflag.FlagSet) { return }, - expectedCfg: mkTxValCfg(defaultAmount, "0.1", "0.2", "0.01", "1"), + expectedCfg: mkTxValCfg(defaultAmount, "0.1", "0.2", "0.01"), }, { name: "Custom amount", fsModify: func(fs *pflag.FlagSet) { fs.Set(FlagAmount, "2000stake") }, - expectedCfg: mkTxValCfg("2000stake", "0.1", "0.2", "0.01", "1"), + expectedCfg: mkTxValCfg("2000stake", "0.1", "0.2", "0.01"), }, { name: "Custom commission rate", fsModify: func(fs *pflag.FlagSet) { fs.Set(FlagCommissionRate, "0.54") }, - expectedCfg: mkTxValCfg(defaultAmount, "0.54", "0.2", "0.01", "1"), + expectedCfg: mkTxValCfg(defaultAmount, "0.54", "0.2", "0.01"), }, { name: "Custom commission max rate", fsModify: func(fs *pflag.FlagSet) { fs.Set(FlagCommissionMaxRate, "0.89") }, - expectedCfg: mkTxValCfg(defaultAmount, "0.1", "0.89", "0.01", "1"), + expectedCfg: mkTxValCfg(defaultAmount, "0.1", "0.89", "0.01"), }, { name: "Custom commission max change rate", fsModify: func(fs *pflag.FlagSet) { fs.Set(FlagCommissionMaxChangeRate, "0.55") }, - expectedCfg: mkTxValCfg(defaultAmount, "0.1", "0.2", "0.55", "1"), - }, - { - name: "Custom min self delegations", - fsModify: func(fs *pflag.FlagSet) { - fs.Set(FlagMinSelfDelegation, "0.33") - }, - expectedCfg: mkTxValCfg(defaultAmount, "0.1", "0.2", "0.01", "0.33"), + expectedCfg: mkTxValCfg(defaultAmount, "0.1", "0.2", "0.55"), }, } diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index 2f3595ce..97891fdf 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -127,7 +127,6 @@ func (s *IntegrationTestSuite) TestNewCreateValidatorCmd() { fmt.Sprintf("--%s=0.5", cli.FlagCommissionRate), fmt.Sprintf("--%s=1.0", cli.FlagCommissionMaxRate), fmt.Sprintf("--%s=0.1", cli.FlagCommissionMaxChangeRate), - fmt.Sprintf("--%s=1", cli.FlagMinSelfDelegation), fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), @@ -146,7 +145,6 @@ func (s *IntegrationTestSuite) TestNewCreateValidatorCmd() { fmt.Sprintf("--%s=0.5", cli.FlagCommissionRate), fmt.Sprintf("--%s=1.0", cli.FlagCommissionMaxRate), fmt.Sprintf("--%s=0.1", cli.FlagCommissionMaxChangeRate), - fmt.Sprintf("--%s=1", cli.FlagMinSelfDelegation), fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), @@ -166,7 +164,6 @@ func (s *IntegrationTestSuite) TestNewCreateValidatorCmd() { fmt.Sprintf("--%s=0.5", cli.FlagCommissionRate), fmt.Sprintf("--%s=1.0", cli.FlagCommissionMaxRate), fmt.Sprintf("--%s=0.1", cli.FlagCommissionMaxChangeRate), - fmt.Sprintf("--%s=1", cli.FlagMinSelfDelegation), fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), @@ -187,7 +184,6 @@ func (s *IntegrationTestSuite) TestNewCreateValidatorCmd() { fmt.Sprintf("--%s=0.5", cli.FlagCommissionRate), fmt.Sprintf("--%s=1.0", cli.FlagCommissionMaxRate), fmt.Sprintf("--%s=0.1", cli.FlagCommissionMaxChangeRate), - fmt.Sprintf("--%s=1", cli.FlagMinSelfDelegation), fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index 105935b6..ed7f0a47 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -730,16 +730,6 @@ func (k Keeper) Unbond( return amount, err } - isValidatorOperator := delegatorAddress.Equals(validator.GetOperator()) - - // If the delegation is the operator of the validator and undelegating will decrease the validator's - // self-delegation below their minimum, we jail the validator. - if isValidatorOperator && !validator.Jailed && - validator.TokensFromShares(delegation.Shares).TruncateInt().LT(validator.MinSelfDelegation) { - k.jailValidator(ctx, validator) - validator = k.mustGetValidator(ctx, validator.GetOperator()) - } - if delegation.Shares.IsZero() { err = k.RemoveDelegation(ctx, delegation) } else { diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 8d843f74..1fef2558 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -307,68 +307,6 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { require.True(sdk.IntEq(t, newNotBonded, oldNotBonded.AddRaw(1))) } -//// test undelegating self delegation from a validator pushing it below MinSelfDelegation -//// shift it from the bonded to unbonding state and jailed -func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { - _, app, ctx := createTestInput(t) - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.NewInt(10000)) - addrVals := simapp.ConvertAddrsToValAddrs(addrDels) - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) - - //create a validator with a self-delegation - validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) - - validator.MinSelfDelegation = delTokens - validator, issuedShares := validator.AddTokensFromDel(delTokens) - require.Equal(t, delTokens, issuedShares.RoundInt()) - - // add bonded tokens to pool for delegations - notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) - require.True(t, validator.IsBonded()) - - selfDelegation := types.NewDelegation(sdk.AccAddress(addrVals[0].Bytes()), addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, selfDelegation) - - // add bonded tokens to pool for delegations - bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, bondedPool) - - // create a second delegation to this validator - app.StakingKeeper.DeleteValidatorByPowerIndex(ctx, validator) - validator, issuedShares = validator.AddTokensFromDel(delTokens) - require.True(t, validator.IsBonded()) - require.Equal(t, delTokens, issuedShares.RoundInt()) - - // add bonded tokens to pool for delegations - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, bondedPool) - - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - - val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 6))) - require.NoError(t, err) - - // end block - applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) - - validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 14), validator.Tokens) - require.Equal(t, sdkstaking.Unbonding, validator.Status) - require.True(t, validator.Jailed) -} - func TestUndelegateFromUnbondingValidator(t *testing.T) { _, app, ctx := createTestInput(t) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index a54f63f1..fb1f18f4 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -108,8 +108,6 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa return nil, err } - validator.MinSelfDelegation = msg.MinSelfDelegation - k.SetValidator(ctx, validator) k.SetValidatorByConsAddr(ctx, validator) k.SetNewValidatorByPowerIndex(ctx, validator) @@ -178,25 +176,12 @@ func (k msgServer) EditValidator(goCtx context.Context, msg *types.MsgEditValida validator.Commission = commission } - if msg.MinSelfDelegation != nil { - if !msg.MinSelfDelegation.GT(validator.MinSelfDelegation) { - return nil, sdkstaking.ErrMinSelfDelegationDecreased - } - - if msg.MinSelfDelegation.GT(validator.Tokens) { - return nil, sdkstaking.ErrSelfDelegationBelowMinimum - } - - validator.MinSelfDelegation = *msg.MinSelfDelegation - } - k.SetValidator(ctx, validator) ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( types.EventTypeEditValidator, sdk.NewAttribute(types.AttributeKeyCommissionRate, validator.Commission.String()), - sdk.NewAttribute(types.AttributeKeyMinSelfDelegation, validator.MinSelfDelegation.String()), ), sdk.NewEvent( sdk.EventTypeMessage, @@ -770,3 +755,49 @@ func (k msgServer) TransferTokenizeShareRecord(goCtx context.Context, msg *types return &types.MsgTransferTokenizeShareRecordResponse{}, nil } + +func (k msgServer) ExemptDelegation(goCtx context.Context, msg *types.MsgExemptDelegation) (*types.MsgExemptDelegationResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + delAddr, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + return nil, err + } + + valAddr, valErr := sdk.ValAddressFromBech32(msg.ValidatorAddress) + if valErr != nil { + return nil, valErr + } + + validator, found := k.GetValidator(ctx, valAddr) + if !found { + return nil, sdkstaking.ErrNoValidatorFound + } + + delegation, found := k.GetDelegation(ctx, delAddr, valAddr) + if !found { + return nil, sdkstaking.ErrNoDelegation + } + + if !delegation.Exempt { + delegation.Exempt = true + k.SetDelegation(ctx, delegation) + validator.TotalExemptShares = validator.TotalExemptShares.Add(delegation.Shares) + k.SetValidator(ctx, validator) + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeExemptDelegation, + sdk.NewAttribute(types.AttributeKeyDelegator, msg.DelegatorAddress), + sdk.NewAttribute(types.AttributeKeyValidator, msg.ValidatorAddress), + ), + ) + } + + return &types.MsgExemptDelegationResponse{}, nil +} + +// Remove min self delegation from the code base and all logic that uses it. +// MsgTokenizeShares must check the total exempt delegation from the validator, the governance parameter and the total tokenized shares to see if a tokenization is permitted +// Calls to MsgRedelegate a Delegation that is Exempt always fails. +// Calls to MsgUndelegate must check if the (exempt_shares - undelegated shares) * exemption_factor >= total_tokeniz_shares diff --git a/x/staking/simulation/genesis_test.go b/x/staking/simulation/genesis_test.go index 545ca1e8..742d4f6f 100644 --- a/x/staking/simulation/genesis_test.go +++ b/x/staking/simulation/genesis_test.go @@ -64,7 +64,6 @@ func TestRandomizedGenState(t *testing.T) { require.Equal(t, "0.292059246265731326", stakingGenesis.Validators[2].Commission.CommissionRates.Rate.String()) require.Equal(t, "0.330000000000000000", stakingGenesis.Validators[2].Commission.CommissionRates.MaxRate.String()) require.Equal(t, "0.038337453731274481", stakingGenesis.Validators[2].Commission.CommissionRates.MaxChangeRate.String()) - require.Equal(t, "1", stakingGenesis.Validators[2].MinSelfDelegation.String()) } // TestRandomizedGenState1 tests abnormal scenarios of applying RandomizedGenState. diff --git a/x/staking/spec/07_events.md b/x/staking/spec/07_events.md index f219fa2c..8066e4cf 100644 --- a/x/staking/spec/07_events.md +++ b/x/staking/spec/07_events.md @@ -32,13 +32,12 @@ The staking module emits the following events: ### MsgEditValidator -| Type | Attribute Key | Attribute Value | -| -------------- | ------------------- | ------------------- | -| edit_validator | commission_rate | {commissionRate} | -| edit_validator | min_self_delegation | {minSelfDelegation} | -| message | module | staking | -| message | action | edit_validator | -| message | sender | {senderAddress} | +| Type | Attribute Key | Attribute Value | +| -------------- | --------------- | ---------------- | +| edit_validator | commission_rate | {commissionRate} | +| message | module | staking | +| message | action | edit_validator | +| message | sender | {senderAddress} | ### MsgDelegate diff --git a/x/staking/spec/09_client.md b/x/staking/spec/09_client.md index 60870535..74cd7caa 100644 --- a/x/staking/spec/09_client.md +++ b/x/staking/spec/09_client.md @@ -179,7 +179,6 @@ valset: security_contact: "" website: "" jailed: false - min_self_delegation: "1" operator_address: cosmosvaloper1rne8lgs98p0jqe82sgt0qr4rdn4hgvmgp9ggcc status: BOND_STATUS_BONDED tokens: "10000000" @@ -526,7 +525,6 @@ description: security_contact: "" website: "" jailed: false -min_self_delegation: "1" operator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj status: BOND_STATUS_BONDED tokens: "32948270000" @@ -577,7 +575,6 @@ description: security_contact: "" website: "" jailed: false - min_self_delegation: "1" operator_address: cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj status: BOND_STATUS_BONDED tokens: "32948270000" @@ -603,7 +600,6 @@ description: security_contact: info@noderunners.biz website: http://noderunners.biz jailed: false - min_self_delegation: "1" operator_address: cosmosvaloper1q5ku90atkhktze83j9xjaks2p7uruag5zp6wt7 status: BOND_STATUS_BONDED tokens: "559343421" @@ -753,8 +749,7 @@ Example Output: "maxChangeRate": "10000000000000000" }, "updateTime": "2021-10-01T05:52:50.380144238Z" - }, - "minSelfDelegation": "1" + } } ], "pagination": { @@ -799,8 +794,7 @@ Example Output: "maxChangeRate": "10000000000000000" }, "updateTime": "2021-10-01T05:52:50.380144238Z" - }, - "minSelfDelegation": "1" + } } } ``` @@ -1142,8 +1136,7 @@ Example Output: "max_change_rate": "0.150000000000000000" }, "update_time": "2021-10-01T15:00:00Z" - }, - "min_self_delegation": "1" + } } ], "pagination": { @@ -1199,8 +1192,7 @@ Example Output: "max_change_rate": "0.150000000000000000" }, "update_time": "2021-10-01T15:00:00Z" - }, - "min_self_delegation": "1" + } } } ``` @@ -1274,8 +1266,7 @@ Example Output: "max_change_rate": "0.030000000000000000" }, "update_time": "2021-10-01T15:00:00Z" - }, - "min_self_delegation": "1" + } } ] } @@ -1522,8 +1513,7 @@ Example Output: "max_change_rate": "0.100000000000000000" }, "update_time": "2021-10-09T19:03:54.984821705Z" - }, - "min_self_delegation": "1" + } } ], "pagination": { @@ -1579,8 +1569,7 @@ Example Output: "max_change_rate": "0.100000000000000000" }, "update_time": "2021-10-09T19:03:54.984821705Z" - }, - "min_self_delegation": "1" + } } } ``` @@ -1656,8 +1645,7 @@ Example Output: "max_change_rate": "0.030000000000000000" }, "update_time": "2021-10-01T15:00:00Z" - }, - "min_self_delegation": "1" + } }, { "operator_address": "cosmosvaloper1t8ehvswxjfn3ejzkjtntcyrqwvmvuknzmvtaaa", @@ -1685,8 +1673,7 @@ Example Output: "max_change_rate": "0.200000000000000000" }, "update_time": "2021-10-01T15:06:38.821314287Z" - }, - "min_self_delegation": "1" + } } ] } @@ -1791,8 +1778,7 @@ Example Output: "max_change_rate": "0.100000000000000000" }, "update_time": "2021-10-01T15:51:31.596618510Z" - }, - "min_self_delegation": "1" + } }, { "operator_address": "cosmosvaloper1q5ku90atkhktze83j9xjaks2p7uruag5zp6wt7", @@ -1820,8 +1806,7 @@ Example Output: "max_change_rate": "0.100000000000000000" }, "update_time": "2021-10-04T18:02:21.446645619Z" - }, - "min_self_delegation": "1" + } } ], "pagination": { @@ -1877,8 +1862,7 @@ Example Output: "max_change_rate": "0.020000000000000000" }, "update_time": "2021-10-01T19:24:52.663191049Z" - }, - "min_self_delegation": "1" + } } } ``` diff --git a/x/staking/types/events.go b/x/staking/types/events.go index d6f5385b..45b3b5a1 100644 --- a/x/staking/types/events.go +++ b/x/staking/types/events.go @@ -12,17 +12,17 @@ const ( EventTypeTokenizeShares = "tokenize_shares" EventTypeRedeemShares = "redeem_shares" EventTypeTransferTokenizeShareRecord = "transfer_tokenize_share_record" + EventTypeExemptDelegation = "exempt_delegation" - AttributeKeyValidator = "validator" - AttributeKeyCommissionRate = "commission_rate" - AttributeKeyMinSelfDelegation = "min_self_delegation" - AttributeKeySrcValidator = "source_validator" - AttributeKeyDstValidator = "destination_validator" - AttributeKeyDelegator = "delegator" - AttributeKeyCompletionTime = "completion_time" - AttributeKeyNewShares = "new_shares" - AttributeKeyShareOwner = "share_owner" - AttributeKeyShareRecordId = "share_record_id" - AttributeKeyAmount = "amount" - AttributeValueCategory = ModuleName + AttributeKeyValidator = "validator" + AttributeKeyCommissionRate = "commission_rate" + AttributeKeySrcValidator = "source_validator" + AttributeKeyDstValidator = "destination_validator" + AttributeKeyDelegator = "delegator" + AttributeKeyCompletionTime = "completion_time" + AttributeKeyNewShares = "new_shares" + AttributeKeyShareOwner = "share_owner" + AttributeKeyShareRecordId = "share_record_id" + AttributeKeyAmount = "amount" + AttributeValueCategory = ModuleName ) diff --git a/x/staking/types/exported.go b/x/staking/types/exported.go index 9599da10..8542d677 100644 --- a/x/staking/types/exported.go +++ b/x/staking/types/exported.go @@ -30,7 +30,6 @@ type ValidatorI interface { GetBondedTokens() sdk.Int // validator bonded tokens GetConsensusPower(sdk.Int) int64 // validation power in tendermint GetCommission() sdk.Dec // validator commission rate - GetMinSelfDelegation() sdk.Int // validator minimum self delegation GetDelegatorShares() sdk.Dec // total outstanding delegator shares TokensFromShares(sdk.Dec) sdk.Dec // token worth of provided delegator shares TokensFromSharesTruncated(sdk.Dec) sdk.Dec // token worth of provided delegator shares, truncated diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index 39a9f598..8de1bb5f 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -20,6 +20,7 @@ const ( TypeMsgTokenizeShares = "tokenize_shares" TypeMsgRedeemTokensforShares = "redeem_tokens_for_shares" TypeMsgTransferTokenizeShareRecord = "transfer_tokenize_share_record" + TypeMsgExemptDelegation = "exempt_delegation" ) var ( @@ -40,7 +41,7 @@ var ( // Delegator address and validator address are the same. func NewMsgCreateValidator( valAddr sdk.ValAddress, pubKey cryptotypes.PubKey, //nolint:interfacer - selfDelegation sdk.Coin, description Description, commission CommissionRates, minSelfDelegation sdk.Int, + selfDelegation sdk.Coin, description Description, commission CommissionRates, ) (*MsgCreateValidator, error) { var pkAny *codectypes.Any if pubKey != nil { @@ -50,13 +51,12 @@ func NewMsgCreateValidator( } } return &MsgCreateValidator{ - Description: description, - DelegatorAddress: sdk.AccAddress(valAddr).String(), - ValidatorAddress: valAddr.String(), - Pubkey: pkAny, - Value: selfDelegation, - Commission: commission, - MinSelfDelegation: minSelfDelegation, + Description: description, + DelegatorAddress: sdk.AccAddress(valAddr).String(), + ValidatorAddress: valAddr.String(), + Pubkey: pkAny, + Value: selfDelegation, + Commission: commission, }, nil } @@ -125,17 +125,6 @@ func (msg MsgCreateValidator) ValidateBasic() error { return err } - if !msg.MinSelfDelegation.IsPositive() { - return sdkerrors.Wrap( - sdkerrors.ErrInvalidRequest, - "minimum self delegation must be a positive integer", - ) - } - - if msg.Value.Amount.LT(msg.MinSelfDelegation) { - return sdkstaking.ErrSelfDelegationBelowMinimum - } - return nil } @@ -147,12 +136,11 @@ func (msg MsgCreateValidator) UnpackInterfaces(unpacker codectypes.AnyUnpacker) // NewMsgEditValidator creates a new MsgEditValidator instance //nolint:interfacer -func NewMsgEditValidator(valAddr sdk.ValAddress, description Description, newRate *sdk.Dec, newMinSelfDelegation *sdk.Int) *MsgEditValidator { +func NewMsgEditValidator(valAddr sdk.ValAddress, description Description, newRate *sdk.Dec) *MsgEditValidator { return &MsgEditValidator{ - Description: description, - CommissionRate: newRate, - ValidatorAddress: valAddr.String(), - MinSelfDelegation: newMinSelfDelegation, + Description: description, + CommissionRate: newRate, + ValidatorAddress: valAddr.String(), } } @@ -184,13 +172,6 @@ func (msg MsgEditValidator) ValidateBasic() error { return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "empty description") } - if msg.MinSelfDelegation != nil && !msg.MinSelfDelegation.IsPositive() { - return sdkerrors.Wrap( - sdkerrors.ErrInvalidRequest, - "minimum self delegation must be a positive integer", - ) - } - if msg.CommissionRate != nil { if msg.CommissionRate.GT(sdk.OneDec()) || msg.CommissionRate.IsNegative() { return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "commission rate must be between 0 and 1 (inclusive)") @@ -505,9 +486,44 @@ func (msg MsgCancelUnbondingDelegation) ValidateBasic() error { return nil } -// Core business logic -// Remove min self delegation from the code base and all logic that uses it. -// MsgTokenizeShares must check the total exempt delegation from the validator, the governance parameter and the total tokenized shares to see if a tokenization is permitted -// MsgExemptDelegation increases the sum of total exempt delegation. -// Calls to MsgRedelegate a Delegation that is Exempt always fails. -// Calls to MsgUndelegate must check if the (exempt_shares - undelegated shares) * exemption_factor >= total_tokeniz_shares +// NewMsgExemptDelegation creates a new MsgExemptDelegation instance. +//nolint:interfacer +func NewMsgExemptDelegation(delAddr sdk.AccAddress, valAddr sdk.ValAddress) *MsgExemptDelegation { + return &MsgExemptDelegation{ + DelegatorAddress: delAddr.String(), + ValidatorAddress: valAddr.String(), + } +} + +// Route implements the sdk.Msg interface. +func (msg MsgExemptDelegation) Route() string { return RouterKey } + +// Type implements the sdk.Msg interface. +func (msg MsgExemptDelegation) Type() string { return TypeMsgExemptDelegation } + +// GetSigners implements the sdk.Msg interface. +func (msg MsgExemptDelegation) GetSigners() []sdk.AccAddress { + delegator, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + panic(err) + } + return []sdk.AccAddress{delegator} +} + +// GetSignBytes implements the sdk.Msg interface. +func (msg MsgExemptDelegation) GetSignBytes() []byte { + bz := legacy.Cdc.MustMarshalJSON(&msg) + return sdk.MustSortJSON(bz) +} + +// ValidateBasic implements the sdk.Msg interface. +func (msg MsgExemptDelegation) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) + } + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) + } + + return nil +} diff --git a/x/staking/types/msg_test.go b/x/staking/types/msg_test.go index cf0d11c9..bd538197 100644 --- a/x/staking/types/msg_test.go +++ b/x/staking/types/msg_test.go @@ -37,7 +37,7 @@ func TestMsgDecode(t *testing.T) { // now let's try to serialize the whole message commission1 := types.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()) - msg, err := types.NewMsgCreateValidator(valAddr1, pk1, coinPos, types.Description{}, commission1, sdk.OneInt()) + msg, err := types.NewMsgCreateValidator(valAddr1, pk1, coinPos, types.Description{}, commission1) require.NoError(t, err) msgSerialized, err := cdc.MarshalInterface(msg) require.NoError(t, err) @@ -59,27 +59,23 @@ func TestMsgCreateValidator(t *testing.T) { tests := []struct { name, moniker, identity, website, securityContact, details string CommissionRates types.CommissionRates - minSelfDelegation sdk.Int validatorAddr sdk.ValAddress pubkey cryptotypes.PubKey bond sdk.Coin expectPass bool }{ - {"basic good", "a", "b", "c", "d", "e", commission1, sdk.OneInt(), valAddr1, pk1, coinPos, true}, - {"partial description", "", "", "c", "", "", commission1, sdk.OneInt(), valAddr1, pk1, coinPos, true}, - {"empty description", "", "", "", "", "", commission2, sdk.OneInt(), valAddr1, pk1, coinPos, false}, - {"empty address", "a", "b", "c", "d", "e", commission2, sdk.OneInt(), emptyAddr, pk1, coinPos, false}, - {"empty pubkey", "a", "b", "c", "d", "e", commission1, sdk.OneInt(), valAddr1, emptyPubkey, coinPos, false}, - {"empty bond", "a", "b", "c", "d", "e", commission2, sdk.OneInt(), valAddr1, pk1, coinZero, false}, - {"nil bond", "a", "b", "c", "d", "e", commission2, sdk.OneInt(), valAddr1, pk1, sdk.Coin{}, false}, - {"zero min self delegation", "a", "b", "c", "d", "e", commission1, sdk.ZeroInt(), valAddr1, pk1, coinPos, false}, - {"negative min self delegation", "a", "b", "c", "d", "e", commission1, sdk.NewInt(-1), valAddr1, pk1, coinPos, false}, - {"delegation less than min self delegation", "a", "b", "c", "d", "e", commission1, coinPos.Amount.Add(sdk.OneInt()), valAddr1, pk1, coinPos, false}, + {"basic good", "a", "b", "c", "d", "e", commission1, valAddr1, pk1, coinPos, true}, + {"partial description", "", "", "c", "", "", commission1, valAddr1, pk1, coinPos, true}, + {"empty description", "", "", "", "", "", commission2, valAddr1, pk1, coinPos, false}, + {"empty address", "a", "b", "c", "d", "e", commission2, emptyAddr, pk1, coinPos, false}, + {"empty pubkey", "a", "b", "c", "d", "e", commission1, valAddr1, emptyPubkey, coinPos, false}, + {"empty bond", "a", "b", "c", "d", "e", commission2, valAddr1, pk1, coinZero, false}, + {"nil bond", "a", "b", "c", "d", "e", commission2, valAddr1, pk1, sdk.Coin{}, false}, } for _, tc := range tests { description := types.NewDescription(tc.moniker, tc.identity, tc.website, tc.securityContact, tc.details) - msg, err := types.NewMsgCreateValidator(tc.validatorAddr, tc.pubkey, tc.bond, description, tc.CommissionRates, tc.minSelfDelegation) + msg, err := types.NewMsgCreateValidator(tc.validatorAddr, tc.pubkey, tc.bond, description, tc.CommissionRates) require.NoError(t, err) if tc.expectPass { require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) @@ -95,20 +91,19 @@ func TestMsgEditValidator(t *testing.T) { name, moniker, identity, website, securityContact, details string validatorAddr sdk.ValAddress expectPass bool - minSelfDelegation sdk.Int }{ - {"basic good", "a", "b", "c", "d", "e", valAddr1, true, sdk.OneInt()}, - {"partial description", "", "", "c", "", "", valAddr1, true, sdk.OneInt()}, - {"empty description", "", "", "", "", "", valAddr1, false, sdk.OneInt()}, - {"empty address", "a", "b", "c", "d", "e", emptyAddr, false, sdk.OneInt()}, - {"nil int", "a", "b", "c", "d", "e", emptyAddr, false, sdk.Int{}}, + {"basic good", "a", "b", "c", "d", "e", valAddr1, true}, + {"partial description", "", "", "c", "", "", valAddr1, true}, + {"empty description", "", "", "", "", "", valAddr1, false}, + {"empty address", "a", "b", "c", "d", "e", emptyAddr, false}, + {"nil int", "a", "b", "c", "d", "e", emptyAddr, false}, } for _, tc := range tests { description := types.NewDescription(tc.moniker, tc.identity, tc.website, tc.securityContact, tc.details) newRate := sdk.ZeroDec() - msg := types.NewMsgEditValidator(tc.validatorAddr, description, &newRate, &tc.minSelfDelegation) + msg := types.NewMsgEditValidator(tc.validatorAddr, description, &newRate) if tc.expectPass { require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) } else { diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index 44f529b2..768a5101 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -879,84 +879,85 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/tx.proto", fileDescriptor_dc1f14f20335eae7) } var fileDescriptor_dc1f14f20335eae7 = []byte{ - // 1224 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0x8e, 0xd3, 0x6e, 0x69, 0xa7, 0x6c, 0x7f, 0xb8, 0xed, 0x2a, 0x75, 0xdb, 0xb8, 0xb2, 0x50, - 0xa9, 0x56, 0xd4, 0xa1, 0x05, 0x54, 0x58, 0x84, 0xaa, 0x4d, 0x5b, 0xb4, 0x15, 0x44, 0x20, 0x37, - 0x8b, 0x04, 0x1c, 0x22, 0xc7, 0x9e, 0xb8, 0xa6, 0xf6, 0x4c, 0xd6, 0xe3, 0xb4, 0x0d, 0x5a, 0x69, - 0xaf, 0x7b, 0xdc, 0x23, 0x42, 0x42, 0xaa, 0xc4, 0x85, 0x1b, 0x17, 0xf8, 0x07, 0x38, 0xad, 0x38, - 0xa0, 0x3d, 0x22, 0x90, 0x02, 0x6a, 0x25, 0xb4, 0xe7, 0xfe, 0x05, 0xc8, 0xe3, 0xf1, 0xc4, 0x71, - 0x92, 0x26, 0x6d, 0xb7, 0x12, 0xec, 0x29, 0xf6, 0xcc, 0x7b, 0xdf, 0xbc, 0xf7, 0xbd, 0x6f, 0xde, - 0x8c, 0x03, 0x32, 0xc4, 0xd7, 0xf7, 0x6d, 0x64, 0xe5, 0x0e, 0x56, 0xcb, 0xd0, 0xd7, 0x57, 0x73, - 0xfe, 0x91, 0x5a, 0xf5, 0xb0, 0x8f, 0xc5, 0x05, 0xc7, 0x7e, 0x50, 0xb3, 0x4d, 0x36, 0xaf, 0x46, - 0xbf, 0xcc, 0x4e, 0x9a, 0xb5, 0x30, 0xb6, 0x1c, 0x98, 0xa3, 0xc6, 0xe5, 0x5a, 0x25, 0xa7, 0xa3, - 0x7a, 0xe8, 0x29, 0xc9, 0xc9, 0x29, 0xdf, 0x76, 0x21, 0xf1, 0x75, 0xb7, 0xca, 0x0c, 0xa6, 0x2d, - 0x6c, 0x61, 0xfa, 0x98, 0x0b, 0x9e, 0xd8, 0xe8, 0xac, 0x81, 0x89, 0x8b, 0x49, 0x29, 0x9c, 0x08, - 0x5f, 0xd8, 0x54, 0x36, 0x7c, 0xcb, 0x95, 0x75, 0x02, 0x79, 0xa4, 0x06, 0xb6, 0x11, 0x9b, 0x5f, - 0x48, 0x66, 0x11, 0x45, 0x4b, 0xa7, 0x95, 0x3f, 0x07, 0x81, 0x58, 0x20, 0xd6, 0xa6, 0x07, 0x75, - 0x1f, 0x7e, 0xa6, 0x3b, 0xb6, 0xa9, 0xfb, 0xd8, 0x13, 0x35, 0x30, 0x6a, 0x42, 0x62, 0x78, 0x76, - 0xd5, 0xb7, 0x31, 0xca, 0x08, 0x8b, 0xc2, 0xf2, 0xe8, 0xda, 0x6d, 0xf5, 0xdc, 0xbc, 0xd5, 0xad, - 0xa6, 0x47, 0x7e, 0xf0, 0x69, 0x43, 0x4e, 0x69, 0x71, 0x10, 0xb1, 0x08, 0x80, 0x81, 0x5d, 0xd7, - 0x26, 0x24, 0x80, 0x4c, 0x53, 0x48, 0xb5, 0x07, 0xe4, 0x26, 0x77, 0xd0, 0x74, 0x1f, 0x12, 0x06, - 0x1b, 0xc3, 0x11, 0x1f, 0x82, 0x29, 0xd7, 0x46, 0x25, 0x02, 0x9d, 0x4a, 0xc9, 0x84, 0x0e, 0xb4, - 0x74, 0x1a, 0xf1, 0xc0, 0xa2, 0xb0, 0x3c, 0x92, 0xff, 0x38, 0x30, 0xff, 0xa3, 0x21, 0x2f, 0x59, - 0xb6, 0xbf, 0x57, 0x2b, 0xab, 0x06, 0x76, 0x19, 0x7b, 0xec, 0x67, 0x85, 0x98, 0xfb, 0x39, 0xbf, - 0x5e, 0x85, 0x44, 0xdd, 0x41, 0xfe, 0x59, 0x43, 0x96, 0xea, 0xba, 0xeb, 0xdc, 0x51, 0x3a, 0x40, - 0x2a, 0xda, 0xa4, 0x6b, 0xa3, 0x5d, 0xe8, 0x54, 0xb6, 0xf8, 0x98, 0xb8, 0x03, 0x26, 0x99, 0x05, - 0xf6, 0x4a, 0xba, 0x69, 0x7a, 0x90, 0x90, 0xcc, 0x20, 0x5d, 0x7b, 0xfe, 0xac, 0x21, 0x67, 0x42, - 0xb4, 0x36, 0x13, 0x45, 0x9b, 0xe0, 0x63, 0x77, 0xc3, 0xa1, 0x00, 0xea, 0x20, 0xe2, 0x9f, 0x43, - 0xdd, 0x48, 0x42, 0xb5, 0x99, 0x28, 0xda, 0x04, 0x1f, 0x8b, 0xa0, 0x3e, 0x04, 0x43, 0xd5, 0x5a, - 0x79, 0x1f, 0xd6, 0x33, 0x43, 0x94, 0xe5, 0x69, 0x35, 0x94, 0x9d, 0x1a, 0xc9, 0x4e, 0xbd, 0x8b, - 0xea, 0xf9, 0xcc, 0xaf, 0x3f, 0xad, 0x4c, 0x33, 0x2d, 0x19, 0x5e, 0xbd, 0xea, 0x63, 0xf5, 0xd3, - 0x5a, 0xf9, 0x23, 0x58, 0xd7, 0x98, 0xb7, 0xf8, 0x0e, 0xb8, 0x71, 0xa0, 0x3b, 0x35, 0x98, 0x79, - 0x85, 0xc2, 0xcc, 0xaa, 0xcc, 0x3a, 0xd0, 0x5a, 0xac, 0x44, 0x76, 0x54, 0xee, 0xd0, 0xfa, 0xce, - 0xf0, 0xe3, 0x63, 0x39, 0xf5, 0xfc, 0x58, 0x4e, 0x29, 0xf3, 0x40, 0x6a, 0x17, 0x97, 0x06, 0x49, - 0x15, 0x23, 0x02, 0x95, 0x6f, 0x07, 0xc0, 0x44, 0x81, 0x58, 0xdb, 0xa6, 0xed, 0x5f, 0xaf, 0xf2, - 0x36, 0x3a, 0x51, 0x9b, 0xa6, 0xd4, 0x8a, 0x67, 0x0d, 0x79, 0x2c, 0xa4, 0xf6, 0x1c, 0x42, 0x5d, - 0x30, 0xde, 0x94, 0x5c, 0xc9, 0xd3, 0x7d, 0xc8, 0x04, 0xb6, 0xd5, 0xa7, 0xb8, 0xb6, 0xa0, 0x71, - 0xd6, 0x90, 0x6f, 0x85, 0x0b, 0x25, 0xa0, 0x14, 0x6d, 0xcc, 0x68, 0x91, 0xb9, 0x78, 0xd4, 0x59, - 0xd3, 0xa1, 0xae, 0xee, 0x5d, 0xa3, 0x9e, 0x63, 0xa5, 0x93, 0x40, 0x26, 0x59, 0x1b, 0x5e, 0xb8, - 0x7f, 0x04, 0x30, 0x5a, 0x20, 0x16, 0xf3, 0x83, 0x9d, 0x77, 0x81, 0xf0, 0xe2, 0x76, 0x41, 0xfa, - 0x52, 0xbb, 0x60, 0x1d, 0x0c, 0xe9, 0x2e, 0xae, 0x21, 0x9f, 0xd6, 0xaa, 0x0f, 0xf9, 0x32, 0xf3, - 0x18, 0x09, 0x33, 0x60, 0x2a, 0x96, 0x27, 0xcf, 0xff, 0xb7, 0x34, 0x6d, 0x9a, 0x79, 0x68, 0xd9, - 0x48, 0x83, 0xe6, 0x35, 0xd0, 0x50, 0x04, 0x33, 0xcd, 0x1c, 0x89, 0x67, 0x24, 0xa8, 0x58, 0x3c, - 0x6b, 0xc8, 0xf3, 0x49, 0x2a, 0x62, 0x66, 0x8a, 0x36, 0xc5, 0xc7, 0x77, 0x3d, 0xa3, 0x23, 0xaa, - 0x49, 0x7c, 0x8e, 0x3a, 0xd0, 0x1d, 0x35, 0x66, 0x16, 0x47, 0xdd, 0x22, 0x7e, 0x3b, 0xcf, 0x83, - 0x97, 0xe5, 0x79, 0x9f, 0xf6, 0x89, 0x04, 0x9f, 0x11, 0xdd, 0x62, 0x81, 0xee, 0xbe, 0xaa, 0x03, - 0x03, 0x89, 0x96, 0x82, 0x13, 0x93, 0xb5, 0x05, 0xa9, 0xad, 0xaf, 0x15, 0xa3, 0xe3, 0x34, 0x3f, - 0x1c, 0x2c, 0xf5, 0xe4, 0x2f, 0x59, 0xa0, 0xbb, 0x8b, 0x39, 0x07, 0xd3, 0xca, 0x73, 0x01, 0xdc, - 0x2c, 0x10, 0xeb, 0x3e, 0x32, 0x5f, 0x7a, 0xfd, 0x56, 0xc0, 0x4c, 0x4b, 0xa6, 0xd7, 0x45, 0xe9, - 0x71, 0x1a, 0xcc, 0x07, 0x8d, 0x5e, 0x47, 0x06, 0x74, 0xee, 0xa3, 0x32, 0x46, 0xa6, 0x8d, 0xac, - 0x5e, 0xe7, 0xe4, 0xff, 0x96, 0x61, 0xf1, 0x75, 0x30, 0x6e, 0x04, 0x87, 0x5a, 0x40, 0xde, 0x1e, - 0xb4, 0xad, 0xbd, 0x50, 0xfb, 0x03, 0xda, 0x58, 0x34, 0x7c, 0x8f, 0x8e, 0xc6, 0x4a, 0xb1, 0x04, - 0x5e, 0x3b, 0x8f, 0x21, 0xde, 0x5b, 0x7e, 0x49, 0x83, 0xc9, 0x02, 0xb1, 0x8a, 0x78, 0x1f, 0x22, - 0xfb, 0x6b, 0xb8, 0xbb, 0xa7, 0x7b, 0x90, 0xbc, 0x6c, 0xfc, 0x15, 0xc1, 0x8c, 0xcf, 0x12, 0x34, - 0x4b, 0x24, 0x48, 0xb1, 0x84, 0x0f, 0x11, 0xf4, 0xd8, 0x11, 0x17, 0x6b, 0x44, 0x1d, 0xcd, 0x14, - 0x6d, 0x8a, 0x8f, 0x53, 0x82, 0x3e, 0x09, 0x46, 0x63, 0x64, 0x17, 0xc1, 0x6c, 0x1b, 0x87, 0x5c, - 0xfb, 0xcd, 0xa8, 0x85, 0x0b, 0x45, 0xad, 0xfc, 0x20, 0xd0, 0x33, 0x31, 0xe8, 0x50, 0xd0, 0xa5, - 0xe0, 0xa4, 0x82, 0xbd, 0x17, 0x5f, 0xa1, 0x66, 0x80, 0xe9, 0xcb, 0x6e, 0xfc, 0x2f, 0xc1, 0x62, - 0xb7, 0x48, 0xaf, 0xce, 0xc3, 0x37, 0x02, 0xc8, 0x06, 0xf4, 0x7a, 0x3a, 0x22, 0x15, 0xe8, 0xb5, - 0xd0, 0xac, 0x41, 0x03, 0x7b, 0xa6, 0xb8, 0x0e, 0x32, 0x51, 0x85, 0x58, 0xe1, 0x3c, 0x3a, 0x51, - 0xb2, 0x4d, 0xba, 0xda, 0xa0, 0xc6, 0x05, 0x10, 0x73, 0xdb, 0x31, 0xc5, 0x5b, 0x60, 0x88, 0x40, - 0x64, 0x42, 0x2f, 0x94, 0xa4, 0xc6, 0xde, 0xc4, 0x39, 0x30, 0x82, 0xe0, 0x21, 0x53, 0x09, 0x3d, - 0xae, 0xb4, 0x61, 0x04, 0x0f, 0x93, 0x85, 0x5f, 0x06, 0x4b, 0xe7, 0x47, 0xc6, 0xf7, 0xd9, 0xcf, - 0x02, 0x3d, 0xdb, 0xb7, 0x8f, 0xa0, 0x5b, 0xf5, 0xff, 0xeb, 0x9d, 0x2a, 0x96, 0xe1, 0x02, 0x98, - 0xeb, 0x10, 0x76, 0x94, 0xd6, 0xda, 0x8f, 0x23, 0x60, 0xa0, 0x40, 0x2c, 0xf1, 0x11, 0x18, 0x4f, - 0x7e, 0xd3, 0xad, 0xf6, 0xb8, 0x44, 0xb7, 0xdf, 0xd4, 0xa5, 0xf7, 0x2e, 0xec, 0xc2, 0xd5, 0x55, - 0x07, 0x37, 0x5b, 0x2f, 0xf6, 0xb9, 0xde, 0x58, 0x2d, 0x0e, 0xd2, 0xfa, 0x05, 0x1d, 0xf8, 0xd2, - 0x5f, 0x81, 0x61, 0x7e, 0x35, 0xbd, 0xdd, 0x1b, 0x24, 0xb2, 0x95, 0xd6, 0xfa, 0xb7, 0xe5, 0x6b, - 0x3d, 0x02, 0xe3, 0xc9, 0x6b, 0x60, 0x1f, 0x3c, 0x27, 0x5c, 0xfa, 0xe1, 0xb9, 0xdb, 0xe5, 0xa8, - 0x0a, 0x40, 0xec, 0x26, 0xf3, 0x46, 0x6f, 0xa0, 0xa6, 0xb5, 0xf4, 0xf6, 0x45, 0xac, 0xf9, 0x8a, - 0xdf, 0x09, 0x60, 0xb6, 0xfb, 0x49, 0xff, 0x7e, 0x1f, 0x92, 0xe9, 0xe6, 0x2c, 0x6d, 0x5e, 0xc1, - 0x99, 0xc7, 0xf7, 0x10, 0x8c, 0x25, 0x4e, 0xcf, 0x37, 0x7b, 0xc3, 0xb6, 0x7a, 0x48, 0xef, 0x5e, - 0xd4, 0x83, 0xaf, 0xfe, 0x58, 0x00, 0xaf, 0xc6, 0xfb, 0xae, 0xd8, 0x87, 0x8c, 0x3b, 0xf6, 0x69, - 0x69, 0xe3, 0x92, 0x8e, 0x3c, 0x94, 0xef, 0x05, 0x30, 0x77, 0x5e, 0x93, 0xfe, 0xa0, 0x8f, 0x24, - 0xbb, 0xbb, 0x4b, 0xdb, 0x57, 0x72, 0x8f, 0xa2, 0xcc, 0x7f, 0xfe, 0xf4, 0x24, 0x2b, 0x3c, 0x3b, - 0xc9, 0x0a, 0x7f, 0x9f, 0x64, 0x85, 0x27, 0xa7, 0xd9, 0xd4, 0xb3, 0xd3, 0x6c, 0xea, 0xf7, 0xd3, - 0x6c, 0xea, 0x8b, 0x8d, 0xd8, 0x57, 0xae, 0xfd, 0xc0, 0xa9, 0x05, 0xdf, 0xc7, 0x36, 0x32, 0x72, - 0xe1, 0xb2, 0xb6, 0x5f, 0x5f, 0x61, 0x4b, 0xae, 0xb8, 0xd8, 0xac, 0x39, 0x30, 0x77, 0x14, 0xfd, - 0xb9, 0x15, 0x7e, 0x02, 0x97, 0x87, 0xe8, 0x25, 0xf6, 0xad, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, - 0x55, 0xae, 0x8f, 0x71, 0xca, 0x13, 0x00, 0x00, + // 1243 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x41, 0x6f, 0xe3, 0xc4, + 0x17, 0x8f, 0xd3, 0x6e, 0xff, 0xdd, 0xd9, 0xff, 0xb6, 0x5d, 0xb7, 0x5d, 0xa5, 0x6e, 0x1b, 0x57, + 0x16, 0x2a, 0xd5, 0x8a, 0x3a, 0xb4, 0x80, 0x0a, 0x45, 0xa8, 0xda, 0xb4, 0x45, 0x5b, 0x41, 0x04, + 0x72, 0xb3, 0x48, 0xc0, 0x21, 0x72, 0xec, 0x89, 0x6b, 0x6a, 0xcf, 0x64, 0x3d, 0x4e, 0xdb, 0xa0, + 0x95, 0x56, 0xe2, 0xb4, 0xc7, 0x3d, 0x22, 0x24, 0xa4, 0x4a, 0x5c, 0xf8, 0x00, 0xcb, 0x17, 0xe0, + 0xb4, 0xe2, 0x80, 0xf6, 0x88, 0x40, 0x0a, 0xa8, 0x95, 0xd0, 0x9e, 0xfb, 0x09, 0x90, 0xc7, 0xe3, + 0x89, 0xe3, 0x24, 0x4d, 0xd2, 0x6e, 0x25, 0xd8, 0x53, 0xec, 0x99, 0xf7, 0x7e, 0xf3, 0xde, 0xef, + 0xfd, 0xe6, 0xcd, 0x38, 0x20, 0x43, 0x7c, 0x7d, 0xdf, 0x46, 0x56, 0xee, 0x60, 0xa5, 0x0c, 0x7d, + 0x7d, 0x25, 0xe7, 0x1f, 0xa9, 0x55, 0x0f, 0xfb, 0x58, 0x9c, 0x77, 0xec, 0x07, 0x35, 0xdb, 0x64, + 0xf3, 0x6a, 0xf4, 0xcb, 0xec, 0xa4, 0x19, 0x0b, 0x63, 0xcb, 0x81, 0x39, 0x6a, 0x5c, 0xae, 0x55, + 0x72, 0x3a, 0xaa, 0x87, 0x9e, 0x92, 0x9c, 0x9c, 0xf2, 0x6d, 0x17, 0x12, 0x5f, 0x77, 0xab, 0xcc, + 0x60, 0xca, 0xc2, 0x16, 0xa6, 0x8f, 0xb9, 0xe0, 0x89, 0x8d, 0xce, 0x18, 0x98, 0xb8, 0x98, 0x94, + 0xc2, 0x89, 0xf0, 0x85, 0x4d, 0x65, 0xc3, 0xb7, 0x5c, 0x59, 0x27, 0x90, 0x47, 0x6a, 0x60, 0x1b, + 0xb1, 0xf9, 0xf9, 0x64, 0x16, 0x51, 0xb4, 0x74, 0x5a, 0xf9, 0x63, 0x18, 0x88, 0x05, 0x62, 0x6d, + 0x7a, 0x50, 0xf7, 0xe1, 0x67, 0xba, 0x63, 0x9b, 0xba, 0x8f, 0x3d, 0x51, 0x03, 0x37, 0x4c, 0x48, + 0x0c, 0xcf, 0xae, 0xfa, 0x36, 0x46, 0x19, 0x61, 0x41, 0x58, 0xba, 0xb1, 0x7a, 0x47, 0x3d, 0x37, + 0x6f, 0x75, 0xab, 0xe9, 0x91, 0x1f, 0x7e, 0xd6, 0x90, 0x53, 0x5a, 0x1c, 0x44, 0x2c, 0x02, 0x60, + 0x60, 0xd7, 0xb5, 0x09, 0x09, 0x20, 0xd3, 0x14, 0x52, 0xed, 0x01, 0xb9, 0xc9, 0x1d, 0x34, 0xdd, + 0x87, 0x84, 0xc1, 0xc6, 0x70, 0xc4, 0x87, 0x60, 0xd2, 0xb5, 0x51, 0x89, 0x40, 0xa7, 0x52, 0x32, + 0xa1, 0x03, 0x2d, 0x9d, 0x46, 0x3c, 0xb4, 0x20, 0x2c, 0x5d, 0xcf, 0x7f, 0x1c, 0x98, 0xff, 0xde, + 0x90, 0x17, 0x2d, 0xdb, 0xdf, 0xab, 0x95, 0x55, 0x03, 0xbb, 0x8c, 0x3d, 0xf6, 0xb3, 0x4c, 0xcc, + 0xfd, 0x9c, 0x5f, 0xaf, 0x42, 0xa2, 0xee, 0x20, 0xff, 0xac, 0x21, 0x4b, 0x75, 0xdd, 0x75, 0xd6, + 0x95, 0x0e, 0x90, 0x8a, 0x76, 0xcb, 0xb5, 0xd1, 0x2e, 0x74, 0x2a, 0x5b, 0x7c, 0x4c, 0xdc, 0x01, + 0xb7, 0x98, 0x05, 0xf6, 0x4a, 0xba, 0x69, 0x7a, 0x90, 0x90, 0xcc, 0x30, 0x5d, 0x7b, 0xee, 0xac, + 0x21, 0x67, 0x42, 0xb4, 0x36, 0x13, 0x45, 0x9b, 0xe0, 0x63, 0x77, 0xc3, 0xa1, 0x00, 0xea, 0x20, + 0xe2, 0x9f, 0x43, 0x5d, 0x4b, 0x42, 0xb5, 0x99, 0x28, 0xda, 0x04, 0x1f, 0x8b, 0xa0, 0x3e, 0x04, + 0x23, 0xd5, 0x5a, 0x79, 0x1f, 0xd6, 0x33, 0x23, 0x94, 0xe5, 0x29, 0x35, 0x94, 0x9d, 0x1a, 0xc9, + 0x4e, 0xbd, 0x8b, 0xea, 0xf9, 0xcc, 0x2f, 0x4f, 0x97, 0xa7, 0x98, 0x96, 0x0c, 0xaf, 0x5e, 0xf5, + 0xb1, 0xfa, 0x69, 0xad, 0xfc, 0x11, 0xac, 0x6b, 0xcc, 0x5b, 0x7c, 0x07, 0x5c, 0x3b, 0xd0, 0x9d, + 0x1a, 0xcc, 0xfc, 0x8f, 0xc2, 0xcc, 0xa8, 0xcc, 0x3a, 0xd0, 0x5a, 0xac, 0x44, 0x76, 0x54, 0xee, + 0xd0, 0x7a, 0x7d, 0xf4, 0xf1, 0xb1, 0x9c, 0x7a, 0x71, 0x2c, 0xa7, 0x94, 0x39, 0x20, 0xb5, 0x8b, + 0x4b, 0x83, 0xa4, 0x8a, 0x11, 0x81, 0xca, 0x77, 0x43, 0x60, 0xa2, 0x40, 0xac, 0x6d, 0xd3, 0xf6, + 0xaf, 0x56, 0x79, 0x1b, 0x9d, 0xa8, 0x4d, 0x53, 0x6a, 0xc5, 0xb3, 0x86, 0x3c, 0x16, 0x52, 0x7b, + 0x0e, 0xa1, 0x2e, 0x18, 0x6f, 0x4a, 0xae, 0xe4, 0xe9, 0x3e, 0x64, 0x02, 0xdb, 0xea, 0x53, 0x5c, + 0x5b, 0xd0, 0x38, 0x6b, 0xc8, 0xb7, 0xc3, 0x85, 0x12, 0x50, 0x8a, 0x36, 0x66, 0xb4, 0xc8, 0x5c, + 0x3c, 0xea, 0xac, 0xe9, 0x50, 0x57, 0xf7, 0xae, 0x50, 0xcf, 0xb1, 0xd2, 0x49, 0x20, 0x93, 0xac, + 0x0d, 0x2f, 0xdc, 0xdf, 0x02, 0xb8, 0x51, 0x20, 0x16, 0xf3, 0x83, 0x9d, 0x77, 0x81, 0xf0, 0xf2, + 0x76, 0x41, 0xfa, 0x42, 0xbb, 0x60, 0x0d, 0x8c, 0xe8, 0x2e, 0xae, 0x21, 0x9f, 0xd6, 0xaa, 0x0f, + 0xf9, 0x32, 0xf3, 0x18, 0x09, 0xd3, 0x60, 0x32, 0x96, 0x27, 0xcf, 0xff, 0xd7, 0x34, 0x6d, 0x9a, + 0x79, 0x68, 0xd9, 0x48, 0x83, 0xe6, 0x15, 0xd0, 0x50, 0x04, 0xd3, 0xcd, 0x1c, 0x89, 0x67, 0x24, + 0xa8, 0x58, 0x38, 0x6b, 0xc8, 0x73, 0x49, 0x2a, 0x62, 0x66, 0x8a, 0x36, 0xc9, 0xc7, 0x77, 0x3d, + 0xa3, 0x23, 0xaa, 0x49, 0x7c, 0x8e, 0x3a, 0xd4, 0x1d, 0x35, 0x66, 0x16, 0x47, 0xdd, 0x22, 0x7e, + 0x3b, 0xcf, 0xc3, 0x17, 0xe5, 0x79, 0x9f, 0xf6, 0x89, 0x04, 0x9f, 0x11, 0xdd, 0x62, 0x81, 0xee, + 0xbe, 0xaa, 0x03, 0x03, 0x89, 0x96, 0x82, 0x13, 0x93, 0xb5, 0x05, 0xa9, 0xad, 0xaf, 0x15, 0xa3, + 0xe3, 0x34, 0x3f, 0x1a, 0x2c, 0xf5, 0xe4, 0x4f, 0x59, 0xa0, 0xbb, 0x8b, 0x39, 0x07, 0xd3, 0xca, + 0x0b, 0x01, 0xdc, 0x2c, 0x10, 0xeb, 0x3e, 0x32, 0x5f, 0x79, 0xfd, 0x56, 0xc0, 0x74, 0x4b, 0xa6, + 0x57, 0x45, 0xe9, 0x71, 0x1a, 0xcc, 0x05, 0x8d, 0x5e, 0x47, 0x06, 0x74, 0xee, 0xa3, 0x32, 0x46, + 0xa6, 0x8d, 0xac, 0x5e, 0xe7, 0xe4, 0x7f, 0x96, 0x61, 0xf1, 0x75, 0x30, 0x6e, 0x04, 0x87, 0x5a, + 0x40, 0xde, 0x1e, 0xb4, 0xad, 0xbd, 0x50, 0xfb, 0x43, 0xda, 0x58, 0x34, 0x7c, 0x8f, 0x8e, 0xc6, + 0x4a, 0xb1, 0x08, 0x5e, 0x3b, 0x8f, 0x21, 0xde, 0x5b, 0x7e, 0x4e, 0x83, 0x5b, 0x05, 0x62, 0x15, + 0xf1, 0x3e, 0x44, 0xf6, 0xd7, 0x70, 0x77, 0x4f, 0xf7, 0x20, 0x79, 0xd5, 0xf8, 0x2b, 0x82, 0x69, + 0x9f, 0x25, 0x68, 0x96, 0x48, 0x90, 0x62, 0x09, 0x1f, 0x22, 0xe8, 0xb1, 0x23, 0x2e, 0xd6, 0x88, + 0x3a, 0x9a, 0x29, 0xda, 0x24, 0x1f, 0xa7, 0x04, 0x7d, 0x12, 0x8c, 0xc6, 0xc8, 0x2e, 0x82, 0x99, + 0x36, 0x0e, 0xb9, 0xf6, 0x9b, 0x51, 0x0b, 0x03, 0x45, 0xad, 0xfc, 0x28, 0xd0, 0x33, 0x31, 0xe8, + 0x50, 0xd0, 0xa5, 0xe0, 0xa4, 0x82, 0xbd, 0x97, 0x5f, 0xa1, 0x66, 0x80, 0xe9, 0x8b, 0x6e, 0xfc, + 0x2f, 0xc1, 0x42, 0xb7, 0x48, 0x2f, 0xcf, 0xc3, 0xb7, 0x02, 0xc8, 0x06, 0xf4, 0x7a, 0x3a, 0x22, + 0x15, 0xe8, 0xb5, 0xd0, 0xac, 0x41, 0x03, 0x7b, 0xa6, 0xb8, 0x06, 0x32, 0x51, 0x85, 0x58, 0xe1, + 0x3c, 0x3a, 0x51, 0xb2, 0x4d, 0xba, 0xda, 0xb0, 0xc6, 0x05, 0x10, 0x73, 0xdb, 0x31, 0xc5, 0xdb, + 0x60, 0x84, 0x40, 0x64, 0x42, 0x2f, 0x94, 0xa4, 0xc6, 0xde, 0xc4, 0x59, 0x70, 0x1d, 0xc1, 0x43, + 0xa6, 0x12, 0x7a, 0x5c, 0x69, 0xa3, 0x08, 0x1e, 0x26, 0x0b, 0xbf, 0x04, 0x16, 0xcf, 0x8f, 0x8c, + 0xef, 0xb3, 0x9f, 0x04, 0x7a, 0xb6, 0x6f, 0x1f, 0x41, 0xb7, 0xea, 0xff, 0xdb, 0x3b, 0x55, 0x2c, + 0xc3, 0x79, 0x30, 0xdb, 0x21, 0xec, 0x28, 0xad, 0xd5, 0xa7, 0x00, 0x0c, 0x15, 0x88, 0x25, 0x3e, + 0x02, 0xe3, 0xc9, 0x6f, 0xba, 0x95, 0x1e, 0x97, 0xe8, 0xf6, 0x9b, 0xba, 0xf4, 0xde, 0xc0, 0x2e, + 0x5c, 0x5d, 0x75, 0x70, 0xb3, 0xf5, 0x62, 0x9f, 0xeb, 0x8d, 0xd5, 0xe2, 0x20, 0xad, 0x0d, 0xe8, + 0xc0, 0x97, 0xfe, 0x0a, 0x8c, 0xf2, 0xab, 0xe9, 0x9d, 0xde, 0x20, 0x91, 0xad, 0xb4, 0xda, 0xbf, + 0x2d, 0x5f, 0xeb, 0x11, 0x18, 0x4f, 0x5e, 0x03, 0xfb, 0xe0, 0x39, 0xe1, 0xd2, 0x0f, 0xcf, 0xdd, + 0x2e, 0x47, 0x55, 0x00, 0x62, 0x37, 0x99, 0x37, 0x7a, 0x03, 0x35, 0xad, 0xa5, 0xb7, 0x07, 0xb1, + 0xe6, 0x2b, 0x7e, 0x2f, 0x80, 0x99, 0xee, 0x27, 0xfd, 0xfb, 0x7d, 0x48, 0xa6, 0x9b, 0xb3, 0xb4, + 0x79, 0x09, 0x67, 0x1e, 0xdf, 0x43, 0x30, 0x96, 0x38, 0x3d, 0xdf, 0xec, 0x0d, 0xdb, 0xea, 0x21, + 0xbd, 0x3b, 0xa8, 0x07, 0x5f, 0xfd, 0xb1, 0x00, 0xfe, 0x1f, 0xef, 0xbb, 0x62, 0x1f, 0x32, 0xee, + 0xd8, 0xa7, 0xa5, 0x8d, 0x0b, 0x3a, 0xf2, 0x50, 0x7e, 0x10, 0xc0, 0xec, 0x79, 0x4d, 0xfa, 0x83, + 0x3e, 0x92, 0xec, 0xee, 0x2e, 0x6d, 0x5f, 0xca, 0x9d, 0x47, 0xf9, 0x8d, 0x00, 0x26, 0xda, 0xba, + 0x70, 0x1f, 0x5b, 0x31, 0xe9, 0x23, 0xad, 0x0f, 0xee, 0x13, 0x05, 0x91, 0xff, 0xfc, 0xd9, 0x49, + 0x56, 0x78, 0x7e, 0x92, 0x15, 0xfe, 0x3a, 0xc9, 0x0a, 0x4f, 0x4e, 0xb3, 0xa9, 0xe7, 0xa7, 0xd9, + 0xd4, 0x6f, 0xa7, 0xd9, 0xd4, 0x17, 0x1b, 0xb1, 0x4f, 0x6d, 0xfb, 0x81, 0x53, 0x0b, 0x3e, 0xd2, + 0x6d, 0x64, 0xe4, 0xc2, 0xb5, 0x6c, 0xbf, 0xbe, 0xcc, 0xd6, 0x59, 0x76, 0xb1, 0x59, 0x73, 0x60, + 0xee, 0x28, 0xfa, 0x87, 0x2d, 0xfc, 0x0e, 0x2f, 0x8f, 0xd0, 0x9b, 0xf4, 0x5b, 0xff, 0x04, 0x00, + 0x00, 0xff, 0xff, 0xe6, 0x2d, 0x31, 0xf7, 0x4f, 0x14, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -997,6 +998,9 @@ type MsgClient interface { // TransferTokenizeShareRecord defines a method to transfer ownership of // TokenizeShareRecord TransferTokenizeShareRecord(ctx context.Context, in *MsgTransferTokenizeShareRecord, opts ...grpc.CallOption) (*MsgTransferTokenizeShareRecordResponse, error) + // ExemptDelegation defines a method for performing exemption of + // delegated coins from a delegator to a validator. + ExemptDelegation(ctx context.Context, in *MsgExemptDelegation, opts ...grpc.CallOption) (*MsgExemptDelegationResponse, error) } type msgClient struct { @@ -1088,6 +1092,15 @@ func (c *msgClient) TransferTokenizeShareRecord(ctx context.Context, in *MsgTran return out, nil } +func (c *msgClient) ExemptDelegation(ctx context.Context, in *MsgExemptDelegation, opts ...grpc.CallOption) (*MsgExemptDelegationResponse, error) { + out := new(MsgExemptDelegationResponse) + err := c.cc.Invoke(ctx, "/liquidstaking.staking.v1beta1.Msg/ExemptDelegation", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // CreateValidator defines a method for creating a new validator. @@ -1116,6 +1129,9 @@ type MsgServer interface { // TransferTokenizeShareRecord defines a method to transfer ownership of // TokenizeShareRecord TransferTokenizeShareRecord(context.Context, *MsgTransferTokenizeShareRecord) (*MsgTransferTokenizeShareRecordResponse, error) + // ExemptDelegation defines a method for performing exemption of + // delegated coins from a delegator to a validator. + ExemptDelegation(context.Context, *MsgExemptDelegation) (*MsgExemptDelegationResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -1149,6 +1165,9 @@ func (*UnimplementedMsgServer) RedeemTokens(ctx context.Context, req *MsgRedeemT func (*UnimplementedMsgServer) TransferTokenizeShareRecord(ctx context.Context, req *MsgTransferTokenizeShareRecord) (*MsgTransferTokenizeShareRecordResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TransferTokenizeShareRecord not implemented") } +func (*UnimplementedMsgServer) ExemptDelegation(ctx context.Context, req *MsgExemptDelegation) (*MsgExemptDelegationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExemptDelegation not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -1316,6 +1335,24 @@ func _Msg_TransferTokenizeShareRecord_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _Msg_ExemptDelegation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgExemptDelegation) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).ExemptDelegation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/liquidstaking.staking.v1beta1.Msg/ExemptDelegation", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).ExemptDelegation(ctx, req.(*MsgExemptDelegation)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "liquidstaking.staking.v1beta1.Msg", HandlerType: (*MsgServer)(nil), @@ -1356,6 +1393,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "TransferTokenizeShareRecord", Handler: _Msg_TransferTokenizeShareRecord_Handler, }, + { + MethodName: "ExemptDelegation", + Handler: _Msg_ExemptDelegation_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "staking/v1beta1/tx.proto", diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 99ecb71a..d39bc13c 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -47,17 +47,16 @@ func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey, descriptio } return Validator{ - OperatorAddress: operator.String(), - ConsensusPubkey: pkAny, - Jailed: false, - Status: sdkstaking.Unbonded, - Tokens: sdk.ZeroInt(), - DelegatorShares: sdk.ZeroDec(), - Description: description, - UnbondingHeight: int64(0), - UnbondingTime: time.Unix(0, 0).UTC(), - Commission: NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), - MinSelfDelegation: sdk.OneInt(), + OperatorAddress: operator.String(), + ConsensusPubkey: pkAny, + Jailed: false, + Status: sdkstaking.Unbonded, + Tokens: sdk.ZeroInt(), + DelegatorShares: sdk.ZeroDec(), + Description: description, + UnbondingHeight: int64(0), + UnbondingTime: time.Unix(0, 0).UTC(), + Commission: NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), }, nil } @@ -451,7 +450,6 @@ func (v *Validator) MinEqual(other *Validator) bool { v.Description.Equal(other.Description) && v.Commission.Equal(other.Commission) && v.Jailed == other.Jailed && - v.MinSelfDelegation.Equal(other.MinSelfDelegation) && v.ConsensusPubkey.Equal(other.ConsensusPubkey) } @@ -518,9 +516,8 @@ func (v Validator) GetBondedTokens() sdk.Int { return v.BondedTokens() } func (v Validator) GetConsensusPower(r sdk.Int) int64 { return v.ConsensusPower(r) } -func (v Validator) GetCommission() sdk.Dec { return v.Commission.Rate } -func (v Validator) GetMinSelfDelegation() sdk.Int { return v.MinSelfDelegation } -func (v Validator) GetDelegatorShares() sdk.Dec { return v.DelegatorShares } +func (v Validator) GetCommission() sdk.Dec { return v.Commission.Rate } +func (v Validator) GetDelegatorShares() sdk.Dec { return v.DelegatorShares } // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces func (v Validator) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { From a9d0262b7cc6c9d38dca00233577e3e9fa54231d Mon Sep 17 00:00:00 2001 From: junkai121 Date: Thu, 28 Jul 2022 09:48:08 +0800 Subject: [PATCH 42/57] proto-gen again --- x/staking/types/tx.pb.go | 283 +++++++++++++-------------------------- 1 file changed, 90 insertions(+), 193 deletions(-) diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index 768a5101..6a64eb88 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -38,13 +38,12 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // MsgCreateValidator defines a SDK message for creating a new validator. type MsgCreateValidator struct { - Description Description `protobuf:"bytes,1,opt,name=description,proto3" json:"description"` - Commission CommissionRates `protobuf:"bytes,2,opt,name=commission,proto3" json:"commission"` - MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation" yaml:"min_self_delegation"` - DelegatorAddress string `protobuf:"bytes,4,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` - ValidatorAddress string `protobuf:"bytes,5,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` - Pubkey *types.Any `protobuf:"bytes,6,opt,name=pubkey,proto3" json:"pubkey,omitempty"` - Value types1.Coin `protobuf:"bytes,7,opt,name=value,proto3" json:"value"` + Description Description `protobuf:"bytes,1,opt,name=description,proto3" json:"description"` + Commission CommissionRates `protobuf:"bytes,2,opt,name=commission,proto3" json:"commission"` + DelegatorAddress string `protobuf:"bytes,3,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorAddress string `protobuf:"bytes,4,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` + Pubkey *types.Any `protobuf:"bytes,5,opt,name=pubkey,proto3" json:"pubkey,omitempty"` + Value types1.Coin `protobuf:"bytes,6,opt,name=value,proto3" json:"value"` } func (m *MsgCreateValidator) Reset() { *m = MsgCreateValidator{} } @@ -125,8 +124,7 @@ type MsgEditValidator struct { // it's not mandatory to update. If not updated, the deserialized rate will be // zero with no way to distinguish if an update was intended. // REF: #2373 - CommissionRate *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=commission_rate,json=commissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"commission_rate,omitempty" yaml:"commission_rate"` - MinSelfDelegation *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation,omitempty" yaml:"min_self_delegation"` + CommissionRate *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=commission_rate,json=commissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"commission_rate,omitempty" yaml:"commission_rate"` } func (m *MsgEditValidator) Reset() { *m = MsgEditValidator{} } @@ -879,85 +877,82 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/tx.proto", fileDescriptor_dc1f14f20335eae7) } var fileDescriptor_dc1f14f20335eae7 = []byte{ - // 1243 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x41, 0x6f, 0xe3, 0xc4, - 0x17, 0x8f, 0xd3, 0x6e, 0xff, 0xdd, 0xd9, 0xff, 0xb6, 0x5d, 0xb7, 0x5d, 0xa5, 0x6e, 0x1b, 0x57, - 0x16, 0x2a, 0xd5, 0x8a, 0x3a, 0xb4, 0x80, 0x0a, 0x45, 0xa8, 0xda, 0xb4, 0x45, 0x5b, 0x41, 0x04, - 0x72, 0xb3, 0x48, 0xc0, 0x21, 0x72, 0xec, 0x89, 0x6b, 0x6a, 0xcf, 0x64, 0x3d, 0x4e, 0xdb, 0xa0, - 0x95, 0x56, 0xe2, 0xb4, 0xc7, 0x3d, 0x22, 0x24, 0xa4, 0x4a, 0x5c, 0xf8, 0x00, 0xcb, 0x17, 0xe0, - 0xb4, 0xe2, 0x80, 0xf6, 0x88, 0x40, 0x0a, 0xa8, 0x95, 0xd0, 0x9e, 0xfb, 0x09, 0x90, 0xc7, 0xe3, - 0x89, 0xe3, 0x24, 0x4d, 0xd2, 0x6e, 0x25, 0xd8, 0x53, 0xec, 0x99, 0xf7, 0x7e, 0xf3, 0xde, 0xef, - 0xfd, 0xe6, 0xcd, 0x38, 0x20, 0x43, 0x7c, 0x7d, 0xdf, 0x46, 0x56, 0xee, 0x60, 0xa5, 0x0c, 0x7d, - 0x7d, 0x25, 0xe7, 0x1f, 0xa9, 0x55, 0x0f, 0xfb, 0x58, 0x9c, 0x77, 0xec, 0x07, 0x35, 0xdb, 0x64, - 0xf3, 0x6a, 0xf4, 0xcb, 0xec, 0xa4, 0x19, 0x0b, 0x63, 0xcb, 0x81, 0x39, 0x6a, 0x5c, 0xae, 0x55, - 0x72, 0x3a, 0xaa, 0x87, 0x9e, 0x92, 0x9c, 0x9c, 0xf2, 0x6d, 0x17, 0x12, 0x5f, 0x77, 0xab, 0xcc, - 0x60, 0xca, 0xc2, 0x16, 0xa6, 0x8f, 0xb9, 0xe0, 0x89, 0x8d, 0xce, 0x18, 0x98, 0xb8, 0x98, 0x94, - 0xc2, 0x89, 0xf0, 0x85, 0x4d, 0x65, 0xc3, 0xb7, 0x5c, 0x59, 0x27, 0x90, 0x47, 0x6a, 0x60, 0x1b, - 0xb1, 0xf9, 0xf9, 0x64, 0x16, 0x51, 0xb4, 0x74, 0x5a, 0xf9, 0x63, 0x18, 0x88, 0x05, 0x62, 0x6d, - 0x7a, 0x50, 0xf7, 0xe1, 0x67, 0xba, 0x63, 0x9b, 0xba, 0x8f, 0x3d, 0x51, 0x03, 0x37, 0x4c, 0x48, - 0x0c, 0xcf, 0xae, 0xfa, 0x36, 0x46, 0x19, 0x61, 0x41, 0x58, 0xba, 0xb1, 0x7a, 0x47, 0x3d, 0x37, - 0x6f, 0x75, 0xab, 0xe9, 0x91, 0x1f, 0x7e, 0xd6, 0x90, 0x53, 0x5a, 0x1c, 0x44, 0x2c, 0x02, 0x60, - 0x60, 0xd7, 0xb5, 0x09, 0x09, 0x20, 0xd3, 0x14, 0x52, 0xed, 0x01, 0xb9, 0xc9, 0x1d, 0x34, 0xdd, - 0x87, 0x84, 0xc1, 0xc6, 0x70, 0xc4, 0x87, 0x60, 0xd2, 0xb5, 0x51, 0x89, 0x40, 0xa7, 0x52, 0x32, - 0xa1, 0x03, 0x2d, 0x9d, 0x46, 0x3c, 0xb4, 0x20, 0x2c, 0x5d, 0xcf, 0x7f, 0x1c, 0x98, 0xff, 0xde, - 0x90, 0x17, 0x2d, 0xdb, 0xdf, 0xab, 0x95, 0x55, 0x03, 0xbb, 0x8c, 0x3d, 0xf6, 0xb3, 0x4c, 0xcc, - 0xfd, 0x9c, 0x5f, 0xaf, 0x42, 0xa2, 0xee, 0x20, 0xff, 0xac, 0x21, 0x4b, 0x75, 0xdd, 0x75, 0xd6, - 0x95, 0x0e, 0x90, 0x8a, 0x76, 0xcb, 0xb5, 0xd1, 0x2e, 0x74, 0x2a, 0x5b, 0x7c, 0x4c, 0xdc, 0x01, - 0xb7, 0x98, 0x05, 0xf6, 0x4a, 0xba, 0x69, 0x7a, 0x90, 0x90, 0xcc, 0x30, 0x5d, 0x7b, 0xee, 0xac, - 0x21, 0x67, 0x42, 0xb4, 0x36, 0x13, 0x45, 0x9b, 0xe0, 0x63, 0x77, 0xc3, 0xa1, 0x00, 0xea, 0x20, - 0xe2, 0x9f, 0x43, 0x5d, 0x4b, 0x42, 0xb5, 0x99, 0x28, 0xda, 0x04, 0x1f, 0x8b, 0xa0, 0x3e, 0x04, - 0x23, 0xd5, 0x5a, 0x79, 0x1f, 0xd6, 0x33, 0x23, 0x94, 0xe5, 0x29, 0x35, 0x94, 0x9d, 0x1a, 0xc9, - 0x4e, 0xbd, 0x8b, 0xea, 0xf9, 0xcc, 0x2f, 0x4f, 0x97, 0xa7, 0x98, 0x96, 0x0c, 0xaf, 0x5e, 0xf5, - 0xb1, 0xfa, 0x69, 0xad, 0xfc, 0x11, 0xac, 0x6b, 0xcc, 0x5b, 0x7c, 0x07, 0x5c, 0x3b, 0xd0, 0x9d, - 0x1a, 0xcc, 0xfc, 0x8f, 0xc2, 0xcc, 0xa8, 0xcc, 0x3a, 0xd0, 0x5a, 0xac, 0x44, 0x76, 0x54, 0xee, - 0xd0, 0x7a, 0x7d, 0xf4, 0xf1, 0xb1, 0x9c, 0x7a, 0x71, 0x2c, 0xa7, 0x94, 0x39, 0x20, 0xb5, 0x8b, - 0x4b, 0x83, 0xa4, 0x8a, 0x11, 0x81, 0xca, 0x77, 0x43, 0x60, 0xa2, 0x40, 0xac, 0x6d, 0xd3, 0xf6, - 0xaf, 0x56, 0x79, 0x1b, 0x9d, 0xa8, 0x4d, 0x53, 0x6a, 0xc5, 0xb3, 0x86, 0x3c, 0x16, 0x52, 0x7b, - 0x0e, 0xa1, 0x2e, 0x18, 0x6f, 0x4a, 0xae, 0xe4, 0xe9, 0x3e, 0x64, 0x02, 0xdb, 0xea, 0x53, 0x5c, - 0x5b, 0xd0, 0x38, 0x6b, 0xc8, 0xb7, 0xc3, 0x85, 0x12, 0x50, 0x8a, 0x36, 0x66, 0xb4, 0xc8, 0x5c, - 0x3c, 0xea, 0xac, 0xe9, 0x50, 0x57, 0xf7, 0xae, 0x50, 0xcf, 0xb1, 0xd2, 0x49, 0x20, 0x93, 0xac, - 0x0d, 0x2f, 0xdc, 0xdf, 0x02, 0xb8, 0x51, 0x20, 0x16, 0xf3, 0x83, 0x9d, 0x77, 0x81, 0xf0, 0xf2, - 0x76, 0x41, 0xfa, 0x42, 0xbb, 0x60, 0x0d, 0x8c, 0xe8, 0x2e, 0xae, 0x21, 0x9f, 0xd6, 0xaa, 0x0f, - 0xf9, 0x32, 0xf3, 0x18, 0x09, 0xd3, 0x60, 0x32, 0x96, 0x27, 0xcf, 0xff, 0xd7, 0x34, 0x6d, 0x9a, - 0x79, 0x68, 0xd9, 0x48, 0x83, 0xe6, 0x15, 0xd0, 0x50, 0x04, 0xd3, 0xcd, 0x1c, 0x89, 0x67, 0x24, - 0xa8, 0x58, 0x38, 0x6b, 0xc8, 0x73, 0x49, 0x2a, 0x62, 0x66, 0x8a, 0x36, 0xc9, 0xc7, 0x77, 0x3d, - 0xa3, 0x23, 0xaa, 0x49, 0x7c, 0x8e, 0x3a, 0xd4, 0x1d, 0x35, 0x66, 0x16, 0x47, 0xdd, 0x22, 0x7e, - 0x3b, 0xcf, 0xc3, 0x17, 0xe5, 0x79, 0x9f, 0xf6, 0x89, 0x04, 0x9f, 0x11, 0xdd, 0x62, 0x81, 0xee, - 0xbe, 0xaa, 0x03, 0x03, 0x89, 0x96, 0x82, 0x13, 0x93, 0xb5, 0x05, 0xa9, 0xad, 0xaf, 0x15, 0xa3, - 0xe3, 0x34, 0x3f, 0x1a, 0x2c, 0xf5, 0xe4, 0x4f, 0x59, 0xa0, 0xbb, 0x8b, 0x39, 0x07, 0xd3, 0xca, - 0x0b, 0x01, 0xdc, 0x2c, 0x10, 0xeb, 0x3e, 0x32, 0x5f, 0x79, 0xfd, 0x56, 0xc0, 0x74, 0x4b, 0xa6, - 0x57, 0x45, 0xe9, 0x71, 0x1a, 0xcc, 0x05, 0x8d, 0x5e, 0x47, 0x06, 0x74, 0xee, 0xa3, 0x32, 0x46, - 0xa6, 0x8d, 0xac, 0x5e, 0xe7, 0xe4, 0x7f, 0x96, 0x61, 0xf1, 0x75, 0x30, 0x6e, 0x04, 0x87, 0x5a, - 0x40, 0xde, 0x1e, 0xb4, 0xad, 0xbd, 0x50, 0xfb, 0x43, 0xda, 0x58, 0x34, 0x7c, 0x8f, 0x8e, 0xc6, - 0x4a, 0xb1, 0x08, 0x5e, 0x3b, 0x8f, 0x21, 0xde, 0x5b, 0x7e, 0x4e, 0x83, 0x5b, 0x05, 0x62, 0x15, - 0xf1, 0x3e, 0x44, 0xf6, 0xd7, 0x70, 0x77, 0x4f, 0xf7, 0x20, 0x79, 0xd5, 0xf8, 0x2b, 0x82, 0x69, - 0x9f, 0x25, 0x68, 0x96, 0x48, 0x90, 0x62, 0x09, 0x1f, 0x22, 0xe8, 0xb1, 0x23, 0x2e, 0xd6, 0x88, - 0x3a, 0x9a, 0x29, 0xda, 0x24, 0x1f, 0xa7, 0x04, 0x7d, 0x12, 0x8c, 0xc6, 0xc8, 0x2e, 0x82, 0x99, - 0x36, 0x0e, 0xb9, 0xf6, 0x9b, 0x51, 0x0b, 0x03, 0x45, 0xad, 0xfc, 0x28, 0xd0, 0x33, 0x31, 0xe8, - 0x50, 0xd0, 0xa5, 0xe0, 0xa4, 0x82, 0xbd, 0x97, 0x5f, 0xa1, 0x66, 0x80, 0xe9, 0x8b, 0x6e, 0xfc, - 0x2f, 0xc1, 0x42, 0xb7, 0x48, 0x2f, 0xcf, 0xc3, 0xb7, 0x02, 0xc8, 0x06, 0xf4, 0x7a, 0x3a, 0x22, - 0x15, 0xe8, 0xb5, 0xd0, 0xac, 0x41, 0x03, 0x7b, 0xa6, 0xb8, 0x06, 0x32, 0x51, 0x85, 0x58, 0xe1, - 0x3c, 0x3a, 0x51, 0xb2, 0x4d, 0xba, 0xda, 0xb0, 0xc6, 0x05, 0x10, 0x73, 0xdb, 0x31, 0xc5, 0xdb, - 0x60, 0x84, 0x40, 0x64, 0x42, 0x2f, 0x94, 0xa4, 0xc6, 0xde, 0xc4, 0x59, 0x70, 0x1d, 0xc1, 0x43, - 0xa6, 0x12, 0x7a, 0x5c, 0x69, 0xa3, 0x08, 0x1e, 0x26, 0x0b, 0xbf, 0x04, 0x16, 0xcf, 0x8f, 0x8c, - 0xef, 0xb3, 0x9f, 0x04, 0x7a, 0xb6, 0x6f, 0x1f, 0x41, 0xb7, 0xea, 0xff, 0xdb, 0x3b, 0x55, 0x2c, - 0xc3, 0x79, 0x30, 0xdb, 0x21, 0xec, 0x28, 0xad, 0xd5, 0xa7, 0x00, 0x0c, 0x15, 0x88, 0x25, 0x3e, - 0x02, 0xe3, 0xc9, 0x6f, 0xba, 0x95, 0x1e, 0x97, 0xe8, 0xf6, 0x9b, 0xba, 0xf4, 0xde, 0xc0, 0x2e, - 0x5c, 0x5d, 0x75, 0x70, 0xb3, 0xf5, 0x62, 0x9f, 0xeb, 0x8d, 0xd5, 0xe2, 0x20, 0xad, 0x0d, 0xe8, - 0xc0, 0x97, 0xfe, 0x0a, 0x8c, 0xf2, 0xab, 0xe9, 0x9d, 0xde, 0x20, 0x91, 0xad, 0xb4, 0xda, 0xbf, - 0x2d, 0x5f, 0xeb, 0x11, 0x18, 0x4f, 0x5e, 0x03, 0xfb, 0xe0, 0x39, 0xe1, 0xd2, 0x0f, 0xcf, 0xdd, - 0x2e, 0x47, 0x55, 0x00, 0x62, 0x37, 0x99, 0x37, 0x7a, 0x03, 0x35, 0xad, 0xa5, 0xb7, 0x07, 0xb1, - 0xe6, 0x2b, 0x7e, 0x2f, 0x80, 0x99, 0xee, 0x27, 0xfd, 0xfb, 0x7d, 0x48, 0xa6, 0x9b, 0xb3, 0xb4, - 0x79, 0x09, 0x67, 0x1e, 0xdf, 0x43, 0x30, 0x96, 0x38, 0x3d, 0xdf, 0xec, 0x0d, 0xdb, 0xea, 0x21, - 0xbd, 0x3b, 0xa8, 0x07, 0x5f, 0xfd, 0xb1, 0x00, 0xfe, 0x1f, 0xef, 0xbb, 0x62, 0x1f, 0x32, 0xee, - 0xd8, 0xa7, 0xa5, 0x8d, 0x0b, 0x3a, 0xf2, 0x50, 0x7e, 0x10, 0xc0, 0xec, 0x79, 0x4d, 0xfa, 0x83, - 0x3e, 0x92, 0xec, 0xee, 0x2e, 0x6d, 0x5f, 0xca, 0x9d, 0x47, 0xf9, 0x8d, 0x00, 0x26, 0xda, 0xba, - 0x70, 0x1f, 0x5b, 0x31, 0xe9, 0x23, 0xad, 0x0f, 0xee, 0x13, 0x05, 0x91, 0xff, 0xfc, 0xd9, 0x49, - 0x56, 0x78, 0x7e, 0x92, 0x15, 0xfe, 0x3a, 0xc9, 0x0a, 0x4f, 0x4e, 0xb3, 0xa9, 0xe7, 0xa7, 0xd9, - 0xd4, 0x6f, 0xa7, 0xd9, 0xd4, 0x17, 0x1b, 0xb1, 0x4f, 0x6d, 0xfb, 0x81, 0x53, 0x0b, 0x3e, 0xd2, - 0x6d, 0x64, 0xe4, 0xc2, 0xb5, 0x6c, 0xbf, 0xbe, 0xcc, 0xd6, 0x59, 0x76, 0xb1, 0x59, 0x73, 0x60, - 0xee, 0x28, 0xfa, 0x87, 0x2d, 0xfc, 0x0e, 0x2f, 0x8f, 0xd0, 0x9b, 0xf4, 0x5b, 0xff, 0x04, 0x00, - 0x00, 0xff, 0xff, 0xe6, 0x2d, 0x31, 0xf7, 0x4f, 0x14, 0x00, 0x00, + // 1188 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x41, 0x6f, 0x1b, 0x45, + 0x14, 0xf6, 0x3a, 0x69, 0x94, 0xbe, 0xd2, 0x24, 0xdd, 0x36, 0x95, 0xb3, 0x49, 0xec, 0x68, 0x85, + 0x42, 0x54, 0x91, 0x35, 0x09, 0xa0, 0x40, 0x10, 0x8a, 0xea, 0x24, 0x88, 0x0a, 0x59, 0xa0, 0xad, + 0x8b, 0x04, 0x1c, 0xac, 0xf5, 0xee, 0x64, 0xb3, 0xc4, 0xbb, 0xe3, 0xee, 0x8c, 0x93, 0x18, 0x21, + 0x55, 0xe2, 0xd4, 0x63, 0x8f, 0x5c, 0x90, 0x22, 0x71, 0xe1, 0x07, 0x94, 0x3f, 0xc0, 0xa9, 0xe2, + 0x80, 0x7a, 0x44, 0x48, 0x18, 0x94, 0x48, 0xa8, 0xe7, 0xfc, 0x02, 0xb4, 0xb3, 0xb3, 0xe3, 0xf5, + 0xda, 0x8e, 0xed, 0xa4, 0x91, 0xa0, 0x27, 0xef, 0xce, 0xbc, 0xef, 0x9b, 0xf7, 0xbe, 0xf7, 0xe6, + 0xcd, 0xac, 0x21, 0x43, 0xa8, 0xb1, 0xe7, 0x78, 0x76, 0x7e, 0x7f, 0xa5, 0x82, 0xa8, 0xb1, 0x92, + 0xa7, 0x87, 0x5a, 0xcd, 0xc7, 0x14, 0xcb, 0xf3, 0x55, 0xe7, 0x61, 0xdd, 0xb1, 0xf8, 0xbc, 0x16, + 0xfd, 0x72, 0x3b, 0x65, 0xc6, 0xc6, 0xd8, 0xae, 0xa2, 0x3c, 0x33, 0xae, 0xd4, 0x77, 0xf2, 0x86, + 0xd7, 0x08, 0x91, 0x4a, 0x2e, 0x39, 0x45, 0x1d, 0x17, 0x11, 0x6a, 0xb8, 0x35, 0x6e, 0x70, 0xcb, + 0xc6, 0x36, 0x66, 0x8f, 0xf9, 0xe0, 0x89, 0x8f, 0xce, 0x98, 0x98, 0xb8, 0x98, 0x94, 0xc3, 0x89, + 0xf0, 0x85, 0x4f, 0x65, 0xc3, 0xb7, 0x7c, 0xc5, 0x20, 0x48, 0x78, 0x6a, 0x62, 0xc7, 0xe3, 0xf3, + 0xf3, 0xc9, 0x28, 0x22, 0x6f, 0xd9, 0xb4, 0xfa, 0xe7, 0x08, 0xc8, 0x45, 0x62, 0x6f, 0xfa, 0xc8, + 0xa0, 0xe8, 0x73, 0xa3, 0xea, 0x58, 0x06, 0xc5, 0xbe, 0xac, 0xc3, 0x35, 0x0b, 0x11, 0xd3, 0x77, + 0x6a, 0xd4, 0xc1, 0x5e, 0x46, 0x5a, 0x90, 0x96, 0xae, 0xad, 0xde, 0xd1, 0xce, 0x8c, 0x5b, 0xdb, + 0x6a, 0x21, 0x0a, 0xa3, 0xcf, 0x9a, 0xb9, 0x94, 0x1e, 0x27, 0x91, 0x4b, 0x00, 0x26, 0x76, 0x5d, + 0x87, 0x90, 0x80, 0x32, 0xcd, 0x28, 0xb5, 0x3e, 0x94, 0x9b, 0x02, 0xa0, 0x1b, 0x14, 0x11, 0x4e, + 0x1b, 0xe3, 0x91, 0xef, 0xc1, 0x0d, 0x0b, 0x55, 0x91, 0x1d, 0xb8, 0x5d, 0x36, 0x2c, 0xcb, 0x47, + 0x84, 0x64, 0x46, 0x16, 0xa4, 0xa5, 0xab, 0x85, 0xb9, 0xd3, 0x66, 0x2e, 0xd3, 0x30, 0xdc, 0xea, + 0xba, 0xda, 0x61, 0xa2, 0xea, 0x53, 0x62, 0xec, 0x6e, 0x38, 0x14, 0x50, 0xed, 0x47, 0x0a, 0x08, + 0xaa, 0xd1, 0x24, 0x55, 0x87, 0x89, 0xaa, 0x4f, 0x89, 0xb1, 0x88, 0xea, 0x23, 0x18, 0xab, 0xd5, + 0x2b, 0x7b, 0xa8, 0x91, 0xb9, 0xc2, 0xe2, 0xbc, 0xa5, 0x85, 0x89, 0xd7, 0xa2, 0xc4, 0x6b, 0x77, + 0xbd, 0x46, 0x21, 0xf3, 0xeb, 0xd3, 0xe5, 0x5b, 0x3c, 0x9b, 0xa6, 0xdf, 0xa8, 0x51, 0xac, 0x7d, + 0x56, 0xaf, 0x7c, 0x82, 0x1a, 0x3a, 0x47, 0xcb, 0xef, 0xc2, 0x95, 0x7d, 0xa3, 0x5a, 0x47, 0x99, + 0x31, 0x46, 0x33, 0xa3, 0x71, 0xeb, 0x20, 0xdb, 0x31, 0x91, 0x9c, 0x48, 0xf0, 0xd0, 0x7a, 0x7d, + 0xfc, 0xf1, 0x51, 0x2e, 0xf5, 0xe2, 0x28, 0x97, 0x52, 0xe7, 0x40, 0xe9, 0x4c, 0xaf, 0x8e, 0x48, + 0x0d, 0x7b, 0x04, 0xa9, 0x47, 0x69, 0x98, 0x2a, 0x12, 0x7b, 0xdb, 0x72, 0xe8, 0xe5, 0xe6, 0x7e, + 0xa3, 0x9b, 0xb4, 0x69, 0x26, 0xad, 0x7c, 0xda, 0xcc, 0x4d, 0x84, 0xd2, 0x9e, 0x21, 0xa8, 0x0b, + 0x93, 0xad, 0xa4, 0x97, 0x7d, 0x83, 0x22, 0x9e, 0xe4, 0xad, 0x3f, 0x9a, 0xb9, 0x45, 0xdb, 0xa1, + 0xbb, 0xf5, 0x8a, 0x66, 0x62, 0x97, 0x6f, 0x0e, 0xfe, 0xb3, 0x4c, 0xac, 0xbd, 0x3c, 0x6d, 0xd4, + 0x10, 0xd1, 0xb6, 0x90, 0x79, 0xda, 0xcc, 0xdd, 0x0e, 0x17, 0x4a, 0x50, 0xa9, 0xfa, 0x84, 0xd9, + 0x56, 0x68, 0x31, 0x01, 0x15, 0xc8, 0x24, 0x15, 0x12, 0xf2, 0xfd, 0x23, 0xc1, 0xb5, 0x22, 0xb1, + 0xb7, 0xc2, 0x42, 0x42, 0xdd, 0x6b, 0x51, 0x7a, 0x79, 0xb5, 0x98, 0x3e, 0x57, 0x2d, 0xae, 0xc1, + 0x98, 0xe1, 0xe2, 0xba, 0x47, 0x99, 0x62, 0x03, 0x14, 0x11, 0x37, 0x8f, 0x89, 0x30, 0x0d, 0x37, + 0x63, 0x71, 0x8a, 0xf8, 0x7f, 0x4b, 0xb3, 0xe6, 0x51, 0x40, 0xb6, 0xe3, 0xe9, 0xc8, 0xba, 0x04, + 0x19, 0x4a, 0x30, 0xdd, 0x8a, 0x91, 0xf8, 0x66, 0x42, 0x8a, 0x85, 0xd3, 0x66, 0x6e, 0x2e, 0x29, + 0x45, 0xcc, 0x4c, 0xd5, 0x6f, 0x8a, 0xf1, 0xfb, 0xbe, 0xd9, 0x95, 0xd5, 0x22, 0x34, 0xd1, 0x37, + 0xba, 0xb2, 0xc6, 0xcc, 0xe2, 0xac, 0x5b, 0x84, 0x76, 0xea, 0x3c, 0x7a, 0x5e, 0x9d, 0xf7, 0xd8, + 0x6e, 0x4d, 0xe8, 0x19, 0xc9, 0x2d, 0x17, 0xd9, 0x1e, 0xa8, 0x55, 0x51, 0xb0, 0xa5, 0xca, 0xc1, + 0xc9, 0xc1, 0x37, 0xa7, 0xd2, 0xd1, 0x5d, 0x4a, 0xd1, 0xb1, 0x52, 0x18, 0x0f, 0x96, 0x7a, 0xf2, + 0x57, 0x4e, 0x62, 0x35, 0xce, 0xc1, 0xc1, 0xb4, 0xfa, 0x42, 0x82, 0xeb, 0x45, 0x62, 0x3f, 0xf0, + 0xac, 0x57, 0xbe, 0x7e, 0x77, 0x60, 0xba, 0x2d, 0xd2, 0xcb, 0x92, 0xf4, 0x28, 0x0d, 0x73, 0x41, + 0xbb, 0x35, 0x3c, 0x13, 0x55, 0x1f, 0x78, 0x15, 0xec, 0x59, 0x8e, 0x17, 0xed, 0x9b, 0x9e, 0xa7, + 0xd5, 0xff, 0x56, 0x61, 0xf9, 0x0d, 0x98, 0x34, 0x83, 0xa3, 0x25, 0x10, 0x6f, 0x17, 0x39, 0xf6, + 0x6e, 0x58, 0xfb, 0x23, 0xfa, 0x44, 0x34, 0xfc, 0x31, 0x1b, 0x8d, 0xa5, 0x62, 0x11, 0x5e, 0x3f, + 0x4b, 0x21, 0xd1, 0x5b, 0x7e, 0x49, 0xc3, 0x8d, 0x22, 0xb1, 0x4b, 0x78, 0x0f, 0x79, 0xce, 0x37, + 0xe8, 0xfe, 0xae, 0xe1, 0x23, 0xf2, 0xaa, 0xe9, 0x57, 0x82, 0x69, 0xca, 0x03, 0xb4, 0xca, 0x24, + 0x08, 0xb1, 0x8c, 0x0f, 0x3c, 0xe4, 0xf3, 0x5b, 0x47, 0xac, 0x11, 0x75, 0x35, 0x53, 0xf5, 0x9b, + 0x62, 0x9c, 0x09, 0xf4, 0x69, 0x30, 0x1a, 0x13, 0xbb, 0x04, 0x33, 0x1d, 0x1a, 0x8a, 0xda, 0x6f, + 0x79, 0x2d, 0x0d, 0xe5, 0xb5, 0xfa, 0x93, 0xc4, 0xce, 0xc4, 0xa0, 0x43, 0x21, 0x97, 0x91, 0x93, + 0x1d, 0xec, 0xbf, 0xfc, 0x0c, 0xb5, 0x1c, 0x4c, 0x9f, 0x77, 0xe3, 0x7f, 0x05, 0x0b, 0xbd, 0x3c, + 0xbd, 0xb8, 0x0e, 0xdf, 0x4b, 0x90, 0x0d, 0xe4, 0xf5, 0x0d, 0x8f, 0xec, 0x20, 0xbf, 0x4d, 0x66, + 0x1d, 0x99, 0xd8, 0xb7, 0xe4, 0x35, 0xc8, 0x44, 0x19, 0xe2, 0x89, 0xf3, 0xd9, 0x44, 0xd9, 0xb1, + 0xd8, 0x6a, 0xa3, 0xba, 0x28, 0x80, 0x18, 0xec, 0x9e, 0x25, 0xdf, 0x86, 0x31, 0x82, 0x3c, 0x0b, + 0xf9, 0x61, 0x49, 0xea, 0xfc, 0x4d, 0x9e, 0x85, 0xab, 0x1e, 0x3a, 0xe0, 0x55, 0xc2, 0x8e, 0x2b, + 0x7d, 0xdc, 0x43, 0x07, 0xc9, 0xc4, 0x2f, 0xc1, 0xe2, 0xd9, 0x9e, 0x89, 0x7d, 0xf6, 0xb3, 0xc4, + 0xce, 0xf6, 0xed, 0x43, 0xe4, 0xd6, 0xe8, 0x7f, 0xbd, 0x53, 0xc5, 0x22, 0x9c, 0x87, 0xd9, 0x2e, + 0x6e, 0x47, 0x61, 0xad, 0x3e, 0x05, 0x18, 0x29, 0x12, 0x5b, 0x7e, 0x04, 0x93, 0xc9, 0x6f, 0x9b, + 0x95, 0x3e, 0x57, 0xd9, 0xce, 0xfb, 0xb2, 0xf2, 0xfe, 0xd0, 0x10, 0x51, 0x5d, 0x0d, 0xb8, 0xde, + 0x7e, 0xbd, 0xce, 0xf7, 0xe7, 0x6a, 0x03, 0x28, 0x6b, 0x43, 0x02, 0xc4, 0xd2, 0x5f, 0xc3, 0xb8, + 0xb8, 0x9a, 0xde, 0xe9, 0x4f, 0x12, 0xd9, 0x2a, 0xab, 0x83, 0xdb, 0x8a, 0xb5, 0x1e, 0xc1, 0x64, + 0xf2, 0x1a, 0x38, 0x80, 0xce, 0x09, 0xc8, 0x20, 0x3a, 0xf7, 0xba, 0x1c, 0xd5, 0x00, 0x62, 0x37, + 0x99, 0x37, 0xfb, 0x13, 0xb5, 0xac, 0x95, 0x77, 0x86, 0xb1, 0x16, 0x2b, 0xfe, 0x20, 0xc1, 0x4c, + 0xef, 0x93, 0xfe, 0x83, 0x01, 0x4a, 0xa6, 0x17, 0x58, 0xd9, 0xbc, 0x00, 0x58, 0xf8, 0xf7, 0x2d, + 0x4c, 0x24, 0x4e, 0xcf, 0xb7, 0xfa, 0xd3, 0xb6, 0x23, 0x94, 0xf7, 0x86, 0x45, 0x88, 0xd5, 0x1f, + 0x4b, 0xf0, 0x5a, 0xbc, 0xef, 0xca, 0x03, 0x94, 0x71, 0xd7, 0x3e, 0xad, 0x6c, 0x9c, 0x13, 0x28, + 0x5c, 0xf9, 0x51, 0x82, 0xd9, 0xb3, 0x9a, 0xf4, 0x87, 0x03, 0x04, 0xd9, 0x1b, 0xae, 0x6c, 0x5f, + 0x08, 0x2e, 0xbc, 0xfc, 0x4e, 0x82, 0xa9, 0x8e, 0x2e, 0x3c, 0xc0, 0x56, 0x4c, 0x62, 0x94, 0xf5, + 0xe1, 0x31, 0x91, 0x13, 0x85, 0x2f, 0x9e, 0x1d, 0x67, 0xa5, 0xe7, 0xc7, 0x59, 0xe9, 0xef, 0xe3, + 0xac, 0xf4, 0xe4, 0x24, 0x9b, 0x7a, 0x7e, 0x92, 0x4d, 0xfd, 0x7e, 0x92, 0x4d, 0x7d, 0xb9, 0x11, + 0xfb, 0xc6, 0x76, 0x1e, 0x56, 0xeb, 0xc1, 0xa7, 0xb2, 0xe3, 0x99, 0xf9, 0x70, 0x2d, 0x87, 0x36, + 0x96, 0xf9, 0x3a, 0xcb, 0x2e, 0xb6, 0xea, 0x55, 0x94, 0x3f, 0x8c, 0xfe, 0x69, 0x0a, 0x3f, 0xc0, + 0x2b, 0x63, 0xec, 0x26, 0xfd, 0xf6, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x12, 0x95, 0x6a, 0xa3, + 0x57, 0x13, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1431,7 +1426,7 @@ func (m *MsgCreateValidator) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x3a + dAtA[i] = 0x32 if m.Pubkey != nil { { size, err := m.Pubkey.MarshalToSizedBuffer(dAtA[:i]) @@ -1442,32 +1437,22 @@ func (m *MsgCreateValidator) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 + dAtA[i] = 0x2a } if len(m.ValidatorAddress) > 0 { i -= len(m.ValidatorAddress) copy(dAtA[i:], m.ValidatorAddress) i = encodeVarintTx(dAtA, i, uint64(len(m.ValidatorAddress))) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } if len(m.DelegatorAddress) > 0 { i -= len(m.DelegatorAddress) copy(dAtA[i:], m.DelegatorAddress) i = encodeVarintTx(dAtA, i, uint64(len(m.DelegatorAddress))) i-- - dAtA[i] = 0x22 - } - { - size := m.MinSelfDelegation.Size() - i -= size - if _, err := m.MinSelfDelegation.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) + dAtA[i] = 0x1a } - i-- - dAtA[i] = 0x1a { size, err := m.Commission.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -1534,18 +1519,6 @@ func (m *MsgEditValidator) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.MinSelfDelegation != nil { - { - size := m.MinSelfDelegation.Size() - i -= size - if _, err := m.MinSelfDelegation.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } if m.CommissionRate != nil { { size := m.CommissionRate.Size() @@ -2215,8 +2188,6 @@ func (m *MsgCreateValidator) Size() (n int) { n += 1 + l + sovTx(uint64(l)) l = m.Commission.Size() n += 1 + l + sovTx(uint64(l)) - l = m.MinSelfDelegation.Size() - n += 1 + l + sovTx(uint64(l)) l = len(m.DelegatorAddress) if l > 0 { n += 1 + l + sovTx(uint64(l)) @@ -2259,10 +2230,6 @@ func (m *MsgEditValidator) Size() (n int) { l = m.CommissionRate.Size() n += 1 + l + sovTx(uint64(l)) } - if m.MinSelfDelegation != nil { - l = m.MinSelfDelegation.Size() - n += 1 + l + sovTx(uint64(l)) - } return n } @@ -2615,40 +2582,6 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", 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 - } - if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) } @@ -2680,7 +2613,7 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { } m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) } @@ -2712,7 +2645,7 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { } m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Pubkey", wireType) } @@ -2748,7 +2681,7 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 7: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } @@ -2982,42 +2915,6 @@ func (m *MsgEditValidator) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", 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 - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.MinSelfDelegation = &v - if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) From 42680786793698641d28f83686f31595483bec7f Mon Sep 17 00:00:00 2001 From: junkai121 Date: Sun, 31 Jul 2022 17:55:38 +0800 Subject: [PATCH 43/57] resolve min self delegation issue --- cmd/liquidstakingd/cmd/testnet.go | 1 - proto/distribution/v1beta1/query.proto | 15 ++-- testutil/network/network.go | 1 - x/distribution/types/query.pb.go | 100 +++++-------------------- x/staking/keeper/msg_server.go | 1 + x/staking/simulation/operations.go | 4 +- x/staking/types/exported.go | 3 +- x/staking/types/validator.go | 11 +-- 8 files changed, 32 insertions(+), 104 deletions(-) diff --git a/cmd/liquidstakingd/cmd/testnet.go b/cmd/liquidstakingd/cmd/testnet.go index c621df99..a02e8090 100644 --- a/cmd/liquidstakingd/cmd/testnet.go +++ b/cmd/liquidstakingd/cmd/testnet.go @@ -298,7 +298,6 @@ func initTestnetFiles( sdk.NewCoin(sdk.DefaultBondDenom, valTokens), stakingtypes.NewDescription(nodeDirName, "", "", "", ""), stakingtypes.NewCommissionRates(sdk.OneDec(), sdk.OneDec(), sdk.OneDec()), - sdk.OneInt(), ) if err != nil { return err diff --git a/proto/distribution/v1beta1/query.proto b/proto/distribution/v1beta1/query.proto index 97078126..84d0d217 100644 --- a/proto/distribution/v1beta1/query.proto +++ b/proto/distribution/v1beta1/query.proto @@ -19,14 +19,12 @@ service Query { // ValidatorOutstandingRewards queries rewards of a validator address. rpc ValidatorOutstandingRewards(QueryValidatorOutstandingRewardsRequest) returns (QueryValidatorOutstandingRewardsResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/validators/" - "{validator_address}/outstanding_rewards"; + option (google.api.http).get = "/cosmos/distribution/v1beta1/validators/{validator_address}/outstanding_rewards"; } // ValidatorCommission queries accumulated commission for a validator. rpc ValidatorCommission(QueryValidatorCommissionRequest) returns (QueryValidatorCommissionResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/validators/" - "{validator_address}/commission"; + option (google.api.http).get = "/cosmos/distribution/v1beta1/validators/{validator_address}/commission"; } // ValidatorSlashes queries slash events of a validator. @@ -36,8 +34,7 @@ service Query { // DelegationRewards queries the total rewards accrued by a delegation. rpc DelegationRewards(QueryDelegationRewardsRequest) returns (QueryDelegationRewardsResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/" - "{validator_address}"; + option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/{delegator_address}/rewards/{validator_address}"; } // DelegationTotalRewards queries the total rewards accrued by a each @@ -48,14 +45,12 @@ service Query { // DelegatorValidators queries the validators of a delegator. rpc DelegatorValidators(QueryDelegatorValidatorsRequest) returns (QueryDelegatorValidatorsResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/" - "{delegator_address}/validators"; + option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/{delegator_address}/validators"; } // DelegatorWithdrawAddress queries withdraw address of a delegator. rpc DelegatorWithdrawAddress(QueryDelegatorWithdrawAddressRequest) returns (QueryDelegatorWithdrawAddressResponse) { - option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/" - "{delegator_address}/withdraw_address"; + option (google.api.http).get = "/cosmos/distribution/v1beta1/delegators/{delegator_address}/withdraw_address"; } // CommunityPool queries the community pool coins. diff --git a/testutil/network/network.go b/testutil/network/network.go index 42116cc3..c0914def 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -403,7 +403,6 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { sdk.NewCoin(cfg.BondDenom, cfg.BondedTokens), stakingtypes.NewDescription(nodeDirName, "", "", "", ""), stakingtypes.NewCommissionRates(commission, sdk.OneDec(), sdk.OneDec()), - sdk.OneInt(), ) if err != nil { return nil, err diff --git a/x/distribution/types/query.pb.go b/x/distribution/types/query.pb.go index d64162d4..99497254 100644 --- a/x/distribution/types/query.pb.go +++ b/x/distribution/types/query.pb.go @@ -2506,10 +2506,7 @@ func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -2592,10 +2589,7 @@ func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -2677,10 +2671,7 @@ func (m *QueryValidatorOutstandingRewardsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -2763,10 +2754,7 @@ func (m *QueryValidatorOutstandingRewardsResponse) Unmarshal(dAtA []byte) error if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -2848,10 +2836,7 @@ func (m *QueryValidatorCommissionRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -2934,10 +2919,7 @@ func (m *QueryValidatorCommissionResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3093,10 +3075,7 @@ func (m *QueryValidatorSlashesRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3216,10 +3195,7 @@ func (m *QueryValidatorSlashesResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3333,10 +3309,7 @@ func (m *QueryDelegationRewardsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3420,10 +3393,7 @@ func (m *QueryDelegationRewardsResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3505,10 +3475,7 @@ func (m *QueryDelegationTotalRewardsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3626,10 +3593,7 @@ func (m *QueryDelegationTotalRewardsResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3711,10 +3675,7 @@ func (m *QueryDelegatorValidatorsRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3796,10 +3757,7 @@ func (m *QueryDelegatorValidatorsResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3881,10 +3839,7 @@ func (m *QueryDelegatorWithdrawAddressRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -3966,10 +3921,7 @@ func (m *QueryDelegatorWithdrawAddressResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -4019,10 +3971,7 @@ func (m *QueryCommunityPoolRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -4106,10 +4055,7 @@ func (m *QueryCommunityPoolResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -4191,10 +4137,7 @@ func (m *QueryTokenizeShareRecordRewardRequest) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { @@ -4312,10 +4255,7 @@ func (m *QueryTokenizeShareRecordRewardResponse) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthQuery } if (iNdEx + skippy) > l { diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index fb1f18f4..517bdbcc 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -797,6 +797,7 @@ func (k msgServer) ExemptDelegation(goCtx context.Context, msg *types.MsgExemptD return &types.MsgExemptDelegationResponse{}, nil } +// TODO: implement min self delegation // Remove min self delegation from the code base and all logic that uses it. // MsgTokenizeShares must check the total exempt delegation from the validator, the governance parameter and the total tokenized shares to see if a tokenization is permitted // Calls to MsgRedelegate a Delegation that is Exempt always fails. diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index df80423a..53bb2aad 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -201,7 +201,7 @@ func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k k simtypes.RandomDecAmount(r, maxCommission), ) - msg, err := types.NewMsgCreateValidator(address, simAccount.ConsKey.PubKey(), selfDelegation, description, commission, sdk.OneInt()) + msg, err := types.NewMsgCreateValidator(address, simAccount.ConsKey.PubKey(), selfDelegation, description, commission) if err != nil { return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to create CreateValidator message"), nil, err } @@ -262,7 +262,7 @@ func SimulateMsgEditValidator(ak types.AccountKeeper, bk types.BankKeeper, k kee simtypes.RandStringOfLength(r, 10), ) - msg := types.NewMsgEditValidator(address, description, &newCommissionRate, nil) + msg := types.NewMsgEditValidator(address, description, &newCommissionRate) txCtx := simulation.OperationInput{ R: r, diff --git a/x/staking/types/exported.go b/x/staking/types/exported.go index 8542d677..d31bd8bd 100644 --- a/x/staking/types/exported.go +++ b/x/staking/types/exported.go @@ -5,6 +5,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" ) // DelegationI delegation bond for a delegated proof of stake system @@ -18,7 +19,7 @@ type DelegationI interface { type ValidatorI interface { IsJailed() bool // whether the validator is jailed GetMoniker() string // moniker of the validator - GetStatus() BondStatus // status of the validator + GetStatus() sdkstaking.BondStatus // status of the validator IsBonded() bool // check if has a bonded status IsUnbonded() bool // check if has status unbonded IsUnbonding() bool // check if has status unbonding diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index d39bc13c..96037e2f 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -86,15 +86,6 @@ func (v Validators) String() (out string) { return strings.TrimSpace(out) } -// ToSDKValidators - convenience function convert []Validator to []sdk.ValidatorI -func (v Validators) ToSDKValidators() (validators []sdkstaking.ValidatorI) { - for _, val := range v { - validators = append(validators, val) - } - - return validators -} - // Sort Validators sorts validator array in ascending operator address order func (v Validators) Sort() { sort.Sort(v) @@ -519,6 +510,8 @@ func (v Validator) GetConsensusPower(r sdk.Int) int64 { func (v Validator) GetCommission() sdk.Dec { return v.Commission.Rate } func (v Validator) GetDelegatorShares() sdk.Dec { return v.DelegatorShares } +func (v Validator) GetMinSelfDelegation() sdk.Int { return sdk.ZeroInt() } + // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces func (v Validator) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { var pk cryptotypes.PubKey From f489a7f4aadde35afa6e2ebccb05a0fea8f1fb68 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Mon, 1 Aug 2022 08:55:37 +0800 Subject: [PATCH 44/57] logic implementation for exempt shares --- proto/staking/v1beta1/staking.proto | 6 + x/staking/keeper/msg_server.go | 66 +- x/staking/keeper/params.go | 7 + x/staking/simulation/genesis.go | 3 +- x/staking/spec/08_params.md | 3 +- x/staking/types/errors.go | 14 +- x/staking/types/params.go | 28 +- x/staking/types/staking.pb.go | 1620 ++++++++++++++------------- 8 files changed, 941 insertions(+), 806 deletions(-) diff --git a/proto/staking/v1beta1/staking.proto b/proto/staking/v1beta1/staking.proto index 77b72802..c1969f68 100644 --- a/proto/staking/v1beta1/staking.proto +++ b/proto/staking/v1beta1/staking.proto @@ -294,6 +294,12 @@ message Params { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false ]; + // exemption_factor is required for tokenize share and undelegation check for network safety + string exemption_factor = 7 [ + (gogoproto.moretags) = "yaml:\"exemption_factor\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false + ]; } // DelegationResponse is equivalent to Delegation except that it contains a diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 517bdbcc..04242d54 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -263,6 +263,20 @@ func (k msgServer) BeginRedelegate(goCtx context.Context, msg *types.MsgBeginRed if err != nil { return nil, err } + + delegation, found := k.GetDelegation(ctx, delegatorAddress, valSrcAddr) + if !found { + return nil, status.Errorf( + codes.NotFound, + "delegation with delegator %s not found for validator %s", + msg.DelegatorAddress, msg.ValidatorSrcAddress, + ) + } + + if delegation.Exempt { + return nil, types.ErrRedelegationNotAllowedForExemptDelegation + } + shares, err := k.ValidateUnbondAmount( ctx, delegatorAddress, valSrcAddr, msg.Amount.Amount, ) @@ -339,6 +353,28 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( return nil, err } + validator, found := k.GetValidator(ctx, addr) + if !found { + return nil, sdkstaking.ErrNoValidatorFound + } + + delegation, found := k.GetDelegation(ctx, delegatorAddress, addr) + if !found { + return nil, status.Errorf( + codes.NotFound, + "delegation with delegator %s not found for validator %s", + msg.DelegatorAddress, msg.ValidatorAddress, + ) + } + + // tokenize share vs exempt delegation check if exempt delegation + if delegation.Exempt { + maxTokenizeShareAfter := validator.TotalExemptShares.Sub(shares).Mul(k.ExemptionFactor(ctx)) + if maxTokenizeShareAfter.GT(validator.TotalTokenizedShares) { + return nil, types.ErrInsufficientExemptShares + } + } + bondDenom := k.BondDenom(ctx) if msg.Amount.Denom != bondDenom { return nil, sdkerrors.Wrapf( @@ -534,6 +570,19 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS } } + shares, err := k.ValidateUnbondAmount( + ctx, delegatorAddress, valAddr, msg.Amount.Amount, + ) + if err != nil { + return nil, err + } + + // exempt shares check before tokenize operation + maxValTotalShare := validator.TotalExemptShares.Mul(k.ExemptionFactor(ctx)) + if validator.TotalTokenizedShares.Add(shares).GT(maxValTotalShare) { + return nil, types.ErrInsufficientExemptShares + } + recordId := k.GetLastTokenizeShareRecordId(ctx) + 1 k.SetLastTokenizeShareRecordId(ctx, recordId) @@ -556,13 +605,6 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS return nil, err } - shares, err := k.ValidateUnbondAmount( - ctx, delegatorAddress, valAddr, msg.Amount.Amount, - ) - if err != nil { - return nil, err - } - returnAmount, err := k.Unbond(ctx, delegatorAddress, valAddr, shares) if err != nil { return nil, err @@ -599,6 +641,10 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS return nil, err } + validator, _ = k.GetValidator(ctx, valAddr) + validator.TotalTokenizedShares = validator.TotalTokenizedShares.Add(shares) + k.SetValidator(ctx, validator) + ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeTokenizeShares, @@ -796,9 +842,3 @@ func (k msgServer) ExemptDelegation(goCtx context.Context, msg *types.MsgExemptD return &types.MsgExemptDelegationResponse{}, nil } - -// TODO: implement min self delegation -// Remove min self delegation from the code base and all logic that uses it. -// MsgTokenizeShares must check the total exempt delegation from the validator, the governance parameter and the total tokenized shares to see if a tokenization is permitted -// Calls to MsgRedelegate a Delegation that is Exempt always fails. -// Calls to MsgUndelegate must check if the (exempt_shares - undelegated shares) * exemption_factor >= total_tokeniz_shares diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index fb9898e8..c616fe48 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -53,6 +53,12 @@ func (k Keeper) MinCommissionRate(ctx sdk.Context) (res sdk.Dec) { return } +// ExemptionFactor - exemption factor for all validators +func (k Keeper) ExemptionFactor(ctx sdk.Context) (res sdk.Dec) { + k.paramstore.Get(ctx, types.KeyExemptionFactor, &res) + return +} + // Get all parameters as types.Params func (k Keeper) GetParams(ctx sdk.Context) types.Params { return types.NewParams( @@ -62,6 +68,7 @@ func (k Keeper) GetParams(ctx sdk.Context) types.Params { k.HistoricalEntries(ctx), k.BondDenom(ctx), k.MinCommissionRate(ctx), + k.ExemptionFactor(ctx), ) } diff --git a/x/staking/simulation/genesis.go b/x/staking/simulation/genesis.go index 4282f58e..1b54fc77 100644 --- a/x/staking/simulation/genesis.go +++ b/x/staking/simulation/genesis.go @@ -44,6 +44,7 @@ func RandomizedGenState(simState *module.SimulationState) { maxVals uint32 histEntries uint32 minCommissionRate sdk.Dec + exemptionFactor sdk.Dec ) simState.AppParams.GetOrGenerate( @@ -64,7 +65,7 @@ func RandomizedGenState(simState *module.SimulationState) { // NOTE: the slashing module need to be defined after the staking module on the // NewSimulationManager constructor for this to work simState.UnbondTime = unbondTime - params := types.NewParams(simState.UnbondTime, maxVals, 7, histEntries, sdk.DefaultBondDenom, minCommissionRate) + params := types.NewParams(simState.UnbondTime, maxVals, 7, histEntries, sdk.DefaultBondDenom, minCommissionRate, exemptionFactor) // validators & delegations var ( diff --git a/x/staking/spec/08_params.md b/x/staking/spec/08_params.md index e4a56ab3..48b3a61d 100644 --- a/x/staking/spec/08_params.md +++ b/x/staking/spec/08_params.md @@ -7,10 +7,11 @@ order: 8 The staking module contains the following parameters: | Key | Type | Example | -|-------------------|------------------|------------------------| +| ----------------- | ---------------- | ---------------------- | | UnbondingTime | string (time ns) | "259200000000000" | | MaxValidators | uint16 | 100 | | KeyMaxEntries | uint16 | 7 | | HistoricalEntries | uint16 | 3 | | BondDenom | string | "stake" | | MinCommissionRate | string | "0.000000000000000000" | +| ExemptionFactor | string | "0.000000000000000000" | diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index f2f0c92d..b582273e 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -50,10 +50,12 @@ var ( // ErrNoHistoricalInfo = sdkerrors.Register(ModuleName, 38, "no historical info found") // ErrEmptyValidatorPubKey = sdkerrors.Register(ModuleName, 39, "empty validator public key") // ErrCommissionLTMinRate = sdkerrors.Register(ModuleName, 40, "commission cannot be less than min rate") - ErrNotEnoughBalance = sdkerrors.Register(ModuleName, 41, "not enough balance") - ErrTokenizeShareRecordNotExists = sdkerrors.Register(ModuleName, 42, "tokenize share record not exists") - ErrTokenizeShareRecordAlreadyExists = sdkerrors.Register(ModuleName, 43, "tokenize share record already exists") - ErrNotTokenizeShareRecordOwner = sdkerrors.Register(ModuleName, 44, "not tokenize share record owner") - ErrExceedingFreeVestingDelegations = sdkerrors.Register(ModuleName, 45, "trying to exceed vested free delegation for vesting account") - ErrOnlyBondDenomAllowdForTokenize = sdkerrors.Register(ModuleName, 46, "only bond denom is allowed for tokenize") + ErrNotEnoughBalance = sdkerrors.Register(ModuleName, 41, "not enough balance") + ErrTokenizeShareRecordNotExists = sdkerrors.Register(ModuleName, 42, "tokenize share record not exists") + ErrTokenizeShareRecordAlreadyExists = sdkerrors.Register(ModuleName, 43, "tokenize share record already exists") + ErrNotTokenizeShareRecordOwner = sdkerrors.Register(ModuleName, 44, "not tokenize share record owner") + ErrExceedingFreeVestingDelegations = sdkerrors.Register(ModuleName, 45, "trying to exceed vested free delegation for vesting account") + ErrOnlyBondDenomAllowdForTokenize = sdkerrors.Register(ModuleName, 46, "only bond denom is allowed for tokenize") + ErrInsufficientExemptShares = sdkerrors.Register(ModuleName, 47, "insufficient exempt shares") + ErrRedelegationNotAllowedForExemptDelegation = sdkerrors.Register(ModuleName, 48, "redelegation is not allowed for exempt delegation") ) diff --git a/x/staking/types/params.go b/x/staking/types/params.go index cb9def63..fb3582b8 100644 --- a/x/staking/types/params.go +++ b/x/staking/types/params.go @@ -35,6 +35,8 @@ const ( var ( // DefaultMinCommissionRate is set to 0% DefaultMinCommissionRate = sdk.ZeroDec() + // DefaultExemptionFactor is set to 0% + DefaultExemptionFactor = sdk.ZeroDec() ) var ( @@ -44,6 +46,7 @@ var ( KeyBondDenom = []byte("BondDenom") KeyHistoricalEntries = []byte("HistoricalEntries") KeyMinCommissionRate = []byte("MinCommissionRate") + KeyExemptionFactor = []byte("ExemptionFactor") ) var _ paramtypes.ParamSet = (*Params)(nil) @@ -54,7 +57,7 @@ func ParamKeyTable() paramtypes.KeyTable { } // NewParams creates a new Params instance -func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historicalEntries uint32, bondDenom string, minCommissionRate sdk.Dec) Params { +func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historicalEntries uint32, bondDenom string, minCommissionRate, exemptionFactor sdk.Dec) Params { return Params{ UnbondingTime: unbondingTime, MaxValidators: maxValidators, @@ -62,6 +65,7 @@ func NewParams(unbondingTime time.Duration, maxValidators, maxEntries, historica HistoricalEntries: historicalEntries, BondDenom: bondDenom, MinCommissionRate: minCommissionRate, + ExemptionFactor: exemptionFactor, } } @@ -74,6 +78,7 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(KeyHistoricalEntries, &p.HistoricalEntries, validateHistoricalEntries), paramtypes.NewParamSetPair(KeyBondDenom, &p.BondDenom, validateBondDenom), paramtypes.NewParamSetPair(KeyMinCommissionRate, &p.MinCommissionRate, validateMinCommissionRate), + paramtypes.NewParamSetPair(KeyExemptionFactor, &p.ExemptionFactor, validateExemptionFactor), } } @@ -86,6 +91,7 @@ func DefaultParams() Params { DefaultHistoricalEntries, sdk.DefaultBondDenom, DefaultMinCommissionRate, + DefaultExemptionFactor, ) } @@ -137,6 +143,10 @@ func (p Params) Validate() error { return err } + if err := validateExemptionFactor(p.ExemptionFactor); err != nil { + return err + } + return nil } @@ -233,3 +243,19 @@ func validateMinCommissionRate(i interface{}) error { return nil } + +func validateExemptionFactor(i interface{}) error { + v, ok := i.(sdk.Dec) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + if v.IsNegative() { + return fmt.Errorf("exemption factor cannot be negative: %s", v) + } + if v.GT(sdk.OneDec()) { + return fmt.Errorf("exemption factor cannot be greater than 100%%: %s", v) + } + + return nil +} diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 059ef64b..187a259c 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -850,6 +850,8 @@ type Params struct { BondDenom string `protobuf:"bytes,5,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty"` // min_commission_rate is the chain-wide minimum commission rate that a validator can charge their delegators MinCommissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=min_commission_rate,json=minCommissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"min_commission_rate" yaml:"min_commission_rate"` + // exemption_factor is required for tokenize share and undelegation check for network safety + ExemptionFactor github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,7,opt,name=exemption_factor,json=exemptionFactor,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exemption_factor" yaml:"exemption_factor"` } func (m *Params) Reset() { *m = Params{} } @@ -1211,128 +1213,129 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/staking.proto", fileDescriptor_76a7656dabf68054) } var fileDescriptor_76a7656dabf68054 = []byte{ - // 1925 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xdd, 0x6f, 0x63, 0x47, - 0x15, 0xf7, 0x75, 0xbc, 0x89, 0x73, 0x9c, 0xc4, 0xc9, 0x6c, 0x76, 0xeb, 0x35, 0xbb, 0xb1, 0xb9, - 0x52, 0xab, 0x6c, 0x61, 0x6d, 0x9a, 0x4a, 0x05, 0xf6, 0x05, 0xc5, 0x71, 0x96, 0x98, 0x96, 0xdd, - 0xe8, 0xe6, 0xa3, 0x50, 0x90, 0xac, 0xf1, 0xbd, 0xb3, 0xce, 0x10, 0xdf, 0x7b, 0xbd, 0x77, 0xc6, - 0xdb, 0x18, 0xf5, 0x81, 0x17, 0x50, 0xb5, 0x12, 0x62, 0xe1, 0xa9, 0x2f, 0x2b, 0xad, 0xc4, 0x1b, - 0x42, 0xe2, 0x05, 0xf1, 0x37, 0x14, 0x24, 0xa4, 0x15, 0x4f, 0x15, 0x42, 0x06, 0xed, 0x0a, 0x09, - 0xf1, 0x84, 0xf2, 0x0f, 0x80, 0xe6, 0xe3, 0x7e, 0xe4, 0x3a, 0xad, 0xeb, 0xa8, 0x0f, 0x95, 0xe8, - 0x4b, 0x7c, 0xe7, 0xcc, 0x39, 0xbf, 0x33, 0xf3, 0x3b, 0x67, 0xce, 0x7c, 0x04, 0x6e, 0x30, 0x8e, - 0x8f, 0xa9, 0xd7, 0xad, 0x3f, 0x7c, 0xad, 0x43, 0x38, 0x7e, 0xad, 0xae, 0xdb, 0xb5, 0x7e, 0xe0, - 0x73, 0x1f, 0xdd, 0xe8, 0xd1, 0x07, 0x03, 0xea, 0x84, 0xc2, 0xf0, 0x57, 0x2b, 0x97, 0x57, 0xbb, - 0x7e, 0xd7, 0x97, 0x9a, 0x75, 0xf1, 0xa5, 0x8c, 0xca, 0xd7, 0xba, 0xbe, 0xdf, 0xed, 0x91, 0xba, - 0x6c, 0x75, 0x06, 0xf7, 0xeb, 0xd8, 0x1b, 0xea, 0xae, 0xb5, 0x74, 0x97, 0x33, 0x08, 0x30, 0xa7, - 0xbe, 0xa7, 0xfb, 0x2b, 0xe9, 0x7e, 0x4e, 0x5d, 0xc2, 0x38, 0x76, 0xfb, 0x21, 0xb6, 0xed, 0x33, - 0xd7, 0x67, 0x6d, 0xe5, 0x54, 0x35, 0x42, 0x6c, 0xd5, 0xaa, 0x77, 0x30, 0x23, 0xd1, 0x74, 0x6c, - 0x9f, 0x86, 0xd8, 0xd7, 0x39, 0xf1, 0x1c, 0x12, 0xb8, 0xd4, 0xe3, 0x75, 0x3e, 0xec, 0x13, 0xa6, - 0xfe, 0xaa, 0x5e, 0xf3, 0xb1, 0x01, 0x4b, 0x3b, 0x94, 0x71, 0x3f, 0xa0, 0x36, 0xee, 0xb5, 0xbc, - 0xfb, 0x3e, 0x7a, 0x03, 0x66, 0x8f, 0x08, 0x76, 0x48, 0x50, 0x32, 0xaa, 0xc6, 0x7a, 0x61, 0xa3, - 0x54, 0x8b, 0x11, 0x6a, 0xca, 0x76, 0x47, 0xf6, 0x37, 0x72, 0x1f, 0x8e, 0x2a, 0x19, 0x4b, 0x6b, - 0xa3, 0x3b, 0x30, 0xfb, 0x10, 0xf7, 0x18, 0xe1, 0xa5, 0x6c, 0x75, 0x66, 0xbd, 0xb0, 0xb1, 0x5e, - 0xfb, 0x44, 0x16, 0x6b, 0x87, 0xb8, 0x47, 0x1d, 0xcc, 0xfd, 0x08, 0x47, 0x59, 0x9b, 0xbf, 0xcb, - 0x42, 0x71, 0xcb, 0x77, 0x5d, 0xca, 0x18, 0xf5, 0x3d, 0x0b, 0x73, 0xc2, 0x50, 0x03, 0x72, 0x01, - 0xe6, 0x44, 0x8e, 0x68, 0xbe, 0x51, 0x13, 0xfa, 0x7f, 0x1d, 0x55, 0x5e, 0xe9, 0x52, 0x7e, 0x34, - 0xe8, 0xd4, 0x6c, 0xdf, 0xd5, 0x9c, 0xe8, 0x9f, 0x5b, 0xcc, 0x39, 0xd6, 0xd3, 0x6c, 0x12, 0xdb, - 0x92, 0xb6, 0xe8, 0x87, 0x90, 0x77, 0xf1, 0x49, 0x5b, 0xe2, 0x64, 0x25, 0xce, 0xe6, 0x74, 0x38, - 0xa7, 0xa3, 0x4a, 0x71, 0x88, 0xdd, 0xde, 0x6d, 0x33, 0xc4, 0x31, 0xad, 0x39, 0x17, 0x9f, 0x88, - 0x21, 0xa2, 0x3e, 0x14, 0x85, 0xd4, 0x3e, 0xc2, 0x5e, 0x97, 0x28, 0x27, 0x33, 0xd2, 0xc9, 0xce, - 0xd4, 0x4e, 0xae, 0xc6, 0x4e, 0x12, 0x70, 0xa6, 0xb5, 0xe8, 0xe2, 0x93, 0x2d, 0x29, 0x10, 0x1e, - 0x6f, 0xe7, 0x3f, 0x78, 0x5a, 0xc9, 0xfc, 0xeb, 0x69, 0xc5, 0x30, 0x3f, 0x32, 0x00, 0x62, 0xc6, - 0x90, 0x0d, 0xcb, 0x76, 0xd4, 0x92, 0xb6, 0x4c, 0x87, 0xb2, 0x36, 0x21, 0x24, 0x29, 0xda, 0x1b, - 0x79, 0x31, 0xf6, 0x67, 0xa3, 0x8a, 0x61, 0x15, 0xed, 0x54, 0x44, 0x7e, 0x00, 0x85, 0x41, 0xdf, - 0xc1, 0x9c, 0xb4, 0x45, 0xae, 0x4a, 0x42, 0x0b, 0x1b, 0xe5, 0x9a, 0x4a, 0xe4, 0x5a, 0x98, 0xc8, - 0xb5, 0xfd, 0x30, 0x91, 0x1b, 0x6b, 0x02, 0xeb, 0x74, 0x54, 0x41, 0x6a, 0x76, 0x09, 0x63, 0xf3, - 0xf1, 0xdf, 0x2b, 0x86, 0x05, 0x4a, 0x22, 0x0c, 0x12, 0x53, 0xfb, 0xa3, 0x01, 0x85, 0x26, 0x61, - 0x76, 0x40, 0xfb, 0x62, 0xbd, 0xa0, 0x12, 0xcc, 0xb9, 0xbe, 0x47, 0x8f, 0x75, 0x76, 0xce, 0x5b, - 0x61, 0x13, 0x95, 0x21, 0x4f, 0x1d, 0xe2, 0x71, 0xca, 0x87, 0x2a, 0xbc, 0x56, 0xd4, 0x16, 0x56, - 0xef, 0x92, 0x0e, 0xa3, 0x61, 0x50, 0xac, 0xb0, 0x89, 0xee, 0xc0, 0x32, 0x23, 0xf6, 0x20, 0xa0, - 0x7c, 0xd8, 0xb6, 0x7d, 0x8f, 0x63, 0x9b, 0x97, 0x72, 0x32, 0x6e, 0x5f, 0x3a, 0x1d, 0x55, 0x5e, - 0x52, 0x63, 0x4d, 0x6b, 0x98, 0x56, 0x31, 0x14, 0x6d, 0x29, 0x89, 0xf0, 0xe0, 0x10, 0x8e, 0x69, - 0x8f, 0x95, 0x2e, 0x29, 0x0f, 0xba, 0x99, 0x9c, 0x4b, 0x1e, 0xe6, 0xa3, 0xa4, 0x17, 0x9e, 0xfd, - 0x3e, 0x09, 0xc4, 0x77, 0x1b, 0x3b, 0x4e, 0x40, 0x18, 0xd3, 0xe9, 0x9d, 0xf0, 0x9c, 0xd6, 0x30, - 0xad, 0x62, 0x28, 0xda, 0x54, 0x12, 0xc4, 0x45, 0xb4, 0x3d, 0x46, 0x3c, 0x36, 0x60, 0xed, 0xfe, - 0xa0, 0x73, 0x4c, 0x86, 0x3a, 0x1a, 0xab, 0x63, 0xd1, 0xd8, 0xf4, 0x86, 0x8d, 0xd7, 0x63, 0xf4, - 0xb4, 0x9d, 0xf9, 0xa7, 0xdf, 0xdf, 0x5a, 0xd5, 0xc5, 0xc5, 0x0e, 0x86, 0x7d, 0xee, 0xd7, 0x76, - 0x07, 0x9d, 0x37, 0xc9, 0x50, 0x84, 0x5f, 0xab, 0xee, 0x4a, 0x4d, 0x74, 0x15, 0x66, 0x7f, 0x84, - 0x69, 0x8f, 0x38, 0x92, 0xd0, 0xbc, 0xa5, 0x5b, 0x68, 0x13, 0x66, 0x19, 0xc7, 0x7c, 0xc0, 0x24, - 0x8b, 0x4b, 0x1b, 0x37, 0x27, 0x64, 0x5c, 0xc3, 0xf7, 0x9c, 0x3d, 0x69, 0x60, 0x69, 0x43, 0x51, - 0x47, 0xb8, 0x7f, 0x4c, 0x3c, 0xcd, 0xe4, 0x54, 0xab, 0xbd, 0xe5, 0x71, 0x4b, 0x5b, 0x0b, 0x62, - 0x1c, 0xd2, 0x23, 0x5d, 0xc9, 0x1f, 0x3b, 0xc2, 0x01, 0x61, 0xa5, 0x59, 0x89, 0xd8, 0x9a, 0x7a, - 0x49, 0x6a, 0xc2, 0xd2, 0x78, 0xa6, 0x55, 0x8c, 0x44, 0x7b, 0x52, 0x82, 0x2c, 0x28, 0x38, 0x71, - 0xbe, 0x96, 0xe6, 0x64, 0x24, 0x5e, 0x9d, 0xc0, 0x42, 0x22, 0xc3, 0x75, 0x31, 0x4c, 0x82, 0x88, - 0x54, 0x19, 0x78, 0x1d, 0xdf, 0x73, 0xa8, 0xd7, 0x6d, 0x1f, 0x11, 0xda, 0x3d, 0xe2, 0xa5, 0x7c, - 0xd5, 0x58, 0x9f, 0x49, 0xa6, 0x4a, 0x5a, 0xc3, 0xb4, 0x8a, 0x91, 0x68, 0x47, 0x4a, 0x90, 0x03, - 0x4b, 0xb1, 0x96, 0x5c, 0xb6, 0xf3, 0x13, 0x97, 0xed, 0x97, 0xf5, 0xb2, 0xbd, 0x92, 0xf6, 0x12, - 0xaf, 0xdc, 0xc5, 0x48, 0x28, 0xcc, 0xd0, 0x3d, 0x80, 0xb8, 0x58, 0x94, 0x40, 0x7a, 0xb8, 0xf9, - 0xa9, 0x0b, 0x8f, 0x9e, 0x7f, 0x02, 0x02, 0xbd, 0x07, 0x97, 0xb9, 0xcf, 0x71, 0xaf, 0x4d, 0x4e, - 0x88, 0xdb, 0xe7, 0x61, 0x2c, 0x0b, 0x32, 0x96, 0x6f, 0x4d, 0x1d, 0xcb, 0xb2, 0x9a, 0xc9, 0x39, - 0x90, 0xa6, 0xb5, 0x22, 0xa5, 0xdb, 0x52, 0xa8, 0x03, 0xfa, 0x53, 0x03, 0xae, 0x2a, 0x5d, 0x99, - 0x57, 0xf4, 0xc7, 0xc4, 0x09, 0x47, 0xb0, 0x20, 0x47, 0x70, 0x6f, 0xea, 0x11, 0xdc, 0x48, 0x8e, - 0x20, 0x8d, 0x6a, 0x5a, 0xab, 0xb2, 0x63, 0x3f, 0x94, 0xab, 0x71, 0xdc, 0x5e, 0x78, 0xff, 0x69, - 0x25, 0xa3, 0x6b, 0x49, 0xc6, 0x7c, 0x03, 0x16, 0x0e, 0x71, 0x4f, 0xd7, 0x00, 0xc2, 0xd0, 0x75, - 0x98, 0xc7, 0x61, 0xa3, 0x64, 0x54, 0x67, 0xd6, 0xe7, 0xad, 0x58, 0xa0, 0x6a, 0xd0, 0x4f, 0xfe, - 0x56, 0x35, 0xcc, 0xdf, 0x1a, 0x30, 0xdb, 0x3c, 0xdc, 0xc5, 0x34, 0x40, 0x2d, 0x58, 0x89, 0xf3, - 0xf9, 0x6c, 0x05, 0xba, 0x7e, 0x3a, 0xaa, 0x94, 0xd2, 0x29, 0x1f, 0x95, 0xa0, 0x78, 0x59, 0x85, - 0x35, 0xa8, 0x05, 0x2b, 0x0f, 0xc3, 0xc2, 0x16, 0x41, 0x65, 0xd3, 0x50, 0x63, 0x2a, 0xa6, 0xb5, - 0x1c, 0xc9, 0x34, 0x54, 0x6a, 0x9a, 0x6f, 0xc1, 0x9c, 0x1a, 0x2d, 0x43, 0x9b, 0x70, 0xa9, 0x2f, - 0x3e, 0xe4, 0xec, 0x0a, 0x1b, 0x2f, 0x4f, 0x5a, 0x52, 0xd2, 0x4c, 0x67, 0x93, 0xb2, 0x34, 0x7f, - 0x99, 0x05, 0x68, 0x1e, 0x1e, 0xee, 0x07, 0xb4, 0xdf, 0x23, 0xfc, 0xb3, 0x24, 0x60, 0x1f, 0xae, - 0xc4, 0xb3, 0x63, 0x81, 0x9d, 0x22, 0xa1, 0x7a, 0x3a, 0xaa, 0x5c, 0x4f, 0x93, 0x90, 0x50, 0x33, - 0xad, 0xcb, 0x91, 0x7c, 0x2f, 0xb0, 0xcf, 0x45, 0x75, 0x18, 0x8f, 0x50, 0x67, 0x3e, 0x1e, 0x35, - 0xa1, 0x96, 0x44, 0x6d, 0x32, 0x7e, 0x3e, 0xc3, 0xef, 0x40, 0x21, 0xa6, 0x84, 0xa1, 0x37, 0x21, - 0xcf, 0xf5, 0xb7, 0x26, 0xfa, 0xe6, 0x44, 0xa2, 0x43, 0x6b, 0x4d, 0x76, 0x04, 0x60, 0x3e, 0x16, - 0x7c, 0x2b, 0xaa, 0xc4, 0x3a, 0xfe, 0x5c, 0x26, 0x9c, 0xd8, 0x6e, 0xf4, 0x72, 0x9e, 0xb9, 0xd0, - 0xe1, 0x52, 0x5b, 0x8b, 0x1d, 0x51, 0x15, 0x13, 0xb9, 0xf3, 0xe5, 0x2d, 0xdd, 0x4a, 0xd1, 0xfd, - 0xab, 0x2c, 0x5c, 0x3e, 0x08, 0xcb, 0xe5, 0xe7, 0x9e, 0x9b, 0xb7, 0x61, 0x8e, 0x78, 0x3c, 0xa0, - 0x92, 0x1c, 0x91, 0x0c, 0x5f, 0x9f, 0x90, 0x0c, 0xe7, 0x4c, 0x6d, 0xdb, 0xe3, 0xc1, 0x50, 0xa7, - 0x46, 0x88, 0x96, 0x22, 0xe5, 0x17, 0x33, 0x50, 0xfa, 0x38, 0x4b, 0xb4, 0x05, 0x45, 0x3b, 0x20, - 0x52, 0x10, 0xee, 0x7d, 0x86, 0xdc, 0xfb, 0xca, 0xf1, 0x51, 0x39, 0xa5, 0x60, 0x5a, 0x4b, 0xa1, - 0x44, 0xef, 0x7c, 0x5d, 0x10, 0x07, 0x58, 0x91, 0x95, 0x42, 0xeb, 0x53, 0x9e, 0x58, 0x4d, 0xbd, - 0xf5, 0x85, 0x4e, 0xce, 0x02, 0xa8, 0xbd, 0x6f, 0x29, 0x96, 0xca, 0xcd, 0xef, 0x01, 0x14, 0xa9, - 0x47, 0x39, 0xc5, 0xbd, 0x76, 0x07, 0xf7, 0xb0, 0x67, 0x5f, 0xe4, 0x1a, 0xd0, 0xf2, 0x78, 0xec, - 0x36, 0x05, 0x67, 0x5a, 0x4b, 0x5a, 0xd2, 0x50, 0x02, 0xb4, 0x03, 0x73, 0xa1, 0xab, 0xdc, 0x85, - 0x0e, 0x4c, 0xa1, 0x79, 0xe2, 0xa8, 0xfa, 0xf3, 0x19, 0x58, 0xb1, 0x88, 0xf3, 0x45, 0x28, 0xa6, - 0x0b, 0xc5, 0x77, 0x01, 0x54, 0x35, 0x10, 0x65, 0xf8, 0x02, 0xd1, 0x10, 0xf5, 0x64, 0x5e, 0x21, - 0x34, 0x19, 0x4f, 0xc4, 0xe3, 0x9f, 0x59, 0x58, 0x48, 0xc6, 0xe3, 0xff, 0x74, 0xef, 0x42, 0xbb, - 0x71, 0x41, 0xca, 0xc9, 0x82, 0xf4, 0xb5, 0x09, 0x05, 0x69, 0x2c, 0x89, 0x3f, 0xb9, 0x12, 0x9d, - 0x66, 0x61, 0x76, 0x17, 0x07, 0xd8, 0x65, 0xe8, 0x3b, 0x63, 0x87, 0x65, 0x75, 0x87, 0xbe, 0x36, - 0x96, 0xa6, 0x4d, 0xfd, 0x98, 0xa3, 0xae, 0xcb, 0x1f, 0x9c, 0x73, 0x24, 0x7e, 0x19, 0x96, 0xc4, - 0x6d, 0x3e, 0x9a, 0x91, 0xe2, 0x76, 0x51, 0xde, 0xe8, 0xa3, 0x1b, 0x21, 0x43, 0x15, 0x28, 0x08, - 0xb5, 0xb8, 0xe4, 0x0a, 0x1d, 0x70, 0xf1, 0xc9, 0xb6, 0x92, 0xa0, 0x5b, 0x80, 0x8e, 0xa2, 0xc7, - 0x9a, 0x76, 0xcc, 0x84, 0xd0, 0x5b, 0x89, 0x7b, 0x42, 0xf5, 0x1b, 0x00, 0x62, 0x14, 0x6d, 0x87, - 0x78, 0xbe, 0xab, 0xef, 0xa5, 0xf3, 0x42, 0xd2, 0x14, 0x02, 0x71, 0xae, 0x76, 0xa9, 0xd7, 0x4e, - 0xbd, 0x15, 0xe8, 0x3b, 0xd2, 0x85, 0xcf, 0xd5, 0xe7, 0x40, 0x9a, 0xd6, 0x8a, 0x4b, 0xbd, 0xb3, - 0x8f, 0x0b, 0x89, 0xe4, 0xfe, 0x8d, 0x01, 0x28, 0xae, 0xfa, 0x16, 0x61, 0x7d, 0x71, 0xd9, 0x14, - 0xf7, 0x88, 0x38, 0x76, 0x9a, 0xfc, 0x89, 0x87, 0x91, 0xc8, 0x20, 0xbc, 0x47, 0x24, 0xd6, 0xcc, - 0x37, 0xe3, 0x42, 0x99, 0xd5, 0xa1, 0xd4, 0x97, 0xdd, 0x0e, 0x66, 0x24, 0x71, 0x17, 0xa1, 0xa1, - 0xf5, 0x58, 0x65, 0xcc, 0x98, 0x7f, 0x31, 0xe0, 0xda, 0x58, 0x52, 0x45, 0x63, 0x26, 0x80, 0x82, - 0x44, 0xa7, 0x0c, 0xd1, 0x50, 0x8f, 0xfd, 0xa2, 0xa9, 0xba, 0x12, 0x8c, 0x15, 0xe2, 0xcf, 0xae, - 0xe4, 0xe7, 0x64, 0x04, 0xfe, 0x6c, 0xc0, 0x6a, 0xd2, 0x7d, 0x34, 0x9f, 0x03, 0x58, 0x48, 0x7a, - 0xd7, 0x33, 0xf9, 0xca, 0x14, 0x33, 0xd1, 0x93, 0x38, 0x03, 0x83, 0xbe, 0x17, 0x2f, 0x63, 0xf5, - 0x56, 0xf8, 0x8d, 0x69, 0xb9, 0x09, 0x47, 0x98, 0x5e, 0xce, 0x39, 0x19, 0xa4, 0xff, 0x1a, 0x90, - 0xdb, 0xf5, 0xfd, 0x1e, 0xf2, 0x61, 0xc5, 0xf3, 0x79, 0x5b, 0xe4, 0x3c, 0x71, 0xda, 0xfa, 0x59, - 0x41, 0x95, 0xc9, 0xad, 0xe9, 0x28, 0xfb, 0xf7, 0xa8, 0x32, 0x0e, 0x65, 0x15, 0x3d, 0x9f, 0x37, - 0xa4, 0x64, 0x5f, 0x3d, 0x3a, 0xbc, 0x07, 0x8b, 0x67, 0x9d, 0xa9, 0x22, 0xfa, 0xf6, 0xd4, 0xce, - 0xce, 0xc2, 0x9c, 0x8e, 0x2a, 0xab, 0x6a, 0x79, 0x9d, 0x11, 0x9b, 0xd6, 0x42, 0x27, 0xe1, 0xfd, - 0x76, 0x5e, 0x44, 0xf3, 0x3f, 0x22, 0xa2, 0x3f, 0x33, 0xe0, 0x72, 0x78, 0x83, 0x94, 0x17, 0x48, - 0x8b, 0xd8, 0x7e, 0xe0, 0xa0, 0x25, 0xc8, 0x52, 0x47, 0x32, 0x90, 0xb3, 0xb2, 0xd4, 0x41, 0xab, - 0x70, 0xc9, 0x7f, 0xd7, 0x23, 0x81, 0x7e, 0x32, 0x53, 0x0d, 0x59, 0xaf, 0x7c, 0x67, 0xd0, 0x23, - 0x6d, 0x6c, 0xdb, 0xfe, 0xc0, 0xe3, 0xfa, 0xd9, 0x6c, 0x51, 0x49, 0x37, 0x95, 0x50, 0x5c, 0x3a, - 0xa3, 0x92, 0xa6, 0x12, 0xd1, 0x8a, 0x05, 0x2a, 0xb5, 0x5e, 0xfd, 0x83, 0x01, 0x10, 0x3f, 0xf2, - 0xa0, 0xaf, 0xc2, 0x4b, 0x8d, 0x7b, 0x77, 0x9b, 0xed, 0xbd, 0xfd, 0xcd, 0xfd, 0x83, 0xbd, 0xf6, - 0xc1, 0xdd, 0xbd, 0xdd, 0xed, 0xad, 0xd6, 0x9d, 0xd6, 0x76, 0x73, 0x39, 0x53, 0x2e, 0x3e, 0x7a, - 0x52, 0x2d, 0x1c, 0x78, 0xac, 0x4f, 0x6c, 0x7a, 0x9f, 0x12, 0x07, 0xbd, 0x02, 0xab, 0x67, 0xb5, - 0x45, 0x6b, 0xbb, 0xb9, 0x6c, 0x94, 0x17, 0x1e, 0x3d, 0xa9, 0xe6, 0xd5, 0x99, 0x91, 0x38, 0x68, - 0x1d, 0xae, 0x8c, 0xeb, 0xb5, 0xee, 0x7e, 0x7b, 0x39, 0x5b, 0x5e, 0x7c, 0xf4, 0xa4, 0x3a, 0x1f, - 0x1d, 0x2e, 0x91, 0x09, 0x28, 0xa9, 0xa9, 0xf1, 0x66, 0xca, 0xf0, 0xe8, 0x49, 0x75, 0x56, 0x45, - 0xb2, 0x9c, 0x7b, 0xff, 0xd7, 0x6b, 0x99, 0xc6, 0xf7, 0x3f, 0x7c, 0xbe, 0x66, 0x3c, 0x7b, 0xbe, - 0x66, 0xfc, 0xe3, 0xf9, 0x9a, 0xf1, 0xf8, 0xc5, 0x5a, 0xe6, 0xd9, 0x8b, 0xb5, 0xcc, 0x47, 0x2f, - 0xd6, 0x32, 0xef, 0x7c, 0x2b, 0x11, 0x44, 0xfa, 0xa0, 0x37, 0x10, 0x25, 0x8d, 0x7a, 0x76, 0x5d, - 0xa5, 0x30, 0xe5, 0xc3, 0x5b, 0x3a, 0x7d, 0x6f, 0x29, 0xba, 0xea, 0x27, 0xe1, 0xbf, 0x17, 0x54, - 0x84, 0x3b, 0xb3, 0x72, 0xeb, 0x78, 0xfd, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x92, 0xe5, - 0x0e, 0x86, 0x18, 0x00, 0x00, + // 1952 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xdd, 0x6f, 0x5b, 0x49, + 0x15, 0xf7, 0xb5, 0xdd, 0xc4, 0x39, 0x4e, 0xe2, 0x64, 0x9a, 0x76, 0x5d, 0xd3, 0xc6, 0xe6, 0x4a, + 0xbb, 0x4a, 0x17, 0xe2, 0xb0, 0x59, 0x69, 0x81, 0xbe, 0xa0, 0x38, 0x4e, 0x49, 0xd8, 0xa5, 0x8d, + 0x6e, 0x3e, 0x16, 0x16, 0x24, 0x6b, 0x7c, 0xef, 0xd4, 0x19, 0xe2, 0x7b, 0xaf, 0x7b, 0x67, 0xdc, + 0x8d, 0xd1, 0x3e, 0xf0, 0x02, 0x5a, 0x55, 0x42, 0x14, 0x9e, 0xf6, 0xa5, 0x52, 0x25, 0xde, 0x10, + 0x12, 0x2f, 0x88, 0xbf, 0x61, 0x41, 0x42, 0xaa, 0x78, 0x5a, 0x21, 0x64, 0x50, 0x2b, 0xa4, 0x15, + 0x4f, 0x28, 0xff, 0x00, 0x68, 0x3e, 0xee, 0x47, 0xae, 0xb3, 0xeb, 0x75, 0xd8, 0x87, 0x4a, 0xec, + 0x4b, 0xe3, 0xf9, 0xdd, 0x73, 0x7e, 0x67, 0xe6, 0x9c, 0x33, 0x67, 0xe6, 0x4c, 0xe1, 0x06, 0xe3, + 0xf8, 0x98, 0x7a, 0x9d, 0xb5, 0x07, 0xaf, 0xb5, 0x09, 0xc7, 0xaf, 0xad, 0xe9, 0x71, 0xbd, 0x17, + 0xf8, 0xdc, 0x47, 0x37, 0xba, 0xf4, 0x7e, 0x9f, 0x3a, 0x21, 0x18, 0xfe, 0xd5, 0xc2, 0x95, 0xa5, + 0x8e, 0xdf, 0xf1, 0xa5, 0xe4, 0x9a, 0xf8, 0xa5, 0x94, 0x2a, 0xd7, 0x3a, 0xbe, 0xdf, 0xe9, 0x92, + 0x35, 0x39, 0x6a, 0xf7, 0xef, 0xad, 0x61, 0x6f, 0xa0, 0x3f, 0x2d, 0xa7, 0x3f, 0x39, 0xfd, 0x00, + 0x73, 0xea, 0x7b, 0xfa, 0x7b, 0x35, 0xfd, 0x9d, 0x53, 0x97, 0x30, 0x8e, 0xdd, 0x5e, 0xc8, 0x6d, + 0xfb, 0xcc, 0xf5, 0x59, 0x4b, 0x19, 0x55, 0x83, 0x90, 0x5b, 0x8d, 0xd6, 0xda, 0x98, 0x91, 0x68, + 0x39, 0xb6, 0x4f, 0x43, 0xee, 0xeb, 0x9c, 0x78, 0x0e, 0x09, 0x5c, 0xea, 0xf1, 0x35, 0x3e, 0xe8, + 0x11, 0xa6, 0xfe, 0x55, 0x5f, 0xcd, 0x47, 0x06, 0xcc, 0x6f, 0x53, 0xc6, 0xfd, 0x80, 0xda, 0xb8, + 0xbb, 0xe3, 0xdd, 0xf3, 0xd1, 0x1b, 0x30, 0x75, 0x44, 0xb0, 0x43, 0x82, 0xb2, 0x51, 0x33, 0x56, + 0x8a, 0xeb, 0xe5, 0x7a, 0xcc, 0x50, 0x57, 0xba, 0xdb, 0xf2, 0x7b, 0x23, 0xff, 0xe1, 0xb0, 0x9a, + 0xb1, 0xb4, 0x34, 0xba, 0x0d, 0x53, 0x0f, 0x70, 0x97, 0x11, 0x5e, 0xce, 0xd6, 0x72, 0x2b, 0xc5, + 0xf5, 0x95, 0xfa, 0xa7, 0x7a, 0xb1, 0x7e, 0x88, 0xbb, 0xd4, 0xc1, 0xdc, 0x8f, 0x78, 0x94, 0xb6, + 0xf9, 0xbb, 0x2c, 0x94, 0x36, 0x7d, 0xd7, 0xa5, 0x8c, 0x51, 0xdf, 0xb3, 0x30, 0x27, 0x0c, 0x35, + 0x20, 0x1f, 0x60, 0x4e, 0xe4, 0x8c, 0x66, 0x1a, 0x75, 0x21, 0xff, 0xd7, 0x61, 0xf5, 0x95, 0x0e, + 0xe5, 0x47, 0xfd, 0x76, 0xdd, 0xf6, 0x5d, 0xed, 0x13, 0xfd, 0x67, 0x95, 0x39, 0xc7, 0x7a, 0x99, + 0x4d, 0x62, 0x5b, 0x52, 0x17, 0xfd, 0x10, 0x0a, 0x2e, 0x3e, 0x69, 0x49, 0x9e, 0xac, 0xe4, 0xd9, + 0x98, 0x8c, 0xe7, 0x74, 0x58, 0x2d, 0x0d, 0xb0, 0xdb, 0xbd, 0x65, 0x86, 0x3c, 0xa6, 0x35, 0xed, + 0xe2, 0x13, 0x31, 0x45, 0xd4, 0x83, 0x92, 0x40, 0xed, 0x23, 0xec, 0x75, 0x88, 0x32, 0x92, 0x93, + 0x46, 0xb6, 0x27, 0x36, 0x72, 0x35, 0x36, 0x92, 0xa0, 0x33, 0xad, 0x39, 0x17, 0x9f, 0x6c, 0x4a, + 0x40, 0x58, 0xbc, 0x55, 0xf8, 0xe0, 0x49, 0x35, 0xf3, 0xf1, 0x93, 0xaa, 0x61, 0x7e, 0x64, 0x00, + 0xc4, 0x1e, 0x43, 0x36, 0x2c, 0xd8, 0xd1, 0x48, 0xea, 0x32, 0x1d, 0xca, 0xfa, 0x98, 0x90, 0xa4, + 0xdc, 0xde, 0x28, 0x88, 0xb9, 0x3f, 0x1d, 0x56, 0x0d, 0xab, 0x64, 0xa7, 0x22, 0xf2, 0x03, 0x28, + 0xf6, 0x7b, 0x0e, 0xe6, 0xa4, 0x25, 0x72, 0x55, 0x3a, 0xb4, 0xb8, 0x5e, 0xa9, 0xab, 0x44, 0xae, + 0x87, 0x89, 0x5c, 0xdf, 0x0f, 0x13, 0xb9, 0xb1, 0x2c, 0xb8, 0x4e, 0x87, 0x55, 0xa4, 0x56, 0x97, + 0x50, 0x36, 0x1f, 0xfd, 0xbd, 0x6a, 0x58, 0xa0, 0x10, 0xa1, 0x90, 0x58, 0xda, 0x1f, 0x0d, 0x28, + 0x36, 0x09, 0xb3, 0x03, 0xda, 0x13, 0xfb, 0x05, 0x95, 0x61, 0xda, 0xf5, 0x3d, 0x7a, 0xac, 0xb3, + 0x73, 0xc6, 0x0a, 0x87, 0xa8, 0x02, 0x05, 0xea, 0x10, 0x8f, 0x53, 0x3e, 0x50, 0xe1, 0xb5, 0xa2, + 0xb1, 0xd0, 0x7a, 0x97, 0xb4, 0x19, 0x0d, 0x83, 0x62, 0x85, 0x43, 0x74, 0x1b, 0x16, 0x18, 0xb1, + 0xfb, 0x01, 0xe5, 0x83, 0x96, 0xed, 0x7b, 0x1c, 0xdb, 0xbc, 0x9c, 0x97, 0x71, 0xfb, 0xd2, 0xe9, + 0xb0, 0xfa, 0x92, 0x9a, 0x6b, 0x5a, 0xc2, 0xb4, 0x4a, 0x21, 0xb4, 0xa9, 0x10, 0x61, 0xc1, 0x21, + 0x1c, 0xd3, 0x2e, 0x2b, 0x5f, 0x52, 0x16, 0xf4, 0x30, 0xb9, 0x96, 0x02, 0xcc, 0x44, 0x49, 0x2f, + 0x2c, 0xfb, 0x3d, 0x12, 0x88, 0xdf, 0x2d, 0xec, 0x38, 0x01, 0x61, 0x4c, 0xa7, 0x77, 0xc2, 0x72, + 0x5a, 0xc2, 0xb4, 0x4a, 0x21, 0xb4, 0xa1, 0x10, 0xc4, 0x45, 0xb4, 0x3d, 0x46, 0x3c, 0xd6, 0x67, + 0xad, 0x5e, 0xbf, 0x7d, 0x4c, 0x06, 0x3a, 0x1a, 0x4b, 0x23, 0xd1, 0xd8, 0xf0, 0x06, 0x8d, 0xd7, + 0x63, 0xf6, 0xb4, 0x9e, 0xf9, 0xa7, 0xdf, 0xaf, 0x2e, 0xe9, 0xe2, 0x62, 0x07, 0x83, 0x1e, 0xf7, + 0xeb, 0xbb, 0xfd, 0xf6, 0x9b, 0x64, 0x20, 0xc2, 0xaf, 0x45, 0x77, 0xa5, 0x24, 0xba, 0x0a, 0x53, + 0x3f, 0xc2, 0xb4, 0x4b, 0x1c, 0xe9, 0xd0, 0x82, 0xa5, 0x47, 0x68, 0x03, 0xa6, 0x18, 0xc7, 0xbc, + 0xcf, 0xa4, 0x17, 0xe7, 0xd7, 0x6f, 0x8e, 0xc9, 0xb8, 0x86, 0xef, 0x39, 0x7b, 0x52, 0xc1, 0xd2, + 0x8a, 0xa2, 0x8e, 0x70, 0xff, 0x98, 0x78, 0xda, 0x93, 0x13, 0xed, 0xf6, 0x1d, 0x8f, 0x5b, 0x5a, + 0x5b, 0x38, 0xc6, 0x21, 0x5d, 0xd2, 0x91, 0xfe, 0x63, 0x47, 0x38, 0x20, 0xac, 0x3c, 0x25, 0x19, + 0x77, 0x26, 0xde, 0x92, 0xda, 0x61, 0x69, 0x3e, 0xd3, 0x2a, 0x45, 0xd0, 0x9e, 0x44, 0x90, 0x05, + 0x45, 0x27, 0xce, 0xd7, 0xf2, 0xb4, 0x8c, 0xc4, 0xab, 0x63, 0xbc, 0x90, 0xc8, 0x70, 0x5d, 0x0c, + 0x93, 0x24, 0x22, 0x55, 0xfa, 0x5e, 0xdb, 0xf7, 0x1c, 0xea, 0x75, 0x5a, 0x47, 0x84, 0x76, 0x8e, + 0x78, 0xb9, 0x50, 0x33, 0x56, 0x72, 0xc9, 0x54, 0x49, 0x4b, 0x98, 0x56, 0x29, 0x82, 0xb6, 0x25, + 0x82, 0x1c, 0x98, 0x8f, 0xa5, 0xe4, 0xb6, 0x9d, 0x19, 0xbb, 0x6d, 0xbf, 0xac, 0xb7, 0xed, 0x95, + 0xb4, 0x95, 0x78, 0xe7, 0xce, 0x45, 0xa0, 0x50, 0x43, 0x77, 0x01, 0xe2, 0x62, 0x51, 0x06, 0x69, + 0xe1, 0xe6, 0x67, 0x2e, 0x3c, 0x7a, 0xfd, 0x09, 0x0a, 0xf4, 0x1e, 0x5c, 0xe6, 0x3e, 0xc7, 0xdd, + 0x16, 0x39, 0x21, 0x6e, 0x8f, 0x87, 0xb1, 0x2c, 0xca, 0x58, 0xbe, 0x35, 0x71, 0x2c, 0x2b, 0x6a, + 0x25, 0xe7, 0x50, 0x9a, 0xd6, 0xa2, 0x44, 0xb7, 0x24, 0xa8, 0x03, 0xfa, 0x53, 0x03, 0xae, 0x2a, + 0x59, 0x99, 0x57, 0xf4, 0xc7, 0xc4, 0x09, 0x67, 0x30, 0x2b, 0x67, 0x70, 0x77, 0xe2, 0x19, 0xdc, + 0x48, 0xce, 0x20, 0xcd, 0x6a, 0x5a, 0x4b, 0xf2, 0xc3, 0x7e, 0x88, 0xab, 0x79, 0xdc, 0x9a, 0x7d, + 0xff, 0x49, 0x35, 0xa3, 0x6b, 0x49, 0xc6, 0x7c, 0x03, 0x66, 0x0f, 0x71, 0x57, 0xd7, 0x00, 0xc2, + 0xd0, 0x75, 0x98, 0xc1, 0xe1, 0xa0, 0x6c, 0xd4, 0x72, 0x2b, 0x33, 0x56, 0x0c, 0xa8, 0x1a, 0xf4, + 0x93, 0xbf, 0xd5, 0x0c, 0xf3, 0xb7, 0x06, 0x4c, 0x35, 0x0f, 0x77, 0x31, 0x0d, 0xd0, 0x0e, 0x2c, + 0xc6, 0xf9, 0x7c, 0xb6, 0x02, 0x5d, 0x3f, 0x1d, 0x56, 0xcb, 0xe9, 0x94, 0x8f, 0x4a, 0x50, 0xbc, + 0xad, 0xc2, 0x1a, 0xb4, 0x03, 0x8b, 0x0f, 0xc2, 0xc2, 0x16, 0x51, 0x65, 0xd3, 0x54, 0x23, 0x22, + 0xa6, 0xb5, 0x10, 0x61, 0x9a, 0x2a, 0xb5, 0xcc, 0xb7, 0x60, 0x5a, 0xcd, 0x96, 0xa1, 0x0d, 0xb8, + 0xd4, 0x13, 0x3f, 0xe4, 0xea, 0x8a, 0xeb, 0x2f, 0x8f, 0xdb, 0x52, 0x52, 0x4d, 0x67, 0x93, 0xd2, + 0x34, 0x7f, 0x99, 0x05, 0x68, 0x1e, 0x1e, 0xee, 0x07, 0xb4, 0xd7, 0x25, 0xfc, 0xf3, 0x74, 0xc0, + 0x3e, 0x5c, 0x89, 0x57, 0xc7, 0x02, 0x3b, 0xe5, 0x84, 0xda, 0xe9, 0xb0, 0x7a, 0x3d, 0xed, 0x84, + 0x84, 0x98, 0x69, 0x5d, 0x8e, 0xf0, 0xbd, 0xc0, 0x3e, 0x97, 0xd5, 0x61, 0x3c, 0x62, 0xcd, 0x7d, + 0x32, 0x6b, 0x42, 0x2c, 0xc9, 0xda, 0x64, 0xfc, 0x7c, 0x0f, 0xbf, 0x03, 0xc5, 0xd8, 0x25, 0x0c, + 0xbd, 0x09, 0x05, 0xae, 0x7f, 0x6b, 0x47, 0xdf, 0x1c, 0xeb, 0xe8, 0x50, 0x5b, 0x3b, 0x3b, 0x22, + 0x30, 0x1f, 0x09, 0x7f, 0x2b, 0x57, 0x89, 0x7d, 0xfc, 0x42, 0x26, 0x9c, 0x38, 0x6e, 0xf4, 0x76, + 0xce, 0x5d, 0xe8, 0x72, 0xa9, 0xb5, 0xc5, 0x89, 0xa8, 0x8a, 0x89, 0x3c, 0xf9, 0x0a, 0x96, 0x1e, + 0xa5, 0xdc, 0xfd, 0xab, 0x2c, 0x5c, 0x3e, 0x08, 0xcb, 0xe5, 0x0b, 0xef, 0x9b, 0xb7, 0x61, 0x9a, + 0x78, 0x3c, 0xa0, 0xd2, 0x39, 0x22, 0x19, 0xbe, 0x3e, 0x26, 0x19, 0xce, 0x59, 0xda, 0x96, 0xc7, + 0x83, 0x81, 0x4e, 0x8d, 0x90, 0x2d, 0xe5, 0x94, 0x5f, 0xe4, 0xa0, 0xfc, 0x49, 0x9a, 0x68, 0x13, + 0x4a, 0x76, 0x40, 0x24, 0x10, 0x9e, 0x7d, 0x86, 0x3c, 0xfb, 0x2a, 0xf1, 0x55, 0x39, 0x25, 0x60, + 0x5a, 0xf3, 0x21, 0xa2, 0x4f, 0xbe, 0x0e, 0x88, 0x0b, 0xac, 0xc8, 0x4a, 0x21, 0xf5, 0x19, 0x6f, + 0xac, 0xa6, 0x3e, 0xfa, 0x42, 0x23, 0x67, 0x09, 0xd4, 0xd9, 0x37, 0x1f, 0xa3, 0xf2, 0xf0, 0xbb, + 0x0f, 0x25, 0xea, 0x51, 0x4e, 0x71, 0xb7, 0xd5, 0xc6, 0x5d, 0xec, 0xd9, 0x17, 0x69, 0x03, 0x76, + 0x3c, 0x1e, 0x9b, 0x4d, 0xd1, 0x99, 0xd6, 0xbc, 0x46, 0x1a, 0x0a, 0x40, 0xdb, 0x30, 0x1d, 0x9a, + 0xca, 0x5f, 0xe8, 0xc2, 0x14, 0xaa, 0x27, 0xae, 0xaa, 0x3f, 0xcf, 0xc1, 0xa2, 0x45, 0x9c, 0x2f, + 0x42, 0x31, 0x59, 0x28, 0xbe, 0x0b, 0xa0, 0xaa, 0x81, 0x28, 0xc3, 0x17, 0x88, 0x86, 0xa8, 0x27, + 0x33, 0x8a, 0xa1, 0xc9, 0x78, 0x22, 0x1e, 0xff, 0xcc, 0xc2, 0x6c, 0x32, 0x1e, 0xff, 0xa7, 0x67, + 0x17, 0xda, 0x8d, 0x0b, 0x52, 0x5e, 0x16, 0xa4, 0xaf, 0x8d, 0x29, 0x48, 0x23, 0x49, 0xfc, 0xe9, + 0x95, 0xe8, 0xe3, 0x1c, 0x4c, 0xed, 0xe2, 0x00, 0xbb, 0x0c, 0x7d, 0x67, 0xe4, 0xb2, 0xac, 0x7a, + 0xe8, 0x6b, 0x23, 0x69, 0xda, 0xd4, 0x8f, 0x39, 0xaa, 0x5d, 0xfe, 0xe0, 0x9c, 0x2b, 0xf1, 0xcb, + 0x30, 0x2f, 0xba, 0xf9, 0x68, 0x45, 0xca, 0xb7, 0x73, 0xb2, 0xa3, 0x8f, 0x3a, 0x42, 0x86, 0xaa, + 0x50, 0x14, 0x62, 0x71, 0xc9, 0x15, 0x32, 0xe0, 0xe2, 0x93, 0x2d, 0x85, 0xa0, 0x55, 0x40, 0x47, + 0xd1, 0x63, 0x4d, 0x2b, 0xf6, 0x84, 0x90, 0x5b, 0x8c, 0xbf, 0x84, 0xe2, 0x37, 0x00, 0xc4, 0x2c, + 0x5a, 0x0e, 0xf1, 0x7c, 0x57, 0xf7, 0xa5, 0x33, 0x02, 0x69, 0x0a, 0x40, 0xdc, 0xab, 0x5d, 0xea, + 0xb5, 0x52, 0x6f, 0x05, 0xba, 0x47, 0xba, 0xf0, 0xbd, 0xfa, 0x1c, 0x4a, 0xd3, 0x5a, 0x74, 0xa9, + 0x77, 0xf6, 0x71, 0x41, 0xb4, 0x67, 0xea, 0x84, 0x14, 0x52, 0xf7, 0xb0, 0xcd, 0xfd, 0x40, 0x76, + 0x4b, 0xff, 0x43, 0x7b, 0x96, 0xe6, 0x33, 0xad, 0x52, 0x04, 0xdd, 0x96, 0x48, 0x62, 0x4b, 0xfd, + 0xc6, 0x00, 0x14, 0x9f, 0x35, 0x16, 0x61, 0x3d, 0xd1, 0xe2, 0x8a, 0xee, 0x25, 0xce, 0x18, 0x1d, + 0xf2, 0xb1, 0x57, 0xa0, 0x48, 0x21, 0xec, 0x5e, 0x12, 0x3b, 0xf5, 0x9b, 0x71, 0x79, 0xce, 0xea, + 0x04, 0xd2, 0x2d, 0x76, 0x1b, 0x33, 0x92, 0xe8, 0x80, 0x68, 0xa8, 0x3d, 0x52, 0x8f, 0x33, 0xe6, + 0x5f, 0x0c, 0xb8, 0x36, 0x92, 0xca, 0xd1, 0x9c, 0x09, 0xa0, 0x20, 0xf1, 0x51, 0x26, 0xc6, 0x40, + 0xcf, 0xfd, 0xa2, 0x1b, 0x64, 0x31, 0x18, 0x29, 0xff, 0x9f, 0xdf, 0x41, 0x93, 0x97, 0x11, 0xf8, + 0xb3, 0x01, 0x4b, 0x49, 0xf3, 0xd1, 0x7a, 0x0e, 0x60, 0x36, 0x69, 0x5d, 0xaf, 0xe4, 0x2b, 0x13, + 0xac, 0x44, 0x2f, 0xe2, 0x0c, 0x0d, 0xfa, 0x5e, 0x5c, 0x3c, 0xd4, 0x0b, 0xe5, 0x37, 0x26, 0xf5, + 0x4d, 0x38, 0xc3, 0x74, 0x11, 0xc9, 0xcb, 0x20, 0xfd, 0xc7, 0x80, 0xfc, 0xae, 0xef, 0x77, 0x91, + 0x0f, 0x8b, 0x9e, 0xcf, 0x5b, 0x62, 0xa7, 0x11, 0xa7, 0xa5, 0x1f, 0x33, 0x54, 0x71, 0xde, 0x9c, + 0xcc, 0x65, 0xff, 0x1a, 0x56, 0x47, 0xa9, 0xac, 0x92, 0xe7, 0xf3, 0x86, 0x44, 0xf6, 0xd5, 0x53, + 0xc7, 0x7b, 0x30, 0x77, 0xd6, 0x98, 0x2a, 0xdd, 0x6f, 0x4f, 0x6c, 0xec, 0x2c, 0xcd, 0xe9, 0xb0, + 0xba, 0xa4, 0x76, 0xd6, 0x19, 0xd8, 0xb4, 0x66, 0xdb, 0x09, 0xeb, 0xb7, 0x0a, 0x22, 0x9a, 0xff, + 0x16, 0x11, 0xfd, 0x99, 0x01, 0x97, 0xc3, 0xbe, 0x55, 0xb6, 0xad, 0x16, 0xb1, 0xfd, 0xc0, 0x41, + 0xf3, 0x90, 0xa5, 0x8e, 0xf4, 0x40, 0xde, 0xca, 0x52, 0x07, 0x2d, 0xc1, 0x25, 0xff, 0x5d, 0x8f, + 0x04, 0xfa, 0xa1, 0x4e, 0x0d, 0x64, 0x95, 0xf4, 0x9d, 0x7e, 0x97, 0xb4, 0xb0, 0x6d, 0xfb, 0x7d, + 0x8f, 0xeb, 0xc7, 0xba, 0x39, 0x85, 0x6e, 0x28, 0x50, 0xb4, 0xba, 0x51, 0x21, 0x55, 0x89, 0x68, + 0xc5, 0x80, 0x4a, 0xad, 0x57, 0xff, 0x60, 0x00, 0xc4, 0x4f, 0x4b, 0xe8, 0xab, 0xf0, 0x52, 0xe3, + 0xee, 0x9d, 0x66, 0x6b, 0x6f, 0x7f, 0x63, 0xff, 0x60, 0xaf, 0x75, 0x70, 0x67, 0x6f, 0x77, 0x6b, + 0x73, 0xe7, 0xf6, 0xce, 0x56, 0x73, 0x21, 0x53, 0x29, 0x3d, 0x7c, 0x5c, 0x2b, 0x1e, 0x78, 0xac, + 0x47, 0x6c, 0x7a, 0x8f, 0x12, 0x07, 0xbd, 0x02, 0x4b, 0x67, 0xa5, 0xc5, 0x68, 0xab, 0xb9, 0x60, + 0x54, 0x66, 0x1f, 0x3e, 0xae, 0x15, 0xd4, 0x4d, 0x95, 0x38, 0x68, 0x05, 0xae, 0x8c, 0xca, 0xed, + 0xdc, 0xf9, 0xf6, 0x42, 0xb6, 0x32, 0xf7, 0xf0, 0x71, 0x6d, 0x26, 0xba, 0xd2, 0x22, 0x13, 0x50, + 0x52, 0x52, 0xf3, 0xe5, 0x2a, 0xf0, 0xf0, 0x71, 0x6d, 0x4a, 0x45, 0xb2, 0x92, 0x7f, 0xff, 0xd7, + 0xcb, 0x99, 0xc6, 0xf7, 0x3f, 0x7c, 0xb6, 0x6c, 0x3c, 0x7d, 0xb6, 0x6c, 0xfc, 0xe3, 0xd9, 0xb2, + 0xf1, 0xe8, 0xf9, 0x72, 0xe6, 0xe9, 0xf3, 0xe5, 0xcc, 0x47, 0xcf, 0x97, 0x33, 0xef, 0x7c, 0x2b, + 0x11, 0x44, 0x7a, 0xbf, 0xdb, 0x17, 0x85, 0x94, 0x7a, 0xf6, 0x9a, 0x4a, 0x61, 0xca, 0x07, 0xab, + 0x3a, 0x7d, 0x57, 0x95, 0xbb, 0xd6, 0x4e, 0xc2, 0xff, 0xd4, 0x50, 0x11, 0x6e, 0x4f, 0xc9, 0x03, + 0xeb, 0xf5, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x89, 0xe9, 0x9c, 0xfc, 0x18, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1341,668 +1344,668 @@ 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{ - // 10570 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, - 0x75, 0x18, 0x8e, 0xd9, 0x5d, 0x00, 0xbb, 0x0f, 0x5f, 0x8b, 0x06, 0xee, 0xb8, 0xb7, 0x77, 0x07, - 0x80, 0x43, 0xf2, 0xee, 0x78, 0xe4, 0x01, 0xe4, 0x91, 0xf7, 0x41, 0x9c, 0xc8, 0xd3, 0x2e, 0xb0, - 0x87, 0x03, 0x89, 0x2f, 0x0e, 0x80, 0x23, 0x45, 0xfd, 0x5c, 0xfb, 0x1b, 0xec, 0x36, 0x16, 0x43, - 0xec, 0xce, 0x0c, 0x67, 0x66, 0xef, 0x00, 0x8a, 0x2a, 0xd3, 0x96, 0x25, 0xd3, 0x74, 0x14, 0x51, - 0xb2, 0xcb, 0x96, 0x29, 0x9d, 0x22, 0x59, 0x4a, 0xa4, 0x30, 0x76, 0x24, 0xeb, 0x2b, 0x71, 0x9c, - 0x3f, 0x64, 0x57, 0x39, 0x91, 0x55, 0x15, 0x47, 0x72, 0x2a, 0x91, 0xe2, 0x24, 0x27, 0x99, 0x52, - 0x1c, 0x45, 0x51, 0x62, 0x85, 0x91, 0x2a, 0xa9, 0x52, 0xa5, 0x92, 0xea, 0xaf, 0xf9, 0xda, 0x5d, - 0xcc, 0x2e, 0xee, 0x8e, 0x92, 0xec, 0xfc, 0x05, 0x74, 0xf7, 0x7b, 0xaf, 0x5f, 0xbf, 0x7e, 0xfd, - 0xfa, 0xbd, 0xd7, 0xdd, 0xb3, 0xf0, 0xa1, 0x0b, 0x30, 0x51, 0x31, 0x8c, 0x4a, 0x15, 0x4f, 0x99, - 0x96, 0xe1, 0x18, 0x1b, 0xf5, 0xcd, 0xa9, 0x32, 0xb6, 0x4b, 0x96, 0x66, 0x3a, 0x86, 0x35, 0x49, - 0xeb, 0xd0, 0x10, 0x83, 0x98, 0x14, 0x10, 0xf2, 0x22, 0x0c, 0x5f, 0xd2, 0xaa, 0x78, 0xd6, 0x05, - 0x5c, 0xc5, 0x0e, 0x3a, 0x0f, 0x89, 0x4d, 0xad, 0x8a, 0x33, 0xd2, 0x44, 0xfc, 0x44, 0xdf, 0xe9, - 0xbb, 0x27, 0x43, 0x48, 0x93, 0x41, 0x8c, 0x15, 0x52, 0xad, 0x50, 0x0c, 0xf9, 0x3b, 0x09, 0x18, - 0x69, 0xd2, 0x8a, 0x10, 0x24, 0x74, 0xb5, 0x46, 0x28, 0x4a, 0x27, 0x52, 0x0a, 0xfd, 0x1f, 0x65, - 0xa0, 0xd7, 0x54, 0x4b, 0xdb, 0x6a, 0x05, 0x67, 0x62, 0xb4, 0x5a, 0x14, 0xd1, 0x18, 0x40, 0x19, - 0x9b, 0x58, 0x2f, 0x63, 0xbd, 0xb4, 0x9b, 0x89, 0x4f, 0xc4, 0x4f, 0xa4, 0x14, 0x5f, 0x0d, 0xba, - 0x0f, 0x86, 0xcd, 0xfa, 0x46, 0x55, 0x2b, 0x15, 0x7d, 0x60, 0x30, 0x11, 0x3f, 0xd1, 0xad, 0xa4, - 0x59, 0xc3, 0xac, 0x07, 0x7c, 0x1c, 0x86, 0xae, 0x61, 0x75, 0xdb, 0x0f, 0xda, 0x47, 0x41, 0x07, - 0x49, 0xb5, 0x0f, 0x70, 0x06, 0xfa, 0x6b, 0xd8, 0xb6, 0xd5, 0x0a, 0x2e, 0x3a, 0xbb, 0x26, 0xce, - 0x24, 0xe8, 0xe8, 0x27, 0x1a, 0x46, 0x1f, 0x1e, 0x79, 0x1f, 0xc7, 0x5a, 0xdb, 0x35, 0x31, 0xca, - 0x41, 0x0a, 0xeb, 0xf5, 0x1a, 0xa3, 0xd0, 0xdd, 0x42, 0x7e, 0x05, 0xbd, 0x5e, 0x0b, 0x53, 0x49, - 0x12, 0x34, 0x4e, 0xa2, 0xd7, 0xc6, 0xd6, 0x55, 0xad, 0x84, 0x33, 0x3d, 0x94, 0xc0, 0xf1, 0x06, - 0x02, 0xab, 0xac, 0x3d, 0x4c, 0x43, 0xe0, 0xa1, 0x19, 0x48, 0xe1, 0x1d, 0x07, 0xeb, 0xb6, 0x66, - 0xe8, 0x99, 0x5e, 0x4a, 0xe4, 0x9e, 0x26, 0xb3, 0x88, 0xab, 0xe5, 0x30, 0x09, 0x0f, 0x0f, 0x9d, - 0x85, 0x5e, 0xc3, 0x74, 0x34, 0x43, 0xb7, 0x33, 0xc9, 0x09, 0xe9, 0x44, 0xdf, 0xe9, 0x23, 0x4d, - 0x15, 0x61, 0x99, 0xc1, 0x28, 0x02, 0x18, 0xcd, 0x43, 0xda, 0x36, 0xea, 0x56, 0x09, 0x17, 0x4b, - 0x46, 0x19, 0x17, 0x35, 0x7d, 0xd3, 0xc8, 0xa4, 0x28, 0x81, 0xf1, 0xc6, 0x81, 0x50, 0xc0, 0x19, - 0xa3, 0x8c, 0xe7, 0xf5, 0x4d, 0x43, 0x19, 0xb4, 0x03, 0x65, 0x74, 0x10, 0x7a, 0xec, 0x5d, 0xdd, - 0x51, 0x77, 0x32, 0xfd, 0x54, 0x43, 0x78, 0x49, 0xfe, 0xfd, 0x1e, 0x18, 0x6a, 0x47, 0xc5, 0x2e, - 0x40, 0xf7, 0x26, 0x19, 0x65, 0x26, 0xd6, 0x89, 0x0c, 0x18, 0x4e, 0x50, 0x88, 0x3d, 0xfb, 0x14, - 0x62, 0x0e, 0xfa, 0x74, 0x6c, 0x3b, 0xb8, 0xcc, 0x34, 0x22, 0xde, 0xa6, 0x4e, 0x01, 0x43, 0x6a, - 0x54, 0xa9, 0xc4, 0xbe, 0x54, 0xea, 0x69, 0x18, 0x72, 0x59, 0x2a, 0x5a, 0xaa, 0x5e, 0x11, 0xba, - 0x39, 0x15, 0xc5, 0xc9, 0x64, 0x41, 0xe0, 0x29, 0x04, 0x4d, 0x19, 0xc4, 0x81, 0x32, 0x9a, 0x05, - 0x30, 0x74, 0x6c, 0x6c, 0x16, 0xcb, 0xb8, 0x54, 0xcd, 0x24, 0x5b, 0x48, 0x69, 0x99, 0x80, 0x34, - 0x48, 0xc9, 0x60, 0xb5, 0xa5, 0x2a, 0x7a, 0xc4, 0x53, 0xb5, 0xde, 0x16, 0x9a, 0xb2, 0xc8, 0x16, - 0x59, 0x83, 0xb6, 0xad, 0xc3, 0xa0, 0x85, 0x89, 0xde, 0xe3, 0x32, 0x1f, 0x59, 0x8a, 0x32, 0x31, - 0x19, 0x39, 0x32, 0x85, 0xa3, 0xb1, 0x81, 0x0d, 0x58, 0xfe, 0x22, 0xba, 0x0b, 0xdc, 0x8a, 0x22, - 0x55, 0x2b, 0xa0, 0x56, 0xa8, 0x5f, 0x54, 0x2e, 0xa9, 0x35, 0x9c, 0x7d, 0x1e, 0x06, 0x83, 0xe2, - 0x41, 0xa3, 0xd0, 0x6d, 0x3b, 0xaa, 0xe5, 0x50, 0x2d, 0xec, 0x56, 0x58, 0x01, 0xa5, 0x21, 0x8e, - 0xf5, 0x32, 0xb5, 0x72, 0xdd, 0x0a, 0xf9, 0x17, 0xbd, 0xd5, 0x1b, 0x70, 0x9c, 0x0e, 0xf8, 0x58, - 0xe3, 0x8c, 0x06, 0x28, 0x87, 0xc7, 0x9d, 0x3d, 0x07, 0x03, 0x81, 0x01, 0xb4, 0xdb, 0xb5, 0xfc, - 0x02, 0x1c, 0x68, 0x4a, 0x1a, 0x3d, 0x0d, 0xa3, 0x75, 0x5d, 0xd3, 0x1d, 0x6c, 0x99, 0x16, 0x26, - 0x1a, 0xcb, 0xba, 0xca, 0xfc, 0xa7, 0xde, 0x16, 0x3a, 0xb7, 0xee, 0x87, 0x66, 0x54, 0x94, 0x91, - 0x7a, 0x63, 0xe5, 0xc9, 0x54, 0xf2, 0xbb, 0xbd, 0xe9, 0x17, 0x5f, 0x7c, 0xf1, 0xc5, 0x98, 0xfc, - 0xc1, 0x1e, 0x18, 0x6d, 0xb6, 0x66, 0x9a, 0x2e, 0xdf, 0x83, 0xd0, 0xa3, 0xd7, 0x6b, 0x1b, 0xd8, - 0xa2, 0x42, 0xea, 0x56, 0x78, 0x09, 0xe5, 0xa0, 0xbb, 0xaa, 0x6e, 0xe0, 0x6a, 0x26, 0x31, 0x21, - 0x9d, 0x18, 0x3c, 0x7d, 0x5f, 0x5b, 0xab, 0x72, 0x72, 0x81, 0xa0, 0x28, 0x0c, 0x13, 0x3d, 0x06, - 0x09, 0x6e, 0xa2, 0x09, 0x85, 0x93, 0xed, 0x51, 0x20, 0x6b, 0x49, 0xa1, 0x78, 0xe8, 0x30, 0xa4, - 0xc8, 0x5f, 0xa6, 0x1b, 0x3d, 0x94, 0xe7, 0x24, 0xa9, 0x20, 0x7a, 0x81, 0xb2, 0x90, 0xa4, 0xcb, - 0xa4, 0x8c, 0xc5, 0xd6, 0xe6, 0x96, 0x89, 0x62, 0x95, 0xf1, 0xa6, 0x5a, 0xaf, 0x3a, 0xc5, 0xab, - 0x6a, 0xb5, 0x8e, 0xa9, 0xc2, 0xa7, 0x94, 0x7e, 0x5e, 0x79, 0x85, 0xd4, 0xa1, 0x71, 0xe8, 0x63, - 0xab, 0x4a, 0xd3, 0xcb, 0x78, 0x87, 0x5a, 0xcf, 0x6e, 0x85, 0x2d, 0xb4, 0x79, 0x52, 0x43, 0xba, - 0x7f, 0xd6, 0x36, 0x74, 0xa1, 0x9a, 0xb4, 0x0b, 0x52, 0x41, 0xbb, 0x3f, 0x17, 0x36, 0xdc, 0x47, - 0x9b, 0x0f, 0x2f, 0xac, 0x53, 0xf2, 0x17, 0x63, 0x90, 0xa0, 0xf6, 0x62, 0x08, 0xfa, 0xd6, 0xde, - 0xb6, 0x52, 0x28, 0xce, 0x2e, 0xaf, 0xe7, 0x17, 0x0a, 0x69, 0x09, 0x0d, 0x02, 0xd0, 0x8a, 0x4b, - 0x0b, 0xcb, 0xb9, 0xb5, 0x74, 0xcc, 0x2d, 0xcf, 0x2f, 0xad, 0x9d, 0x7d, 0x38, 0x1d, 0x77, 0x11, - 0xd6, 0x59, 0x45, 0xc2, 0x0f, 0xf0, 0xd0, 0xe9, 0x74, 0x37, 0x4a, 0x43, 0x3f, 0x23, 0x30, 0xff, - 0x74, 0x61, 0xf6, 0xec, 0xc3, 0xe9, 0x9e, 0x60, 0xcd, 0x43, 0xa7, 0xd3, 0xbd, 0x68, 0x00, 0x52, - 0xb4, 0x26, 0xbf, 0xbc, 0xbc, 0x90, 0x4e, 0xba, 0x34, 0x57, 0xd7, 0x94, 0xf9, 0xa5, 0xb9, 0x74, - 0xca, 0xa5, 0x39, 0xa7, 0x2c, 0xaf, 0xaf, 0xa4, 0xc1, 0xa5, 0xb0, 0x58, 0x58, 0x5d, 0xcd, 0xcd, - 0x15, 0xd2, 0x7d, 0x2e, 0x44, 0xfe, 0x6d, 0x6b, 0x85, 0xd5, 0x74, 0x7f, 0x80, 0xad, 0x87, 0x4e, - 0xa7, 0x07, 0xdc, 0x2e, 0x0a, 0x4b, 0xeb, 0x8b, 0xe9, 0x41, 0x34, 0x0c, 0x03, 0xac, 0x0b, 0xc1, - 0xc4, 0x50, 0xa8, 0xea, 0xec, 0xc3, 0xe9, 0xb4, 0xc7, 0x08, 0xa3, 0x32, 0x1c, 0xa8, 0x38, 0xfb, - 0x70, 0x1a, 0xc9, 0x33, 0xd0, 0x4d, 0xb5, 0x0b, 0x21, 0x18, 0x5c, 0xc8, 0xe5, 0x0b, 0x0b, 0xc5, - 0xe5, 0x95, 0xb5, 0xf9, 0xe5, 0xa5, 0xdc, 0x42, 0x5a, 0xf2, 0xea, 0x94, 0xc2, 0x93, 0xeb, 0xf3, - 0x4a, 0x61, 0x36, 0x1d, 0xf3, 0xd7, 0xad, 0x14, 0x72, 0x6b, 0x85, 0xd9, 0x74, 0x5c, 0x2e, 0xc1, - 0x68, 0x33, 0x3b, 0xd9, 0x74, 0x65, 0xf8, 0xa6, 0x38, 0xd6, 0x62, 0x8a, 0x29, 0xad, 0x86, 0x29, - 0xfe, 0x76, 0x0c, 0x46, 0x9a, 0xec, 0x15, 0x4d, 0x3b, 0xb9, 0x08, 0xdd, 0x4c, 0x45, 0xd9, 0xee, - 0x79, 0x6f, 0xd3, 0x4d, 0x87, 0x2a, 0x6c, 0xc3, 0x0e, 0x4a, 0xf1, 0xfc, 0x1e, 0x44, 0xbc, 0x85, - 0x07, 0x41, 0x48, 0x34, 0xd8, 0xf4, 0x9f, 0x6b, 0xb0, 0xe9, 0x6c, 0xdb, 0x3b, 0xdb, 0xce, 0xb6, - 0x47, 0xeb, 0x3a, 0xb3, 0xed, 0xdd, 0x4d, 0x6c, 0xfb, 0x05, 0x18, 0x6e, 0x20, 0xd4, 0xb6, 0x8d, - 0x7d, 0x97, 0x04, 0x99, 0x56, 0xc2, 0x89, 0xb0, 0x74, 0xb1, 0x80, 0xa5, 0xbb, 0x10, 0x96, 0xe0, - 0x9d, 0xad, 0x27, 0xa1, 0x61, 0xae, 0x3f, 0x29, 0xc1, 0xc1, 0xe6, 0x9e, 0x62, 0x53, 0x1e, 0x1e, - 0x83, 0x9e, 0x1a, 0x76, 0xb6, 0x0c, 0xe1, 0x2d, 0x1d, 0x6b, 0xb2, 0x07, 0x93, 0xe6, 0xf0, 0x64, - 0x73, 0x2c, 0xff, 0x26, 0x1e, 0x6f, 0xe5, 0xee, 0x31, 0x6e, 0x1a, 0x38, 0xfd, 0x95, 0x18, 0x1c, - 0x68, 0x4a, 0xbc, 0x29, 0xa3, 0x47, 0x01, 0x34, 0xdd, 0xac, 0x3b, 0xcc, 0x23, 0x62, 0x06, 0x36, - 0x45, 0x6b, 0xa8, 0xf1, 0x22, 0xc6, 0xb3, 0xee, 0xb8, 0xed, 0x71, 0xda, 0x0e, 0xac, 0x8a, 0x02, - 0x9c, 0xf7, 0x18, 0x4d, 0x50, 0x46, 0xc7, 0x5a, 0x8c, 0xb4, 0x41, 0x31, 0x1f, 0x80, 0x74, 0xa9, - 0xaa, 0x61, 0xdd, 0x29, 0xda, 0x8e, 0x85, 0xd5, 0x9a, 0xa6, 0x57, 0xe8, 0x0e, 0x92, 0x9c, 0xee, - 0xde, 0x54, 0xab, 0x36, 0x56, 0x86, 0x58, 0xf3, 0xaa, 0x68, 0x25, 0x18, 0x54, 0x81, 0x2c, 0x1f, - 0x46, 0x4f, 0x00, 0x83, 0x35, 0xbb, 0x18, 0xf2, 0x07, 0x52, 0xd0, 0xe7, 0xf3, 0xab, 0xd1, 0x9d, - 0xd0, 0xff, 0xac, 0x7a, 0x55, 0x2d, 0x8a, 0x58, 0x89, 0x49, 0xa2, 0x8f, 0xd4, 0xad, 0xf0, 0x78, - 0xe9, 0x01, 0x18, 0xa5, 0x20, 0x46, 0xdd, 0xc1, 0x56, 0xb1, 0x54, 0x55, 0x6d, 0x9b, 0x0a, 0x2d, - 0x49, 0x41, 0x11, 0x69, 0x5b, 0x26, 0x4d, 0x33, 0xa2, 0x05, 0x9d, 0x81, 0x11, 0x8a, 0x51, 0xab, - 0x57, 0x1d, 0xcd, 0xac, 0xe2, 0x22, 0x89, 0xde, 0x6c, 0xba, 0x93, 0xb8, 0x9c, 0x0d, 0x13, 0x88, - 0x45, 0x0e, 0x40, 0x38, 0xb2, 0xd1, 0x2c, 0x1c, 0xa5, 0x68, 0x15, 0xac, 0x63, 0x4b, 0x75, 0x70, - 0x11, 0x3f, 0x57, 0x57, 0xab, 0x76, 0x51, 0xd5, 0xcb, 0xc5, 0x2d, 0xd5, 0xde, 0xca, 0x8c, 0x12, - 0x02, 0xf9, 0x58, 0x46, 0x52, 0x0e, 0x11, 0xc0, 0x39, 0x0e, 0x57, 0xa0, 0x60, 0x39, 0xbd, 0x7c, - 0x59, 0xb5, 0xb7, 0xd0, 0x34, 0x1c, 0xa4, 0x54, 0x6c, 0xc7, 0xd2, 0xf4, 0x4a, 0xb1, 0xb4, 0x85, - 0x4b, 0xdb, 0xc5, 0xba, 0xb3, 0x79, 0x3e, 0x73, 0xd8, 0xdf, 0x3f, 0xe5, 0x70, 0x95, 0xc2, 0xcc, - 0x10, 0x90, 0x75, 0x67, 0xf3, 0x3c, 0x5a, 0x85, 0x7e, 0x32, 0x19, 0x35, 0xed, 0x79, 0x5c, 0xdc, - 0x34, 0x2c, 0xba, 0x35, 0x0e, 0x36, 0x31, 0x4d, 0x3e, 0x09, 0x4e, 0x2e, 0x73, 0x84, 0x45, 0xa3, - 0x8c, 0xa7, 0xbb, 0x57, 0x57, 0x0a, 0x85, 0x59, 0xa5, 0x4f, 0x50, 0xb9, 0x64, 0x58, 0x44, 0xa1, - 0x2a, 0x86, 0x2b, 0xe0, 0x3e, 0xa6, 0x50, 0x15, 0x43, 0x88, 0xf7, 0x0c, 0x8c, 0x94, 0x4a, 0x6c, - 0xcc, 0x5a, 0xa9, 0xc8, 0x63, 0x2c, 0x3b, 0x93, 0x0e, 0x08, 0xab, 0x54, 0x9a, 0x63, 0x00, 0x5c, - 0xc7, 0x6d, 0xf4, 0x08, 0x1c, 0xf0, 0x84, 0xe5, 0x47, 0x1c, 0x6e, 0x18, 0x65, 0x18, 0xf5, 0x0c, - 0x8c, 0x98, 0xbb, 0x8d, 0x88, 0x28, 0xd0, 0xa3, 0xb9, 0x1b, 0x46, 0x3b, 0x07, 0xa3, 0xe6, 0x96, - 0xd9, 0x88, 0x77, 0xd2, 0x8f, 0x87, 0xcc, 0x2d, 0x33, 0x8c, 0x78, 0x0f, 0x0d, 0xb8, 0x2d, 0x5c, - 0x52, 0x1d, 0x5c, 0xce, 0xdc, 0xe1, 0x07, 0xf7, 0x35, 0xa0, 0x29, 0x48, 0x97, 0x4a, 0x45, 0xac, - 0xab, 0x1b, 0x55, 0x5c, 0x54, 0x2d, 0xac, 0xab, 0x76, 0x66, 0xdc, 0x0f, 0x3c, 0x58, 0x2a, 0x15, - 0x68, 0x6b, 0x8e, 0x36, 0xa2, 0x93, 0x30, 0x6c, 0x6c, 0x3c, 0x5b, 0x62, 0x2a, 0x59, 0x34, 0x2d, - 0xbc, 0xa9, 0xed, 0x64, 0xee, 0xa6, 0xf2, 0x1d, 0x22, 0x0d, 0x54, 0x21, 0x57, 0x68, 0x35, 0xba, - 0x17, 0xd2, 0x25, 0x7b, 0x4b, 0xb5, 0x4c, 0x6a, 0x93, 0x6d, 0x53, 0x2d, 0xe1, 0xcc, 0x3d, 0x0c, - 0x94, 0xd5, 0x2f, 0x89, 0x6a, 0xb2, 0x24, 0xec, 0x6b, 0xda, 0xa6, 0x23, 0x28, 0x1e, 0x67, 0x4b, - 0x82, 0xd6, 0x71, 0x6a, 0x27, 0x20, 0x4d, 0x44, 0x11, 0xe8, 0xf8, 0x04, 0x05, 0x1b, 0x34, 0xb7, - 0x4c, 0x7f, 0xbf, 0x77, 0xc1, 0x00, 0x81, 0xf4, 0x3a, 0xbd, 0x97, 0x39, 0x64, 0xe6, 0x96, 0xaf, - 0xc7, 0x87, 0xe1, 0x20, 0x01, 0xaa, 0x61, 0x47, 0x2d, 0xab, 0x8e, 0xea, 0x83, 0xbe, 0x9f, 0x42, - 0x13, 0xb9, 0x2f, 0xf2, 0xc6, 0x00, 0x9f, 0x56, 0x7d, 0x63, 0xd7, 0xd5, 0xac, 0x53, 0x8c, 0x4f, - 0x52, 0x27, 0x74, 0xeb, 0xb6, 0x39, 0xdd, 0xf2, 0x34, 0xf4, 0xfb, 0x15, 0x1f, 0xa5, 0x80, 0xa9, - 0x7e, 0x5a, 0x22, 0x5e, 0xd0, 0xcc, 0xf2, 0x2c, 0xf1, 0x5f, 0x9e, 0x29, 0xa4, 0x63, 0xc4, 0x8f, - 0x5a, 0x98, 0x5f, 0x2b, 0x14, 0x95, 0xf5, 0xa5, 0xb5, 0xf9, 0xc5, 0x42, 0x3a, 0xee, 0x73, 0xd8, - 0x1f, 0x4f, 0x24, 0x8f, 0xa5, 0x8f, 0xcb, 0x5f, 0x8b, 0xc1, 0x60, 0x30, 0x02, 0x43, 0x6f, 0x81, - 0x3b, 0x44, 0xba, 0xc4, 0xc6, 0x4e, 0xf1, 0x9a, 0x66, 0xd1, 0x15, 0x59, 0x53, 0xd9, 0xee, 0xe8, - 0xea, 0xc4, 0x28, 0x87, 0x5a, 0xc5, 0xce, 0x53, 0x9a, 0x45, 0xd6, 0x5b, 0x4d, 0x75, 0xd0, 0x02, - 0x8c, 0xeb, 0x46, 0xd1, 0x76, 0x54, 0xbd, 0xac, 0x5a, 0xe5, 0xa2, 0x97, 0xa8, 0x2a, 0xaa, 0xa5, - 0x12, 0xb6, 0x6d, 0x83, 0xed, 0x84, 0x2e, 0x95, 0x23, 0xba, 0xb1, 0xca, 0x81, 0xbd, 0x2d, 0x22, - 0xc7, 0x41, 0x43, 0xfa, 0x1b, 0x6f, 0xa5, 0xbf, 0x87, 0x21, 0x55, 0x53, 0xcd, 0x22, 0xd6, 0x1d, - 0x6b, 0x97, 0xfa, 0xdd, 0x49, 0x25, 0x59, 0x53, 0xcd, 0x02, 0x29, 0xbf, 0x29, 0xe1, 0xcf, 0xe3, - 0x89, 0x64, 0x32, 0x9d, 0x7a, 0x3c, 0x91, 0x4c, 0xa5, 0x41, 0x7e, 0x3d, 0x0e, 0xfd, 0x7e, 0x3f, - 0x9c, 0x84, 0x35, 0x25, 0xba, 0x65, 0x49, 0xd4, 0xa8, 0xdd, 0xb5, 0xa7, 0xd7, 0x3e, 0x39, 0x43, - 0xf6, 0xb2, 0xe9, 0x1e, 0xe6, 0x1d, 0x2b, 0x0c, 0x93, 0xf8, 0x11, 0x44, 0xd9, 0x30, 0xf3, 0x46, - 0x92, 0x0a, 0x2f, 0xa1, 0x39, 0xe8, 0x79, 0xd6, 0xa6, 0xb4, 0x7b, 0x28, 0xed, 0xbb, 0xf7, 0xa6, - 0xfd, 0xf8, 0x2a, 0x25, 0x9e, 0x7a, 0x7c, 0xb5, 0xb8, 0xb4, 0xac, 0x2c, 0xe6, 0x16, 0x14, 0x8e, - 0x8e, 0x0e, 0x41, 0xa2, 0xaa, 0x3e, 0xbf, 0x1b, 0xdc, 0xf5, 0x68, 0x55, 0xbb, 0x93, 0x70, 0x08, - 0x12, 0xd7, 0xb0, 0xba, 0x1d, 0xdc, 0x6b, 0x68, 0xd5, 0x6d, 0x5c, 0x0c, 0x53, 0xd0, 0x4d, 0xe5, - 0x85, 0x00, 0xb8, 0xc4, 0xd2, 0x5d, 0x28, 0x09, 0x89, 0x99, 0x65, 0x85, 0x2c, 0x88, 0x34, 0xf4, - 0xb3, 0xda, 0xe2, 0xca, 0x7c, 0x61, 0xa6, 0x90, 0x8e, 0xc9, 0x67, 0xa0, 0x87, 0x09, 0x81, 0x2c, - 0x16, 0x57, 0x0c, 0xe9, 0x2e, 0x5e, 0xe4, 0x34, 0x24, 0xd1, 0xba, 0xbe, 0x98, 0x2f, 0x28, 0xe9, - 0x58, 0x70, 0xaa, 0x13, 0xe9, 0x6e, 0xd9, 0x86, 0x7e, 0xbf, 0x23, 0xfe, 0xe6, 0x04, 0xd9, 0x5f, - 0x92, 0xa0, 0xcf, 0xe7, 0x58, 0x13, 0x8f, 0x48, 0xad, 0x56, 0x8d, 0x6b, 0x45, 0xb5, 0xaa, 0xa9, - 0x36, 0x57, 0x0d, 0xa0, 0x55, 0x39, 0x52, 0xd3, 0xee, 0xd4, 0xbd, 0x49, 0x4b, 0xa4, 0x3b, 0xdd, - 0x23, 0x7f, 0x44, 0x82, 0x74, 0xd8, 0xb3, 0x0d, 0xb1, 0x29, 0xfd, 0x24, 0xd9, 0x94, 0x3f, 0x2c, - 0xc1, 0x60, 0xd0, 0x9d, 0x0d, 0xb1, 0x77, 0xe7, 0x4f, 0x94, 0xbd, 0x6f, 0xc5, 0x60, 0x20, 0xe0, - 0xc4, 0xb6, 0xcb, 0xdd, 0x73, 0x30, 0xac, 0x95, 0x71, 0xcd, 0x34, 0x1c, 0xac, 0x97, 0x76, 0x8b, - 0x55, 0x7c, 0x15, 0x57, 0x33, 0x32, 0x35, 0x1a, 0x53, 0x7b, 0xbb, 0xc9, 0x93, 0xf3, 0x1e, 0xde, - 0x02, 0x41, 0x9b, 0x1e, 0x99, 0x9f, 0x2d, 0x2c, 0xae, 0x2c, 0xaf, 0x15, 0x96, 0x66, 0xde, 0x56, - 0x5c, 0x5f, 0x7a, 0x62, 0x69, 0xf9, 0xa9, 0x25, 0x25, 0xad, 0x85, 0xc0, 0x6e, 0xe3, 0xb2, 0x5f, - 0x81, 0x74, 0x98, 0x29, 0x74, 0x07, 0x34, 0x63, 0x2b, 0xdd, 0x85, 0x46, 0x60, 0x68, 0x69, 0xb9, - 0xb8, 0x3a, 0x3f, 0x5b, 0x28, 0x16, 0x2e, 0x5d, 0x2a, 0xcc, 0xac, 0xad, 0xb2, 0xc4, 0x87, 0x0b, - 0xbd, 0x16, 0x58, 0xe0, 0xf2, 0xab, 0x71, 0x18, 0x69, 0xc2, 0x09, 0xca, 0xf1, 0x90, 0x85, 0x45, - 0x51, 0xa7, 0xda, 0xe1, 0x7e, 0x92, 0xf8, 0x0c, 0x2b, 0xaa, 0xe5, 0xf0, 0x08, 0xe7, 0x5e, 0x20, - 0x52, 0xd2, 0x1d, 0x6d, 0x53, 0xc3, 0x16, 0xcf, 0x13, 0xb1, 0x38, 0x66, 0xc8, 0xab, 0x67, 0xa9, - 0xa2, 0xfb, 0x01, 0x99, 0x86, 0xad, 0x39, 0xda, 0x55, 0x5c, 0xd4, 0x74, 0x91, 0x54, 0x22, 0x71, - 0x4d, 0x42, 0x49, 0x8b, 0x96, 0x79, 0xdd, 0x71, 0xa1, 0x75, 0x5c, 0x51, 0x43, 0xd0, 0xc4, 0x98, - 0xc7, 0x95, 0xb4, 0x68, 0x71, 0xa1, 0xef, 0x84, 0xfe, 0xb2, 0x51, 0x27, 0xce, 0x1e, 0x83, 0x23, - 0x7b, 0x87, 0xa4, 0xf4, 0xb1, 0x3a, 0x17, 0x84, 0xbb, 0xf1, 0x5e, 0x36, 0xab, 0x5f, 0xe9, 0x63, - 0x75, 0x0c, 0xe4, 0x38, 0x0c, 0xa9, 0x95, 0x8a, 0x45, 0x88, 0x0b, 0x42, 0x2c, 0x30, 0x19, 0x74, - 0xab, 0x29, 0x60, 0xf6, 0x71, 0x48, 0x0a, 0x39, 0x90, 0xad, 0x9a, 0x48, 0xa2, 0x68, 0xb2, 0x68, - 0x3b, 0x76, 0x22, 0xa5, 0x24, 0x75, 0xd1, 0x78, 0x27, 0xf4, 0x6b, 0x76, 0xd1, 0x4b, 0xce, 0xc7, - 0x26, 0x62, 0x27, 0x92, 0x4a, 0x9f, 0x66, 0xbb, 0x89, 0x4d, 0xf9, 0x93, 0x31, 0x18, 0x0c, 0x1e, - 0x2e, 0xa0, 0x59, 0x48, 0x56, 0x8d, 0x92, 0x4a, 0x55, 0x8b, 0x9d, 0x6c, 0x9d, 0x88, 0x38, 0x8f, - 0x98, 0x5c, 0xe0, 0xf0, 0x8a, 0x8b, 0x99, 0xfd, 0x53, 0x09, 0x92, 0xa2, 0x1a, 0x1d, 0x84, 0x84, - 0xa9, 0x3a, 0x5b, 0x94, 0x5c, 0x77, 0x3e, 0x96, 0x96, 0x14, 0x5a, 0x26, 0xf5, 0xb6, 0xa9, 0xea, - 0x54, 0x05, 0x78, 0x3d, 0x29, 0x93, 0x79, 0xad, 0x62, 0xb5, 0x4c, 0xa3, 0x1e, 0xa3, 0x56, 0xc3, - 0xba, 0x63, 0x8b, 0x79, 0xe5, 0xf5, 0x33, 0xbc, 0x1a, 0xdd, 0x07, 0xc3, 0x8e, 0xa5, 0x6a, 0xd5, - 0x00, 0x6c, 0x82, 0xc2, 0xa6, 0x45, 0x83, 0x0b, 0x3c, 0x0d, 0x87, 0x04, 0xdd, 0x32, 0x76, 0xd4, - 0xd2, 0x16, 0x2e, 0x7b, 0x48, 0x3d, 0x34, 0xbb, 0x71, 0x07, 0x07, 0x98, 0xe5, 0xed, 0x02, 0x57, - 0xfe, 0x9a, 0x04, 0xc3, 0x22, 0x4e, 0x2b, 0xbb, 0xc2, 0x5a, 0x04, 0x50, 0x75, 0xdd, 0x70, 0xfc, - 0xe2, 0x6a, 0x54, 0xe5, 0x06, 0xbc, 0xc9, 0x9c, 0x8b, 0xa4, 0xf8, 0x08, 0x64, 0x6b, 0x00, 0x5e, - 0x4b, 0x4b, 0xb1, 0x8d, 0x43, 0x1f, 0x3f, 0x39, 0xa2, 0xc7, 0x8f, 0x2c, 0xb2, 0x07, 0x56, 0x45, - 0x02, 0x3a, 0x34, 0x0a, 0xdd, 0x1b, 0xb8, 0xa2, 0xe9, 0x3c, 0x1f, 0xcc, 0x0a, 0x22, 0xff, 0x92, - 0x70, 0xf3, 0x2f, 0xf9, 0xf7, 0x49, 0x30, 0x52, 0x32, 0x6a, 0x61, 0x7e, 0xf3, 0xe9, 0x50, 0x7a, - 0xc1, 0xbe, 0x2c, 0x3d, 0xf3, 0x58, 0x45, 0x73, 0xb6, 0xea, 0x1b, 0x93, 0x25, 0xa3, 0x36, 0x55, - 0x31, 0xaa, 0xaa, 0x5e, 0xf1, 0xce, 0x4f, 0xe9, 0x3f, 0xa5, 0x53, 0x15, 0xac, 0x9f, 0xaa, 0x18, - 0xbe, 0xd3, 0xd4, 0x0b, 0xde, 0xbf, 0xff, 0x4b, 0x92, 0x7e, 0x3b, 0x16, 0x9f, 0x5b, 0xc9, 0xbf, - 0x16, 0xcb, 0xce, 0xb1, 0xee, 0x56, 0x84, 0x78, 0x14, 0xbc, 0x59, 0xc5, 0x25, 0x32, 0x64, 0xf8, - 0xde, 0x7d, 0x30, 0x5a, 0x31, 0x2a, 0x06, 0xa5, 0x38, 0x45, 0xfe, 0xe3, 0x27, 0xb2, 0x29, 0xb7, - 0x36, 0x1b, 0x79, 0x7c, 0x3b, 0xbd, 0x04, 0x23, 0x1c, 0xb8, 0x48, 0x8f, 0x84, 0x58, 0x60, 0x83, - 0xf6, 0x4c, 0xab, 0x65, 0x7e, 0xef, 0x3b, 0x74, 0x43, 0x57, 0x86, 0x39, 0x2a, 0x69, 0x63, 0xb1, - 0xcf, 0xb4, 0x02, 0x07, 0x02, 0xf4, 0xd8, 0xb2, 0xc5, 0x56, 0x04, 0xc5, 0x3f, 0xe6, 0x14, 0x47, - 0x7c, 0x14, 0x57, 0x39, 0xea, 0xf4, 0x0c, 0x0c, 0x74, 0x42, 0xeb, 0x9f, 0x71, 0x5a, 0xfd, 0xd8, - 0x4f, 0x64, 0x0e, 0x86, 0x28, 0x91, 0x52, 0xdd, 0x76, 0x8c, 0x1a, 0xb5, 0x89, 0x7b, 0x93, 0xf9, - 0xe7, 0xdf, 0x61, 0xeb, 0x68, 0x90, 0xa0, 0xcd, 0xb8, 0x58, 0xd3, 0xd3, 0x40, 0x4f, 0xc1, 0xca, - 0xb8, 0x54, 0x8d, 0xa0, 0xf0, 0x65, 0xce, 0x88, 0x0b, 0x3f, 0x7d, 0x05, 0x46, 0xc9, 0xff, 0xd4, - 0x64, 0xf9, 0x39, 0x89, 0xce, 0xc1, 0x65, 0xbe, 0xf6, 0x2e, 0xb6, 0x54, 0x47, 0x5c, 0x02, 0x3e, - 0x9e, 0x7c, 0xb3, 0x58, 0xc1, 0x8e, 0x83, 0x2d, 0xbb, 0xa8, 0x56, 0x9b, 0xb1, 0xe7, 0x4b, 0x62, - 0x64, 0x7e, 0xeb, 0xfb, 0xc1, 0x59, 0x9c, 0x63, 0x98, 0xb9, 0x6a, 0x75, 0x7a, 0x1d, 0xee, 0x68, - 0xa2, 0x15, 0x6d, 0xd0, 0x7c, 0x95, 0xd3, 0x1c, 0x6d, 0xd0, 0x0c, 0x42, 0x76, 0x05, 0x44, 0xbd, - 0x3b, 0x97, 0x6d, 0xd0, 0xfc, 0x10, 0xa7, 0x89, 0x38, 0xae, 0x98, 0x52, 0x42, 0xf1, 0x71, 0x18, - 0xbe, 0x8a, 0xad, 0x0d, 0xc3, 0xe6, 0x89, 0xa3, 0x36, 0xc8, 0x7d, 0x98, 0x93, 0x1b, 0xe2, 0x88, - 0x34, 0x93, 0x44, 0x68, 0x3d, 0x02, 0xc9, 0x4d, 0xb5, 0x84, 0xdb, 0x20, 0x71, 0x9d, 0x93, 0xe8, - 0x25, 0xf0, 0x04, 0x35, 0x07, 0xfd, 0x15, 0x83, 0xef, 0x5a, 0xd1, 0xe8, 0x1f, 0xe1, 0xe8, 0x7d, - 0x02, 0x87, 0x93, 0x30, 0x0d, 0xb3, 0x5e, 0x25, 0x5b, 0x5a, 0x34, 0x89, 0xbf, 0x23, 0x48, 0x08, - 0x1c, 0x4e, 0xa2, 0x03, 0xb1, 0x7e, 0x54, 0x90, 0xb0, 0x7d, 0xf2, 0xbc, 0x08, 0x7d, 0x86, 0x5e, - 0xdd, 0x35, 0xf4, 0x76, 0x98, 0xf8, 0x18, 0xa7, 0x00, 0x1c, 0x85, 0x10, 0xb8, 0x00, 0xa9, 0x76, - 0x27, 0xe2, 0xef, 0x7e, 0x5f, 0x2c, 0x0f, 0x31, 0x03, 0x73, 0x30, 0x24, 0x0c, 0x94, 0x66, 0xe8, - 0x6d, 0x90, 0xf8, 0x7b, 0x9c, 0xc4, 0xa0, 0x0f, 0x8d, 0x0f, 0xc3, 0xc1, 0xb6, 0x53, 0xc1, 0xed, - 0x10, 0xf9, 0xa4, 0x18, 0x06, 0x47, 0xe1, 0xa2, 0xdc, 0xc0, 0x7a, 0x69, 0xab, 0x3d, 0x0a, 0x9f, - 0x12, 0xa2, 0x14, 0x38, 0x84, 0xc4, 0x0c, 0x0c, 0xd4, 0x54, 0xcb, 0xde, 0x52, 0xab, 0x6d, 0x4d, - 0xc7, 0xdf, 0xe7, 0x34, 0xfa, 0x5d, 0x24, 0x2e, 0x91, 0xba, 0xde, 0x09, 0x99, 0xd7, 0x84, 0x44, - 0x7c, 0x68, 0x7c, 0xe9, 0xd9, 0x0e, 0xcd, 0xb2, 0x75, 0x42, 0xed, 0x1f, 0x88, 0xa5, 0xc7, 0x70, - 0x17, 0xfd, 0x14, 0x2f, 0x40, 0xca, 0xd6, 0x9e, 0x6f, 0x8b, 0xcc, 0xef, 0x88, 0x99, 0xa6, 0x08, - 0x04, 0xf9, 0x6d, 0x70, 0xa8, 0xe9, 0x36, 0xd1, 0x06, 0xb1, 0xdf, 0xe5, 0xc4, 0x0e, 0x36, 0xd9, - 0x2a, 0xb8, 0x49, 0xe8, 0x94, 0xe4, 0x3f, 0x14, 0x26, 0x01, 0x87, 0x68, 0xad, 0x90, 0x38, 0xc2, - 0x56, 0x37, 0x3b, 0x93, 0xda, 0xa7, 0x85, 0xd4, 0x18, 0x6e, 0x40, 0x6a, 0x6b, 0x70, 0x90, 0x53, - 0xec, 0x6c, 0x5e, 0x3f, 0x23, 0x0c, 0x2b, 0xc3, 0x5e, 0x0f, 0xce, 0xee, 0xdb, 0x21, 0xeb, 0x8a, - 0x53, 0x38, 0xac, 0x76, 0xb1, 0xa6, 0x9a, 0x6d, 0x50, 0xfe, 0x3d, 0x4e, 0x59, 0x58, 0x7c, 0xd7, - 0xe3, 0xb5, 0x17, 0x55, 0x93, 0x10, 0x7f, 0x1a, 0x32, 0x82, 0x78, 0x5d, 0xb7, 0x70, 0xc9, 0xa8, - 0xe8, 0xda, 0xf3, 0xb8, 0xdc, 0x06, 0xe9, 0xcf, 0x86, 0xa6, 0x6a, 0xdd, 0x87, 0x4e, 0x28, 0xcf, - 0x43, 0xda, 0xf5, 0x55, 0x8a, 0x5a, 0xcd, 0x34, 0x2c, 0x27, 0x82, 0xe2, 0xe7, 0xc4, 0x4c, 0xb9, - 0x78, 0xf3, 0x14, 0x6d, 0xba, 0x00, 0x83, 0xb4, 0xd8, 0xae, 0x4a, 0x7e, 0x9e, 0x13, 0x1a, 0xf0, - 0xb0, 0xb8, 0xe1, 0x28, 0x19, 0x35, 0x53, 0xb5, 0xda, 0xb1, 0x7f, 0x5f, 0x10, 0x86, 0x83, 0xa3, - 0x70, 0xc3, 0xe1, 0xec, 0x9a, 0x98, 0xec, 0xf6, 0x6d, 0x50, 0xf8, 0xa2, 0x30, 0x1c, 0x02, 0x87, - 0x93, 0x10, 0x0e, 0x43, 0x1b, 0x24, 0xfe, 0x91, 0x20, 0x21, 0x70, 0x08, 0x89, 0x27, 0xbd, 0x8d, - 0xd6, 0xc2, 0x15, 0xcd, 0x76, 0x2c, 0xe6, 0x26, 0xef, 0x4d, 0xea, 0x1f, 0x7f, 0x3f, 0xe8, 0x84, - 0x29, 0x3e, 0x54, 0x62, 0x89, 0x78, 0xda, 0x95, 0x46, 0x51, 0xd1, 0x8c, 0xfd, 0xbe, 0xb0, 0x44, - 0x3e, 0x34, 0xc2, 0x9b, 0xcf, 0x43, 0x24, 0x62, 0x2f, 0x91, 0xd8, 0xa1, 0x0d, 0x72, 0xff, 0x24, - 0xc4, 0xdc, 0xaa, 0xc0, 0x25, 0x34, 0x7d, 0xfe, 0x4f, 0x5d, 0xdf, 0xc6, 0xbb, 0x6d, 0x69, 0xe7, - 0x1f, 0x84, 0xfc, 0x9f, 0x75, 0x86, 0xc9, 0x6c, 0xc8, 0x50, 0xc8, 0x9f, 0x42, 0x51, 0xf7, 0x87, - 0x32, 0xbf, 0xf0, 0x43, 0x3e, 0xde, 0xa0, 0x3b, 0x35, 0xbd, 0x40, 0x94, 0x3c, 0xe8, 0xf4, 0x44, - 0x13, 0x7b, 0xd7, 0x0f, 0x5d, 0x3d, 0x0f, 0xf8, 0x3c, 0xd3, 0x97, 0x60, 0x20, 0xe0, 0xf0, 0x44, - 0x93, 0xfa, 0x25, 0x4e, 0xaa, 0xdf, 0xef, 0xef, 0x4c, 0x9f, 0x81, 0x04, 0x71, 0x5e, 0xa2, 0xd1, - 0xdf, 0xcd, 0xd1, 0x29, 0xf8, 0xf4, 0xa3, 0x90, 0x14, 0x4e, 0x4b, 0x34, 0xea, 0x7b, 0x38, 0xaa, - 0x8b, 0x42, 0xd0, 0x85, 0xc3, 0x12, 0x8d, 0xfe, 0xcb, 0x02, 0x5d, 0xa0, 0x10, 0xf4, 0xf6, 0x45, - 0xf8, 0xa5, 0x5f, 0x4d, 0xf0, 0x4d, 0x47, 0xc8, 0xee, 0x02, 0xf4, 0x72, 0x4f, 0x25, 0x1a, 0xfb, - 0x57, 0x78, 0xe7, 0x02, 0x63, 0xfa, 0x1c, 0x74, 0xb7, 0x29, 0xf0, 0xf7, 0x72, 0x54, 0x06, 0x3f, - 0x3d, 0x03, 0x7d, 0x3e, 0xef, 0x24, 0x1a, 0xfd, 0x6f, 0x73, 0x74, 0x3f, 0x16, 0x61, 0x9d, 0x7b, - 0x27, 0xd1, 0x04, 0xde, 0x27, 0x58, 0xe7, 0x18, 0x44, 0x6c, 0xc2, 0x31, 0x89, 0xc6, 0x7e, 0x45, - 0x48, 0x5d, 0xa0, 0x4c, 0x5f, 0x84, 0x94, 0xbb, 0xd9, 0x44, 0xe3, 0xbf, 0x9f, 0xe3, 0x7b, 0x38, - 0x44, 0x02, 0xbe, 0xcd, 0x2e, 0x9a, 0xc4, 0x07, 0x84, 0x04, 0x7c, 0x58, 0x64, 0x19, 0x85, 0x1d, - 0x98, 0x68, 0x4a, 0xbf, 0x26, 0x96, 0x51, 0xc8, 0x7f, 0x21, 0xb3, 0x49, 0x6d, 0x7e, 0x34, 0x89, - 0x5f, 0x17, 0xb3, 0x49, 0xe1, 0x09, 0x1b, 0x61, 0x8f, 0x20, 0x9a, 0xc6, 0x6f, 0x0a, 0x36, 0x42, - 0x0e, 0xc1, 0xf4, 0x0a, 0xa0, 0x46, 0x6f, 0x20, 0x9a, 0xde, 0x07, 0x39, 0xbd, 0xe1, 0x06, 0x67, - 0x60, 0xfa, 0x29, 0x38, 0xd8, 0xdc, 0x13, 0x88, 0xa6, 0xfa, 0x5b, 0x3f, 0x0c, 0xc5, 0x6e, 0x7e, - 0x47, 0x60, 0x7a, 0xcd, 0xdb, 0x52, 0xfc, 0x5e, 0x40, 0x34, 0xd9, 0x57, 0x7f, 0x18, 0x34, 0xdc, - 0x7e, 0x27, 0x60, 0x3a, 0x07, 0xe0, 0x6d, 0xc0, 0xd1, 0xb4, 0x3e, 0xcc, 0x69, 0xf9, 0x90, 0xc8, - 0xd2, 0xe0, 0xfb, 0x6f, 0x34, 0xfe, 0x75, 0xb1, 0x34, 0x38, 0x06, 0x59, 0x1a, 0x62, 0xeb, 0x8d, - 0xc6, 0xfe, 0x88, 0x58, 0x1a, 0x02, 0x85, 0x68, 0xb6, 0x6f, 0x77, 0x8b, 0xa6, 0xf0, 0x31, 0xa1, - 0xd9, 0x3e, 0xac, 0xe9, 0x25, 0x18, 0x6e, 0xd8, 0x10, 0xa3, 0x49, 0xfd, 0x36, 0x27, 0x95, 0x0e, - 0xef, 0x87, 0xfe, 0xcd, 0x8b, 0x6f, 0x86, 0xd1, 0xd4, 0x3e, 0x1e, 0xda, 0xbc, 0xf8, 0x5e, 0x38, - 0x7d, 0x01, 0x92, 0x7a, 0xbd, 0x5a, 0x25, 0x8b, 0x07, 0xed, 0x7d, 0xe7, 0x2f, 0xf3, 0x9f, 0x7f, - 0xcc, 0xa5, 0x23, 0x10, 0xa6, 0xcf, 0x40, 0x37, 0xae, 0x6d, 0xe0, 0x72, 0x14, 0xe6, 0xf7, 0x7e, - 0x2c, 0x0c, 0x26, 0x81, 0x9e, 0xbe, 0x08, 0xc0, 0x52, 0x23, 0xf4, 0x78, 0x30, 0x02, 0xf7, 0xbf, - 0xfc, 0x98, 0xdf, 0xc6, 0xf1, 0x50, 0x3c, 0x02, 0xec, 0x6e, 0xcf, 0xde, 0x04, 0xbe, 0x1f, 0x24, - 0x40, 0x67, 0xe4, 0x11, 0xe8, 0x7d, 0xd6, 0x36, 0x74, 0x47, 0xad, 0x44, 0x61, 0xff, 0x57, 0x8e, - 0x2d, 0xe0, 0x89, 0xc0, 0x6a, 0x86, 0x85, 0x1d, 0xb5, 0x62, 0x47, 0xe1, 0xfe, 0x37, 0x8e, 0xeb, - 0x22, 0x10, 0xe4, 0x92, 0x6a, 0x3b, 0xed, 0x8c, 0xfb, 0xaf, 0x04, 0xb2, 0x40, 0x20, 0x4c, 0x93, - 0xff, 0xb7, 0xf1, 0x6e, 0x14, 0xee, 0x0f, 0x04, 0xd3, 0x1c, 0x7e, 0xfa, 0x51, 0x48, 0x91, 0x7f, - 0xd9, 0x15, 0xbb, 0x08, 0xe4, 0xff, 0xce, 0x91, 0x3d, 0x0c, 0xd2, 0xb3, 0xed, 0x94, 0x1d, 0x2d, - 0x5a, 0xd8, 0x6f, 0xf0, 0x99, 0x16, 0xf0, 0xd3, 0x39, 0xe8, 0xb3, 0x9d, 0x72, 0xb9, 0xce, 0xfd, - 0xd3, 0x08, 0xf4, 0xff, 0xf1, 0x63, 0x37, 0x65, 0xe1, 0xe2, 0x90, 0xd9, 0xbe, 0xb6, 0xed, 0x98, - 0x06, 0x3d, 0x02, 0x89, 0xa2, 0xf0, 0x43, 0x4e, 0xc1, 0x87, 0x32, 0x3d, 0x03, 0xfd, 0x64, 0x2c, - 0x16, 0x36, 0x31, 0x3d, 0xaf, 0x8a, 0x20, 0xf1, 0x23, 0x2e, 0x80, 0x00, 0x52, 0xfe, 0xe7, 0xbe, - 0xfc, 0xfa, 0x98, 0xf4, 0xd5, 0xd7, 0xc7, 0xa4, 0x6f, 0xbd, 0x3e, 0x26, 0xbd, 0xf2, 0xed, 0xb1, - 0xae, 0xaf, 0x7e, 0x7b, 0xac, 0xeb, 0x1b, 0xdf, 0x1e, 0xeb, 0x6a, 0x9e, 0x36, 0x86, 0x39, 0x63, - 0xce, 0x60, 0x09, 0xe3, 0x67, 0xe4, 0x40, 0xba, 0xb8, 0x62, 0x78, 0xd9, 0x5a, 0x37, 0xc8, 0x81, - 0x1f, 0x49, 0x24, 0x60, 0x0e, 0xe6, 0x72, 0x55, 0x7d, 0xb7, 0xc5, 0x1b, 0x9c, 0x6c, 0xd3, 0xc4, - 0xb0, 0xfc, 0x16, 0x88, 0xe7, 0xf4, 0x5d, 0x74, 0x88, 0xd9, 0xbc, 0x62, 0xdd, 0xaa, 0xf2, 0xab, - 0x5f, 0xbd, 0xa4, 0xbc, 0x6e, 0x55, 0xd1, 0xa8, 0x77, 0x3f, 0x53, 0x3a, 0xd1, 0xcf, 0x2f, 0x5d, - 0x4e, 0x27, 0x7e, 0xf0, 0xb1, 0xf1, 0xae, 0xfc, 0x76, 0x78, 0x84, 0x5f, 0x8a, 0x1c, 0x65, 0x32, - 0xa7, 0xef, 0xd2, 0x41, 0xae, 0x48, 0xcf, 0x74, 0x93, 0x3e, 0x6c, 0x91, 0xd8, 0x1e, 0x0b, 0x27, - 0xb6, 0x9f, 0xc2, 0xd5, 0xea, 0x13, 0xba, 0x71, 0x4d, 0x5f, 0x23, 0x60, 0x1b, 0x3d, 0x94, 0xc6, - 0x43, 0xf0, 0x4a, 0x0c, 0xc6, 0xc3, 0xe3, 0x26, 0x8a, 0x63, 0x3b, 0x6a, 0xcd, 0x6c, 0xf5, 0x02, - 0xe9, 0x02, 0xa4, 0xd6, 0x04, 0x0c, 0xca, 0x40, 0xaf, 0x8d, 0x4b, 0x86, 0x5e, 0xb6, 0xe9, 0x60, - 0xe3, 0x8a, 0x28, 0x92, 0xc1, 0xea, 0xaa, 0x6e, 0xd8, 0xfc, 0x82, 0x24, 0x2b, 0xe4, 0x7f, 0x43, - 0xea, 0x6c, 0x26, 0x07, 0xdd, 0xae, 0xc4, 0x48, 0xef, 0xdb, 0x2b, 0xfd, 0x4f, 0xa5, 0xe0, 0x0d, - 0xc1, 0x97, 0xeb, 0x6f, 0x57, 0x24, 0xbf, 0x18, 0x87, 0x43, 0x25, 0xc3, 0xae, 0x19, 0x76, 0x91, - 0xcd, 0x30, 0x2b, 0x70, 0x61, 0xf4, 0xfb, 0x9b, 0xda, 0xc8, 0xff, 0x5f, 0x86, 0x41, 0xba, 0x0a, - 0x68, 0xe6, 0x93, 0x1a, 0x9e, 0xc8, 0xbd, 0xe2, 0x4f, 0xfe, 0x4d, 0x37, 0xd5, 0x9a, 0x01, 0x17, - 0x91, 0x5e, 0xed, 0x58, 0x83, 0x51, 0xad, 0x66, 0x56, 0x31, 0x3d, 0x03, 0x2a, 0xba, 0x6d, 0xd1, - 0xf4, 0xbe, 0xc2, 0xe9, 0x8d, 0x78, 0xe8, 0xf3, 0x02, 0x7b, 0x7a, 0x01, 0x86, 0xd5, 0x52, 0x09, - 0x9b, 0x01, 0x92, 0x11, 0x2b, 0x54, 0x30, 0x98, 0xe6, 0x98, 0x2e, 0xb5, 0xfc, 0xc5, 0x56, 0x73, - 0xfb, 0xcc, 0x3d, 0xbe, 0x49, 0xb3, 0x70, 0x05, 0xeb, 0xa7, 0x74, 0xec, 0x5c, 0x33, 0xac, 0x6d, - 0x2e, 0xde, 0x53, 0xac, 0x2b, 0x31, 0x09, 0xbf, 0x14, 0x87, 0x31, 0xd6, 0x30, 0xb5, 0xa1, 0xda, - 0x78, 0xea, 0xea, 0x83, 0x1b, 0xd8, 0x51, 0x1f, 0x9c, 0x2a, 0x19, 0x9a, 0xce, 0x67, 0x62, 0x84, - 0xcf, 0x0b, 0x69, 0x9f, 0xe4, 0xed, 0x2d, 0x16, 0xe6, 0x1c, 0x24, 0x66, 0x0c, 0x4d, 0x27, 0x1a, - 0x59, 0xc6, 0xba, 0x51, 0xe3, 0xcb, 0x92, 0x15, 0xd0, 0x5d, 0xd0, 0xa3, 0xd6, 0x8c, 0xba, 0xee, - 0xb0, 0xe3, 0xab, 0x7c, 0xdf, 0x97, 0x6f, 0x8c, 0x77, 0xfd, 0xf9, 0x8d, 0xf1, 0xf8, 0xbc, 0xee, - 0x28, 0xbc, 0x69, 0x3a, 0xf1, 0xdd, 0x8f, 0x8e, 0x4b, 0xf2, 0xe3, 0xd0, 0x3b, 0x8b, 0x4b, 0xfb, - 0xa1, 0x35, 0x8b, 0x4b, 0x21, 0x5a, 0xf7, 0x42, 0x72, 0x5e, 0x77, 0xd8, 0x9d, 0xd9, 0xa3, 0x10, - 0xd7, 0x74, 0x76, 0x0b, 0x2b, 0xd4, 0x3f, 0xa9, 0x27, 0xa0, 0xb3, 0xb8, 0xe4, 0x82, 0x96, 0x71, - 0x29, 0x0c, 0x4a, 0xc8, 0x93, 0xfa, 0xfc, 0xec, 0x37, 0xfe, 0x62, 0xac, 0xeb, 0xc5, 0xd7, 0xc7, - 0xba, 0x5a, 0xce, 0x84, 0xdf, 0x1c, 0x72, 0x11, 0xf3, 0x29, 0xb0, 0xcb, 0xdb, 0x53, 0x4e, 0x60, - 0x2d, 0xfc, 0xad, 0x18, 0x8c, 0x35, 0xa8, 0x38, 0xdf, 0x18, 0x5a, 0x59, 0x87, 0x69, 0x48, 0xce, - 0x8a, 0xfd, 0xa6, 0x53, 0xe3, 0xf0, 0xeb, 0x1d, 0x1a, 0x87, 0x01, 0xd1, 0x93, 0xb0, 0x0d, 0x27, - 0xa3, 0x6d, 0x83, 0xe0, 0x7f, 0x1f, 0xa6, 0xe1, 0xb5, 0x04, 0x1c, 0xa5, 0x8f, 0x42, 0xac, 0x9a, - 0xa6, 0x3b, 0x53, 0x25, 0x6b, 0xd7, 0x74, 0xe8, 0x76, 0x62, 0x6c, 0x72, 0x69, 0x0c, 0x7b, 0xcd, - 0x93, 0xac, 0xb9, 0x85, 0x4a, 0x6e, 0x42, 0xf7, 0x0a, 0xc1, 0x23, 0x82, 0x70, 0x0c, 0x47, 0xad, - 0x72, 0x01, 0xb1, 0x02, 0xa9, 0x65, 0x0f, 0x49, 0x62, 0xac, 0x56, 0x13, 0x6f, 0x48, 0xaa, 0x58, - 0xdd, 0x64, 0x17, 0x77, 0xe3, 0x74, 0x0b, 0x49, 0x92, 0x0a, 0x7a, 0x47, 0x77, 0x14, 0xba, 0xd5, - 0x3a, 0x3b, 0x72, 0x8e, 0x93, 0xbd, 0x85, 0x16, 0xe4, 0x27, 0xa0, 0x97, 0x1f, 0x73, 0xa1, 0x34, - 0xc4, 0xb7, 0xf1, 0x2e, 0xed, 0xa7, 0x5f, 0x21, 0xff, 0xa2, 0x49, 0xe8, 0xa6, 0xcc, 0xf3, 0x17, - 0x09, 0x99, 0xc9, 0x06, 0xee, 0x27, 0x29, 0x93, 0x0a, 0x03, 0x93, 0x1f, 0x87, 0xe4, 0xac, 0x51, - 0xd3, 0x74, 0x23, 0x48, 0x2d, 0xc5, 0xa8, 0x51, 0x9e, 0xcd, 0x3a, 0x57, 0x7d, 0x85, 0x15, 0xd0, - 0x41, 0xe8, 0x61, 0x17, 0xb9, 0xf9, 0xb1, 0x39, 0x2f, 0xc9, 0x33, 0xd0, 0x4b, 0x69, 0x2f, 0x9b, - 0x08, 0xf1, 0x97, 0x3d, 0xfc, 0xc6, 0x38, 0xb5, 0x92, 0x9c, 0x7c, 0xcc, 0x63, 0x16, 0x41, 0xa2, - 0xac, 0x3a, 0x2a, 0x1f, 0x37, 0xfd, 0x5f, 0x7e, 0x0c, 0x92, 0x9c, 0x88, 0x8d, 0x4e, 0x43, 0xdc, - 0x30, 0x6d, 0x7e, 0xf0, 0x9d, 0x6d, 0x35, 0x94, 0x65, 0x33, 0x9f, 0x20, 0x8b, 0x46, 0x21, 0xc0, - 0x79, 0xa5, 0xe5, 0x2a, 0x39, 0xef, 0x53, 0x24, 0xdf, 0x94, 0xfb, 0xfe, 0x65, 0x53, 0xda, 0xa0, - 0x0e, 0xae, 0xb2, 0x7c, 0x2c, 0x06, 0x63, 0xbe, 0xd6, 0xab, 0xd8, 0x22, 0xb1, 0x1e, 0x5b, 0x60, - 0x5c, 0x5b, 0x90, 0x8f, 0x49, 0xde, 0xde, 0x42, 0x5d, 0x1e, 0x85, 0x78, 0xce, 0x34, 0x51, 0x16, - 0x92, 0xec, 0x80, 0xdb, 0x60, 0xfa, 0x92, 0x50, 0xdc, 0x32, 0x69, 0xb3, 0x8d, 0x4d, 0xe7, 0x9a, - 0x6a, 0xb9, 0x4f, 0x98, 0x44, 0x59, 0x7e, 0x04, 0x52, 0x33, 0x86, 0x6e, 0x63, 0xdd, 0xae, 0xd3, - 0xa5, 0xb7, 0x51, 0x35, 0x4a, 0xdb, 0x9c, 0x02, 0x2b, 0x10, 0x81, 0xab, 0xa6, 0x49, 0x31, 0x13, - 0x0a, 0xf9, 0x97, 0x99, 0xa9, 0xfc, 0x6a, 0x4b, 0x11, 0x3d, 0xd2, 0xb9, 0x88, 0xf8, 0x20, 0x5d, - 0x19, 0xfd, 0x6f, 0x09, 0x8e, 0x34, 0x2e, 0xa8, 0x6d, 0xbc, 0x6b, 0x77, 0xba, 0x9e, 0x9e, 0x86, - 0xd4, 0x0a, 0x7d, 0x47, 0xfc, 0x04, 0xde, 0x45, 0x59, 0xe8, 0xc5, 0xe5, 0xd3, 0x67, 0xce, 0x3c, - 0xf8, 0x08, 0xd3, 0xf6, 0xcb, 0x5d, 0x8a, 0xa8, 0x40, 0x63, 0x90, 0xb2, 0x71, 0xc9, 0x3c, 0x7d, - 0xe6, 0xec, 0xf6, 0x83, 0x4c, 0xbd, 0x2e, 0x77, 0x29, 0x5e, 0xd5, 0x74, 0x92, 0x8c, 0xfa, 0xbb, - 0x1f, 0x1b, 0x97, 0xf2, 0xdd, 0x10, 0xb7, 0xeb, 0xb5, 0xdb, 0xaa, 0x23, 0xaf, 0x76, 0xc3, 0x84, - 0x1f, 0x93, 0x1a, 0xa8, 0xab, 0x6a, 0x55, 0x2b, 0xab, 0xde, 0x0b, 0xf0, 0xb4, 0x4f, 0x06, 0x14, - 0xa2, 0xb9, 0x08, 0xb2, 0x7b, 0x4a, 0x52, 0xfe, 0xac, 0x04, 0xfd, 0x57, 0x04, 0xe5, 0x55, 0xec, - 0xa0, 0x0b, 0x00, 0x6e, 0x4f, 0x62, 0xd9, 0x1c, 0x9e, 0x0c, 0xf7, 0x35, 0xe9, 0xe2, 0x28, 0x3e, - 0x70, 0x74, 0x8e, 0x2a, 0xa2, 0x69, 0xd8, 0xfc, 0xfd, 0x4b, 0x04, 0xaa, 0x0b, 0x8c, 0xee, 0x07, - 0x44, 0x2d, 0x5c, 0xf1, 0xaa, 0xe1, 0x68, 0x7a, 0xa5, 0x68, 0x1a, 0xd7, 0xf8, 0x63, 0xc1, 0xb8, - 0x92, 0xa6, 0x2d, 0x57, 0x68, 0xc3, 0x0a, 0xa9, 0x27, 0x4c, 0xa7, 0x5c, 0x2a, 0x64, 0x37, 0x51, - 0xcb, 0x65, 0x0b, 0xdb, 0x36, 0x37, 0x62, 0xa2, 0x88, 0x2e, 0x40, 0xaf, 0x59, 0xdf, 0x28, 0x0a, - 0x8b, 0xd1, 0x77, 0xfa, 0x48, 0xb3, 0xf5, 0x2f, 0xf4, 0x83, 0x5b, 0x80, 0x1e, 0xb3, 0xbe, 0x41, - 0xb4, 0xe5, 0x4e, 0xe8, 0x6f, 0xc2, 0x4c, 0xdf, 0x55, 0x8f, 0x0f, 0xfa, 0x7c, 0x9d, 0x8f, 0xa0, - 0x68, 0x5a, 0x9a, 0x61, 0x69, 0xce, 0x2e, 0xbd, 0xbd, 0x12, 0x57, 0xd2, 0xa2, 0x61, 0x85, 0xd7, - 0xcb, 0xdb, 0x30, 0xb4, 0x4a, 0x5d, 0x2d, 0x8f, 0xf3, 0x33, 0x1e, 0x7f, 0x52, 0x34, 0x7f, 0x2d, - 0x39, 0x8b, 0x35, 0x70, 0x96, 0x7f, 0xb2, 0xa5, 0x76, 0x9e, 0xeb, 0x5c, 0x3b, 0x83, 0x9b, 0xff, - 0x5f, 0x1d, 0x0a, 0x2c, 0x4e, 0xee, 0x59, 0xfb, 0xcc, 0x57, 0xbb, 0x8a, 0x19, 0x15, 0x61, 0x64, - 0xf7, 0xde, 0x54, 0xb3, 0x11, 0x66, 0x34, 0x1b, 0xb9, 0x84, 0xe4, 0x47, 0x60, 0x60, 0x45, 0xb5, - 0x9c, 0x55, 0xec, 0x5c, 0xc6, 0x6a, 0x19, 0x5b, 0xc1, 0x5d, 0x77, 0x40, 0xec, 0xba, 0x08, 0x12, - 0x74, 0x6b, 0x65, 0xbb, 0x0e, 0xfd, 0x5f, 0xde, 0x82, 0x04, 0xbd, 0xc1, 0xe6, 0xee, 0xc8, 0x1c, - 0x83, 0xed, 0xc8, 0xc4, 0x96, 0xee, 0x3a, 0xd8, 0x16, 0x01, 0x1d, 0x2d, 0xa0, 0x87, 0xc5, 0xbe, - 0x1a, 0xdf, 0x7b, 0x5f, 0xe5, 0x8a, 0xc8, 0x77, 0xd7, 0x2a, 0xf4, 0xe6, 0x89, 0x29, 0x9e, 0x9f, - 0x75, 0x19, 0x91, 0x3c, 0x46, 0xd0, 0x22, 0x0c, 0x99, 0xaa, 0xe5, 0xd0, 0xab, 0xfb, 0x5b, 0x74, - 0x14, 0x5c, 0xd7, 0xc7, 0x1b, 0x57, 0x5e, 0x60, 0xb0, 0xbc, 0x97, 0x01, 0xd3, 0x5f, 0x29, 0xff, - 0x65, 0x02, 0x7a, 0xb8, 0x30, 0x1e, 0x85, 0x5e, 0x2e, 0x56, 0xae, 0x9d, 0x47, 0x27, 0x1b, 0x37, - 0xa6, 0x49, 0x77, 0x03, 0xe1, 0xf4, 0x04, 0x0e, 0x3a, 0x06, 0xc9, 0xd2, 0x96, 0xaa, 0xe9, 0x45, - 0xad, 0x2c, 0xbc, 0xde, 0xd7, 0x6f, 0x8c, 0xf7, 0xce, 0x90, 0xba, 0xf9, 0x59, 0xa5, 0x97, 0x36, - 0xce, 0x97, 0x89, 0x27, 0xb0, 0x85, 0xb5, 0xca, 0x96, 0xc3, 0x57, 0x18, 0x2f, 0xa1, 0xf3, 0x90, - 0x20, 0x0a, 0xc1, 0x5f, 0x76, 0x65, 0x1b, 0x62, 0x0f, 0x37, 0x00, 0xcc, 0x27, 0x49, 0xc7, 0xaf, - 0x7c, 0x73, 0x5c, 0x52, 0x28, 0x06, 0x9a, 0x81, 0x81, 0xaa, 0x6a, 0x3b, 0x45, 0xba, 0x83, 0x91, - 0xee, 0xbb, 0x29, 0x89, 0x43, 0x8d, 0x02, 0xe1, 0x82, 0xe5, 0xac, 0xf7, 0x11, 0x2c, 0x56, 0x55, - 0x46, 0x27, 0x20, 0x4d, 0x89, 0x94, 0x8c, 0x5a, 0x4d, 0x73, 0x98, 0x6f, 0xd5, 0x43, 0xe5, 0x3e, - 0x48, 0xea, 0x67, 0x68, 0x35, 0xf5, 0xb0, 0x0e, 0x43, 0x8a, 0x3e, 0x25, 0xa1, 0x20, 0xec, 0xda, - 0x64, 0x92, 0x54, 0xd0, 0xc6, 0xe3, 0x30, 0xe4, 0xd9, 0x47, 0x06, 0x92, 0x64, 0x54, 0xbc, 0x6a, - 0x0a, 0xf8, 0x00, 0x8c, 0xea, 0x78, 0x87, 0x5e, 0xe4, 0x0c, 0x40, 0xa7, 0x28, 0x34, 0x22, 0x6d, - 0x57, 0x82, 0x18, 0xf7, 0xc0, 0x60, 0x49, 0x08, 0x9f, 0xc1, 0x02, 0x85, 0x1d, 0x70, 0x6b, 0x29, - 0xd8, 0x21, 0x48, 0xaa, 0xa6, 0xc9, 0x00, 0xfa, 0xb8, 0x7d, 0x34, 0x4d, 0xda, 0x74, 0x12, 0x86, - 0xe9, 0x18, 0x2d, 0x6c, 0xd7, 0xab, 0x0e, 0x27, 0xd2, 0x4f, 0x61, 0x86, 0x48, 0x83, 0xc2, 0xea, - 0x29, 0xec, 0x5d, 0x30, 0x80, 0xaf, 0x6a, 0x65, 0xac, 0x97, 0x30, 0x83, 0x1b, 0xa0, 0x70, 0xfd, - 0xa2, 0x92, 0x02, 0xdd, 0x0b, 0xae, 0xdd, 0x2b, 0x0a, 0x9b, 0x3c, 0xc8, 0xe8, 0x89, 0xfa, 0x1c, - 0xab, 0x96, 0x33, 0x90, 0x98, 0x55, 0x1d, 0x95, 0x38, 0x18, 0xce, 0x0e, 0xdb, 0x68, 0xfa, 0x15, - 0xf2, 0xaf, 0xfc, 0xdd, 0x18, 0x24, 0xae, 0x18, 0x0e, 0x46, 0x0f, 0xf9, 0x1c, 0xc0, 0xc1, 0x66, - 0xfa, 0xbc, 0xaa, 0x55, 0x74, 0x5c, 0x5e, 0xb4, 0x2b, 0xbe, 0xf7, 0xdc, 0x9e, 0x3a, 0xc5, 0x02, - 0xea, 0x34, 0x0a, 0xdd, 0x96, 0x51, 0xd7, 0xcb, 0xe2, 0xc6, 0x21, 0x2d, 0xa0, 0x02, 0x24, 0x5d, - 0x2d, 0x49, 0x44, 0x69, 0xc9, 0x10, 0xd1, 0x12, 0xa2, 0xc3, 0xbc, 0x42, 0xe9, 0xdd, 0xe0, 0xca, - 0x92, 0x87, 0x94, 0x6b, 0xbc, 0xb8, 0xb6, 0xb5, 0xa7, 0xb0, 0x1e, 0x1a, 0xd9, 0x4c, 0xdc, 0xb9, - 0x77, 0x85, 0xc7, 0x34, 0x2e, 0xed, 0x36, 0x70, 0xe9, 0x05, 0xd4, 0x8a, 0xbf, 0x2d, 0xef, 0xa5, - 0xe3, 0xf2, 0xd4, 0x8a, 0xbd, 0x2f, 0x3f, 0x02, 0x29, 0x5b, 0xab, 0xe8, 0xaa, 0x53, 0xb7, 0x30, - 0xd7, 0x3c, 0xaf, 0x42, 0xfe, 0x92, 0x04, 0x3d, 0x4c, 0x93, 0x7d, 0x72, 0x93, 0x9a, 0xcb, 0x2d, - 0xd6, 0x4a, 0x6e, 0xf1, 0xfd, 0xcb, 0x2d, 0x07, 0xe0, 0x32, 0x63, 0xf3, 0xb7, 0xc1, 0x4d, 0x3c, - 0x06, 0xc6, 0xe2, 0xaa, 0x56, 0xe1, 0x0b, 0xd5, 0x87, 0x24, 0xff, 0x07, 0x89, 0x38, 0xb1, 0xbc, - 0x1d, 0xe5, 0x60, 0x40, 0xf0, 0x55, 0xdc, 0xac, 0xaa, 0x15, 0xae, 0x3b, 0x47, 0x5b, 0x32, 0x77, - 0xa9, 0xaa, 0x56, 0x94, 0x3e, 0xce, 0x0f, 0x29, 0x34, 0x9f, 0x87, 0x58, 0x8b, 0x79, 0x08, 0x4c, - 0x7c, 0x7c, 0x7f, 0x13, 0x1f, 0x98, 0xa2, 0x44, 0x78, 0x8a, 0x3e, 0x17, 0xa3, 0xc1, 0x8c, 0x69, - 0xd8, 0x6a, 0xf5, 0xcd, 0x58, 0x11, 0x87, 0x21, 0x65, 0x1a, 0xd5, 0x22, 0x6b, 0x61, 0x37, 0x71, - 0x93, 0xa6, 0x51, 0x55, 0x1a, 0xa6, 0xbd, 0xfb, 0x16, 0x2d, 0x97, 0x9e, 0x5b, 0x20, 0xb5, 0xde, - 0xb0, 0xd4, 0x2c, 0xe8, 0x67, 0xa2, 0xe0, 0x7b, 0xd9, 0x03, 0x44, 0x06, 0x74, 0x73, 0x94, 0x1a, - 0xf7, 0x5e, 0xc6, 0x36, 0x83, 0x54, 0x38, 0x1c, 0xc1, 0x60, 0xa6, 0xbf, 0x59, 0x14, 0xec, 0x57, - 0x4b, 0x85, 0xc3, 0xc9, 0xbf, 0x21, 0x01, 0x2c, 0x10, 0xc9, 0xd2, 0xf1, 0x92, 0x5d, 0xc8, 0xa6, - 0x2c, 0x14, 0x03, 0x3d, 0x8f, 0xb5, 0x9a, 0x34, 0xde, 0x7f, 0xbf, 0xed, 0xe7, 0x7b, 0x06, 0x06, - 0x3c, 0x65, 0xb4, 0xb1, 0x60, 0x66, 0x6c, 0x0f, 0xaf, 0x7a, 0x15, 0x3b, 0x4a, 0xff, 0x55, 0x5f, - 0x49, 0xfe, 0x23, 0x09, 0x52, 0x94, 0xa7, 0x45, 0xec, 0xa8, 0x81, 0x39, 0x94, 0xf6, 0x3f, 0x87, - 0x47, 0x01, 0x18, 0x19, 0x5b, 0x7b, 0x1e, 0x73, 0xcd, 0x4a, 0xd1, 0x9a, 0x55, 0xed, 0x79, 0x8c, - 0xce, 0xba, 0x02, 0x8f, 0xef, 0x2d, 0x70, 0xe1, 0x75, 0x73, 0xb1, 0xdf, 0x01, 0xbd, 0xf4, 0x13, - 0x39, 0x3b, 0x36, 0x77, 0xa4, 0x7b, 0xf4, 0x7a, 0x6d, 0x6d, 0xc7, 0x96, 0x9f, 0x85, 0xde, 0xb5, - 0x1d, 0x96, 0x1b, 0x39, 0x0c, 0x29, 0xcb, 0x30, 0xf8, 0x9e, 0xcc, 0x7c, 0xa1, 0x24, 0xa9, 0xa0, - 0x5b, 0x90, 0xc8, 0x07, 0xc4, 0xbc, 0x7c, 0x80, 0x97, 0xd0, 0x88, 0xb7, 0x95, 0xd0, 0x38, 0xf9, - 0x75, 0x09, 0xfa, 0x7c, 0xf6, 0x01, 0x3d, 0x08, 0x07, 0xf2, 0x0b, 0xcb, 0x33, 0x4f, 0x14, 0xe7, - 0x67, 0x8b, 0x97, 0x16, 0x72, 0x73, 0xde, 0x5b, 0x93, 0xec, 0xc1, 0x97, 0xaf, 0x4f, 0x20, 0x1f, - 0xec, 0xba, 0xbe, 0xad, 0x1b, 0xd7, 0x74, 0x34, 0x05, 0xa3, 0x41, 0x94, 0x5c, 0x7e, 0xb5, 0xb0, - 0xb4, 0x96, 0x96, 0xb2, 0x07, 0x5e, 0xbe, 0x3e, 0x31, 0xec, 0xc3, 0xc8, 0x6d, 0xd8, 0x58, 0x77, - 0x1a, 0x11, 0x66, 0x96, 0x17, 0x17, 0xe7, 0xd7, 0xd2, 0xb1, 0x06, 0x04, 0x6e, 0xb0, 0xef, 0x85, - 0xe1, 0x20, 0xc2, 0xd2, 0xfc, 0x42, 0x3a, 0x9e, 0x45, 0x2f, 0x5f, 0x9f, 0x18, 0xf4, 0x41, 0x2f, - 0x69, 0xd5, 0x6c, 0xf2, 0xa5, 0x8f, 0x8f, 0x75, 0x7d, 0xea, 0x13, 0x63, 0x12, 0x19, 0xd9, 0x40, - 0xc0, 0x46, 0xa0, 0xfb, 0xe1, 0x8e, 0xd5, 0xf9, 0xb9, 0xa5, 0xc2, 0x6c, 0x71, 0x71, 0x75, 0xae, - 0xc8, 0x3e, 0xb2, 0xe1, 0x8e, 0x6e, 0xe8, 0xe5, 0xeb, 0x13, 0x7d, 0x7c, 0x48, 0xad, 0xa0, 0x57, - 0x94, 0xc2, 0x95, 0xe5, 0xb5, 0x42, 0x5a, 0x62, 0xd0, 0x2b, 0x16, 0xbe, 0x6a, 0x38, 0xec, 0x1b, - 0x5a, 0x0f, 0xc0, 0xa1, 0x26, 0xd0, 0xee, 0xc0, 0x86, 0x5f, 0xbe, 0x3e, 0x31, 0xb0, 0x62, 0x61, - 0xb6, 0x7e, 0x28, 0xc6, 0x24, 0x64, 0x1a, 0x31, 0x96, 0x57, 0x96, 0x57, 0x73, 0x0b, 0xe9, 0x89, - 0x6c, 0xfa, 0xe5, 0xeb, 0x13, 0xfd, 0xc2, 0x18, 0x12, 0x78, 0x6f, 0x64, 0xb7, 0x33, 0xe2, 0x79, - 0xcf, 0x83, 0x70, 0xd4, 0x76, 0xd4, 0x6d, 0x4d, 0xaf, 0xb8, 0x19, 0x67, 0x5e, 0xe6, 0x21, 0xcf, - 0xd1, 0xaa, 0xf6, 0x5c, 0x5d, 0x2b, 0x8b, 0x4a, 0xf1, 0x77, 0xcf, 0xf4, 0x73, 0xb6, 0xf5, 0xc9, - 0x52, 0x36, 0x22, 0xbb, 0x1a, 0x1d, 0x3a, 0xb5, 0x3e, 0xaa, 0xc8, 0x46, 0x24, 0xd0, 0xb3, 0x7b, - 0x06, 0x77, 0xf2, 0x2b, 0x12, 0x0c, 0x5e, 0xd6, 0x6c, 0xc7, 0xb0, 0xb4, 0x92, 0x5a, 0xa5, 0x2f, - 0x4c, 0xce, 0xb6, 0x6b, 0x5b, 0x43, 0x4b, 0xfd, 0x12, 0xf4, 0x5c, 0x55, 0xab, 0xcc, 0xa8, 0xb1, - 0x47, 0x3c, 0x7b, 0x4a, 0xd1, 0xb3, 0x70, 0x82, 0x0e, 0xc3, 0x96, 0x3f, 0x1d, 0x83, 0x21, 0xba, - 0x26, 0x6c, 0xf6, 0x25, 0x24, 0x12, 0x6a, 0xe5, 0x21, 0x61, 0xa9, 0x0e, 0xcf, 0x1d, 0xe6, 0x27, - 0x79, 0x3e, 0xfc, 0x58, 0x74, 0x8e, 0x7b, 0x72, 0x16, 0x97, 0x14, 0x8a, 0x8b, 0xfe, 0x3f, 0x48, - 0xd6, 0xd4, 0x9d, 0x22, 0xa5, 0xc3, 0x02, 0x98, 0x5c, 0x67, 0x74, 0xde, 0xb8, 0x31, 0x3e, 0xb4, - 0xab, 0xd6, 0xaa, 0xd3, 0xb2, 0xa0, 0x23, 0x2b, 0xbd, 0x35, 0x75, 0x87, 0xb0, 0x88, 0x4c, 0x18, - 0x22, 0xb5, 0xa5, 0x2d, 0x55, 0xaf, 0x60, 0xd6, 0x09, 0xcd, 0x84, 0xe6, 0x2f, 0x77, 0xdc, 0xc9, - 0x41, 0xaf, 0x13, 0x1f, 0x39, 0x59, 0x19, 0xa8, 0xa9, 0x3b, 0x33, 0xb4, 0x82, 0xf4, 0x38, 0x9d, - 0xfc, 0xe0, 0x47, 0xc7, 0xbb, 0xe8, 0x19, 0xc3, 0x37, 0x24, 0x00, 0x4f, 0x62, 0xa8, 0x04, 0xe9, - 0x92, 0x5b, 0xa2, 0xb8, 0x36, 0x9f, 0xca, 0xc9, 0x88, 0x29, 0x09, 0x89, 0x9d, 0xed, 0xd4, 0x5f, - 0xbd, 0x31, 0x2e, 0x29, 0x43, 0xa5, 0xd0, 0x8c, 0xbc, 0x1d, 0xfa, 0xea, 0x66, 0x59, 0x75, 0x70, - 0x91, 0x46, 0x75, 0xb1, 0xc8, 0x5d, 0x7f, 0x8c, 0xd0, 0x7a, 0xe3, 0xc6, 0x38, 0x62, 0xa3, 0xf3, - 0x21, 0xcb, 0xd4, 0x17, 0x00, 0x56, 0x43, 0x10, 0x7c, 0x43, 0xfb, 0x13, 0x09, 0xfa, 0x66, 0x7d, - 0xf7, 0xbe, 0x32, 0xd0, 0x5b, 0x33, 0x74, 0x6d, 0x9b, 0x6b, 0x67, 0x4a, 0x11, 0x45, 0x94, 0x85, - 0x24, 0x7b, 0x82, 0xe7, 0xec, 0x8a, 0xc4, 0xa8, 0x28, 0x13, 0xac, 0x6b, 0x78, 0xc3, 0xd6, 0xc4, - 0xa4, 0x28, 0xa2, 0x88, 0x2e, 0x41, 0xda, 0xc6, 0xa5, 0xba, 0xa5, 0x39, 0xbb, 0xc5, 0x92, 0xa1, - 0x3b, 0x6a, 0xc9, 0x61, 0x8f, 0xb9, 0xf2, 0x87, 0xdf, 0xb8, 0x31, 0x7e, 0x07, 0xe3, 0x35, 0x0c, - 0x21, 0x2b, 0x43, 0xa2, 0x6a, 0x86, 0xd5, 0x90, 0x1e, 0xca, 0xd8, 0x51, 0xb5, 0xaa, 0x9d, 0x61, - 0xa7, 0x66, 0xa2, 0xe8, 0x1f, 0x4b, 0xd2, 0x9f, 0xe6, 0xba, 0x04, 0x69, 0xc3, 0xc4, 0x56, 0xc0, - 0x2d, 0x95, 0xc2, 0x3d, 0x87, 0x21, 0x64, 0x65, 0x48, 0x54, 0x09, 0x97, 0xd5, 0x21, 0xb3, 0x2d, - 0xc2, 0x46, 0xb3, 0xbe, 0xe1, 0x65, 0xc7, 0x46, 0x1b, 0x66, 0x23, 0xa7, 0xef, 0xe6, 0x1f, 0xf2, - 0xa8, 0x87, 0xf1, 0xe4, 0xaf, 0x7c, 0xfe, 0xd4, 0x28, 0x37, 0x2e, 0x5e, 0xb6, 0xea, 0x09, 0xbc, - 0x4b, 0xa6, 0x9f, 0x83, 0xae, 0x50, 0x48, 0xe2, 0x84, 0x3e, 0xab, 0x6a, 0x55, 0xf1, 0x28, 0x59, - 0xe1, 0x25, 0x94, 0x83, 0x1e, 0xdb, 0x51, 0x9d, 0xba, 0xcd, 0x3f, 0x01, 0x76, 0x6f, 0x84, 0xc6, - 0xe5, 0x0d, 0xbd, 0xbc, 0x4a, 0x11, 0x14, 0x8e, 0x48, 0xec, 0x88, 0x63, 0x6c, 0x63, 0x9d, 0x4b, - 0xb2, 0xa3, 0xd5, 0x4e, 0xcf, 0xf2, 0x18, 0x36, 0x11, 0x4c, 0x19, 0x57, 0x71, 0x85, 0xf9, 0x5a, - 0x5b, 0x2a, 0x09, 0x49, 0xe8, 0x07, 0xc1, 0xf2, 0xf3, 0x1d, 0x2f, 0x49, 0x2e, 0xb0, 0x30, 0x3d, - 0x59, 0x19, 0x72, 0xab, 0x56, 0x69, 0x0d, 0x52, 0x02, 0xf7, 0x14, 0xf9, 0x57, 0xf3, 0x4e, 0x46, - 0x48, 0xc1, 0xa7, 0xe1, 0x22, 0x77, 0xe1, 0xbf, 0xec, 0x78, 0x09, 0xd2, 0x75, 0x7d, 0xc3, 0xd0, - 0xe9, 0x3b, 0x42, 0xee, 0xfb, 0x93, 0xd8, 0x2f, 0xee, 0x57, 0x95, 0x30, 0x84, 0xac, 0x0c, 0xb9, - 0x55, 0x97, 0x59, 0x84, 0x50, 0x86, 0x41, 0x0f, 0x8a, 0x2e, 0xdb, 0x54, 0xe4, 0xb2, 0xbd, 0x93, - 0x2f, 0xdb, 0x03, 0xe1, 0x5e, 0xbc, 0x95, 0x3b, 0xe0, 0x56, 0x12, 0x34, 0xb4, 0x0c, 0xe0, 0x19, - 0x0b, 0x9a, 0xc3, 0xe8, 0x8b, 0x54, 0x03, 0xcf, 0xf0, 0x88, 0x90, 0xd0, 0x23, 0x81, 0x5e, 0x80, - 0x11, 0x96, 0x4c, 0xc6, 0x3b, 0xb8, 0x66, 0x3a, 0x62, 0x2e, 0xe9, 0xe7, 0x60, 0xf2, 0x0b, 0x1d, - 0xcf, 0x65, 0x96, 0x8d, 0xa4, 0x09, 0x49, 0x59, 0x19, 0xa6, 0xb5, 0x05, 0x5a, 0xc9, 0x27, 0xf4, - 0xdd, 0x12, 0x1c, 0x64, 0xb0, 0x54, 0xaf, 0xe8, 0x9d, 0x7d, 0xce, 0x01, 0xfd, 0xf6, 0x65, 0x7e, - 0xb9, 0x63, 0x0e, 0x8e, 0xfa, 0x39, 0x08, 0x53, 0x95, 0x95, 0x51, 0xda, 0xb0, 0x26, 0xea, 0x19, - 0x1f, 0xd3, 0xfd, 0x2f, 0x7d, 0x74, 0xbc, 0x8b, 0xdb, 0x92, 0x2e, 0xf9, 0x2c, 0x4d, 0xf3, 0x73, - 0x1b, 0x80, 0x6d, 0x12, 0x3e, 0xa9, 0xa2, 0x40, 0x93, 0x2f, 0x29, 0xc5, 0xab, 0x60, 0x36, 0xe8, - 0xc5, 0x7f, 0x3f, 0x21, 0xc9, 0xbf, 0x23, 0x41, 0xcf, 0xec, 0x95, 0x15, 0x55, 0xb3, 0xd0, 0x3c, - 0x0c, 0x7b, 0xfa, 0x1c, 0xb4, 0x40, 0x47, 0xde, 0xb8, 0x31, 0x9e, 0x09, 0xab, 0xbc, 0x6b, 0x82, - 0xbc, 0x65, 0x25, 0x6c, 0xd0, 0x7c, 0xab, 0x18, 0x3b, 0x40, 0xaa, 0x01, 0x44, 0x6e, 0x8c, 0xc0, - 0x43, 0xc3, 0x5c, 0x80, 0x5e, 0xc6, 0x2d, 0xfd, 0x08, 0x87, 0x49, 0xfe, 0xe1, 0x67, 0x18, 0xf7, - 0x44, 0x2d, 0x29, 0x8a, 0xe6, 0xa6, 0x5e, 0x09, 0xa6, 0xfc, 0xfe, 0x18, 0xc0, 0xec, 0x95, 0x2b, - 0x6b, 0x96, 0x66, 0x56, 0xb1, 0x73, 0x2b, 0x05, 0xb0, 0x06, 0x07, 0x7c, 0x71, 0x9d, 0x55, 0x0a, - 0x09, 0x61, 0xe2, 0x8d, 0x1b, 0xe3, 0x47, 0xc2, 0x42, 0xf0, 0x81, 0xc9, 0xca, 0x88, 0x17, 0xe1, - 0x59, 0xa5, 0xa6, 0x54, 0xcb, 0xb6, 0xe3, 0x52, 0x8d, 0xb7, 0xa6, 0xea, 0x03, 0xf3, 0x53, 0x9d, - 0xb5, 0x9d, 0xe6, 0x12, 0x7e, 0x06, 0xfa, 0x3c, 0x91, 0xd8, 0xe8, 0x09, 0x48, 0x3a, 0xfc, 0x7f, - 0x2e, 0xe8, 0x7b, 0x23, 0x05, 0x2d, 0xb0, 0xb9, 0xb0, 0x5d, 0x02, 0xf2, 0x2b, 0x44, 0xde, 0x4c, - 0x54, 0x64, 0x1d, 0xff, 0x54, 0x2a, 0x1c, 0xd9, 0x6e, 0xf8, 0x72, 0x8e, 0xef, 0xcb, 0xb9, 0xe4, - 0xd8, 0x64, 0x47, 0x64, 0xc6, 0x24, 0xc3, 0x2e, 0xcc, 0xf3, 0x52, 0x48, 0xdc, 0x1f, 0x88, 0xc1, - 0xc8, 0xba, 0x30, 0x97, 0x3f, 0xf5, 0xb2, 0x79, 0x0a, 0x7a, 0xb1, 0xee, 0x58, 0x1a, 0x15, 0x0e, - 0x51, 0x86, 0x73, 0x11, 0xca, 0xd0, 0x64, 0x68, 0xf4, 0x23, 0x3e, 0xe2, 0x30, 0x81, 0x53, 0x0b, - 0x09, 0xe5, 0x7d, 0x71, 0xc8, 0xb4, 0xc2, 0x44, 0x33, 0x30, 0x54, 0xb2, 0x30, 0xad, 0x28, 0xfa, - 0x33, 0x9a, 0xf9, 0xac, 0xe7, 0x2a, 0x87, 0x00, 0x64, 0x65, 0x50, 0xd4, 0xf0, 0x9d, 0xaf, 0x02, - 0xc4, 0x81, 0x25, 0x5a, 0x49, 0xa0, 0xda, 0xf4, 0x58, 0x65, 0xbe, 0xf5, 0x89, 0x4e, 0x82, 0x04, - 0xd8, 0xde, 0x37, 0xe8, 0xd5, 0xd2, 0xcd, 0xef, 0x39, 0x18, 0xd2, 0x74, 0xcd, 0xd1, 0xd4, 0x6a, - 0x71, 0x43, 0xad, 0xaa, 0x7a, 0x69, 0x3f, 0x61, 0xc0, 0xbc, 0xee, 0x78, 0xdd, 0x86, 0xc8, 0xc9, - 0xca, 0x20, 0xaf, 0xc9, 0xb3, 0x0a, 0x74, 0x19, 0x7a, 0x45, 0x57, 0x89, 0x7d, 0x39, 0x4c, 0x02, - 0xdd, 0xe7, 0xaa, 0xbe, 0x37, 0x0e, 0xc3, 0x0a, 0x2e, 0xff, 0xbf, 0xa9, 0xe8, 0x6c, 0x2a, 0x16, - 0x01, 0x98, 0x35, 0x20, 0x66, 0x78, 0x1f, 0xb3, 0x41, 0xec, 0x49, 0x8a, 0x51, 0x98, 0xb5, 0x1d, - 0xdf, 0x7c, 0xfc, 0xc7, 0x18, 0xf4, 0xfb, 0xe7, 0xe3, 0x6f, 0xe8, 0xde, 0x85, 0x56, 0x3c, 0x83, - 0xc4, 0x4e, 0x17, 0x1e, 0x88, 0x30, 0x48, 0x0d, 0x4a, 0xbc, 0xb7, 0x25, 0x7a, 0x23, 0x06, 0x3d, - 0x2b, 0xaa, 0xa5, 0xd6, 0x6c, 0xf4, 0x78, 0x83, 0xb3, 0x2c, 0xb2, 0xab, 0x0d, 0xdf, 0xaf, 0xe6, - 0xc9, 0x1c, 0x16, 0x2e, 0x7f, 0xb0, 0x89, 0x4b, 0x7c, 0x0f, 0x0c, 0x92, 0x68, 0xde, 0x77, 0x11, - 0x23, 0x46, 0x8f, 0x97, 0x49, 0x44, 0xef, 0x9d, 0x02, 0xa2, 0x71, 0xe8, 0x23, 0x60, 0x9e, 0xc9, - 0x25, 0x30, 0x50, 0x53, 0x77, 0x0a, 0xac, 0x06, 0x9d, 0x02, 0xb4, 0xe5, 0x26, 0x6b, 0x8a, 0x9e, - 0x24, 0x08, 0xdc, 0xb0, 0xd7, 0x22, 0xc0, 0x8f, 0x02, 0x10, 0x2e, 0x8a, 0xec, 0x06, 0x23, 0x8b, - 0x4b, 0x53, 0xa4, 0x66, 0x96, 0xde, 0x62, 0x7c, 0x01, 0x46, 0x6a, 0x9a, 0x5e, 0x0c, 0xe5, 0x0a, - 0x78, 0x8c, 0xb4, 0x6f, 0xbf, 0xba, 0x09, 0x49, 0x59, 0x19, 0xae, 0x69, 0x7a, 0x30, 0xb9, 0xe0, - 0x53, 0xee, 0xd7, 0x24, 0x40, 0x9e, 0xd5, 0x57, 0xb0, 0x6d, 0x92, 0x60, 0x93, 0xc4, 0x11, 0xde, - 0xdc, 0x71, 0xe1, 0x47, 0x3a, 0x23, 0x2e, 0x82, 0x88, 0x23, 0x7c, 0x6b, 0xe6, 0x11, 0xcf, 0x50, - 0xc6, 0xf8, 0x54, 0x36, 0xb9, 0x5c, 0x3a, 0x39, 0x63, 0x68, 0x02, 0xbb, 0xc1, 0x32, 0x76, 0xc9, - 0x7f, 0x26, 0xc1, 0xa1, 0x06, 0xa5, 0x72, 0x79, 0xc6, 0x80, 0x2c, 0x5f, 0x23, 0xff, 0xa2, 0x1d, - 0xe3, 0x7d, 0xbf, 0xaa, 0x3a, 0x6c, 0x35, 0x18, 0xe2, 0x5b, 0x67, 0xf2, 0xd9, 0x25, 0xd5, 0x7f, - 0x21, 0xc1, 0xa8, 0xbf, 0x7b, 0x77, 0x3c, 0xeb, 0xd0, 0xef, 0xef, 0x9d, 0x8f, 0xe4, 0xbe, 0x0e, - 0x46, 0xc2, 0x07, 0x11, 0x20, 0x83, 0x9e, 0xf6, 0x96, 0x31, 0xcb, 0x15, 0x9e, 0xef, 0x54, 0x36, - 0x82, 0xc3, 0xf0, 0x72, 0x4e, 0xd0, 0x49, 0xfa, 0x3f, 0x12, 0x24, 0x56, 0x0c, 0xa3, 0x8a, 0x0c, - 0x18, 0xd6, 0x0d, 0xa7, 0x48, 0x74, 0x1e, 0x97, 0x8b, 0x3c, 0xad, 0xc0, 0xcc, 0xe4, 0x4c, 0x67, - 0x22, 0xfb, 0xde, 0x8d, 0xf1, 0x46, 0x52, 0xca, 0x90, 0x6e, 0x38, 0x79, 0x5a, 0xb3, 0xc6, 0x92, - 0x0e, 0x2f, 0xc0, 0x40, 0xb0, 0x33, 0x66, 0x44, 0x9f, 0xea, 0xb8, 0xb3, 0x20, 0x99, 0x37, 0x6e, - 0x8c, 0x8f, 0xb2, 0xe5, 0x15, 0xa8, 0x96, 0x95, 0xfe, 0x0d, 0x5f, 0xef, 0xec, 0x56, 0xdb, 0x0f, - 0xc8, 0x8c, 0xbe, 0x47, 0x82, 0x11, 0x11, 0x41, 0xd2, 0x00, 0x52, 0xc1, 0x25, 0xc3, 0x2a, 0xa3, - 0x41, 0x88, 0xf1, 0x73, 0xa2, 0x84, 0x12, 0xd3, 0xca, 0x68, 0x14, 0xba, 0x8d, 0x6b, 0x3a, 0xbf, - 0x64, 0x92, 0x52, 0x58, 0x81, 0xda, 0x2b, 0xa3, 0x5c, 0xaf, 0xe2, 0xa2, 0x5a, 0x2a, 0xd1, 0x7b, - 0xce, 0x2c, 0x6d, 0x36, 0xc0, 0x6a, 0x73, 0xac, 0x92, 0x04, 0x9d, 0xae, 0x49, 0xe3, 0x9f, 0x40, - 0xf2, 0x2a, 0x98, 0x6a, 0x9d, 0xfc, 0xa2, 0x04, 0xe0, 0x25, 0x79, 0xd0, 0xfd, 0x70, 0x47, 0x7e, - 0x79, 0x69, 0xb6, 0xb8, 0xba, 0x96, 0x5b, 0x5b, 0x5f, 0x2d, 0xae, 0x2f, 0xad, 0xae, 0x14, 0x66, - 0xe6, 0x2f, 0xcd, 0x17, 0x66, 0xbd, 0xe3, 0x09, 0xdb, 0xc4, 0x25, 0x6d, 0x53, 0xc3, 0x65, 0x74, - 0x0c, 0x46, 0x83, 0xd0, 0xa4, 0x54, 0x98, 0x4d, 0x4b, 0xd9, 0xfe, 0x97, 0xaf, 0x4f, 0x24, 0x99, - 0xcf, 0x88, 0xcb, 0xe8, 0x04, 0x1c, 0x68, 0x84, 0x9b, 0x5f, 0x9a, 0x4b, 0xc7, 0xb2, 0x03, 0x2f, - 0x5f, 0x9f, 0x48, 0xb9, 0xce, 0x25, 0x92, 0x01, 0xf9, 0x21, 0x39, 0xbd, 0x78, 0x16, 0x5e, 0xbe, - 0x3e, 0xd1, 0xc3, 0x66, 0x32, 0x9b, 0x78, 0xe9, 0xe3, 0x63, 0x5d, 0xf9, 0xb7, 0xb5, 0x3c, 0x80, - 0xb8, 0xe8, 0x9b, 0x44, 0xed, 0xb9, 0x6a, 0x9d, 0x98, 0x34, 0x4d, 0x2f, 0x4d, 0x31, 0x15, 0xd6, - 0x9c, 0xdd, 0x53, 0x5c, 0x7d, 0x4f, 0x31, 0x71, 0x4d, 0xed, 0x88, 0xe3, 0x85, 0xd0, 0x41, 0xc4, - 0x57, 0x8e, 0x43, 0x26, 0x7c, 0x10, 0xe1, 0xec, 0xb4, 0x77, 0x06, 0xb1, 0xc7, 0x69, 0x43, 0xe4, - 0x69, 0x42, 0x8b, 0xf3, 0x8b, 0xfd, 0x9f, 0x31, 0xec, 0x7d, 0x9c, 0x22, 0xff, 0xbb, 0x04, 0xa0, - 0x45, 0xbb, 0x32, 0x43, 0x1c, 0x41, 0xdf, 0x75, 0xb9, 0x50, 0xaa, 0x4c, 0xba, 0x15, 0xa9, 0xb2, - 0xb5, 0x40, 0xf2, 0x29, 0xb6, 0xaf, 0xac, 0x77, 0xd3, 0x0c, 0x14, 0xd9, 0xd6, 0x6c, 0x5c, 0xdd, - 0x2c, 0xfa, 0xac, 0x61, 0xbc, 0xe3, 0x9d, 0x92, 0xb9, 0x93, 0xbe, 0x9d, 0x32, 0x44, 0x92, 0xed, - 0x94, 0xab, 0xb8, 0xba, 0x19, 0x15, 0x1b, 0x26, 0x6e, 0x5d, 0x6c, 0xd8, 0xbd, 0xdf, 0xb8, 0x99, - 0x67, 0x9b, 0x7b, 0xf6, 0xc8, 0x36, 0x67, 0x5a, 0xa6, 0x94, 0x39, 0x36, 0x3a, 0x23, 0x1e, 0x4b, - 0xf5, 0xb6, 0xb7, 0x27, 0xf3, 0xd7, 0x54, 0xc9, 0x97, 0xc4, 0x8e, 0x7c, 0x04, 0xb2, 0x8d, 0xca, - 0x25, 0xf6, 0x07, 0xf9, 0xd5, 0x38, 0xa4, 0x17, 0xed, 0x4a, 0xa1, 0xac, 0x39, 0xb7, 0x57, 0xf3, - 0x2e, 0xb6, 0x0e, 0xbb, 0xd1, 0x1b, 0x37, 0xc6, 0x07, 0x99, 0x68, 0xf7, 0x10, 0x68, 0x0d, 0x86, - 0xc2, 0xae, 0x18, 0x53, 0xb0, 0xd9, 0xfd, 0x9c, 0x1e, 0x35, 0xb8, 0x60, 0x83, 0xc1, 0x13, 0x1c, - 0xb4, 0xd3, 0x5c, 0xa7, 0x99, 0x5e, 0x5d, 0xbe, 0x8d, 0xfa, 0xec, 0x9b, 0xba, 0x2c, 0x64, 0xc2, - 0x73, 0xe3, 0x4e, 0xdc, 0x5f, 0x4a, 0xd0, 0xb7, 0x68, 0x8b, 0x74, 0x00, 0xfe, 0x29, 0xcd, 0x90, - 0x9c, 0x73, 0x5f, 0x02, 0xc5, 0xdb, 0x53, 0x5f, 0xf1, 0x3a, 0xc8, 0x13, 0xc2, 0x01, 0x18, 0xf1, - 0x8d, 0xd3, 0x1d, 0xff, 0x9f, 0xc6, 0xa8, 0xd1, 0xcc, 0xe3, 0x8a, 0xa6, 0xbb, 0xee, 0x0f, 0xfe, - 0x9b, 0x1a, 0xf8, 0x79, 0x72, 0x4e, 0xec, 0x57, 0xce, 0xdb, 0xd4, 0x4e, 0x84, 0xe4, 0xe9, 0x7a, - 0xba, 0x8b, 0x8d, 0x69, 0x09, 0xa9, 0x83, 0x9b, 0x4c, 0xa1, 0xe4, 0x83, 0xfc, 0x5d, 0x09, 0x06, - 0x16, 0xed, 0xca, 0xba, 0x5e, 0xfe, 0x6b, 0xaf, 0xbf, 0x9b, 0x70, 0x20, 0x30, 0xd2, 0xdb, 0x25, - 0xd2, 0x8f, 0xc6, 0xe0, 0x08, 0x31, 0xf4, 0x24, 0x6e, 0xa9, 0xfe, 0xec, 0xe4, 0x50, 0xf7, 0x2b, - 0x61, 0x74, 0xbc, 0x31, 0xdb, 0xc6, 0xae, 0x50, 0x85, 0x32, 0x6a, 0xbe, 0xa9, 0x38, 0x06, 0x77, - 0xef, 0x25, 0x21, 0xd7, 0xb6, 0xfc, 0x51, 0x0c, 0x86, 0x17, 0xed, 0x4a, 0x20, 0x40, 0xb0, 0xff, - 0xba, 0xc9, 0x6f, 0x0d, 0x0e, 0x84, 0xce, 0xd6, 0x8a, 0x2c, 0xd4, 0x49, 0x84, 0x0d, 0x51, 0x53, - 0x30, 0x59, 0x19, 0x71, 0x02, 0x47, 0x70, 0xcb, 0xa4, 0xd6, 0x27, 0xec, 0x35, 0x38, 0xd4, 0x20, - 0x43, 0x57, 0xf7, 0x3d, 0xae, 0xa5, 0x8e, 0xb8, 0x96, 0x3f, 0x25, 0xd1, 0x3d, 0x91, 0x58, 0x28, - 0x5c, 0x63, 0x61, 0xdd, 0xa6, 0x7b, 0xb8, 0x7c, 0x0b, 0x67, 0xe8, 0x5c, 0xe0, 0x09, 0xeb, 0xbe, - 0x16, 0xfe, 0xdb, 0x61, 0xa2, 0x15, 0xa7, 0x37, 0x2f, 0x87, 0x0f, 0x4a, 0x30, 0x46, 0xc4, 0x6b, - 0xa9, 0xba, 0xbd, 0x89, 0xad, 0x66, 0xb1, 0xec, 0x39, 0xc8, 0x88, 0x19, 0xe2, 0x13, 0x67, 0xd1, - 0x86, 0xa2, 0x1b, 0xe1, 0xba, 0x0a, 0xe0, 0x43, 0x63, 0x4f, 0x14, 0x6c, 0x7a, 0xa5, 0x89, 0x47, - 0xbd, 0xbc, 0x44, 0xbf, 0x6d, 0x8c, 0xaf, 0x71, 0x2d, 0xe1, 0x1f, 0x86, 0xd0, 0xf1, 0xb5, 0xf0, - 0xc4, 0x9f, 0x80, 0x63, 0x7b, 0x73, 0xe6, 0xae, 0xb3, 0x2f, 0x48, 0x74, 0x6f, 0x67, 0xe7, 0xc9, - 0x3f, 0xed, 0x96, 0xca, 0x37, 0xc2, 0xa3, 0x70, 0xb8, 0x09, 0xdb, 0x62, 0x58, 0xa7, 0x3f, 0x9d, - 0x82, 0xf8, 0xa2, 0x5d, 0x41, 0x3f, 0x0f, 0x43, 0xe1, 0x98, 0xee, 0xc1, 0x08, 0x27, 0xba, 0xd1, - 0x53, 0xcf, 0x3e, 0xd2, 0x31, 0x8a, 0xab, 0x5d, 0xbb, 0x30, 0x10, 0x74, 0xec, 0xa7, 0xa2, 0x69, - 0x05, 0x10, 0xb2, 0xe7, 0x3a, 0x44, 0x70, 0xbb, 0x7e, 0x16, 0x92, 0xae, 0x6b, 0x7a, 0x32, 0x9a, - 0x88, 0x80, 0xcd, 0x9e, 0x6e, 0x1f, 0xd6, 0xed, 0xeb, 0xe7, 0x61, 0x28, 0xec, 0x06, 0xb6, 0x21, - 0xe7, 0x10, 0x4a, 0x3b, 0x72, 0x6e, 0xe5, 0x1c, 0x99, 0x00, 0x3e, 0x4f, 0xe6, 0xfe, 0x68, 0x42, - 0x1e, 0x74, 0xf6, 0xe1, 0x4e, 0xa0, 0xdd, 0x1e, 0xaf, 0x4b, 0x70, 0xa8, 0xf5, 0x4e, 0x7f, 0xa1, - 0x0d, 0x95, 0x69, 0x85, 0x9c, 0x9d, 0xb9, 0x09, 0x64, 0x97, 0xbf, 0x17, 0x60, 0x30, 0xb4, 0x7b, - 0x3e, 0x10, 0x4d, 0x36, 0x88, 0x91, 0x3d, 0xdf, 0x29, 0x86, 0xdb, 0xfb, 0x4b, 0x12, 0x3b, 0x0e, - 0x12, 0x76, 0x17, 0xb5, 0xa1, 0xc6, 0x4d, 0xed, 0x74, 0xf6, 0xe2, 0x3e, 0x11, 0x5d, 0x56, 0x3e, - 0x2e, 0xc1, 0xe1, 0xbd, 0x8c, 0xf4, 0xa3, 0x6d, 0x0c, 0xb2, 0x35, 0x7a, 0xb6, 0x70, 0x53, 0xe8, - 0x6e, 0x96, 0xf8, 0x4d, 0x48, 0xe6, 0x7d, 0x33, 0x06, 0x27, 0xfd, 0x69, 0xb2, 0xe7, 0xea, 0xd8, - 0xda, 0x75, 0x13, 0x62, 0xa6, 0x5a, 0xd1, 0x74, 0xff, 0x07, 0x15, 0x0e, 0xf9, 0xf7, 0x41, 0x0a, - 0x2b, 0xc6, 0x24, 0xbf, 0x24, 0x41, 0xdf, 0x8a, 0x5a, 0xc1, 0x0a, 0x7e, 0xae, 0x8e, 0x6d, 0xa7, - 0xc9, 0x8b, 0xfe, 0x83, 0xd0, 0x63, 0x6c, 0x6e, 0x8a, 0xf7, 0x03, 0x09, 0x85, 0x97, 0xd0, 0x28, - 0x74, 0x57, 0xb5, 0x9a, 0xc6, 0x5c, 0xa5, 0x84, 0xc2, 0x0a, 0x68, 0x1c, 0xfa, 0x68, 0xbe, 0xb6, - 0xc8, 0xde, 0x42, 0x26, 0xc4, 0xd7, 0x36, 0xeb, 0xba, 0xb3, 0x46, 0x1f, 0x44, 0x66, 0xa0, 0xd7, - 0xc2, 0x57, 0xb1, 0x65, 0xb3, 0x5f, 0x1c, 0x48, 0x2a, 0xa2, 0x28, 0x5f, 0x84, 0x7e, 0xc6, 0x09, - 0x9f, 0xed, 0x43, 0x90, 0xa4, 0xaf, 0xda, 0x3c, 0x7e, 0x7a, 0x49, 0xf9, 0x09, 0xf6, 0x5d, 0x00, - 0x46, 0x9f, 0xb1, 0xc4, 0x0a, 0xf9, 0x7c, 0x4b, 0xc1, 0x9f, 0x88, 0x4e, 0x2f, 0x30, 0x19, 0xba, - 0x12, 0xfe, 0xe3, 0x6e, 0x38, 0xc0, 0x53, 0x9b, 0xaa, 0xa9, 0x4d, 0x6d, 0x39, 0x8e, 0xf8, 0x76, - 0x0d, 0xf0, 0x78, 0x42, 0x35, 0x35, 0x79, 0x17, 0x12, 0x97, 0x1d, 0xc7, 0x44, 0x27, 0xa1, 0xdb, - 0xaa, 0x57, 0xb1, 0xb8, 0xc6, 0xe2, 0xa6, 0xa7, 0x54, 0x53, 0x9b, 0x24, 0x00, 0x4a, 0xbd, 0x8a, - 0x15, 0x06, 0x82, 0x0a, 0x30, 0xbe, 0x59, 0xaf, 0x56, 0x77, 0x8b, 0x65, 0x4c, 0x7f, 0x1a, 0xd9, - 0xfd, 0x15, 0x42, 0xbc, 0x63, 0xaa, 0xba, 0x9b, 0x4a, 0x4c, 0x2a, 0x47, 0x28, 0xd8, 0x2c, 0x85, - 0x12, 0xbf, 0x40, 0x58, 0x10, 0x30, 0xf2, 0x9f, 0xc7, 0x20, 0x29, 0x48, 0xd3, 0x87, 0xfa, 0xb8, - 0x8a, 0x4b, 0x8e, 0x21, 0xae, 0xaa, 0xba, 0x65, 0x84, 0x20, 0x5e, 0xe1, 0x93, 0x97, 0xba, 0xdc, - 0xa5, 0x90, 0x02, 0xa9, 0x73, 0x3f, 0x9f, 0x40, 0xea, 0xcc, 0x3a, 0x99, 0xcf, 0x84, 0x69, 0x88, - 0x93, 0xe4, 0xcb, 0x5d, 0x0a, 0x2d, 0xa1, 0x0c, 0xf4, 0x10, 0x7b, 0xe9, 0xb0, 0xd9, 0x22, 0xf5, - 0xbc, 0x8c, 0x0e, 0x42, 0xb7, 0xa9, 0x3a, 0x25, 0xf6, 0xb2, 0x91, 0x34, 0xb0, 0x22, 0xf1, 0xc2, - 0xd8, 0x77, 0xb9, 0xc2, 0xbf, 0x3b, 0x4a, 0x84, 0xc1, 0x3e, 0x80, 0x4e, 0xf8, 0x5e, 0x51, 0x1d, - 0x07, 0x5b, 0x3a, 0x21, 0xc8, 0xc0, 0x11, 0x82, 0xc4, 0x86, 0x51, 0xde, 0xe5, 0xbf, 0x85, 0x4a, - 0xff, 0xe7, 0xbf, 0xd2, 0x48, 0xf5, 0xa1, 0x48, 0x1b, 0xd9, 0x4f, 0x40, 0xf7, 0x8b, 0xca, 0x3c, - 0x01, 0x2a, 0xc0, 0x88, 0x5a, 0x2e, 0x6b, 0x44, 0xe1, 0xd5, 0x6a, 0x71, 0x43, 0xa3, 0x76, 0xd4, - 0xa6, 0x3f, 0xf0, 0xdd, 0x6a, 0x2e, 0x90, 0x87, 0x90, 0xe7, 0xf0, 0xf9, 0x14, 0xf4, 0x9a, 0x8c, - 0x29, 0xf9, 0x02, 0x0c, 0x37, 0x70, 0x4a, 0xf8, 0xdb, 0xd6, 0xf4, 0xb2, 0xf8, 0xa6, 0x04, 0xf9, - 0x9f, 0xd4, 0xd1, 0x1f, 0x31, 0x60, 0xbe, 0x1d, 0xfd, 0x3f, 0xff, 0x8b, 0xad, 0xbf, 0x38, 0x32, - 0xe8, 0xfb, 0xe2, 0x88, 0x6a, 0x6a, 0xf9, 0x14, 0xa5, 0xcf, 0x3f, 0x34, 0x92, 0xe3, 0x0d, 0xec, - 0x23, 0x23, 0x93, 0x86, 0x55, 0x99, 0xaa, 0x60, 0x5d, 0xa4, 0xce, 0x49, 0x93, 0x6a, 0x6a, 0x36, - 0x55, 0x47, 0xef, 0x47, 0x15, 0xec, 0x0b, 0xbe, 0xff, 0xe9, 0xf7, 0x47, 0x12, 0x73, 0xb9, 0x95, - 0x79, 0x57, 0x8f, 0xff, 0x30, 0x06, 0x47, 0x7c, 0x7a, 0xec, 0x03, 0x6e, 0x54, 0xe7, 0x6c, 0x73, - 0x8d, 0x6f, 0xe3, 0x93, 0x44, 0x4f, 0x40, 0x82, 0xc0, 0xa3, 0x88, 0xdf, 0x50, 0xcc, 0x7c, 0xe6, - 0x2b, 0xff, 0x54, 0x0e, 0x26, 0x70, 0x03, 0xb3, 0x42, 0x89, 0xe4, 0xdf, 0xd3, 0xbe, 0xfc, 0xd2, - 0xde, 0xef, 0x49, 0xd8, 0xb7, 0x4e, 0x8c, 0x61, 0x19, 0xfe, 0xcf, 0x39, 0x38, 0x1c, 0x3e, 0x74, - 0x60, 0x56, 0xb4, 0xad, 0xd3, 0x93, 0x0e, 0x2c, 0x75, 0xab, 0xcf, 0x30, 0xec, 0x35, 0x83, 0x11, - 0x07, 0x22, 0x51, 0xe7, 0x29, 0xf2, 0x0e, 0x1c, 0x7c, 0x92, 0x30, 0xe5, 0xdd, 0x0d, 0x10, 0x7b, - 0xc1, 0x41, 0xf7, 0x7e, 0xb5, 0xc4, 0x43, 0x17, 0x71, 0x69, 0x1a, 0x3c, 0xc6, 0x79, 0x48, 0x77, - 0x6c, 0xb2, 0xe5, 0x1e, 0x33, 0xe9, 0xdb, 0x5f, 0x14, 0x1f, 0xa6, 0xfc, 0x59, 0x09, 0xee, 0x68, - 0xe8, 0x9a, 0x1b, 0xff, 0xa5, 0x26, 0x9f, 0x92, 0xe8, 0xf4, 0x91, 0x87, 0xff, 0xeb, 0x12, 0x73, - 0x4d, 0x78, 0x3e, 0x1e, 0xc9, 0x33, 0x63, 0x26, 0xc0, 0xf4, 0x63, 0x70, 0x20, 0xc8, 0xb3, 0x90, - 0xd6, 0x3d, 0x30, 0x18, 0x8c, 0x7c, 0xb8, 0xd4, 0x06, 0x02, 0xb1, 0x8f, 0xbc, 0x19, 0x16, 0xb7, - 0x3b, 0xe4, 0x05, 0xff, 0x09, 0x27, 0x8b, 0x60, 0x3b, 0x1d, 0xb1, 0x47, 0x40, 0x7e, 0xbf, 0x04, - 0x13, 0xc1, 0x8e, 0x3c, 0xcf, 0xd2, 0xee, 0x8c, 0xe7, 0x5b, 0x36, 0xe1, 0x3f, 0x90, 0xe0, 0xce, - 0x3d, 0x78, 0xe2, 0x72, 0xf8, 0x05, 0x09, 0x46, 0x7d, 0xd7, 0x1a, 0x84, 0xa9, 0x17, 0x5a, 0xf0, - 0x60, 0xdb, 0xd7, 0x32, 0x5c, 0x8f, 0xec, 0x30, 0x11, 0xce, 0x6b, 0xdf, 0x1c, 0x1f, 0x69, 0x6c, - 0xb3, 0x95, 0x91, 0xc6, 0xab, 0x08, 0xb7, 0x50, 0x5d, 0x5e, 0x95, 0xe0, 0xde, 0xe0, 0x90, 0x9b, - 0x78, 0xfa, 0x3f, 0xa9, 0xf9, 0xf8, 0x96, 0x04, 0x27, 0xdb, 0x61, 0x8e, 0x4f, 0x8c, 0x06, 0x23, - 0xde, 0x2d, 0xa5, 0xf0, 0xb4, 0x9c, 0xee, 0xfc, 0xb6, 0x26, 0x57, 0x5a, 0xe4, 0x12, 0xbd, 0x0d, - 0xf2, 0x37, 0xf9, 0x72, 0xf3, 0xcf, 0xbc, 0x2b, 0xeb, 0x60, 0xd2, 0x43, 0xc8, 0x3a, 0x90, 0xf6, - 0x68, 0x32, 0x25, 0xb1, 0x26, 0x53, 0xe2, 0xcb, 0x67, 0xbc, 0x93, 0x1b, 0xb5, 0x26, 0x81, 0xdc, - 0x06, 0x8c, 0x34, 0x51, 0x6c, 0xbe, 0xd6, 0x3b, 0xd7, 0x6b, 0x05, 0x35, 0xaa, 0xae, 0xbc, 0x0b, - 0xe3, 0xb4, 0xfb, 0xa6, 0x01, 0xe5, 0xed, 0x1d, 0xb9, 0xc3, 0x2d, 0xce, 0x5e, 0xb1, 0xec, 0x0a, - 0xf4, 0xb0, 0xe9, 0xe6, 0xa3, 0xde, 0xbf, 0xda, 0x70, 0x3a, 0xf2, 0x87, 0x84, 0xa1, 0x9b, 0x15, - 0xdc, 0x37, 0x5f, 0x58, 0xed, 0x0c, 0xf9, 0x16, 0x2d, 0x2c, 0x9f, 0x4c, 0xbe, 0x21, 0x4c, 0x5e, - 0x73, 0xee, 0xdc, 0x04, 0xcf, 0x2d, 0xb6, 0x78, 0x4c, 0x44, 0xb7, 0xd7, 0xb4, 0x7d, 0x42, 0x98, - 0x36, 0x77, 0x68, 0x11, 0xa6, 0xed, 0x27, 0x33, 0x03, 0xae, 0x91, 0x8b, 0x60, 0xf3, 0x67, 0xd8, - 0xc8, 0xfd, 0x40, 0x82, 0x43, 0x74, 0x88, 0xfe, 0xab, 0x6b, 0x9d, 0x4a, 0xfe, 0x7e, 0x40, 0xb6, - 0x55, 0x2a, 0x36, 0x5d, 0xf2, 0x69, 0xdb, 0x2a, 0x5d, 0x09, 0x6c, 0x41, 0xf7, 0x03, 0x2a, 0xdb, - 0x4e, 0x18, 0x9a, 0xe5, 0xb1, 0xd3, 0x65, 0xdb, 0xb9, 0xb2, 0xc7, 0x86, 0x95, 0xb8, 0x05, 0xb3, - 0xfa, 0x75, 0x09, 0xb2, 0xcd, 0x86, 0xec, 0x26, 0x11, 0x0f, 0x06, 0xee, 0x46, 0x86, 0x27, 0xf2, - 0xa1, 0x0e, 0xee, 0x00, 0x86, 0x16, 0xd5, 0x01, 0x0b, 0xdf, 0x6e, 0x8f, 0x61, 0x3c, 0xa8, 0xaf, - 0x8d, 0x9e, 0xf9, 0x4f, 0x6c, 0x31, 0xfd, 0x41, 0x83, 0xb1, 0xfd, 0x59, 0xf2, 0xdd, 0x77, 0x60, - 0xac, 0x05, 0xf3, 0xb7, 0x7b, 0x6b, 0x34, 0x5a, 0xce, 0xe9, 0x6d, 0x72, 0xff, 0x1f, 0xe6, 0xcb, - 0x23, 0xf8, 0xde, 0xde, 0x17, 0xd9, 0x35, 0xfb, 0x60, 0x8f, 0xfc, 0xff, 0xc3, 0xe1, 0xa6, 0x58, - 0x9c, 0xc5, 0x1c, 0x24, 0xb6, 0x34, 0x5b, 0x1c, 0xaf, 0x9d, 0x8a, 0xe0, 0x2e, 0x44, 0x84, 0xa2, - 0xca, 0x08, 0xd2, 0xb4, 0x87, 0x15, 0xc3, 0xa8, 0x72, 0x6e, 0x64, 0x05, 0x86, 0x7d, 0x75, 0xbc, - 0xaf, 0x47, 0x21, 0x61, 0x1a, 0xfc, 0x9b, 0x94, 0x7d, 0xa7, 0xef, 0x8a, 0xe8, 0x8b, 0xa0, 0x72, - 0x21, 0x50, 0x34, 0x79, 0x14, 0x10, 0xa3, 0x49, 0x2f, 0xd8, 0x8b, 0x9e, 0x9e, 0x81, 0x91, 0x40, - 0x2d, 0xef, 0x6b, 0x06, 0x7a, 0x4c, 0x5a, 0xc3, 0x7b, 0x8b, 0x7a, 0xef, 0xc7, 0xd0, 0xdd, 0x6f, - 0xfe, 0xd1, 0x92, 0x7c, 0x06, 0xee, 0xa2, 0xb4, 0x9b, 0xa4, 0x86, 0xf3, 0xbb, 0xf3, 0x65, 0x21, - 0xfa, 0xd0, 0xa5, 0x58, 0x79, 0x07, 0xee, 0xde, 0x1b, 0xcd, 0x73, 0x9c, 0xd8, 0x89, 0x63, 0x9b, - 0x8e, 0x53, 0x33, 0x7a, 0x9c, 0x61, 0x46, 0x47, 0x7e, 0x0c, 0x8e, 0xb5, 0xee, 0x99, 0xde, 0xda, - 0x17, 0x3c, 0x37, 0xfd, 0x30, 0xb1, 0xfc, 0x0e, 0x38, 0x1e, 0x89, 0x7f, 0xdb, 0x98, 0x7f, 0x14, - 0xee, 0x69, 0xd5, 0xb9, 0xbd, 0x7c, 0x4d, 0xc7, 0x65, 0x1f, 0xef, 0xec, 0x8c, 0x55, 0xf2, 0x5d, - 0x3a, 0x96, 0x5f, 0x68, 0x3d, 0x76, 0x81, 0xce, 0x59, 0x57, 0xa0, 0x97, 0x75, 0xd9, 0xae, 0x0f, - 0xd0, 0x9a, 0x77, 0x41, 0x48, 0xbe, 0x87, 0xab, 0x4a, 0xae, 0x5a, 0x6d, 0xc6, 0x80, 0xd0, 0xd6, - 0xe7, 0xb9, 0x6a, 0xb4, 0x04, 0xbb, 0x8d, 0x2c, 0x1e, 0xe7, 0xf2, 0x5d, 0x50, 0x6d, 0x67, 0xad, - 0xd9, 0xc1, 0xb6, 0x60, 0xf2, 0x3c, 0x97, 0xe4, 0x1e, 0x80, 0x9c, 0xcd, 0xb0, 0xe6, 0x1f, 0x77, - 0xa7, 0xd0, 0xf7, 0x02, 0x99, 0xa2, 0x96, 0x73, 0xb6, 0x8d, 0x1d, 0x57, 0x0e, 0x45, 0x77, 0xb2, - 0x5a, 0x02, 0xf2, 0x2e, 0xdc, 0xfb, 0x9d, 0x52, 0x27, 0xf7, 0x3b, 0x4f, 0x7f, 0x6e, 0x1c, 0xba, - 0x69, 0x0f, 0xe8, 0x93, 0x12, 0x80, 0xef, 0x91, 0xcc, 0x99, 0x08, 0x41, 0x36, 0x4f, 0x9c, 0x65, - 0xcf, 0x76, 0x8a, 0xc6, 0x63, 0xb7, 0x93, 0xbf, 0xf8, 0xaf, 0xbe, 0xf3, 0x6b, 0xb1, 0xbb, 0x91, - 0x2c, 0x0e, 0x29, 0xc2, 0x99, 0x3d, 0xdf, 0xa6, 0xf8, 0x85, 0xc0, 0x77, 0x4c, 0x1f, 0xee, 0xa8, - 0x47, 0xc1, 0xe7, 0x99, 0x0e, 0xb1, 0x38, 0x9b, 0x17, 0x28, 0x9b, 0x67, 0xd0, 0x43, 0xd1, 0x6c, - 0x4e, 0xbd, 0x23, 0xb8, 0x4f, 0xbe, 0x13, 0xbd, 0x2e, 0xc1, 0x68, 0xb3, 0xf4, 0x0f, 0xba, 0xd8, - 0x11, 0x33, 0x8d, 0x11, 0x46, 0xf6, 0xad, 0xfb, 0x27, 0xc0, 0x07, 0x36, 0x47, 0x07, 0x96, 0x43, - 0x17, 0xf7, 0x31, 0xb0, 0x29, 0x9f, 0x1b, 0x8a, 0x7e, 0x39, 0x06, 0x47, 0xf7, 0xcc, 0xa9, 0xa0, - 0xcb, 0x1d, 0x31, 0xbb, 0x47, 0x60, 0x95, 0x9d, 0xbf, 0x05, 0x94, 0xf8, 0xf8, 0x9f, 0xa4, 0xe3, - 0x7f, 0x02, 0xcd, 0xef, 0x67, 0xfc, 0x5e, 0xd4, 0xe4, 0x97, 0xc4, 0xbf, 0x96, 0x02, 0xcf, 0xb2, - 0xdb, 0xd2, 0xb8, 0x86, 0x8c, 0x45, 0x7b, 0x0b, 0xaa, 0xc9, 0xdd, 0xb3, 0xa7, 0xe9, 0x80, 0x14, - 0xb4, 0x72, 0x93, 0x13, 0x3a, 0xf5, 0x8e, 0xa0, 0x57, 0xf8, 0x4e, 0xf4, 0xee, 0x16, 0x6f, 0xab, - 0x1f, 0x6b, 0x87, 0xd3, 0xd6, 0xb9, 0x99, 0xec, 0xc5, 0x7d, 0xe3, 0xf3, 0x21, 0xd7, 0xe8, 0x90, - 0x2b, 0x08, 0xdf, 0xea, 0x21, 0x37, 0x9d, 0x60, 0xf4, 0x75, 0x09, 0x46, 0x9b, 0xa5, 0x36, 0xda, - 0x5b, 0xce, 0x7b, 0xa4, 0x6c, 0xda, 0x5b, 0xce, 0x7b, 0x65, 0x55, 0xe4, 0xb7, 0x50, 0x51, 0x9c, - 0x45, 0x0f, 0xb7, 0x12, 0xc5, 0x9e, 0x33, 0x4c, 0xd6, 0xf0, 0x9e, 0x29, 0x83, 0xf6, 0xd6, 0x70, - 0x3b, 0xc9, 0x91, 0xf6, 0xd6, 0x70, 0x5b, 0xf9, 0x8b, 0xe8, 0x35, 0xec, 0x8e, 0xb3, 0xcd, 0x29, - 0xb6, 0xd1, 0xbf, 0x94, 0x60, 0x20, 0x10, 0x66, 0xa3, 0xf3, 0xed, 0xf0, 0xdb, 0x2c, 0x19, 0x11, - 0x79, 0x31, 0xa8, 0x75, 0x4c, 0x2f, 0xcf, 0xd3, 0x91, 0xcd, 0xa0, 0xdc, 0x7e, 0x46, 0x66, 0x05, - 0xf8, 0xbf, 0x21, 0xc1, 0x48, 0x93, 0x08, 0xb6, 0xbd, 0xd5, 0xdb, 0x3a, 0x2e, 0xcf, 0x5e, 0xdc, - 0x37, 0x3e, 0x1f, 0xe3, 0x25, 0x3a, 0xc6, 0xb7, 0xa2, 0xc7, 0xf6, 0x33, 0x46, 0x9f, 0x77, 0xf0, - 0x7d, 0xef, 0x99, 0xab, 0xaf, 0x9f, 0xc8, 0x0b, 0x32, 0x7b, 0x47, 0xc7, 0xd9, 0xc7, 0xf6, 0x8b, - 0xce, 0x47, 0xf7, 0x14, 0x1d, 0xdd, 0x93, 0x68, 0xf9, 0xe6, 0x46, 0xd7, 0xe8, 0x54, 0xfc, 0x61, - 0xe3, 0x97, 0xe5, 0xda, 0x52, 0xb4, 0xa6, 0xd1, 0x71, 0x76, 0x7a, 0x3f, 0xa8, 0x7c, 0x88, 0xe7, - 0xe9, 0x10, 0x4f, 0xa3, 0x07, 0x5a, 0x0d, 0xd1, 0xf7, 0xa6, 0x5a, 0xd3, 0x37, 0x8d, 0xa9, 0x77, - 0xb0, 0xd0, 0xfb, 0x9d, 0xe8, 0x7d, 0xe2, 0x1d, 0xe9, 0x54, 0x3b, 0xdd, 0xfb, 0xe2, 0xe7, 0xec, - 0x03, 0xed, 0x23, 0x70, 0x2e, 0xef, 0xa6, 0x5c, 0x8e, 0xa1, 0x23, 0xad, 0xb8, 0x24, 0x31, 0x34, - 0xfa, 0x4d, 0xc9, 0x7d, 0xa0, 0xfe, 0x60, 0x5b, 0x5d, 0xf8, 0x63, 0xed, 0xc8, 0xcb, 0x87, 0x4d, - 0x02, 0x71, 0xf9, 0x18, 0xe5, 0x6b, 0x02, 0x8d, 0xb5, 0xe4, 0x8b, 0xb1, 0xf3, 0x09, 0x09, 0xee, - 0x68, 0x11, 0x30, 0xa3, 0x7c, 0x3b, 0xfd, 0xee, 0x1d, 0xa4, 0x47, 0x5e, 0xdb, 0x6b, 0x27, 0x62, - 0x97, 0xbb, 0xd0, 0xef, 0x4a, 0x90, 0x6d, 0x1d, 0x1d, 0xa3, 0xc2, 0xbe, 0x7b, 0xf1, 0x47, 0xe7, - 0xd9, 0x4b, 0x37, 0x4b, 0xc6, 0xe5, 0xf7, 0x35, 0x09, 0x0e, 0xb5, 0x8c, 0x88, 0xd1, 0xec, 0x3e, - 0xfb, 0x09, 0xc4, 0xe3, 0xd9, 0xc2, 0x4d, 0x52, 0x71, 0x99, 0x25, 0x3a, 0xd0, 0x22, 0x32, 0x6e, - 0x4f, 0x07, 0xf6, 0x8e, 0xbe, 0xdb, 0xd3, 0x81, 0x88, 0xd0, 0x9c, 0xcb, 0xb4, 0x65, 0x6c, 0xdc, - 0x9e, 0x4c, 0xa3, 0x62, 0xf0, 0xf6, 0x64, 0x1a, 0x19, 0xa0, 0xbb, 0x0a, 0xd0, 0x22, 0xca, 0x6e, - 0x57, 0x01, 0xf6, 0x8e, 0xe6, 0xdb, 0x55, 0x80, 0x88, 0x50, 0x5f, 0x7e, 0x53, 0x1e, 0x4d, 0xff, - 0xa8, 0xa7, 0xf1, 0xe6, 0x8f, 0x5a, 0x77, 0xb6, 0x9e, 0xbf, 0xa9, 0x6f, 0xb7, 0xee, 0xfb, 0xed, - 0xb3, 0xfc, 0x17, 0x71, 0x40, 0xab, 0x8e, 0xba, 0x8d, 0x73, 0x75, 0x67, 0xcb, 0xb0, 0xb4, 0xe7, - 0x99, 0x13, 0x8e, 0x01, 0x6a, 0xea, 0x8e, 0xff, 0x93, 0x03, 0x7b, 0xe6, 0x3e, 0xee, 0x7b, 0xed, - 0x9b, 0xe3, 0xc7, 0xdb, 0x78, 0x70, 0x49, 0x80, 0x95, 0x54, 0x4d, 0xdd, 0xe1, 0x17, 0x7f, 0x7f, - 0x0e, 0x40, 0xad, 0x56, 0x8d, 0x6b, 0xc5, 0xaa, 0x66, 0x8b, 0xa7, 0x1c, 0x6f, 0x89, 0x98, 0xcd, - 0x46, 0x6e, 0x27, 0x7d, 0x3f, 0x45, 0xd0, 0xa5, 0xa4, 0x28, 0xc5, 0x05, 0xcd, 0x76, 0xd0, 0xdb, - 0x21, 0x55, 0xc6, 0xfa, 0x2e, 0xa3, 0x1e, 0xbf, 0x25, 0xd4, 0x93, 0x84, 0x20, 0x25, 0x5e, 0x04, - 0xa4, 0xfa, 0xe1, 0xe8, 0x0f, 0xe7, 0xf1, 0xef, 0x46, 0x46, 0xed, 0x9f, 0x81, 0x0e, 0xe8, 0xc7, - 0xd1, 0x87, 0xd5, 0x70, 0x55, 0xf6, 0x58, 0x20, 0x71, 0x14, 0xf8, 0x5d, 0x99, 0xf8, 0x89, 0x94, - 0xfb, 0xbb, 0x32, 0xd3, 0xc3, 0x7f, 0xf6, 0xf9, 0x53, 0x03, 0x01, 0x8a, 0xf9, 0x7e, 0xff, 0x79, - 0xc9, 0xc9, 0x8f, 0x48, 0x30, 0xdc, 0xd0, 0x23, 0x92, 0x61, 0x2c, 0xb7, 0xbe, 0x76, 0x79, 0x59, - 0x99, 0x7f, 0x26, 0xb7, 0x36, 0xbf, 0xbc, 0x24, 0xbe, 0xb6, 0xec, 0xfb, 0xa4, 0x01, 0x1a, 0x87, - 0xc3, 0x4d, 0x60, 0x66, 0x0b, 0x0b, 0x85, 0xb9, 0xdc, 0x5a, 0x21, 0x2d, 0xa1, 0x3b, 0xe1, 0x68, - 0x53, 0x22, 0x2e, 0x48, 0xac, 0x05, 0x88, 0x52, 0x70, 0x41, 0xe2, 0x6f, 0xc6, 0xba, 0xfb, 0xb7, - 0xa9, 0xc6, 0xaf, 0x26, 0x57, 0xb0, 0x8e, 0x6d, 0xcd, 0xbe, 0x99, 0x95, 0x17, 0xf1, 0xe9, 0x80, - 0xcf, 0xf4, 0x42, 0xff, 0x1c, 0xeb, 0x65, 0xd5, 0x51, 0x9d, 0x5b, 0x73, 0x2e, 0x80, 0x6c, 0xfe, - 0x63, 0x20, 0xec, 0x0b, 0x8c, 0xde, 0xaf, 0xee, 0xf4, 0x77, 0xf4, 0x69, 0x50, 0xf6, 0xf8, 0x99, - 0x7f, 0x7e, 0x33, 0x4c, 0x4f, 0x66, 0xbf, 0x2b, 0x42, 0x8d, 0x26, 0xfb, 0x75, 0xa1, 0x5f, 0x95, - 0xe0, 0x00, 0x85, 0xf2, 0x3c, 0x65, 0x0a, 0x29, 0xbe, 0xad, 0x16, 0xe5, 0xcf, 0x91, 0xcd, 0xc2, - 0x55, 0x67, 0xf6, 0xb3, 0x40, 0x77, 0xf3, 0xcf, 0x62, 0x1d, 0xf1, 0xf1, 0x10, 0xa6, 0x2e, 0x2b, - 0x23, 0xd5, 0x06, 0x4c, 0x3b, 0x74, 0x20, 0x98, 0xb8, 0xe9, 0x03, 0xc1, 0x27, 0xa1, 0xcf, 0x17, - 0xcd, 0x65, 0xba, 0xdb, 0xfb, 0x76, 0x60, 0xf8, 0x48, 0xde, 0x4f, 0x03, 0xbd, 0x57, 0x82, 0x03, - 0x4d, 0xa3, 0xdf, 0x4c, 0xcf, 0xbe, 0x4f, 0xfe, 0x43, 0x12, 0x6b, 0x4a, 0x5e, 0x56, 0x46, 0xeb, - 0xcd, 0x72, 0x0b, 0x4f, 0xc1, 0x40, 0x20, 0x64, 0xcd, 0xf4, 0x52, 0x36, 0xf6, 0xf1, 0x35, 0x9c, - 0x20, 0x1d, 0x94, 0x85, 0x24, 0xde, 0x31, 0x0d, 0xcb, 0xc1, 0x65, 0x7a, 0x41, 0x3b, 0xa9, 0xb8, - 0x65, 0xa4, 0xc3, 0xc1, 0xa6, 0x8f, 0xdc, 0xec, 0x4c, 0xea, 0x26, 0xcf, 0x15, 0x46, 0x9d, 0x66, - 0x6e, 0xda, 0x5b, 0xe1, 0x28, 0x57, 0xe5, 0x16, 0x2f, 0xeb, 0x80, 0x1e, 0x16, 0x1c, 0xaa, 0xb6, - 0x72, 0x5d, 0xe4, 0x25, 0x40, 0x8d, 0xaa, 0x1a, 0xfe, 0x55, 0x2f, 0xcf, 0xfa, 0xa2, 0x51, 0xe8, - 0xf6, 0xff, 0xee, 0x15, 0x2b, 0x78, 0xe7, 0xb4, 0x6f, 0x82, 0x6d, 0xfb, 0xbf, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xaa, 0x09, 0x66, 0xf5, 0xa3, 0xab, 0x00, 0x00, + // 10576 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0x66, 0x77, 0x01, 0xec, 0x3e, 0x7c, 0x2d, 0x1a, 0xb8, 0xe3, 0xde, 0xde, 0x1d, 0x00, + 0x0e, 0xc9, 0xbb, 0xe3, 0x91, 0x07, 0x90, 0x47, 0xde, 0xf1, 0x88, 0x13, 0x79, 0xda, 0x05, 0xf6, + 0x70, 0x20, 0xf1, 0xc5, 0x01, 0x70, 0xa4, 0xa8, 0xa8, 0x36, 0x83, 0xdd, 0xc6, 0x62, 0x88, 0xdd, + 0x99, 0xe1, 0xcc, 0xec, 0x1d, 0x40, 0x51, 0x65, 0x5a, 0xb2, 0x64, 0x9a, 0x8e, 0x22, 0x4a, 0x76, + 0xd9, 0xb2, 0xa4, 0x53, 0x28, 0x4b, 0x89, 0x14, 0xc6, 0x8e, 0x65, 0x7d, 0x25, 0x8e, 0xf3, 0x43, + 0x76, 0x95, 0x13, 0x59, 0x55, 0x71, 0x24, 0xa7, 0x12, 0x29, 0xae, 0xf8, 0x24, 0x53, 0x8a, 0xc3, + 0x28, 0x4a, 0xac, 0x30, 0x52, 0x25, 0x55, 0x4a, 0x2a, 0xa9, 0xfe, 0x9a, 0xaf, 0xdd, 0xc5, 0xec, + 0xe2, 0xee, 0x28, 0xc9, 0xce, 0x2f, 0xa0, 0xbb, 0xdf, 0x7b, 0xfd, 0xfa, 0xf5, 0xeb, 0xd7, 0xef, + 0xbd, 0xee, 0x9e, 0x85, 0x8f, 0x9e, 0x87, 0x89, 0x8a, 0x61, 0x54, 0xaa, 0x78, 0xca, 0xb4, 0x0c, + 0xc7, 0xd8, 0xa8, 0x6f, 0x4e, 0x95, 0xb1, 0x5d, 0xb2, 0x34, 0xd3, 0x31, 0xac, 0x49, 0x5a, 0x87, + 0x86, 0x18, 0xc4, 0xa4, 0x80, 0x90, 0x17, 0x61, 0xf8, 0xa2, 0x56, 0xc5, 0xb3, 0x2e, 0xe0, 0x2a, + 0x76, 0xd0, 0x39, 0x48, 0x6c, 0x6a, 0x55, 0x9c, 0x91, 0x26, 0xe2, 0x27, 0xfa, 0x4e, 0xdf, 0x39, + 0x19, 0x42, 0x9a, 0x0c, 0x62, 0xac, 0x90, 0x6a, 0x85, 0x62, 0xc8, 0xdf, 0x4d, 0xc0, 0x48, 0x93, + 0x56, 0x84, 0x20, 0xa1, 0xab, 0x35, 0x42, 0x51, 0x3a, 0x91, 0x52, 0xe8, 0xff, 0x28, 0x03, 0xbd, + 0xa6, 0x5a, 0xda, 0x56, 0x2b, 0x38, 0x13, 0xa3, 0xd5, 0xa2, 0x88, 0xc6, 0x00, 0xca, 0xd8, 0xc4, + 0x7a, 0x19, 0xeb, 0xa5, 0xdd, 0x4c, 0x7c, 0x22, 0x7e, 0x22, 0xa5, 0xf8, 0x6a, 0xd0, 0x3d, 0x30, + 0x6c, 0xd6, 0x37, 0xaa, 0x5a, 0xa9, 0xe8, 0x03, 0x83, 0x89, 0xf8, 0x89, 0x6e, 0x25, 0xcd, 0x1a, + 0x66, 0x3d, 0xe0, 0xe3, 0x30, 0x74, 0x15, 0xab, 0xdb, 0x7e, 0xd0, 0x3e, 0x0a, 0x3a, 0x48, 0xaa, + 0x7d, 0x80, 0x33, 0xd0, 0x5f, 0xc3, 0xb6, 0xad, 0x56, 0x70, 0xd1, 0xd9, 0x35, 0x71, 0x26, 0x41, + 0x47, 0x3f, 0xd1, 0x30, 0xfa, 0xf0, 0xc8, 0xfb, 0x38, 0xd6, 0xda, 0xae, 0x89, 0x51, 0x0e, 0x52, + 0x58, 0xaf, 0xd7, 0x18, 0x85, 0xee, 0x16, 0xf2, 0x2b, 0xe8, 0xf5, 0x5a, 0x98, 0x4a, 0x92, 0xa0, + 0x71, 0x12, 0xbd, 0x36, 0xb6, 0xae, 0x68, 0x25, 0x9c, 0xe9, 0xa1, 0x04, 0x8e, 0x37, 0x10, 0x58, + 0x65, 0xed, 0x61, 0x1a, 0x02, 0x0f, 0xcd, 0x40, 0x0a, 0xef, 0x38, 0x58, 0xb7, 0x35, 0x43, 0xcf, + 0xf4, 0x52, 0x22, 0x77, 0x35, 0x99, 0x45, 0x5c, 0x2d, 0x87, 0x49, 0x78, 0x78, 0xe8, 0x2c, 0xf4, + 0x1a, 0xa6, 0xa3, 0x19, 0xba, 0x9d, 0x49, 0x4e, 0x48, 0x27, 0xfa, 0x4e, 0x1f, 0x69, 0xaa, 0x08, + 0xcb, 0x0c, 0x46, 0x11, 0xc0, 0x68, 0x1e, 0xd2, 0xb6, 0x51, 0xb7, 0x4a, 0xb8, 0x58, 0x32, 0xca, + 0xb8, 0xa8, 0xe9, 0x9b, 0x46, 0x26, 0x45, 0x09, 0x8c, 0x37, 0x0e, 0x84, 0x02, 0xce, 0x18, 0x65, + 0x3c, 0xaf, 0x6f, 0x1a, 0xca, 0xa0, 0x1d, 0x28, 0xa3, 0x83, 0xd0, 0x63, 0xef, 0xea, 0x8e, 0xba, + 0x93, 0xe9, 0xa7, 0x1a, 0xc2, 0x4b, 0xf2, 0xef, 0xf5, 0xc0, 0x50, 0x3b, 0x2a, 0x76, 0x1e, 0xba, + 0x37, 0xc9, 0x28, 0x33, 0xb1, 0x4e, 0x64, 0xc0, 0x70, 0x82, 0x42, 0xec, 0xd9, 0xa7, 0x10, 0x73, + 0xd0, 0xa7, 0x63, 0xdb, 0xc1, 0x65, 0xa6, 0x11, 0xf1, 0x36, 0x75, 0x0a, 0x18, 0x52, 0xa3, 0x4a, + 0x25, 0xf6, 0xa5, 0x52, 0x4f, 0xc1, 0x90, 0xcb, 0x52, 0xd1, 0x52, 0xf5, 0x8a, 0xd0, 0xcd, 0xa9, + 0x28, 0x4e, 0x26, 0x0b, 0x02, 0x4f, 0x21, 0x68, 0xca, 0x20, 0x0e, 0x94, 0xd1, 0x2c, 0x80, 0xa1, + 0x63, 0x63, 0xb3, 0x58, 0xc6, 0xa5, 0x6a, 0x26, 0xd9, 0x42, 0x4a, 0xcb, 0x04, 0xa4, 0x41, 0x4a, + 0x06, 0xab, 0x2d, 0x55, 0xd1, 0xc3, 0x9e, 0xaa, 0xf5, 0xb6, 0xd0, 0x94, 0x45, 0xb6, 0xc8, 0x1a, + 0xb4, 0x6d, 0x1d, 0x06, 0x2d, 0x4c, 0xf4, 0x1e, 0x97, 0xf9, 0xc8, 0x52, 0x94, 0x89, 0xc9, 0xc8, + 0x91, 0x29, 0x1c, 0x8d, 0x0d, 0x6c, 0xc0, 0xf2, 0x17, 0xd1, 0x1d, 0xe0, 0x56, 0x14, 0xa9, 0x5a, + 0x01, 0xb5, 0x42, 0xfd, 0xa2, 0x72, 0x49, 0xad, 0xe1, 0xec, 0x73, 0x30, 0x18, 0x14, 0x0f, 0x1a, + 0x85, 0x6e, 0xdb, 0x51, 0x2d, 0x87, 0x6a, 0x61, 0xb7, 0xc2, 0x0a, 0x28, 0x0d, 0x71, 0xac, 0x97, + 0xa9, 0x95, 0xeb, 0x56, 0xc8, 0xbf, 0xe8, 0xad, 0xde, 0x80, 0xe3, 0x74, 0xc0, 0xc7, 0x1a, 0x67, + 0x34, 0x40, 0x39, 0x3c, 0xee, 0xec, 0x43, 0x30, 0x10, 0x18, 0x40, 0xbb, 0x5d, 0xcb, 0xcf, 0xc3, + 0x81, 0xa6, 0xa4, 0xd1, 0x53, 0x30, 0x5a, 0xd7, 0x35, 0xdd, 0xc1, 0x96, 0x69, 0x61, 0xa2, 0xb1, + 0xac, 0xab, 0xcc, 0x7f, 0xea, 0x6d, 0xa1, 0x73, 0xeb, 0x7e, 0x68, 0x46, 0x45, 0x19, 0xa9, 0x37, + 0x56, 0x9e, 0x4c, 0x25, 0x5f, 0xef, 0x4d, 0xbf, 0xf0, 0xc2, 0x0b, 0x2f, 0xc4, 0xe4, 0x0f, 0xf7, + 0xc0, 0x68, 0xb3, 0x35, 0xd3, 0x74, 0xf9, 0x1e, 0x84, 0x1e, 0xbd, 0x5e, 0xdb, 0xc0, 0x16, 0x15, + 0x52, 0xb7, 0xc2, 0x4b, 0x28, 0x07, 0xdd, 0x55, 0x75, 0x03, 0x57, 0x33, 0x89, 0x09, 0xe9, 0xc4, + 0xe0, 0xe9, 0x7b, 0xda, 0x5a, 0x95, 0x93, 0x0b, 0x04, 0x45, 0x61, 0x98, 0xe8, 0x51, 0x48, 0x70, + 0x13, 0x4d, 0x28, 0x9c, 0x6c, 0x8f, 0x02, 0x59, 0x4b, 0x0a, 0xc5, 0x43, 0x87, 0x21, 0x45, 0xfe, + 0x32, 0xdd, 0xe8, 0xa1, 0x3c, 0x27, 0x49, 0x05, 0xd1, 0x0b, 0x94, 0x85, 0x24, 0x5d, 0x26, 0x65, + 0x2c, 0xb6, 0x36, 0xb7, 0x4c, 0x14, 0xab, 0x8c, 0x37, 0xd5, 0x7a, 0xd5, 0x29, 0x5e, 0x51, 0xab, + 0x75, 0x4c, 0x15, 0x3e, 0xa5, 0xf4, 0xf3, 0xca, 0xcb, 0xa4, 0x0e, 0x8d, 0x43, 0x1f, 0x5b, 0x55, + 0x9a, 0x5e, 0xc6, 0x3b, 0xd4, 0x7a, 0x76, 0x2b, 0x6c, 0xa1, 0xcd, 0x93, 0x1a, 0xd2, 0xfd, 0x33, + 0xb6, 0xa1, 0x0b, 0xd5, 0xa4, 0x5d, 0x90, 0x0a, 0xda, 0xfd, 0x43, 0x61, 0xc3, 0x7d, 0xb4, 0xf9, + 0xf0, 0xc2, 0x3a, 0x25, 0x7f, 0x29, 0x06, 0x09, 0x6a, 0x2f, 0x86, 0xa0, 0x6f, 0xed, 0x6d, 0x2b, + 0x85, 0xe2, 0xec, 0xf2, 0x7a, 0x7e, 0xa1, 0x90, 0x96, 0xd0, 0x20, 0x00, 0xad, 0xb8, 0xb8, 0xb0, + 0x9c, 0x5b, 0x4b, 0xc7, 0xdc, 0xf2, 0xfc, 0xd2, 0xda, 0xd9, 0x07, 0xd3, 0x71, 0x17, 0x61, 0x9d, + 0x55, 0x24, 0xfc, 0x00, 0x0f, 0x9c, 0x4e, 0x77, 0xa3, 0x34, 0xf4, 0x33, 0x02, 0xf3, 0x4f, 0x15, + 0x66, 0xcf, 0x3e, 0x98, 0xee, 0x09, 0xd6, 0x3c, 0x70, 0x3a, 0xdd, 0x8b, 0x06, 0x20, 0x45, 0x6b, + 0xf2, 0xcb, 0xcb, 0x0b, 0xe9, 0xa4, 0x4b, 0x73, 0x75, 0x4d, 0x99, 0x5f, 0x9a, 0x4b, 0xa7, 0x5c, + 0x9a, 0x73, 0xca, 0xf2, 0xfa, 0x4a, 0x1a, 0x5c, 0x0a, 0x8b, 0x85, 0xd5, 0xd5, 0xdc, 0x5c, 0x21, + 0xdd, 0xe7, 0x42, 0xe4, 0xdf, 0xb6, 0x56, 0x58, 0x4d, 0xf7, 0x07, 0xd8, 0x7a, 0xe0, 0x74, 0x7a, + 0xc0, 0xed, 0xa2, 0xb0, 0xb4, 0xbe, 0x98, 0x1e, 0x44, 0xc3, 0x30, 0xc0, 0xba, 0x10, 0x4c, 0x0c, + 0x85, 0xaa, 0xce, 0x3e, 0x98, 0x4e, 0x7b, 0x8c, 0x30, 0x2a, 0xc3, 0x81, 0x8a, 0xb3, 0x0f, 0xa6, + 0x91, 0x3c, 0x03, 0xdd, 0x54, 0xbb, 0x10, 0x82, 0xc1, 0x85, 0x5c, 0xbe, 0xb0, 0x50, 0x5c, 0x5e, + 0x59, 0x9b, 0x5f, 0x5e, 0xca, 0x2d, 0xa4, 0x25, 0xaf, 0x4e, 0x29, 0x3c, 0xb1, 0x3e, 0xaf, 0x14, + 0x66, 0xd3, 0x31, 0x7f, 0xdd, 0x4a, 0x21, 0xb7, 0x56, 0x98, 0x4d, 0xc7, 0xe5, 0x12, 0x8c, 0x36, + 0xb3, 0x93, 0x4d, 0x57, 0x86, 0x6f, 0x8a, 0x63, 0x2d, 0xa6, 0x98, 0xd2, 0x6a, 0x98, 0xe2, 0xef, + 0xc4, 0x60, 0xa4, 0xc9, 0x5e, 0xd1, 0xb4, 0x93, 0x0b, 0xd0, 0xcd, 0x54, 0x94, 0xed, 0x9e, 0x77, + 0x37, 0xdd, 0x74, 0xa8, 0xc2, 0x36, 0xec, 0xa0, 0x14, 0xcf, 0xef, 0x41, 0xc4, 0x5b, 0x78, 0x10, + 0x84, 0x44, 0x83, 0x4d, 0x7f, 0x47, 0x83, 0x4d, 0x67, 0xdb, 0xde, 0xd9, 0x76, 0xb6, 0x3d, 0x5a, + 0xd7, 0x99, 0x6d, 0xef, 0x6e, 0x62, 0xdb, 0xcf, 0xc3, 0x70, 0x03, 0xa1, 0xb6, 0x6d, 0xec, 0x7b, + 0x24, 0xc8, 0xb4, 0x12, 0x4e, 0x84, 0xa5, 0x8b, 0x05, 0x2c, 0xdd, 0xf9, 0xb0, 0x04, 0x6f, 0x6f, + 0x3d, 0x09, 0x0d, 0x73, 0xfd, 0x69, 0x09, 0x0e, 0x36, 0xf7, 0x14, 0x9b, 0xf2, 0xf0, 0x28, 0xf4, + 0xd4, 0xb0, 0xb3, 0x65, 0x08, 0x6f, 0xe9, 0x58, 0x93, 0x3d, 0x98, 0x34, 0x87, 0x27, 0x9b, 0x63, + 0xf9, 0x37, 0xf1, 0x78, 0x2b, 0x77, 0x8f, 0x71, 0xd3, 0xc0, 0xe9, 0x2f, 0xc5, 0xe0, 0x40, 0x53, + 0xe2, 0x4d, 0x19, 0x3d, 0x0a, 0xa0, 0xe9, 0x66, 0xdd, 0x61, 0x1e, 0x11, 0x33, 0xb0, 0x29, 0x5a, + 0x43, 0x8d, 0x17, 0x31, 0x9e, 0x75, 0xc7, 0x6d, 0x8f, 0xd3, 0x76, 0x60, 0x55, 0x14, 0xe0, 0x9c, + 0xc7, 0x68, 0x82, 0x32, 0x3a, 0xd6, 0x62, 0xa4, 0x0d, 0x8a, 0x79, 0x1f, 0xa4, 0x4b, 0x55, 0x0d, + 0xeb, 0x4e, 0xd1, 0x76, 0x2c, 0xac, 0xd6, 0x34, 0xbd, 0x42, 0x77, 0x90, 0xe4, 0x74, 0xf7, 0xa6, + 0x5a, 0xb5, 0xb1, 0x32, 0xc4, 0x9a, 0x57, 0x45, 0x2b, 0xc1, 0xa0, 0x0a, 0x64, 0xf9, 0x30, 0x7a, + 0x02, 0x18, 0xac, 0xd9, 0xc5, 0x90, 0x3f, 0x94, 0x82, 0x3e, 0x9f, 0x5f, 0x8d, 0x6e, 0x87, 0xfe, + 0x67, 0xd4, 0x2b, 0x6a, 0x51, 0xc4, 0x4a, 0x4c, 0x12, 0x7d, 0xa4, 0x6e, 0x85, 0xc7, 0x4b, 0xf7, + 0xc1, 0x28, 0x05, 0x31, 0xea, 0x0e, 0xb6, 0x8a, 0xa5, 0xaa, 0x6a, 0xdb, 0x54, 0x68, 0x49, 0x0a, + 0x8a, 0x48, 0xdb, 0x32, 0x69, 0x9a, 0x11, 0x2d, 0xe8, 0x0c, 0x8c, 0x50, 0x8c, 0x5a, 0xbd, 0xea, + 0x68, 0x66, 0x15, 0x17, 0x49, 0xf4, 0x66, 0xd3, 0x9d, 0xc4, 0xe5, 0x6c, 0x98, 0x40, 0x2c, 0x72, + 0x00, 0xc2, 0x91, 0x8d, 0x66, 0xe1, 0x28, 0x45, 0xab, 0x60, 0x1d, 0x5b, 0xaa, 0x83, 0x8b, 0xf8, + 0xd9, 0xba, 0x5a, 0xb5, 0x8b, 0xaa, 0x5e, 0x2e, 0x6e, 0xa9, 0xf6, 0x56, 0x66, 0x94, 0x10, 0xc8, + 0xc7, 0x32, 0x92, 0x72, 0x88, 0x00, 0xce, 0x71, 0xb8, 0x02, 0x05, 0xcb, 0xe9, 0xe5, 0x4b, 0xaa, + 0xbd, 0x85, 0xa6, 0xe1, 0x20, 0xa5, 0x62, 0x3b, 0x96, 0xa6, 0x57, 0x8a, 0xa5, 0x2d, 0x5c, 0xda, + 0x2e, 0xd6, 0x9d, 0xcd, 0x73, 0x99, 0xc3, 0xfe, 0xfe, 0x29, 0x87, 0xab, 0x14, 0x66, 0x86, 0x80, + 0xac, 0x3b, 0x9b, 0xe7, 0xd0, 0x2a, 0xf4, 0x93, 0xc9, 0xa8, 0x69, 0xcf, 0xe1, 0xe2, 0xa6, 0x61, + 0xd1, 0xad, 0x71, 0xb0, 0x89, 0x69, 0xf2, 0x49, 0x70, 0x72, 0x99, 0x23, 0x2c, 0x1a, 0x65, 0x3c, + 0xdd, 0xbd, 0xba, 0x52, 0x28, 0xcc, 0x2a, 0x7d, 0x82, 0xca, 0x45, 0xc3, 0x22, 0x0a, 0x55, 0x31, + 0x5c, 0x01, 0xf7, 0x31, 0x85, 0xaa, 0x18, 0x42, 0xbc, 0x67, 0x60, 0xa4, 0x54, 0x62, 0x63, 0xd6, + 0x4a, 0x45, 0x1e, 0x63, 0xd9, 0x99, 0x74, 0x40, 0x58, 0xa5, 0xd2, 0x1c, 0x03, 0xe0, 0x3a, 0x6e, + 0xa3, 0x87, 0xe1, 0x80, 0x27, 0x2c, 0x3f, 0xe2, 0x70, 0xc3, 0x28, 0xc3, 0xa8, 0x67, 0x60, 0xc4, + 0xdc, 0x6d, 0x44, 0x44, 0x81, 0x1e, 0xcd, 0xdd, 0x30, 0xda, 0x43, 0x30, 0x6a, 0x6e, 0x99, 0x8d, + 0x78, 0x27, 0xfd, 0x78, 0xc8, 0xdc, 0x32, 0xc3, 0x88, 0x77, 0xd1, 0x80, 0xdb, 0xc2, 0x25, 0xd5, + 0xc1, 0xe5, 0xcc, 0x6d, 0x7e, 0x70, 0x5f, 0x03, 0x9a, 0x82, 0x74, 0xa9, 0x54, 0xc4, 0xba, 0xba, + 0x51, 0xc5, 0x45, 0xd5, 0xc2, 0xba, 0x6a, 0x67, 0xc6, 0xfd, 0xc0, 0x83, 0xa5, 0x52, 0x81, 0xb6, + 0xe6, 0x68, 0x23, 0x3a, 0x09, 0xc3, 0xc6, 0xc6, 0x33, 0x25, 0xa6, 0x92, 0x45, 0xd3, 0xc2, 0x9b, + 0xda, 0x4e, 0xe6, 0x4e, 0x2a, 0xdf, 0x21, 0xd2, 0x40, 0x15, 0x72, 0x85, 0x56, 0xa3, 0xbb, 0x21, + 0x5d, 0xb2, 0xb7, 0x54, 0xcb, 0xa4, 0x36, 0xd9, 0x36, 0xd5, 0x12, 0xce, 0xdc, 0xc5, 0x40, 0x59, + 0xfd, 0x92, 0xa8, 0x26, 0x4b, 0xc2, 0xbe, 0xaa, 0x6d, 0x3a, 0x82, 0xe2, 0x71, 0xb6, 0x24, 0x68, + 0x1d, 0xa7, 0x76, 0x02, 0xd2, 0x44, 0x14, 0x81, 0x8e, 0x4f, 0x50, 0xb0, 0x41, 0x73, 0xcb, 0xf4, + 0xf7, 0x7b, 0x07, 0x0c, 0x10, 0x48, 0xaf, 0xd3, 0xbb, 0x99, 0x43, 0x66, 0x6e, 0xf9, 0x7a, 0x7c, + 0x10, 0x0e, 0x12, 0xa0, 0x1a, 0x76, 0xd4, 0xb2, 0xea, 0xa8, 0x3e, 0xe8, 0x7b, 0x29, 0x34, 0x91, + 0xfb, 0x22, 0x6f, 0x0c, 0xf0, 0x69, 0xd5, 0x37, 0x76, 0x5d, 0xcd, 0x3a, 0xc5, 0xf8, 0x24, 0x75, + 0x42, 0xb7, 0x6e, 0x99, 0xd3, 0x2d, 0x4f, 0x43, 0xbf, 0x5f, 0xf1, 0x51, 0x0a, 0x98, 0xea, 0xa7, + 0x25, 0xe2, 0x05, 0xcd, 0x2c, 0xcf, 0x12, 0xff, 0xe5, 0xe9, 0x42, 0x3a, 0x46, 0xfc, 0xa8, 0x85, + 0xf9, 0xb5, 0x42, 0x51, 0x59, 0x5f, 0x5a, 0x9b, 0x5f, 0x2c, 0xa4, 0xe3, 0x3e, 0x87, 0xfd, 0xb1, + 0x44, 0xf2, 0x58, 0xfa, 0xb8, 0xfc, 0xf5, 0x18, 0x0c, 0x06, 0x23, 0x30, 0xf4, 0x16, 0xb8, 0x4d, + 0xa4, 0x4b, 0x6c, 0xec, 0x14, 0xaf, 0x6a, 0x16, 0x5d, 0x91, 0x35, 0x95, 0xed, 0x8e, 0xae, 0x4e, + 0x8c, 0x72, 0xa8, 0x55, 0xec, 0x3c, 0xa9, 0x59, 0x64, 0xbd, 0xd5, 0x54, 0x07, 0x2d, 0xc0, 0xb8, + 0x6e, 0x14, 0x6d, 0x47, 0xd5, 0xcb, 0xaa, 0x55, 0x2e, 0x7a, 0x89, 0xaa, 0xa2, 0x5a, 0x2a, 0x61, + 0xdb, 0x36, 0xd8, 0x4e, 0xe8, 0x52, 0x39, 0xa2, 0x1b, 0xab, 0x1c, 0xd8, 0xdb, 0x22, 0x72, 0x1c, + 0x34, 0xa4, 0xbf, 0xf1, 0x56, 0xfa, 0x7b, 0x18, 0x52, 0x35, 0xd5, 0x2c, 0x62, 0xdd, 0xb1, 0x76, + 0xa9, 0xdf, 0x9d, 0x54, 0x92, 0x35, 0xd5, 0x2c, 0x90, 0xf2, 0x9b, 0x12, 0xfe, 0x3c, 0x96, 0x48, + 0x26, 0xd3, 0xa9, 0xc7, 0x12, 0xc9, 0x54, 0x1a, 0xe4, 0xd7, 0xe2, 0xd0, 0xef, 0xf7, 0xc3, 0x49, + 0x58, 0x53, 0xa2, 0x5b, 0x96, 0x44, 0x8d, 0xda, 0x1d, 0x7b, 0x7a, 0xed, 0x93, 0x33, 0x64, 0x2f, + 0x9b, 0xee, 0x61, 0xde, 0xb1, 0xc2, 0x30, 0x89, 0x1f, 0x41, 0x94, 0x0d, 0x33, 0x6f, 0x24, 0xa9, + 0xf0, 0x12, 0x9a, 0x83, 0x9e, 0x67, 0x6c, 0x4a, 0xbb, 0x87, 0xd2, 0xbe, 0x73, 0x6f, 0xda, 0x8f, + 0xad, 0x52, 0xe2, 0xa9, 0xc7, 0x56, 0x8b, 0x4b, 0xcb, 0xca, 0x62, 0x6e, 0x41, 0xe1, 0xe8, 0xe8, + 0x10, 0x24, 0xaa, 0xea, 0x73, 0xbb, 0xc1, 0x5d, 0x8f, 0x56, 0xb5, 0x3b, 0x09, 0x87, 0x20, 0x71, + 0x15, 0xab, 0xdb, 0xc1, 0xbd, 0x86, 0x56, 0xdd, 0xc2, 0xc5, 0x30, 0x05, 0xdd, 0x54, 0x5e, 0x08, + 0x80, 0x4b, 0x2c, 0xdd, 0x85, 0x92, 0x90, 0x98, 0x59, 0x56, 0xc8, 0x82, 0x48, 0x43, 0x3f, 0xab, + 0x2d, 0xae, 0xcc, 0x17, 0x66, 0x0a, 0xe9, 0x98, 0x7c, 0x06, 0x7a, 0x98, 0x10, 0xc8, 0x62, 0x71, + 0xc5, 0x90, 0xee, 0xe2, 0x45, 0x4e, 0x43, 0x12, 0xad, 0xeb, 0x8b, 0xf9, 0x82, 0x92, 0x8e, 0x05, + 0xa7, 0x3a, 0x91, 0xee, 0x96, 0x6d, 0xe8, 0xf7, 0x3b, 0xe2, 0x6f, 0x4e, 0x90, 0xfd, 0x65, 0x09, + 0xfa, 0x7c, 0x8e, 0x35, 0xf1, 0x88, 0xd4, 0x6a, 0xd5, 0xb8, 0x5a, 0x54, 0xab, 0x9a, 0x6a, 0x73, + 0xd5, 0x00, 0x5a, 0x95, 0x23, 0x35, 0xed, 0x4e, 0xdd, 0x9b, 0xb4, 0x44, 0xba, 0xd3, 0x3d, 0xf2, + 0xc7, 0x25, 0x48, 0x87, 0x3d, 0xdb, 0x10, 0x9b, 0xd2, 0x4f, 0x92, 0x4d, 0xf9, 0x63, 0x12, 0x0c, + 0x06, 0xdd, 0xd9, 0x10, 0x7b, 0xb7, 0xff, 0x44, 0xd9, 0xfb, 0x76, 0x0c, 0x06, 0x02, 0x4e, 0x6c, + 0xbb, 0xdc, 0x3d, 0x0b, 0xc3, 0x5a, 0x19, 0xd7, 0x4c, 0xc3, 0xc1, 0x7a, 0x69, 0xb7, 0x58, 0xc5, + 0x57, 0x70, 0x35, 0x23, 0x53, 0xa3, 0x31, 0xb5, 0xb7, 0x9b, 0x3c, 0x39, 0xef, 0xe1, 0x2d, 0x10, + 0xb4, 0xe9, 0x91, 0xf9, 0xd9, 0xc2, 0xe2, 0xca, 0xf2, 0x5a, 0x61, 0x69, 0xe6, 0x6d, 0xc5, 0xf5, + 0xa5, 0xc7, 0x97, 0x96, 0x9f, 0x5c, 0x52, 0xd2, 0x5a, 0x08, 0xec, 0x16, 0x2e, 0xfb, 0x15, 0x48, + 0x87, 0x99, 0x42, 0xb7, 0x41, 0x33, 0xb6, 0xd2, 0x5d, 0x68, 0x04, 0x86, 0x96, 0x96, 0x8b, 0xab, + 0xf3, 0xb3, 0x85, 0x62, 0xe1, 0xe2, 0xc5, 0xc2, 0xcc, 0xda, 0x2a, 0x4b, 0x7c, 0xb8, 0xd0, 0x6b, + 0x81, 0x05, 0x2e, 0x7f, 0x24, 0x0e, 0x23, 0x4d, 0x38, 0x41, 0x39, 0x1e, 0xb2, 0xb0, 0x28, 0xea, + 0x54, 0x3b, 0xdc, 0x4f, 0x12, 0x9f, 0x61, 0x45, 0xb5, 0x1c, 0x1e, 0xe1, 0xdc, 0x0d, 0x44, 0x4a, + 0xba, 0xa3, 0x6d, 0x6a, 0xd8, 0xe2, 0x79, 0x22, 0x16, 0xc7, 0x0c, 0x79, 0xf5, 0x2c, 0x55, 0x74, + 0x2f, 0x20, 0xd3, 0xb0, 0x35, 0x47, 0xbb, 0x82, 0x8b, 0x9a, 0x2e, 0x92, 0x4a, 0x24, 0xae, 0x49, + 0x28, 0x69, 0xd1, 0x32, 0xaf, 0x3b, 0x2e, 0xb4, 0x8e, 0x2b, 0x6a, 0x08, 0x9a, 0x18, 0xf3, 0xb8, + 0x92, 0x16, 0x2d, 0x2e, 0xf4, 0xed, 0xd0, 0x5f, 0x36, 0xea, 0xc4, 0xd9, 0x63, 0x70, 0x64, 0xef, + 0x90, 0x94, 0x3e, 0x56, 0xe7, 0x82, 0x70, 0x37, 0xde, 0xcb, 0x66, 0xf5, 0x2b, 0x7d, 0xac, 0x8e, + 0x81, 0x1c, 0x87, 0x21, 0xb5, 0x52, 0xb1, 0x08, 0x71, 0x41, 0x88, 0x05, 0x26, 0x83, 0x6e, 0x35, + 0x05, 0xcc, 0x3e, 0x06, 0x49, 0x21, 0x07, 0xb2, 0x55, 0x13, 0x49, 0x14, 0x4d, 0x16, 0x6d, 0xc7, + 0x4e, 0xa4, 0x94, 0xa4, 0x2e, 0x1a, 0x6f, 0x87, 0x7e, 0xcd, 0x2e, 0x7a, 0xc9, 0xf9, 0xd8, 0x44, + 0xec, 0x44, 0x52, 0xe9, 0xd3, 0x6c, 0x37, 0xb1, 0x29, 0x7f, 0x3a, 0x06, 0x83, 0xc1, 0xc3, 0x05, + 0x34, 0x0b, 0xc9, 0xaa, 0x51, 0x52, 0xa9, 0x6a, 0xb1, 0x93, 0xad, 0x13, 0x11, 0xe7, 0x11, 0x93, + 0x0b, 0x1c, 0x5e, 0x71, 0x31, 0xb3, 0x7f, 0x22, 0x41, 0x52, 0x54, 0xa3, 0x83, 0x90, 0x30, 0x55, + 0x67, 0x8b, 0x92, 0xeb, 0xce, 0xc7, 0xd2, 0x92, 0x42, 0xcb, 0xa4, 0xde, 0x36, 0x55, 0x9d, 0xaa, + 0x00, 0xaf, 0x27, 0x65, 0x32, 0xaf, 0x55, 0xac, 0x96, 0x69, 0xd4, 0x63, 0xd4, 0x6a, 0x58, 0x77, + 0x6c, 0x31, 0xaf, 0xbc, 0x7e, 0x86, 0x57, 0xa3, 0x7b, 0x60, 0xd8, 0xb1, 0x54, 0xad, 0x1a, 0x80, + 0x4d, 0x50, 0xd8, 0xb4, 0x68, 0x70, 0x81, 0xa7, 0xe1, 0x90, 0xa0, 0x5b, 0xc6, 0x8e, 0x5a, 0xda, + 0xc2, 0x65, 0x0f, 0xa9, 0x87, 0x66, 0x37, 0x6e, 0xe3, 0x00, 0xb3, 0xbc, 0x5d, 0xe0, 0xca, 0x5f, + 0x97, 0x60, 0x58, 0xc4, 0x69, 0x65, 0x57, 0x58, 0x8b, 0x00, 0xaa, 0xae, 0x1b, 0x8e, 0x5f, 0x5c, + 0x8d, 0xaa, 0xdc, 0x80, 0x37, 0x99, 0x73, 0x91, 0x14, 0x1f, 0x81, 0x6c, 0x0d, 0xc0, 0x6b, 0x69, + 0x29, 0xb6, 0x71, 0xe8, 0xe3, 0x27, 0x47, 0xf4, 0xf8, 0x91, 0x45, 0xf6, 0xc0, 0xaa, 0x48, 0x40, + 0x87, 0x46, 0xa1, 0x7b, 0x03, 0x57, 0x34, 0x9d, 0xe7, 0x83, 0x59, 0x41, 0xe4, 0x5f, 0x12, 0x6e, + 0xfe, 0x25, 0xff, 0x01, 0x09, 0x46, 0x4a, 0x46, 0x2d, 0xcc, 0x6f, 0x3e, 0x1d, 0x4a, 0x2f, 0xd8, + 0x97, 0xa4, 0xa7, 0x1f, 0xad, 0x68, 0xce, 0x56, 0x7d, 0x63, 0xb2, 0x64, 0xd4, 0xa6, 0x2a, 0x46, + 0x55, 0xd5, 0x2b, 0xde, 0xf9, 0x29, 0xfd, 0xa7, 0x74, 0xaa, 0x82, 0xf5, 0x53, 0x15, 0xc3, 0x77, + 0x9a, 0x7a, 0xde, 0xfb, 0xf7, 0x7f, 0x49, 0xd2, 0x6f, 0xc6, 0xe2, 0x73, 0x2b, 0xf9, 0x57, 0x63, + 0xd9, 0x39, 0xd6, 0xdd, 0x8a, 0x10, 0x8f, 0x82, 0x37, 0xab, 0xb8, 0x44, 0x86, 0x0c, 0xdf, 0xbb, + 0x07, 0x46, 0x2b, 0x46, 0xc5, 0xa0, 0x14, 0xa7, 0xc8, 0x7f, 0xfc, 0x44, 0x36, 0xe5, 0xd6, 0x66, + 0x23, 0x8f, 0x6f, 0xa7, 0x97, 0x60, 0x84, 0x03, 0x17, 0xe9, 0x91, 0x10, 0x0b, 0x6c, 0xd0, 0x9e, + 0x69, 0xb5, 0xcc, 0xef, 0x7e, 0x97, 0x6e, 0xe8, 0xca, 0x30, 0x47, 0x25, 0x6d, 0x2c, 0xf6, 0x99, + 0x56, 0xe0, 0x40, 0x80, 0x1e, 0x5b, 0xb6, 0xd8, 0x8a, 0xa0, 0xf8, 0x47, 0x9c, 0xe2, 0x88, 0x8f, + 0xe2, 0x2a, 0x47, 0x9d, 0x9e, 0x81, 0x81, 0x4e, 0x68, 0xfd, 0x0b, 0x4e, 0xab, 0x1f, 0xfb, 0x89, + 0xcc, 0xc1, 0x10, 0x25, 0x52, 0xaa, 0xdb, 0x8e, 0x51, 0xa3, 0x36, 0x71, 0x6f, 0x32, 0xff, 0xf2, + 0xbb, 0x6c, 0x1d, 0x0d, 0x12, 0xb4, 0x19, 0x17, 0x6b, 0x7a, 0x1a, 0xe8, 0x29, 0x58, 0x19, 0x97, + 0xaa, 0x11, 0x14, 0xbe, 0xc2, 0x19, 0x71, 0xe1, 0xa7, 0x2f, 0xc3, 0x28, 0xf9, 0x9f, 0x9a, 0x2c, + 0x3f, 0x27, 0xd1, 0x39, 0xb8, 0xcc, 0xd7, 0xdf, 0xc3, 0x96, 0xea, 0x88, 0x4b, 0xc0, 0xc7, 0x93, + 0x6f, 0x16, 0x2b, 0xd8, 0x71, 0xb0, 0x65, 0x17, 0xd5, 0x6a, 0x33, 0xf6, 0x7c, 0x49, 0x8c, 0xcc, + 0x6f, 0x7c, 0x3f, 0x38, 0x8b, 0x73, 0x0c, 0x33, 0x57, 0xad, 0x4e, 0xaf, 0xc3, 0x6d, 0x4d, 0xb4, + 0xa2, 0x0d, 0x9a, 0x1f, 0xe1, 0x34, 0x47, 0x1b, 0x34, 0x83, 0x90, 0x5d, 0x01, 0x51, 0xef, 0xce, + 0x65, 0x1b, 0x34, 0x3f, 0xca, 0x69, 0x22, 0x8e, 0x2b, 0xa6, 0x94, 0x50, 0x7c, 0x0c, 0x86, 0xaf, + 0x60, 0x6b, 0xc3, 0xb0, 0x79, 0xe2, 0xa8, 0x0d, 0x72, 0x1f, 0xe3, 0xe4, 0x86, 0x38, 0x22, 0xcd, + 0x24, 0x11, 0x5a, 0x0f, 0x43, 0x72, 0x53, 0x2d, 0xe1, 0x36, 0x48, 0x5c, 0xe3, 0x24, 0x7a, 0x09, + 0x3c, 0x41, 0xcd, 0x41, 0x7f, 0xc5, 0xe0, 0xbb, 0x56, 0x34, 0xfa, 0xc7, 0x39, 0x7a, 0x9f, 0xc0, + 0xe1, 0x24, 0x4c, 0xc3, 0xac, 0x57, 0xc9, 0x96, 0x16, 0x4d, 0xe2, 0xef, 0x09, 0x12, 0x02, 0x87, + 0x93, 0xe8, 0x40, 0xac, 0xaf, 0x08, 0x12, 0xb6, 0x4f, 0x9e, 0x17, 0xa0, 0xcf, 0xd0, 0xab, 0xbb, + 0x86, 0xde, 0x0e, 0x13, 0x9f, 0xe0, 0x14, 0x80, 0xa3, 0x10, 0x02, 0xe7, 0x21, 0xd5, 0xee, 0x44, + 0xfc, 0xfd, 0xef, 0x8b, 0xe5, 0x21, 0x66, 0x60, 0x0e, 0x86, 0x84, 0x81, 0xd2, 0x0c, 0xbd, 0x0d, + 0x12, 0xff, 0x80, 0x93, 0x18, 0xf4, 0xa1, 0xf1, 0x61, 0x38, 0xd8, 0x76, 0x2a, 0xb8, 0x1d, 0x22, + 0x9f, 0x16, 0xc3, 0xe0, 0x28, 0x5c, 0x94, 0x1b, 0x58, 0x2f, 0x6d, 0xb5, 0x47, 0xe1, 0x33, 0x42, + 0x94, 0x02, 0x87, 0x90, 0x98, 0x81, 0x81, 0x9a, 0x6a, 0xd9, 0x5b, 0x6a, 0xb5, 0xad, 0xe9, 0xf8, + 0x87, 0x9c, 0x46, 0xbf, 0x8b, 0xc4, 0x25, 0x52, 0xd7, 0x3b, 0x21, 0xf3, 0xaa, 0x90, 0x88, 0x0f, + 0x8d, 0x2f, 0x3d, 0xdb, 0xa1, 0x59, 0xb6, 0x4e, 0xa8, 0xfd, 0x23, 0xb1, 0xf4, 0x18, 0xee, 0xa2, + 0x9f, 0xe2, 0x79, 0x48, 0xd9, 0xda, 0x73, 0x6d, 0x91, 0xf9, 0x2d, 0x31, 0xd3, 0x14, 0x81, 0x20, + 0xbf, 0x0d, 0x0e, 0x35, 0xdd, 0x26, 0xda, 0x20, 0xf6, 0xdb, 0x9c, 0xd8, 0xc1, 0x26, 0x5b, 0x05, + 0x37, 0x09, 0x9d, 0x92, 0xfc, 0xc7, 0xc2, 0x24, 0xe0, 0x10, 0xad, 0x15, 0x12, 0x47, 0xd8, 0xea, + 0x66, 0x67, 0x52, 0xfb, 0x1d, 0x21, 0x35, 0x86, 0x1b, 0x90, 0xda, 0x1a, 0x1c, 0xe4, 0x14, 0x3b, + 0x9b, 0xd7, 0xcf, 0x0a, 0xc3, 0xca, 0xb0, 0xd7, 0x83, 0xb3, 0xfb, 0x76, 0xc8, 0xba, 0xe2, 0x14, + 0x0e, 0xab, 0x5d, 0xac, 0xa9, 0x66, 0x1b, 0x94, 0x7f, 0x97, 0x53, 0x16, 0x16, 0xdf, 0xf5, 0x78, + 0xed, 0x45, 0xd5, 0x24, 0xc4, 0x9f, 0x82, 0x8c, 0x20, 0x5e, 0xd7, 0x2d, 0x5c, 0x32, 0x2a, 0xba, + 0xf6, 0x1c, 0x2e, 0xb7, 0x41, 0xfa, 0x73, 0xa1, 0xa9, 0x5a, 0xf7, 0xa1, 0x13, 0xca, 0xf3, 0x90, + 0x76, 0x7d, 0x95, 0xa2, 0x56, 0x33, 0x0d, 0xcb, 0x89, 0xa0, 0xf8, 0x79, 0x31, 0x53, 0x2e, 0xde, + 0x3c, 0x45, 0x9b, 0x2e, 0xc0, 0x20, 0x2d, 0xb6, 0xab, 0x92, 0x5f, 0xe0, 0x84, 0x06, 0x3c, 0x2c, + 0x6e, 0x38, 0x4a, 0x46, 0xcd, 0x54, 0xad, 0x76, 0xec, 0xdf, 0x17, 0x85, 0xe1, 0xe0, 0x28, 0xdc, + 0x70, 0x38, 0xbb, 0x26, 0x26, 0xbb, 0x7d, 0x1b, 0x14, 0xbe, 0x24, 0x0c, 0x87, 0xc0, 0xe1, 0x24, + 0x84, 0xc3, 0xd0, 0x06, 0x89, 0x7f, 0x22, 0x48, 0x08, 0x1c, 0x42, 0xe2, 0x09, 0x6f, 0xa3, 0xb5, + 0x70, 0x45, 0xb3, 0x1d, 0x8b, 0xb9, 0xc9, 0x7b, 0x93, 0xfa, 0xa7, 0xdf, 0x0f, 0x3a, 0x61, 0x8a, + 0x0f, 0x95, 0x58, 0x22, 0x9e, 0x76, 0xa5, 0x51, 0x54, 0x34, 0x63, 0xbf, 0x27, 0x2c, 0x91, 0x0f, + 0x8d, 0xf0, 0xe6, 0xf3, 0x10, 0x89, 0xd8, 0x4b, 0x24, 0x76, 0x68, 0x83, 0xdc, 0x3f, 0x0b, 0x31, + 0xb7, 0x2a, 0x70, 0x09, 0x4d, 0x9f, 0xff, 0x53, 0xd7, 0xb7, 0xf1, 0x6e, 0x5b, 0xda, 0xf9, 0xfb, + 0x21, 0xff, 0x67, 0x9d, 0x61, 0x32, 0x1b, 0x32, 0x14, 0xf2, 0xa7, 0x50, 0xd4, 0xfd, 0xa1, 0xcc, + 0xcf, 0xff, 0x90, 0x8f, 0x37, 0xe8, 0x4e, 0x4d, 0x2f, 0x10, 0x25, 0x0f, 0x3a, 0x3d, 0xd1, 0xc4, + 0xde, 0xf3, 0x43, 0x57, 0xcf, 0x03, 0x3e, 0xcf, 0xf4, 0x45, 0x18, 0x08, 0x38, 0x3c, 0xd1, 0xa4, + 0x7e, 0x81, 0x93, 0xea, 0xf7, 0xfb, 0x3b, 0xd3, 0x67, 0x20, 0x41, 0x9c, 0x97, 0x68, 0xf4, 0xf7, + 0x72, 0x74, 0x0a, 0x3e, 0xfd, 0x08, 0x24, 0x85, 0xd3, 0x12, 0x8d, 0xfa, 0x3e, 0x8e, 0xea, 0xa2, + 0x10, 0x74, 0xe1, 0xb0, 0x44, 0xa3, 0xff, 0xa2, 0x40, 0x17, 0x28, 0x04, 0xbd, 0x7d, 0x11, 0x7e, + 0xf9, 0x97, 0x13, 0x7c, 0xd3, 0x11, 0xb2, 0x3b, 0x0f, 0xbd, 0xdc, 0x53, 0x89, 0xc6, 0xfe, 0x25, + 0xde, 0xb9, 0xc0, 0x98, 0x7e, 0x08, 0xba, 0xdb, 0x14, 0xf8, 0xfb, 0x39, 0x2a, 0x83, 0x9f, 0x9e, + 0x81, 0x3e, 0x9f, 0x77, 0x12, 0x8d, 0xfe, 0x77, 0x39, 0xba, 0x1f, 0x8b, 0xb0, 0xce, 0xbd, 0x93, + 0x68, 0x02, 0x1f, 0x10, 0xac, 0x73, 0x0c, 0x22, 0x36, 0xe1, 0x98, 0x44, 0x63, 0xbf, 0x2c, 0xa4, + 0x2e, 0x50, 0xa6, 0x2f, 0x40, 0xca, 0xdd, 0x6c, 0xa2, 0xf1, 0x3f, 0xc8, 0xf1, 0x3d, 0x1c, 0x22, + 0x01, 0xdf, 0x66, 0x17, 0x4d, 0xe2, 0x43, 0x42, 0x02, 0x3e, 0x2c, 0xb2, 0x8c, 0xc2, 0x0e, 0x4c, + 0x34, 0xa5, 0x5f, 0x11, 0xcb, 0x28, 0xe4, 0xbf, 0x90, 0xd9, 0xa4, 0x36, 0x3f, 0x9a, 0xc4, 0xaf, + 0x8a, 0xd9, 0xa4, 0xf0, 0x84, 0x8d, 0xb0, 0x47, 0x10, 0x4d, 0xe3, 0xd7, 0x05, 0x1b, 0x21, 0x87, + 0x60, 0x7a, 0x05, 0x50, 0xa3, 0x37, 0x10, 0x4d, 0xef, 0xc3, 0x9c, 0xde, 0x70, 0x83, 0x33, 0x30, + 0xfd, 0x24, 0x1c, 0x6c, 0xee, 0x09, 0x44, 0x53, 0xfd, 0x8d, 0x1f, 0x86, 0x62, 0x37, 0xbf, 0x23, + 0x30, 0xbd, 0xe6, 0x6d, 0x29, 0x7e, 0x2f, 0x20, 0x9a, 0xec, 0x47, 0x7e, 0x18, 0x34, 0xdc, 0x7e, + 0x27, 0x60, 0x3a, 0x07, 0xe0, 0x6d, 0xc0, 0xd1, 0xb4, 0x3e, 0xc6, 0x69, 0xf9, 0x90, 0xc8, 0xd2, + 0xe0, 0xfb, 0x6f, 0x34, 0xfe, 0x35, 0xb1, 0x34, 0x38, 0x06, 0x59, 0x1a, 0x62, 0xeb, 0x8d, 0xc6, + 0xfe, 0xb8, 0x58, 0x1a, 0x02, 0x85, 0x68, 0xb6, 0x6f, 0x77, 0x8b, 0xa6, 0xf0, 0x09, 0xa1, 0xd9, + 0x3e, 0xac, 0xe9, 0x25, 0x18, 0x6e, 0xd8, 0x10, 0xa3, 0x49, 0xfd, 0x26, 0x27, 0x95, 0x0e, 0xef, + 0x87, 0xfe, 0xcd, 0x8b, 0x6f, 0x86, 0xd1, 0xd4, 0x3e, 0x19, 0xda, 0xbc, 0xf8, 0x5e, 0x38, 0x7d, + 0x1e, 0x92, 0x7a, 0xbd, 0x5a, 0x25, 0x8b, 0x07, 0xed, 0x7d, 0xe7, 0x2f, 0xf3, 0x9f, 0x7f, 0xcc, + 0xa5, 0x23, 0x10, 0xa6, 0xcf, 0x40, 0x37, 0xae, 0x6d, 0xe0, 0x72, 0x14, 0xe6, 0xf7, 0x7e, 0x2c, + 0x0c, 0x26, 0x81, 0x9e, 0xbe, 0x00, 0xc0, 0x52, 0x23, 0xf4, 0x78, 0x30, 0x02, 0xf7, 0xbf, 0xfc, + 0x98, 0xdf, 0xc6, 0xf1, 0x50, 0x3c, 0x02, 0xec, 0x6e, 0xcf, 0xde, 0x04, 0xbe, 0x1f, 0x24, 0x40, + 0x67, 0xe4, 0x61, 0xe8, 0x7d, 0xc6, 0x36, 0x74, 0x47, 0xad, 0x44, 0x61, 0xff, 0x57, 0x8e, 0x2d, + 0xe0, 0x89, 0xc0, 0x6a, 0x86, 0x85, 0x1d, 0xb5, 0x62, 0x47, 0xe1, 0xfe, 0x37, 0x8e, 0xeb, 0x22, + 0x10, 0xe4, 0x92, 0x6a, 0x3b, 0xed, 0x8c, 0xfb, 0xaf, 0x04, 0xb2, 0x40, 0x20, 0x4c, 0x93, 0xff, + 0xb7, 0xf1, 0x6e, 0x14, 0xee, 0x0f, 0x04, 0xd3, 0x1c, 0x7e, 0xfa, 0x11, 0x48, 0x91, 0x7f, 0xd9, + 0x15, 0xbb, 0x08, 0xe4, 0xff, 0xce, 0x91, 0x3d, 0x0c, 0xd2, 0xb3, 0xed, 0x94, 0x1d, 0x2d, 0x5a, + 0xd8, 0x6f, 0xf0, 0x99, 0x16, 0xf0, 0xd3, 0x39, 0xe8, 0xb3, 0x9d, 0x72, 0xb9, 0xce, 0xfd, 0xd3, + 0x08, 0xf4, 0xff, 0xf1, 0x63, 0x37, 0x65, 0xe1, 0xe2, 0x90, 0xd9, 0xbe, 0xba, 0xed, 0x98, 0x06, + 0x3d, 0x02, 0x89, 0xa2, 0xf0, 0x43, 0x4e, 0xc1, 0x87, 0x32, 0x3d, 0x03, 0xfd, 0x64, 0x2c, 0x16, + 0x36, 0x31, 0x3d, 0xaf, 0x8a, 0x20, 0xf1, 0x23, 0x2e, 0x80, 0x00, 0x52, 0xfe, 0x1d, 0x5f, 0x79, + 0x6d, 0x4c, 0xfa, 0xda, 0x6b, 0x63, 0xd2, 0xb7, 0x5f, 0x1b, 0x93, 0x5e, 0xfe, 0xce, 0x58, 0xd7, + 0xd7, 0xbe, 0x33, 0xd6, 0xf5, 0xcd, 0xef, 0x8c, 0x75, 0x35, 0x4f, 0x1b, 0xc3, 0x9c, 0x31, 0x67, + 0xb0, 0x84, 0xf1, 0xd3, 0x72, 0x20, 0x5d, 0x5c, 0x31, 0xbc, 0x6c, 0xad, 0x1b, 0xe4, 0xc0, 0x8f, + 0x24, 0x12, 0x30, 0x07, 0x73, 0xb9, 0xaa, 0xbe, 0xdb, 0xe2, 0x0d, 0x4e, 0xb6, 0x69, 0x62, 0x58, + 0x7e, 0x0b, 0xc4, 0x73, 0xfa, 0x2e, 0x3a, 0xc4, 0x6c, 0x5e, 0xb1, 0x6e, 0x55, 0xf9, 0xd5, 0xaf, + 0x5e, 0x52, 0x5e, 0xb7, 0xaa, 0x68, 0xd4, 0xbb, 0x9f, 0x29, 0x9d, 0xe8, 0xe7, 0x97, 0x2e, 0xa7, + 0x13, 0x3f, 0xf8, 0xc4, 0x78, 0x57, 0x7e, 0x3b, 0x3c, 0xc2, 0x2f, 0x47, 0x8e, 0x32, 0x99, 0xd3, + 0x77, 0xe9, 0x20, 0x57, 0xa4, 0xa7, 0xbb, 0x49, 0x1f, 0xb6, 0x48, 0x6c, 0x8f, 0x85, 0x13, 0xdb, + 0x4f, 0xe2, 0x6a, 0xf5, 0x71, 0xdd, 0xb8, 0xaa, 0xaf, 0x11, 0xb0, 0x8d, 0x1e, 0x4a, 0xe3, 0x01, + 0x78, 0x39, 0x06, 0xe3, 0xe1, 0x71, 0x13, 0xc5, 0xb1, 0x1d, 0xb5, 0x66, 0xb6, 0x7a, 0x81, 0x74, + 0x1e, 0x52, 0x6b, 0x02, 0x06, 0x65, 0xa0, 0xd7, 0xc6, 0x25, 0x43, 0x2f, 0xdb, 0x74, 0xb0, 0x71, + 0x45, 0x14, 0xc9, 0x60, 0x75, 0x55, 0x37, 0x6c, 0x7e, 0x41, 0x92, 0x15, 0xf2, 0xbf, 0x26, 0x75, + 0x36, 0x93, 0x83, 0x6e, 0x57, 0x62, 0xa4, 0xf7, 0xec, 0x95, 0xfe, 0xa7, 0x52, 0xf0, 0x86, 0xe0, + 0xcb, 0xf5, 0xb7, 0x2b, 0x92, 0x77, 0xc7, 0xe1, 0x50, 0xc9, 0xb0, 0x6b, 0x86, 0x5d, 0x64, 0x33, + 0xcc, 0x0a, 0x5c, 0x18, 0xfd, 0xfe, 0xa6, 0x36, 0xf2, 0xff, 0x97, 0x60, 0x90, 0xae, 0x02, 0x9a, + 0xf9, 0xa4, 0x86, 0x27, 0x72, 0xaf, 0xf8, 0xe3, 0x7f, 0xd7, 0x4d, 0xb5, 0x66, 0xc0, 0x45, 0xa4, + 0x57, 0x3b, 0xd6, 0x60, 0x54, 0xab, 0x99, 0x55, 0x4c, 0xcf, 0x80, 0x8a, 0x6e, 0x5b, 0x34, 0xbd, + 0xaf, 0x72, 0x7a, 0x23, 0x1e, 0xfa, 0xbc, 0xc0, 0x9e, 0x5e, 0x80, 0x61, 0xb5, 0x54, 0xc2, 0x66, + 0x80, 0x64, 0xc4, 0x0a, 0x15, 0x0c, 0xa6, 0x39, 0xa6, 0x4b, 0x2d, 0x7f, 0xa1, 0xd5, 0xdc, 0x3e, + 0x7d, 0x97, 0x6f, 0xd2, 0x2c, 0x5c, 0xc1, 0xfa, 0x29, 0x1d, 0x3b, 0x57, 0x0d, 0x6b, 0x9b, 0x8b, + 0xf7, 0x14, 0xeb, 0x4a, 0x4c, 0xc2, 0x2f, 0xc4, 0x61, 0x8c, 0x35, 0x4c, 0x6d, 0xa8, 0x36, 0x9e, + 0xba, 0x72, 0xff, 0x06, 0x76, 0xd4, 0xfb, 0xa7, 0x4a, 0x86, 0xa6, 0xf3, 0x99, 0x18, 0xe1, 0xf3, + 0x42, 0xda, 0x27, 0x79, 0x7b, 0x8b, 0x85, 0x39, 0x07, 0x89, 0x19, 0x43, 0xd3, 0x89, 0x46, 0x96, + 0xb1, 0x6e, 0xd4, 0xf8, 0xb2, 0x64, 0x05, 0x74, 0x07, 0xf4, 0xa8, 0x35, 0xa3, 0xae, 0x3b, 0xec, + 0xf8, 0x2a, 0xdf, 0xf7, 0x95, 0xeb, 0xe3, 0x5d, 0x7f, 0x76, 0x7d, 0x3c, 0x3e, 0xaf, 0x3b, 0x0a, + 0x6f, 0x9a, 0x4e, 0xbc, 0xfe, 0xca, 0xb8, 0x24, 0x3f, 0x06, 0xbd, 0xb3, 0xb8, 0xb4, 0x1f, 0x5a, + 0xb3, 0xb8, 0x14, 0xa2, 0x75, 0x37, 0x24, 0xe7, 0x75, 0x87, 0xdd, 0x99, 0x3d, 0x0a, 0x71, 0x4d, + 0x67, 0xb7, 0xb0, 0x42, 0xfd, 0x93, 0x7a, 0x02, 0x3a, 0x8b, 0x4b, 0x2e, 0x68, 0x19, 0x97, 0xc2, + 0xa0, 0x84, 0x3c, 0xa9, 0xcf, 0xcf, 0x7e, 0xf3, 0x2f, 0xc6, 0xba, 0x5e, 0x78, 0x6d, 0xac, 0xab, + 0xe5, 0x4c, 0xf8, 0xcd, 0x21, 0x17, 0x31, 0x9f, 0x02, 0xbb, 0xbc, 0x3d, 0xe5, 0x04, 0xd6, 0xc2, + 0xdf, 0x89, 0xc1, 0x58, 0x83, 0x8a, 0xf3, 0x8d, 0xa1, 0x95, 0x75, 0x98, 0x86, 0xe4, 0xac, 0xd8, + 0x6f, 0x3a, 0x35, 0x0e, 0xbf, 0xda, 0xa1, 0x71, 0x18, 0x10, 0x3d, 0x09, 0xdb, 0x70, 0x32, 0xda, + 0x36, 0x08, 0xfe, 0xf7, 0x61, 0x1a, 0x5e, 0x4d, 0xc0, 0x51, 0xfa, 0x28, 0xc4, 0xaa, 0x69, 0xba, + 0x33, 0x55, 0xb2, 0x76, 0x4d, 0x87, 0x6e, 0x27, 0xc6, 0x26, 0x97, 0xc6, 0xb0, 0xd7, 0x3c, 0xc9, + 0x9a, 0x5b, 0xa8, 0xe4, 0x26, 0x74, 0xaf, 0x10, 0x3c, 0x22, 0x08, 0xc7, 0x70, 0xd4, 0x2a, 0x17, + 0x10, 0x2b, 0x90, 0x5a, 0xf6, 0x90, 0x24, 0xc6, 0x6a, 0x35, 0xf1, 0x86, 0xa4, 0x8a, 0xd5, 0x4d, + 0x76, 0x71, 0x37, 0x4e, 0xb7, 0x90, 0x24, 0xa9, 0xa0, 0x77, 0x74, 0x47, 0xa1, 0x5b, 0xad, 0xb3, + 0x23, 0xe7, 0x38, 0xd9, 0x5b, 0x68, 0x41, 0x7e, 0x1c, 0x7a, 0xf9, 0x31, 0x17, 0x4a, 0x43, 0x7c, + 0x1b, 0xef, 0xd2, 0x7e, 0xfa, 0x15, 0xf2, 0x2f, 0x9a, 0x84, 0x6e, 0xca, 0x3c, 0x7f, 0x91, 0x90, + 0x99, 0x6c, 0xe0, 0x7e, 0x92, 0x32, 0xa9, 0x30, 0x30, 0xf9, 0x31, 0x48, 0xce, 0x1a, 0x35, 0x4d, + 0x37, 0x82, 0xd4, 0x52, 0x8c, 0x1a, 0xe5, 0xd9, 0xac, 0x73, 0xd5, 0x57, 0x58, 0x01, 0x1d, 0x84, + 0x1e, 0x76, 0x91, 0x9b, 0x1f, 0x9b, 0xf3, 0x92, 0x3c, 0x03, 0xbd, 0x94, 0xf6, 0xb2, 0x89, 0x10, + 0x7f, 0xd9, 0xc3, 0x6f, 0x8c, 0x53, 0x2b, 0xc9, 0xc9, 0xc7, 0x3c, 0x66, 0x11, 0x24, 0xca, 0xaa, + 0xa3, 0xf2, 0x71, 0xd3, 0xff, 0xe5, 0x47, 0x21, 0xc9, 0x89, 0xd8, 0xe8, 0x34, 0xc4, 0x0d, 0xd3, + 0xe6, 0x07, 0xdf, 0xd9, 0x56, 0x43, 0x59, 0x36, 0xf3, 0x09, 0xb2, 0x68, 0x14, 0x02, 0x9c, 0x57, + 0x5a, 0xae, 0x92, 0x73, 0x3e, 0x45, 0xf2, 0x4d, 0xb9, 0xef, 0x5f, 0x36, 0xa5, 0x0d, 0xea, 0xe0, + 0x2a, 0xcb, 0x27, 0x62, 0x30, 0xe6, 0x6b, 0xbd, 0x82, 0x2d, 0x12, 0xeb, 0xb1, 0x05, 0xc6, 0xb5, + 0x05, 0xf9, 0x98, 0xe4, 0xed, 0x2d, 0xd4, 0xe5, 0x11, 0x88, 0xe7, 0x4c, 0x13, 0x65, 0x21, 0xc9, + 0x0e, 0xb8, 0x0d, 0xa6, 0x2f, 0x09, 0xc5, 0x2d, 0x93, 0x36, 0xdb, 0xd8, 0x74, 0xae, 0xaa, 0x96, + 0xfb, 0x84, 0x49, 0x94, 0xe5, 0x87, 0x21, 0x35, 0x63, 0xe8, 0x36, 0xd6, 0xed, 0x3a, 0x5d, 0x7a, + 0x1b, 0x55, 0xa3, 0xb4, 0xcd, 0x29, 0xb0, 0x02, 0x11, 0xb8, 0x6a, 0x9a, 0x14, 0x33, 0xa1, 0x90, + 0x7f, 0x99, 0x99, 0xca, 0xaf, 0xb6, 0x14, 0xd1, 0xc3, 0x9d, 0x8b, 0x88, 0x0f, 0xd2, 0x95, 0xd1, + 0xff, 0x91, 0xe0, 0x48, 0xe3, 0x82, 0xda, 0xc6, 0xbb, 0x76, 0xa7, 0xeb, 0xe9, 0x29, 0x48, 0xad, + 0xd0, 0x77, 0xc4, 0x8f, 0xe3, 0x5d, 0x94, 0x85, 0x5e, 0x5c, 0x3e, 0x7d, 0xe6, 0xcc, 0xfd, 0x0f, + 0x33, 0x6d, 0xbf, 0xd4, 0xa5, 0x88, 0x0a, 0x34, 0x06, 0x29, 0x1b, 0x97, 0xcc, 0xd3, 0x67, 0xce, + 0x6e, 0xdf, 0xcf, 0xd4, 0xeb, 0x52, 0x97, 0xe2, 0x55, 0x4d, 0x27, 0xc9, 0xa8, 0x5f, 0xff, 0xc4, + 0xb8, 0x94, 0xef, 0x86, 0xb8, 0x5d, 0xaf, 0xdd, 0x52, 0x1d, 0xf9, 0x48, 0x37, 0x4c, 0xf8, 0x31, + 0xa9, 0x81, 0xba, 0xa2, 0x56, 0xb5, 0xb2, 0xea, 0xbd, 0x00, 0x4f, 0xfb, 0x64, 0x40, 0x21, 0x9a, + 0x8b, 0x20, 0xbb, 0xa7, 0x24, 0xe5, 0xcf, 0x49, 0xd0, 0x7f, 0x59, 0x50, 0x5e, 0xc5, 0x0e, 0x3a, + 0x0f, 0xe0, 0xf6, 0x24, 0x96, 0xcd, 0xe1, 0xc9, 0x70, 0x5f, 0x93, 0x2e, 0x8e, 0xe2, 0x03, 0x47, + 0x0f, 0x51, 0x45, 0x34, 0x0d, 0x9b, 0xbf, 0x7f, 0x89, 0x40, 0x75, 0x81, 0xd1, 0xbd, 0x80, 0xa8, + 0x85, 0x2b, 0x5e, 0x31, 0x1c, 0x4d, 0xaf, 0x14, 0x4d, 0xe3, 0x2a, 0x7f, 0x2c, 0x18, 0x57, 0xd2, + 0xb4, 0xe5, 0x32, 0x6d, 0x58, 0x21, 0xf5, 0x84, 0xe9, 0x94, 0x4b, 0x85, 0xec, 0x26, 0x6a, 0xb9, + 0x6c, 0x61, 0xdb, 0xe6, 0x46, 0x4c, 0x14, 0xd1, 0x79, 0xe8, 0x35, 0xeb, 0x1b, 0x45, 0x61, 0x31, + 0xfa, 0x4e, 0x1f, 0x69, 0xb6, 0xfe, 0x85, 0x7e, 0x70, 0x0b, 0xd0, 0x63, 0xd6, 0x37, 0x88, 0xb6, + 0xdc, 0x0e, 0xfd, 0x4d, 0x98, 0xe9, 0xbb, 0xe2, 0xf1, 0x41, 0x9f, 0xaf, 0xf3, 0x11, 0x14, 0x4d, + 0x4b, 0x33, 0x2c, 0xcd, 0xd9, 0xa5, 0xb7, 0x57, 0xe2, 0x4a, 0x5a, 0x34, 0xac, 0xf0, 0x7a, 0x79, + 0x1b, 0x86, 0x56, 0xa9, 0xab, 0xe5, 0x71, 0x7e, 0xc6, 0xe3, 0x4f, 0x8a, 0xe6, 0xaf, 0x25, 0x67, + 0xb1, 0x06, 0xce, 0xf2, 0x4f, 0xb4, 0xd4, 0xce, 0x87, 0x3a, 0xd7, 0xce, 0xe0, 0xe6, 0xff, 0x57, + 0x87, 0x02, 0x8b, 0x93, 0x7b, 0xd6, 0x3e, 0xf3, 0xd5, 0xae, 0x62, 0x46, 0x45, 0x18, 0xd9, 0xbd, + 0x37, 0xd5, 0x6c, 0x84, 0x19, 0xcd, 0x46, 0x2e, 0x21, 0xf9, 0x61, 0x18, 0x58, 0x51, 0x2d, 0x67, + 0x15, 0x3b, 0x97, 0xb0, 0x5a, 0xc6, 0x56, 0x70, 0xd7, 0x1d, 0x10, 0xbb, 0x2e, 0x82, 0x04, 0xdd, + 0x5a, 0xd9, 0xae, 0x43, 0xff, 0x97, 0xb7, 0x20, 0x41, 0x6f, 0xb0, 0xb9, 0x3b, 0x32, 0xc7, 0x60, + 0x3b, 0x32, 0xb1, 0xa5, 0xbb, 0x0e, 0xb6, 0x45, 0x40, 0x47, 0x0b, 0xe8, 0x41, 0xb1, 0xaf, 0xc6, + 0xf7, 0xde, 0x57, 0xb9, 0x22, 0xf2, 0xdd, 0xb5, 0x0a, 0xbd, 0x79, 0x62, 0x8a, 0xe7, 0x67, 0x5d, + 0x46, 0x24, 0x8f, 0x11, 0xb4, 0x08, 0x43, 0xa6, 0x6a, 0x39, 0xf4, 0xea, 0xfe, 0x16, 0x1d, 0x05, + 0xd7, 0xf5, 0xf1, 0xc6, 0x95, 0x17, 0x18, 0x2c, 0xef, 0x65, 0xc0, 0xf4, 0x57, 0xca, 0x7f, 0x99, + 0x80, 0x1e, 0x2e, 0x8c, 0x47, 0xa0, 0x97, 0x8b, 0x95, 0x6b, 0xe7, 0xd1, 0xc9, 0xc6, 0x8d, 0x69, + 0xd2, 0xdd, 0x40, 0x38, 0x3d, 0x81, 0x83, 0x8e, 0x41, 0xb2, 0xb4, 0xa5, 0x6a, 0x7a, 0x51, 0x2b, + 0x0b, 0xaf, 0xf7, 0xb5, 0xeb, 0xe3, 0xbd, 0x33, 0xa4, 0x6e, 0x7e, 0x56, 0xe9, 0xa5, 0x8d, 0xf3, + 0x65, 0xe2, 0x09, 0x6c, 0x61, 0xad, 0xb2, 0xe5, 0xf0, 0x15, 0xc6, 0x4b, 0xe8, 0x1c, 0x24, 0x88, + 0x42, 0xf0, 0x97, 0x5d, 0xd9, 0x86, 0xd8, 0xc3, 0x0d, 0x00, 0xf3, 0x49, 0xd2, 0xf1, 0xcb, 0xdf, + 0x1a, 0x97, 0x14, 0x8a, 0x81, 0x66, 0x60, 0xa0, 0xaa, 0xda, 0x4e, 0x91, 0xee, 0x60, 0xa4, 0xfb, + 0x6e, 0x4a, 0xe2, 0x50, 0xa3, 0x40, 0xb8, 0x60, 0x39, 0xeb, 0x7d, 0x04, 0x8b, 0x55, 0x95, 0xd1, + 0x09, 0x48, 0x53, 0x22, 0x25, 0xa3, 0x56, 0xd3, 0x1c, 0xe6, 0x5b, 0xf5, 0x50, 0xb9, 0x0f, 0x92, + 0xfa, 0x19, 0x5a, 0x4d, 0x3d, 0xac, 0xc3, 0x90, 0xa2, 0x4f, 0x49, 0x28, 0x08, 0xbb, 0x36, 0x99, + 0x24, 0x15, 0xb4, 0xf1, 0x38, 0x0c, 0x79, 0xf6, 0x91, 0x81, 0x24, 0x19, 0x15, 0xaf, 0x9a, 0x02, + 0xde, 0x07, 0xa3, 0x3a, 0xde, 0xa1, 0x17, 0x39, 0x03, 0xd0, 0x29, 0x0a, 0x8d, 0x48, 0xdb, 0xe5, + 0x20, 0xc6, 0x5d, 0x30, 0x58, 0x12, 0xc2, 0x67, 0xb0, 0x40, 0x61, 0x07, 0xdc, 0x5a, 0x0a, 0x76, + 0x08, 0x92, 0xaa, 0x69, 0x32, 0x80, 0x3e, 0x6e, 0x1f, 0x4d, 0x93, 0x36, 0x9d, 0x84, 0x61, 0x3a, + 0x46, 0x0b, 0xdb, 0xf5, 0xaa, 0xc3, 0x89, 0xf4, 0x53, 0x98, 0x21, 0xd2, 0xa0, 0xb0, 0x7a, 0x0a, + 0x7b, 0x07, 0x0c, 0xe0, 0x2b, 0x5a, 0x19, 0xeb, 0x25, 0xcc, 0xe0, 0x06, 0x28, 0x5c, 0xbf, 0xa8, + 0xa4, 0x40, 0x77, 0x83, 0x6b, 0xf7, 0x8a, 0xc2, 0x26, 0x0f, 0x32, 0x7a, 0xa2, 0x3e, 0xc7, 0xaa, + 0xe5, 0x0c, 0x24, 0x66, 0x55, 0x47, 0x25, 0x0e, 0x86, 0xb3, 0xc3, 0x36, 0x9a, 0x7e, 0x85, 0xfc, + 0x2b, 0xbf, 0x1e, 0x83, 0xc4, 0x65, 0xc3, 0xc1, 0xe8, 0x01, 0x9f, 0x03, 0x38, 0xd8, 0x4c, 0x9f, + 0x57, 0xb5, 0x8a, 0x8e, 0xcb, 0x8b, 0x76, 0xc5, 0xf7, 0x9e, 0xdb, 0x53, 0xa7, 0x58, 0x40, 0x9d, + 0x46, 0xa1, 0xdb, 0x32, 0xea, 0x7a, 0x59, 0xdc, 0x38, 0xa4, 0x05, 0x54, 0x80, 0xa4, 0xab, 0x25, + 0x89, 0x28, 0x2d, 0x19, 0x22, 0x5a, 0x42, 0x74, 0x98, 0x57, 0x28, 0xbd, 0x1b, 0x5c, 0x59, 0xf2, + 0x90, 0x72, 0x8d, 0x17, 0xd7, 0xb6, 0xf6, 0x14, 0xd6, 0x43, 0x23, 0x9b, 0x89, 0x3b, 0xf7, 0xae, + 0xf0, 0x98, 0xc6, 0xa5, 0xdd, 0x06, 0x2e, 0xbd, 0x80, 0x5a, 0xf1, 0xb7, 0xe5, 0xbd, 0x74, 0x5c, + 0x9e, 0x5a, 0xb1, 0xf7, 0xe5, 0x47, 0x20, 0x65, 0x6b, 0x15, 0x5d, 0x75, 0xea, 0x16, 0xe6, 0x9a, + 0xe7, 0x55, 0xc8, 0x5f, 0x96, 0xa0, 0x87, 0x69, 0xb2, 0x4f, 0x6e, 0x52, 0x73, 0xb9, 0xc5, 0x5a, + 0xc9, 0x2d, 0xbe, 0x7f, 0xb9, 0xe5, 0x00, 0x5c, 0x66, 0x6c, 0xfe, 0x36, 0xb8, 0x89, 0xc7, 0xc0, + 0x58, 0x5c, 0xd5, 0x2a, 0x7c, 0xa1, 0xfa, 0x90, 0xe4, 0x3f, 0x97, 0x88, 0x13, 0xcb, 0xdb, 0x51, + 0x0e, 0x06, 0x04, 0x5f, 0xc5, 0xcd, 0xaa, 0x5a, 0xe1, 0xba, 0x73, 0xb4, 0x25, 0x73, 0x17, 0xab, + 0x6a, 0x45, 0xe9, 0xe3, 0xfc, 0x90, 0x42, 0xf3, 0x79, 0x88, 0xb5, 0x98, 0x87, 0xc0, 0xc4, 0xc7, + 0xf7, 0x37, 0xf1, 0x81, 0x29, 0x4a, 0x84, 0xa7, 0xe8, 0xf3, 0x31, 0x1a, 0xcc, 0x98, 0x86, 0xad, + 0x56, 0xdf, 0x8c, 0x15, 0x71, 0x18, 0x52, 0xa6, 0x51, 0x2d, 0xb2, 0x16, 0x76, 0x13, 0x37, 0x69, + 0x1a, 0x55, 0xa5, 0x61, 0xda, 0xbb, 0x6f, 0xd2, 0x72, 0xe9, 0xb9, 0x09, 0x52, 0xeb, 0x0d, 0x4b, + 0xcd, 0x82, 0x7e, 0x26, 0x0a, 0xbe, 0x97, 0xdd, 0x47, 0x64, 0x40, 0x37, 0x47, 0xa9, 0x71, 0xef, + 0x65, 0x6c, 0x33, 0x48, 0x85, 0xc3, 0x11, 0x0c, 0x66, 0xfa, 0x9b, 0x45, 0xc1, 0x7e, 0xb5, 0x54, + 0x38, 0x9c, 0xfc, 0x6b, 0x12, 0xc0, 0x02, 0x91, 0x2c, 0x1d, 0x2f, 0xd9, 0x85, 0x6c, 0xca, 0x42, + 0x31, 0xd0, 0xf3, 0x58, 0xab, 0x49, 0xe3, 0xfd, 0xf7, 0xdb, 0x7e, 0xbe, 0x67, 0x60, 0xc0, 0x53, + 0x46, 0x1b, 0x0b, 0x66, 0xc6, 0xf6, 0xf0, 0xaa, 0x57, 0xb1, 0xa3, 0xf4, 0x5f, 0xf1, 0x95, 0xe4, + 0x3f, 0x94, 0x20, 0x45, 0x79, 0x5a, 0xc4, 0x8e, 0x1a, 0x98, 0x43, 0x69, 0xff, 0x73, 0x78, 0x14, + 0x80, 0x91, 0xb1, 0xb5, 0xe7, 0x30, 0xd7, 0xac, 0x14, 0xad, 0x59, 0xd5, 0x9e, 0xc3, 0xe8, 0xac, + 0x2b, 0xf0, 0xf8, 0xde, 0x02, 0x17, 0x5e, 0x37, 0x17, 0xfb, 0x6d, 0xd0, 0x4b, 0x3f, 0x91, 0xb3, + 0x63, 0x73, 0x47, 0xba, 0x47, 0xaf, 0xd7, 0xd6, 0x76, 0x6c, 0xf9, 0x19, 0xe8, 0x5d, 0xdb, 0x61, + 0xb9, 0x91, 0xc3, 0x90, 0xb2, 0x0c, 0x83, 0xef, 0xc9, 0xcc, 0x17, 0x4a, 0x92, 0x0a, 0xba, 0x05, + 0x89, 0x7c, 0x40, 0xcc, 0xcb, 0x07, 0x78, 0x09, 0x8d, 0x78, 0x5b, 0x09, 0x8d, 0x93, 0xdf, 0x90, + 0xa0, 0xcf, 0x67, 0x1f, 0xd0, 0xfd, 0x70, 0x20, 0xbf, 0xb0, 0x3c, 0xf3, 0x78, 0x71, 0x7e, 0xb6, + 0x78, 0x71, 0x21, 0x37, 0xe7, 0xbd, 0x35, 0xc9, 0x1e, 0x7c, 0xe9, 0xda, 0x04, 0xf2, 0xc1, 0xae, + 0xeb, 0xdb, 0xba, 0x71, 0x55, 0x47, 0x53, 0x30, 0x1a, 0x44, 0xc9, 0xe5, 0x57, 0x0b, 0x4b, 0x6b, + 0x69, 0x29, 0x7b, 0xe0, 0xa5, 0x6b, 0x13, 0xc3, 0x3e, 0x8c, 0xdc, 0x86, 0x8d, 0x75, 0xa7, 0x11, + 0x61, 0x66, 0x79, 0x71, 0x71, 0x7e, 0x2d, 0x1d, 0x6b, 0x40, 0xe0, 0x06, 0xfb, 0x6e, 0x18, 0x0e, + 0x22, 0x2c, 0xcd, 0x2f, 0xa4, 0xe3, 0x59, 0xf4, 0xd2, 0xb5, 0x89, 0x41, 0x1f, 0xf4, 0x92, 0x56, + 0xcd, 0x26, 0x5f, 0xfc, 0xe4, 0x58, 0xd7, 0x67, 0x3e, 0x35, 0x26, 0x91, 0x91, 0x0d, 0x04, 0x6c, + 0x04, 0xba, 0x17, 0x6e, 0x5b, 0x9d, 0x9f, 0x5b, 0x2a, 0xcc, 0x16, 0x17, 0x57, 0xe7, 0x8a, 0xec, + 0x23, 0x1b, 0xee, 0xe8, 0x86, 0x5e, 0xba, 0x36, 0xd1, 0xc7, 0x87, 0xd4, 0x0a, 0x7a, 0x45, 0x29, + 0x5c, 0x5e, 0x5e, 0x2b, 0xa4, 0x25, 0x06, 0xbd, 0x62, 0xe1, 0x2b, 0x86, 0xc3, 0xbe, 0xa1, 0x75, + 0x1f, 0x1c, 0x6a, 0x02, 0xed, 0x0e, 0x6c, 0xf8, 0xa5, 0x6b, 0x13, 0x03, 0x2b, 0x16, 0x66, 0xeb, + 0x87, 0x62, 0x4c, 0x42, 0xa6, 0x11, 0x63, 0x79, 0x65, 0x79, 0x35, 0xb7, 0x90, 0x9e, 0xc8, 0xa6, + 0x5f, 0xba, 0x36, 0xd1, 0x2f, 0x8c, 0x21, 0x81, 0xf7, 0x46, 0x76, 0x2b, 0x23, 0x9e, 0xff, 0x7d, + 0x3f, 0x1c, 0xb5, 0x1d, 0x75, 0x5b, 0xd3, 0x2b, 0x6e, 0xc6, 0x99, 0x97, 0x79, 0xc8, 0x73, 0xb4, + 0xaa, 0x3d, 0x5b, 0xd7, 0xca, 0xa2, 0x52, 0xfc, 0xdd, 0x33, 0xfd, 0x9c, 0x6d, 0x7d, 0xb2, 0x94, + 0x8d, 0xc8, 0xae, 0x46, 0x87, 0x4e, 0xad, 0x8f, 0x2a, 0xb2, 0x11, 0x09, 0xf4, 0xec, 0x9e, 0xc1, + 0x9d, 0xfc, 0xb2, 0x04, 0x83, 0x97, 0x34, 0xdb, 0x31, 0x2c, 0xad, 0xa4, 0x56, 0xe9, 0x0b, 0x93, + 0xb3, 0xed, 0xda, 0xd6, 0xd0, 0x52, 0xbf, 0x08, 0x3d, 0x57, 0xd4, 0x2a, 0x33, 0x6a, 0xec, 0x11, + 0xcf, 0x9e, 0x52, 0xf4, 0x2c, 0x9c, 0xa0, 0xc3, 0xb0, 0xe5, 0xdf, 0x89, 0xc1, 0x10, 0x5d, 0x13, + 0x36, 0xfb, 0x12, 0x12, 0x09, 0xb5, 0xf2, 0x90, 0xb0, 0x54, 0x87, 0xe7, 0x0e, 0xf3, 0x93, 0x3c, + 0x1f, 0x7e, 0x2c, 0x3a, 0xc7, 0x3d, 0x39, 0x8b, 0x4b, 0x0a, 0xc5, 0x45, 0x7f, 0x0b, 0x92, 0x35, + 0x75, 0xa7, 0x48, 0xe9, 0xb0, 0x00, 0x26, 0xd7, 0x19, 0x9d, 0x37, 0xae, 0x8f, 0x0f, 0xed, 0xaa, + 0xb5, 0xea, 0xb4, 0x2c, 0xe8, 0xc8, 0x4a, 0x6f, 0x4d, 0xdd, 0x21, 0x2c, 0x22, 0x13, 0x86, 0x48, + 0x6d, 0x69, 0x4b, 0xd5, 0x2b, 0x98, 0x75, 0x42, 0x33, 0xa1, 0xf9, 0x4b, 0x1d, 0x77, 0x72, 0xd0, + 0xeb, 0xc4, 0x47, 0x4e, 0x56, 0x06, 0x6a, 0xea, 0xce, 0x0c, 0xad, 0x20, 0x3d, 0x4e, 0x27, 0x3f, + 0xfc, 0xca, 0x78, 0x17, 0x3d, 0x63, 0xf8, 0xa6, 0x04, 0xe0, 0x49, 0x0c, 0x95, 0x20, 0x5d, 0x72, + 0x4b, 0x14, 0xd7, 0xe6, 0x53, 0x39, 0x19, 0x31, 0x25, 0x21, 0xb1, 0xb3, 0x9d, 0xfa, 0x6b, 0xd7, + 0xc7, 0x25, 0x65, 0xa8, 0x14, 0x9a, 0x91, 0xb7, 0x43, 0x5f, 0xdd, 0x2c, 0xab, 0x0e, 0x2e, 0xd2, + 0xa8, 0x2e, 0x16, 0xb9, 0xeb, 0x8f, 0x11, 0x5a, 0x6f, 0x5c, 0x1f, 0x47, 0x6c, 0x74, 0x3e, 0x64, + 0x99, 0xfa, 0x02, 0xc0, 0x6a, 0x08, 0x82, 0x6f, 0x68, 0x7f, 0x2c, 0x41, 0xdf, 0xac, 0xef, 0xde, + 0x57, 0x06, 0x7a, 0x6b, 0x86, 0xae, 0x6d, 0x73, 0xed, 0x4c, 0x29, 0xa2, 0x88, 0xb2, 0x90, 0x64, + 0x4f, 0xf0, 0x9c, 0x5d, 0x91, 0x18, 0x15, 0x65, 0x82, 0x75, 0x15, 0x6f, 0xd8, 0x9a, 0x98, 0x14, + 0x45, 0x14, 0xd1, 0x45, 0x48, 0xdb, 0xb8, 0x54, 0xb7, 0x34, 0x67, 0xb7, 0x58, 0x32, 0x74, 0x47, + 0x2d, 0x39, 0xec, 0x31, 0x57, 0xfe, 0xf0, 0x1b, 0xd7, 0xc7, 0x6f, 0x63, 0xbc, 0x86, 0x21, 0x64, + 0x65, 0x48, 0x54, 0xcd, 0xb0, 0x1a, 0xd2, 0x43, 0x19, 0x3b, 0xaa, 0x56, 0xb5, 0x33, 0xec, 0xd4, + 0x4c, 0x14, 0xfd, 0x63, 0x49, 0xfa, 0xd3, 0x5c, 0x17, 0x21, 0x6d, 0x98, 0xd8, 0x0a, 0xb8, 0xa5, + 0x52, 0xb8, 0xe7, 0x30, 0x84, 0xac, 0x0c, 0x89, 0x2a, 0xe1, 0xb2, 0x3a, 0x64, 0xb6, 0x45, 0xd8, + 0x68, 0xd6, 0x37, 0xbc, 0xec, 0xd8, 0x68, 0xc3, 0x6c, 0xe4, 0xf4, 0xdd, 0xfc, 0x03, 0x1e, 0xf5, + 0x30, 0x9e, 0xfc, 0xd5, 0x2f, 0x9c, 0x1a, 0xe5, 0xc6, 0xc5, 0xcb, 0x56, 0x3d, 0x8e, 0x77, 0xc9, + 0xf4, 0x73, 0xd0, 0x15, 0x0a, 0x49, 0x9c, 0xd0, 0x67, 0x54, 0xad, 0x2a, 0x1e, 0x25, 0x2b, 0xbc, + 0x84, 0x72, 0xd0, 0x63, 0x3b, 0xaa, 0x53, 0xb7, 0xf9, 0x27, 0xc0, 0xee, 0x8e, 0xd0, 0xb8, 0xbc, + 0xa1, 0x97, 0x57, 0x29, 0x82, 0xc2, 0x11, 0x89, 0x1d, 0x71, 0x8c, 0x6d, 0xac, 0x73, 0x49, 0x76, + 0xb4, 0xda, 0xe9, 0x59, 0x1e, 0xc3, 0x26, 0x82, 0x29, 0xe3, 0x2a, 0xae, 0x30, 0x5f, 0x6b, 0x4b, + 0x25, 0x21, 0x09, 0xfd, 0x20, 0x58, 0x7e, 0xbe, 0xe3, 0x25, 0xc9, 0x05, 0x16, 0xa6, 0x27, 0x2b, + 0x43, 0x6e, 0xd5, 0x2a, 0xad, 0x41, 0x4a, 0xe0, 0x9e, 0x22, 0xff, 0x6a, 0xde, 0xc9, 0x08, 0x29, + 0xf8, 0x34, 0x5c, 0xe4, 0x2e, 0xfc, 0x97, 0x1d, 0x2f, 0x42, 0xba, 0xae, 0x6f, 0x18, 0x3a, 0x7d, + 0x47, 0xc8, 0x7d, 0x7f, 0x12, 0xfb, 0xc5, 0xfd, 0xaa, 0x12, 0x86, 0x90, 0x95, 0x21, 0xb7, 0xea, + 0x12, 0x8b, 0x10, 0xca, 0x30, 0xe8, 0x41, 0xd1, 0x65, 0x9b, 0x8a, 0x5c, 0xb6, 0xb7, 0xf3, 0x65, + 0x7b, 0x20, 0xdc, 0x8b, 0xb7, 0x72, 0x07, 0xdc, 0x4a, 0x82, 0x86, 0x96, 0x01, 0x3c, 0x63, 0x41, + 0x73, 0x18, 0x7d, 0x91, 0x6a, 0xe0, 0x19, 0x1e, 0x11, 0x12, 0x7a, 0x24, 0xd0, 0xf3, 0x30, 0xc2, + 0x92, 0xc9, 0x78, 0x07, 0xd7, 0x4c, 0x47, 0xcc, 0x25, 0xfd, 0x1c, 0x4c, 0x7e, 0xa1, 0xe3, 0xb9, + 0xcc, 0xb2, 0x91, 0x34, 0x21, 0x29, 0x2b, 0xc3, 0xb4, 0xb6, 0x40, 0x2b, 0xf9, 0x84, 0xbe, 0x57, + 0x82, 0x83, 0x0c, 0x96, 0xea, 0x15, 0xbd, 0xb3, 0xcf, 0x39, 0xa0, 0xdf, 0xbe, 0xcc, 0x2f, 0x77, + 0xcc, 0xc1, 0x51, 0x3f, 0x07, 0x61, 0xaa, 0xb2, 0x32, 0x4a, 0x1b, 0xd6, 0x44, 0x3d, 0xe3, 0x63, + 0xba, 0xff, 0xc5, 0x57, 0xc6, 0xbb, 0xb8, 0x2d, 0xe9, 0x92, 0xcf, 0xd2, 0x34, 0x3f, 0xb7, 0x01, + 0xd8, 0x26, 0xe1, 0x93, 0x2a, 0x0a, 0x34, 0xf9, 0x92, 0x52, 0xbc, 0x0a, 0x66, 0x83, 0x5e, 0xf8, + 0x0f, 0x13, 0x92, 0xfc, 0x5b, 0x12, 0xf4, 0xcc, 0x5e, 0x5e, 0x51, 0x35, 0x0b, 0xcd, 0xc3, 0xb0, + 0xa7, 0xcf, 0x41, 0x0b, 0x74, 0xe4, 0x8d, 0xeb, 0xe3, 0x99, 0xb0, 0xca, 0xbb, 0x26, 0xc8, 0x5b, + 0x56, 0xc2, 0x06, 0xcd, 0xb7, 0x8a, 0xb1, 0x03, 0xa4, 0x1a, 0x40, 0xe4, 0xc6, 0x08, 0x3c, 0x34, + 0xcc, 0x05, 0xe8, 0x65, 0xdc, 0xd2, 0x8f, 0x70, 0x98, 0xe4, 0x1f, 0x7e, 0x86, 0x71, 0x57, 0xd4, + 0x92, 0xa2, 0x68, 0x6e, 0xea, 0x95, 0x60, 0xca, 0x1f, 0x8c, 0x01, 0xcc, 0x5e, 0xbe, 0xbc, 0x66, + 0x69, 0x66, 0x15, 0x3b, 0x37, 0x53, 0x00, 0x6b, 0x70, 0xc0, 0x17, 0xd7, 0x59, 0xa5, 0x90, 0x10, + 0x26, 0xde, 0xb8, 0x3e, 0x7e, 0x24, 0x2c, 0x04, 0x1f, 0x98, 0xac, 0x8c, 0x78, 0x11, 0x9e, 0x55, + 0x6a, 0x4a, 0xb5, 0x6c, 0x3b, 0x2e, 0xd5, 0x78, 0x6b, 0xaa, 0x3e, 0x30, 0x3f, 0xd5, 0x59, 0xdb, + 0x69, 0x2e, 0xe1, 0xa7, 0xa1, 0xcf, 0x13, 0x89, 0x8d, 0x1e, 0x87, 0xa4, 0xc3, 0xff, 0xe7, 0x82, + 0xbe, 0x3b, 0x52, 0xd0, 0x02, 0x9b, 0x0b, 0xdb, 0x25, 0x20, 0xbf, 0x4c, 0xe4, 0xcd, 0x44, 0x45, + 0xd6, 0xf1, 0x4f, 0xa5, 0xc2, 0x91, 0xed, 0x86, 0x2f, 0xe7, 0xf8, 0xbe, 0x9c, 0x4b, 0x8e, 0x4d, + 0x76, 0x44, 0x66, 0x4c, 0x32, 0xec, 0xc2, 0x3c, 0x2f, 0x85, 0xc4, 0xfd, 0xa1, 0x18, 0x8c, 0xac, + 0x0b, 0x73, 0xf9, 0x53, 0x2f, 0x9b, 0x27, 0xa1, 0x17, 0xeb, 0x8e, 0xa5, 0x51, 0xe1, 0x10, 0x65, + 0x78, 0x28, 0x42, 0x19, 0x9a, 0x0c, 0x8d, 0x7e, 0xc4, 0x47, 0x1c, 0x26, 0x70, 0x6a, 0x21, 0xa1, + 0x7c, 0x20, 0x0e, 0x99, 0x56, 0x98, 0x68, 0x06, 0x86, 0x4a, 0x16, 0xa6, 0x15, 0x45, 0x7f, 0x46, + 0x33, 0x9f, 0xf5, 0x5c, 0xe5, 0x10, 0x80, 0xac, 0x0c, 0x8a, 0x1a, 0xbe, 0xf3, 0x55, 0x80, 0x38, + 0xb0, 0x44, 0x2b, 0x09, 0x54, 0x9b, 0x1e, 0xab, 0xcc, 0xb7, 0x3e, 0xd1, 0x49, 0x90, 0x00, 0xdb, + 0xfb, 0x06, 0xbd, 0x5a, 0xba, 0xf9, 0x3d, 0x0b, 0x43, 0x9a, 0xae, 0x39, 0x9a, 0x5a, 0x2d, 0x6e, + 0xa8, 0x55, 0x55, 0x2f, 0xed, 0x27, 0x0c, 0x98, 0xd7, 0x1d, 0xaf, 0xdb, 0x10, 0x39, 0x59, 0x19, + 0xe4, 0x35, 0x79, 0x56, 0x81, 0x2e, 0x41, 0xaf, 0xe8, 0x2a, 0xb1, 0x2f, 0x87, 0x49, 0xa0, 0xfb, + 0x5c, 0xd5, 0xf7, 0xc7, 0x61, 0x58, 0xc1, 0xe5, 0xff, 0x3f, 0x15, 0x9d, 0x4d, 0xc5, 0x22, 0x00, + 0xb3, 0x06, 0xc4, 0x0c, 0xef, 0x63, 0x36, 0x88, 0x3d, 0x49, 0x31, 0x0a, 0xb3, 0xb6, 0xe3, 0x9b, + 0x8f, 0xff, 0x18, 0x83, 0x7e, 0xff, 0x7c, 0xfc, 0x0d, 0xdd, 0xbb, 0xd0, 0x8a, 0x67, 0x90, 0xd8, + 0xe9, 0xc2, 0x7d, 0x11, 0x06, 0xa9, 0x41, 0x89, 0xf7, 0xb6, 0x44, 0xaf, 0xc7, 0xa1, 0x67, 0x45, + 0xb5, 0xd4, 0x9a, 0x8d, 0x1e, 0x6b, 0x70, 0x96, 0x45, 0x76, 0xb5, 0xe1, 0xfb, 0xd5, 0x3c, 0x99, + 0xc3, 0xc2, 0xe5, 0x0f, 0x37, 0x71, 0x89, 0xef, 0x82, 0x41, 0x12, 0xcd, 0xfb, 0x2e, 0x62, 0xc4, + 0xe8, 0xf1, 0x32, 0x89, 0xe8, 0xbd, 0x53, 0x40, 0x34, 0x0e, 0x7d, 0x04, 0xcc, 0x33, 0xb9, 0x04, + 0x06, 0x6a, 0xea, 0x4e, 0x81, 0xd5, 0xa0, 0x53, 0x80, 0xb6, 0xdc, 0x64, 0x4d, 0xd1, 0x93, 0x04, + 0x81, 0x1b, 0xf6, 0x5a, 0x04, 0xf8, 0x51, 0x00, 0xc2, 0x45, 0x91, 0xdd, 0x60, 0x64, 0x71, 0x69, + 0x8a, 0xd4, 0xcc, 0xd2, 0x5b, 0x8c, 0xcf, 0xc3, 0x48, 0x4d, 0xd3, 0x8b, 0xa1, 0x5c, 0x01, 0x8f, + 0x91, 0xf6, 0xed, 0x57, 0x37, 0x21, 0x29, 0x2b, 0xc3, 0x35, 0x4d, 0x0f, 0x26, 0x17, 0x48, 0x78, + 0xc6, 0x76, 0x48, 0x02, 0xb5, 0xa9, 0x96, 0x1c, 0xc3, 0x62, 0x9f, 0x5c, 0xde, 0x7f, 0x78, 0x16, + 0xa6, 0x27, 0x2b, 0x43, 0x6e, 0xd5, 0x45, 0x5a, 0xe3, 0x5b, 0x52, 0xaf, 0x4a, 0x80, 0xbc, 0xbd, + 0x46, 0xc1, 0xb6, 0x49, 0x42, 0x5c, 0x12, 0xbd, 0x78, 0x1a, 0xc3, 0xa7, 0x3c, 0xd2, 0x05, 0x72, + 0x11, 0x44, 0xf4, 0xe2, 0x5b, 0xa9, 0x0f, 0x7b, 0xe6, 0x39, 0xc6, 0x15, 0xa8, 0xc9, 0x95, 0xd6, + 0xc9, 0x19, 0x43, 0x13, 0xd8, 0x0d, 0xf6, 0xb8, 0x4b, 0xfe, 0x53, 0x09, 0x0e, 0x35, 0xa8, 0xb2, + 0xcb, 0x33, 0x06, 0x64, 0xf9, 0x1a, 0xf9, 0x77, 0xf4, 0x18, 0xef, 0xfb, 0x5d, 0x20, 0xc3, 0x56, + 0x83, 0xf9, 0xbf, 0x79, 0x1b, 0x0d, 0xbb, 0x1a, 0xfb, 0xaf, 0x24, 0x18, 0xf5, 0x77, 0xef, 0x8e, + 0x67, 0x1d, 0xfa, 0xfd, 0xbd, 0xf3, 0x91, 0xdc, 0xd3, 0xc1, 0x48, 0xf8, 0x20, 0x02, 0x64, 0xd0, + 0x53, 0x9e, 0xf1, 0x60, 0x19, 0xca, 0x73, 0x9d, 0xca, 0x46, 0x70, 0x18, 0x36, 0x22, 0x09, 0x3a, + 0x49, 0xff, 0x57, 0x82, 0xc4, 0x8a, 0x61, 0x54, 0x91, 0x01, 0xc3, 0xba, 0xe1, 0x14, 0xc9, 0x4a, + 0xc3, 0xe5, 0x22, 0x4f, 0x66, 0x30, 0xe3, 0x3c, 0xd3, 0x99, 0xc8, 0xbe, 0x77, 0x7d, 0xbc, 0x91, + 0x94, 0x32, 0xa4, 0x1b, 0x4e, 0x9e, 0xd6, 0xac, 0xb1, 0x54, 0xc7, 0xf3, 0x30, 0x10, 0xec, 0x8c, + 0x99, 0xee, 0x27, 0x3b, 0xee, 0x2c, 0x48, 0xe6, 0x8d, 0xeb, 0xe3, 0xa3, 0x6c, 0x65, 0x05, 0xaa, + 0x65, 0xa5, 0x7f, 0xc3, 0xd7, 0x3b, 0xbb, 0x4b, 0xf7, 0x03, 0x32, 0xa3, 0xef, 0x93, 0x60, 0x44, + 0xc4, 0xad, 0x34, 0x6c, 0x55, 0x70, 0xc9, 0xb0, 0xca, 0x68, 0x10, 0x62, 0xfc, 0x74, 0x2a, 0xa1, + 0xc4, 0xb4, 0x32, 0x1a, 0x85, 0x6e, 0xe3, 0xaa, 0xce, 0xaf, 0xb6, 0xa4, 0x14, 0x56, 0xa0, 0x56, + 0xd2, 0x28, 0xd7, 0xab, 0xb8, 0xa8, 0x96, 0x4a, 0xf4, 0x76, 0x35, 0x4b, 0xd6, 0x0d, 0xb0, 0xda, + 0x1c, 0xab, 0x24, 0xa1, 0xae, 0x6b, 0x48, 0xf9, 0x87, 0x97, 0xbc, 0x0a, 0xa6, 0x5a, 0x27, 0xbf, + 0x24, 0x01, 0x78, 0xa9, 0x25, 0x74, 0x2f, 0xdc, 0x96, 0x5f, 0x5e, 0x9a, 0x2d, 0xae, 0xae, 0xe5, + 0xd6, 0xd6, 0x57, 0x8b, 0xeb, 0x4b, 0xab, 0x2b, 0x85, 0x99, 0xf9, 0x8b, 0xf3, 0x85, 0x59, 0xef, + 0x50, 0xc4, 0x36, 0x71, 0x49, 0xdb, 0xd4, 0x70, 0x19, 0x1d, 0x83, 0xd1, 0x20, 0x34, 0x29, 0x15, + 0x66, 0xd3, 0x52, 0xb6, 0xff, 0xa5, 0x6b, 0x13, 0x49, 0xe6, 0xa9, 0xe2, 0x32, 0x3a, 0x01, 0x07, + 0x1a, 0xe1, 0xe6, 0x97, 0xe6, 0xd2, 0xb1, 0xec, 0xc0, 0x4b, 0xd7, 0x26, 0x52, 0xae, 0x4b, 0x8b, + 0x64, 0x40, 0x7e, 0x48, 0x4e, 0x2f, 0x9e, 0x85, 0x97, 0xae, 0x4d, 0xf4, 0xb0, 0x99, 0xcc, 0x26, + 0x5e, 0xfc, 0xe4, 0x58, 0x57, 0xfe, 0x6d, 0x2d, 0x8f, 0x3d, 0x2e, 0xf8, 0x26, 0x51, 0x7b, 0xb6, + 0x5a, 0x27, 0x86, 0x54, 0xd3, 0x4b, 0x53, 0x4c, 0x85, 0x35, 0x67, 0xf7, 0x14, 0x57, 0xdf, 0x53, + 0x4c, 0x5c, 0x53, 0x3b, 0xe2, 0x50, 0x23, 0x74, 0xfc, 0xf1, 0x8d, 0x63, 0x90, 0x09, 0x1f, 0x7f, + 0x38, 0x3b, 0xed, 0x9d, 0x7c, 0xec, 0x71, 0xc6, 0x11, 0x79, 0x86, 0xd1, 0xe2, 0xd4, 0x64, 0xff, + 0x27, 0x1b, 0x7b, 0x1f, 0xe2, 0xc8, 0x7f, 0x1e, 0x07, 0xb4, 0x68, 0x57, 0x66, 0x88, 0xfb, 0xe9, + 0xbb, 0xa4, 0x17, 0x4a, 0xd0, 0x49, 0x37, 0x23, 0x41, 0xb7, 0x16, 0x48, 0x79, 0xc5, 0xf6, 0x95, + 0x6b, 0x6f, 0xcc, 0x7b, 0x35, 0xf5, 0xf1, 0xe2, 0x37, 0x2f, 0x26, 0x4c, 0xec, 0x37, 0x5e, 0xe6, + 0x59, 0xe6, 0xee, 0x3d, 0xb2, 0xcc, 0x99, 0x96, 0xa9, 0x64, 0x8e, 0x8d, 0xce, 0x88, 0x47, 0x52, + 0x3d, 0xed, 0xed, 0x8a, 0xfc, 0x15, 0x55, 0xf2, 0x45, 0xb1, 0x27, 0x1e, 0x81, 0x6c, 0xe3, 0xf4, + 0x0a, 0x0b, 0x2d, 0xbf, 0x12, 0x83, 0xf4, 0xa2, 0x5d, 0x29, 0x94, 0x35, 0xe7, 0xd6, 0xce, 0xfd, + 0x85, 0xd6, 0xe1, 0x36, 0x7a, 0xe3, 0xfa, 0xf8, 0x20, 0x13, 0xed, 0x1e, 0x02, 0xad, 0xc1, 0x50, + 0xd8, 0x05, 0x63, 0x93, 0x3c, 0xbb, 0x9f, 0x53, 0xa3, 0x06, 0xd7, 0x6b, 0x30, 0x78, 0x72, 0xe3, + 0x13, 0x60, 0x16, 0x32, 0x61, 0x09, 0xb9, 0xe2, 0xfb, 0x4b, 0x09, 0xfa, 0x16, 0x6d, 0x11, 0x8c, + 0xe3, 0x9f, 0xd2, 0xfc, 0xc4, 0x43, 0xee, 0x3b, 0x9c, 0x78, 0x7b, 0x4a, 0x24, 0xde, 0xe6, 0x78, + 0x42, 0x38, 0x00, 0x23, 0xbe, 0x71, 0xba, 0xe3, 0xff, 0x93, 0x18, 0x35, 0x1e, 0x79, 0x5c, 0xd1, + 0x74, 0xd7, 0x0d, 0xc0, 0x7f, 0x53, 0xc3, 0x2e, 0x4f, 0xce, 0x89, 0xfd, 0xca, 0x79, 0x9b, 0xae, + 0xd6, 0x90, 0x3c, 0x5d, 0x8f, 0x6f, 0xb1, 0x31, 0x29, 0x20, 0x75, 0x70, 0x8f, 0x28, 0x14, 0xfa, + 0xcb, 0xaf, 0x4b, 0x30, 0xb0, 0x68, 0x57, 0xd6, 0xf5, 0xf2, 0x5f, 0x7b, 0xfd, 0xdd, 0x84, 0x03, + 0x81, 0x91, 0xde, 0x2a, 0x91, 0xbe, 0x12, 0x83, 0x23, 0xc4, 0xdc, 0x12, 0xff, 0xbd, 0xfa, 0xb3, + 0x93, 0xc1, 0xdc, 0xaf, 0x84, 0xd1, 0xf1, 0xc6, 0x5c, 0x17, 0xbb, 0xc0, 0x14, 0xca, 0x67, 0xf9, + 0xa6, 0xe2, 0x18, 0xdc, 0xb9, 0x97, 0x84, 0x5c, 0xdb, 0xf2, 0x87, 0x31, 0x18, 0x5e, 0xb4, 0x2b, + 0x01, 0x47, 0xd9, 0xfe, 0xeb, 0x26, 0xbf, 0x35, 0x38, 0x10, 0x3a, 0xd9, 0x2a, 0x32, 0x97, 0x3f, + 0x11, 0x36, 0x44, 0x4d, 0xc1, 0x64, 0x65, 0xc4, 0x09, 0x1c, 0x80, 0x2d, 0x93, 0x5a, 0x9f, 0xb0, + 0xd7, 0xe0, 0x50, 0x83, 0x0c, 0x5d, 0xdd, 0xf7, 0xb8, 0x96, 0x3a, 0xe2, 0x5a, 0xfe, 0x8c, 0x44, + 0xf7, 0x44, 0x62, 0xa1, 0x70, 0x8d, 0x85, 0x37, 0x9b, 0xee, 0xd1, 0xee, 0x4d, 0x9c, 0xa1, 0x87, + 0x02, 0x0f, 0x48, 0xf7, 0xb5, 0xf0, 0xdf, 0x0e, 0x13, 0xad, 0x38, 0xbd, 0x71, 0x39, 0x7c, 0x58, + 0x82, 0x31, 0x22, 0x5e, 0x4b, 0xd5, 0xed, 0x4d, 0x6c, 0x35, 0x8b, 0xe9, 0x1e, 0x82, 0x8c, 0x98, + 0x21, 0x3e, 0x71, 0x16, 0x6d, 0x28, 0xba, 0x91, 0x9e, 0xab, 0x00, 0x3e, 0x34, 0xf6, 0x40, 0xc0, + 0xa6, 0x17, 0x8a, 0x78, 0xf4, 0xc7, 0x4b, 0xf4, 0xcb, 0xc2, 0xf8, 0x2a, 0xd7, 0x12, 0xfe, 0x59, + 0x06, 0x1d, 0x5f, 0x0d, 0x4f, 0xfc, 0x09, 0x38, 0xb6, 0x37, 0x67, 0xee, 0x3a, 0xfb, 0xa2, 0x44, + 0xf7, 0x76, 0x76, 0x9a, 0xfb, 0xd3, 0x6e, 0xa9, 0x7c, 0x23, 0x3c, 0x0a, 0x87, 0x9b, 0xb0, 0x2d, + 0x86, 0x75, 0xfa, 0x0b, 0x00, 0xf1, 0x45, 0xbb, 0x82, 0x7e, 0x0e, 0x86, 0xc2, 0xb1, 0xcd, 0xfd, + 0x11, 0xae, 0x6c, 0xa3, 0xbf, 0x9c, 0x7d, 0xb8, 0x63, 0x14, 0x57, 0xbb, 0x76, 0x61, 0x20, 0xe8, + 0x5e, 0x4f, 0x45, 0xd3, 0x0a, 0x20, 0x64, 0x1f, 0xea, 0x10, 0xc1, 0xed, 0xfa, 0x19, 0x48, 0xba, + 0xae, 0xe9, 0xc9, 0x68, 0x22, 0x02, 0x36, 0x7b, 0xba, 0x7d, 0x58, 0xb7, 0xaf, 0x9f, 0x83, 0xa1, + 0xb0, 0x1b, 0xd8, 0x86, 0x9c, 0x43, 0x28, 0xed, 0xc8, 0xb9, 0x95, 0x73, 0x64, 0x02, 0xf8, 0x3c, + 0x99, 0x7b, 0xa3, 0x09, 0x79, 0xd0, 0xd9, 0x07, 0x3b, 0x81, 0x76, 0x7b, 0xbc, 0x26, 0xc1, 0xa1, + 0xd6, 0x3b, 0xfd, 0xf9, 0x36, 0x54, 0xa6, 0x15, 0x72, 0x76, 0xe6, 0x06, 0x90, 0x5d, 0xfe, 0x9e, + 0x87, 0xc1, 0xd0, 0xee, 0x79, 0x5f, 0x34, 0xd9, 0x20, 0x46, 0xf6, 0x5c, 0xa7, 0x18, 0x6e, 0xef, + 0x2f, 0x4a, 0xec, 0x30, 0x46, 0xd8, 0x5d, 0xd4, 0x86, 0x1a, 0x37, 0xb5, 0xd3, 0xd9, 0x0b, 0xfb, + 0x44, 0x74, 0x59, 0xf9, 0xa4, 0x04, 0x87, 0xf7, 0x32, 0xd2, 0x8f, 0xb4, 0x31, 0xc8, 0xd6, 0xe8, + 0xd9, 0xc2, 0x0d, 0xa1, 0xbb, 0x5c, 0xbe, 0x5b, 0x82, 0x74, 0x83, 0x15, 0x6e, 0x63, 0x29, 0x86, + 0x71, 0xb2, 0xd3, 0x9d, 0xe3, 0xb8, 0x29, 0xdb, 0x37, 0x21, 0xb3, 0xf6, 0xad, 0x18, 0x9c, 0xf4, + 0xe7, 0xac, 0x9e, 0xad, 0x63, 0x6b, 0xd7, 0xcd, 0x4e, 0x99, 0x6a, 0x45, 0xd3, 0xfd, 0xdf, 0x54, + 0x38, 0xe4, 0xdf, 0x8c, 0x29, 0xac, 0x18, 0x88, 0xfc, 0xa2, 0x04, 0x7d, 0x2b, 0x6a, 0x05, 0x2b, + 0xf8, 0xd9, 0x3a, 0xb6, 0x9d, 0x26, 0x8f, 0xfa, 0x0f, 0x42, 0x8f, 0xb1, 0xb9, 0x29, 0x9e, 0x10, + 0x24, 0x14, 0x5e, 0x42, 0xa3, 0xd0, 0x5d, 0xd5, 0x6a, 0x1a, 0xf3, 0xd7, 0x12, 0x0a, 0x2b, 0xa0, + 0x71, 0xe8, 0xa3, 0xc9, 0xd3, 0x22, 0x7b, 0x0e, 0x99, 0x10, 0x1f, 0xdc, 0xac, 0xeb, 0xce, 0x1a, + 0x7d, 0x13, 0x99, 0x81, 0x5e, 0x0b, 0x5f, 0xc1, 0x96, 0xcd, 0x7e, 0x74, 0x20, 0xa9, 0x88, 0xa2, + 0x7c, 0x01, 0xfa, 0x19, 0x27, 0x7c, 0x32, 0x0f, 0x41, 0x92, 0x3e, 0x6c, 0xf3, 0xf8, 0xe9, 0x25, + 0xe5, 0xc7, 0xd9, 0xa7, 0x01, 0x18, 0x7d, 0xc6, 0x12, 0x2b, 0xe4, 0xf3, 0x2d, 0x05, 0x7f, 0x22, + 0x3a, 0xb9, 0xc1, 0x64, 0xe8, 0x4a, 0xf8, 0x8f, 0xba, 0xe1, 0x00, 0xcf, 0x33, 0xaa, 0xa6, 0x36, + 0xb5, 0xe5, 0x38, 0xe2, 0xf3, 0x35, 0xc0, 0x83, 0x1a, 0xd5, 0xd4, 0xe4, 0x5d, 0x48, 0x5c, 0x72, + 0x1c, 0x13, 0x9d, 0x84, 0x6e, 0xab, 0x5e, 0xc5, 0xe2, 0x26, 0x8b, 0x9b, 0xa9, 0x52, 0x4d, 0x6d, + 0x92, 0x00, 0x28, 0xf5, 0x2a, 0x56, 0x18, 0x08, 0x2a, 0xc0, 0xf8, 0x66, 0xbd, 0x5a, 0xdd, 0x2d, + 0x96, 0x31, 0xfd, 0x75, 0x64, 0xf7, 0x87, 0x08, 0xf1, 0x8e, 0xa9, 0xea, 0x6e, 0x5e, 0x2f, 0xa9, + 0x1c, 0xa1, 0x60, 0xb3, 0x14, 0x4a, 0xfc, 0x08, 0x61, 0x41, 0xc0, 0xc8, 0x7f, 0x16, 0x83, 0xa4, + 0x20, 0x4d, 0xdf, 0xea, 0xe3, 0x2a, 0xa6, 0x47, 0x5b, 0x12, 0x7f, 0xab, 0xcf, 0xcb, 0x08, 0x41, + 0xbc, 0xc2, 0x27, 0x2f, 0x75, 0xa9, 0x4b, 0x21, 0x05, 0x52, 0xe7, 0x7e, 0x41, 0x81, 0xd4, 0x99, + 0x75, 0x32, 0x9f, 0x09, 0xd3, 0x10, 0x87, 0xc9, 0x97, 0xba, 0x14, 0x5a, 0x42, 0x19, 0xe8, 0x21, + 0x46, 0xdb, 0x61, 0xb3, 0x45, 0xea, 0x79, 0x19, 0x1d, 0x84, 0x6e, 0x53, 0x75, 0x4a, 0xec, 0x71, + 0x23, 0x69, 0x60, 0x45, 0xe2, 0x0a, 0xb2, 0x4f, 0x73, 0x85, 0x7f, 0x7a, 0x94, 0x08, 0x83, 0x7d, + 0x03, 0x9d, 0xf0, 0xbd, 0xa2, 0x3a, 0x0e, 0xb6, 0x74, 0x42, 0x90, 0x81, 0x23, 0x04, 0x89, 0x0d, + 0xa3, 0xbc, 0xcb, 0x7f, 0x0e, 0x95, 0xfe, 0xcf, 0x7f, 0xa8, 0x91, 0xea, 0x43, 0x91, 0x36, 0xb2, + 0x5f, 0x81, 0xee, 0x17, 0x95, 0x79, 0x02, 0x54, 0x80, 0x11, 0xb5, 0x5c, 0xd6, 0x88, 0xc2, 0xab, + 0xd5, 0xe2, 0x86, 0x46, 0x8d, 0xb9, 0x4d, 0x7f, 0xe3, 0xbb, 0xd5, 0x5c, 0x20, 0x0f, 0x21, 0xcf, + 0xe1, 0xf3, 0x29, 0xe8, 0x35, 0x19, 0x53, 0xf2, 0x79, 0x18, 0x6e, 0xe0, 0x94, 0xf0, 0xb7, 0xad, + 0xe9, 0x65, 0xf1, 0x59, 0x09, 0xf2, 0x3f, 0xa9, 0xa3, 0xbf, 0x63, 0xc0, 0x1c, 0x4c, 0xfa, 0x7f, + 0xfe, 0xdd, 0xad, 0x3f, 0x3a, 0x32, 0xe8, 0xfb, 0xe8, 0x88, 0x6a, 0x6a, 0xf9, 0x14, 0xa5, 0xcf, + 0xbf, 0x35, 0x92, 0xe3, 0x0d, 0xec, 0x3b, 0x23, 0x93, 0x86, 0x55, 0x99, 0xaa, 0x60, 0x5d, 0xe4, + 0xb1, 0x49, 0x93, 0x6a, 0x6a, 0x36, 0x55, 0x47, 0xef, 0x77, 0x15, 0xec, 0xf3, 0xbe, 0xff, 0xe9, + 0x27, 0x48, 0x12, 0x73, 0xb9, 0x95, 0x79, 0x57, 0x8f, 0xff, 0x20, 0x06, 0x47, 0x7c, 0x7a, 0xec, + 0x03, 0x6e, 0x54, 0xe7, 0x6c, 0x73, 0x8d, 0x6f, 0xe3, 0xab, 0x44, 0x8f, 0x43, 0x82, 0xc0, 0xa3, + 0x88, 0x9f, 0x51, 0xcc, 0x7c, 0xf6, 0xab, 0xff, 0x5c, 0x0e, 0xe6, 0x72, 0x03, 0xb3, 0x42, 0x89, + 0xe4, 0xdf, 0xd7, 0xbe, 0xfc, 0xd2, 0xde, 0x4f, 0x4a, 0xd8, 0x37, 0x4f, 0x8c, 0x61, 0x19, 0xfe, + 0xcf, 0x39, 0x38, 0x1c, 0x3e, 0x01, 0x60, 0x56, 0xb4, 0xad, 0xa3, 0x8c, 0x0e, 0x2c, 0x75, 0xab, + 0x2f, 0x31, 0xec, 0x35, 0x83, 0x11, 0xa7, 0x13, 0x51, 0x87, 0x1b, 0xf2, 0x0e, 0x1c, 0x7c, 0x82, + 0x30, 0xe5, 0x5d, 0x0f, 0x10, 0x7b, 0xc1, 0x41, 0xf7, 0x8a, 0xb5, 0xc4, 0xe3, 0x27, 0x71, 0x6f, + 0x1a, 0x3c, 0xc6, 0x79, 0x5c, 0x79, 0x6c, 0xb2, 0xe5, 0x1e, 0x33, 0xe9, 0xdb, 0x5f, 0x14, 0x1f, + 0xa6, 0xfc, 0x39, 0x09, 0x6e, 0x6b, 0xe8, 0x9a, 0x1b, 0xff, 0xa5, 0x26, 0x5f, 0x93, 0xe8, 0xf4, + 0x9d, 0x87, 0xff, 0x03, 0x13, 0x73, 0x4d, 0x78, 0x3e, 0x1e, 0xc9, 0x33, 0x63, 0x26, 0xc0, 0xf4, + 0xa3, 0x70, 0x20, 0xc8, 0xb3, 0x90, 0xd6, 0x5d, 0x30, 0x18, 0x0c, 0xbf, 0xb8, 0xd4, 0x06, 0x02, + 0x01, 0x98, 0xbc, 0x19, 0x16, 0xb7, 0x3b, 0xe4, 0x05, 0xff, 0x71, 0x23, 0x0b, 0xa3, 0x3b, 0x1d, + 0xb1, 0x47, 0x40, 0xfe, 0xa0, 0x04, 0x13, 0xc1, 0x8e, 0x3c, 0x57, 0xc5, 0xee, 0x8c, 0xe7, 0x9b, + 0x36, 0xe1, 0x3f, 0x90, 0xe0, 0xf6, 0x3d, 0x78, 0xe2, 0x72, 0xf8, 0x79, 0x09, 0x46, 0x7d, 0x77, + 0x0c, 0x84, 0xa9, 0x17, 0x5a, 0x70, 0x7f, 0xdb, 0x77, 0x24, 0x5c, 0x8f, 0xec, 0x30, 0x11, 0xce, + 0xab, 0xdf, 0x1a, 0x1f, 0x69, 0x6c, 0xb3, 0x95, 0x91, 0xc6, 0x7b, 0x01, 0x37, 0x51, 0x5d, 0x3e, + 0x22, 0xc1, 0xdd, 0xc1, 0x21, 0x37, 0x09, 0x37, 0x7e, 0x52, 0xf3, 0xf1, 0x6d, 0x09, 0x4e, 0xb6, + 0xc3, 0x1c, 0x9f, 0x18, 0x0d, 0x46, 0xbc, 0x8b, 0x4a, 0xe1, 0x69, 0x39, 0xdd, 0xf9, 0x85, 0x4d, + 0xae, 0xb4, 0xc8, 0x25, 0x7a, 0x0b, 0xe4, 0x6f, 0xf2, 0xe5, 0xe6, 0x9f, 0x79, 0x57, 0xd6, 0xc1, + 0xcc, 0x8b, 0x90, 0x75, 0x20, 0xf7, 0xd2, 0x64, 0x4a, 0x62, 0x4d, 0xa6, 0xc4, 0x97, 0x54, 0x79, + 0x17, 0x37, 0x6a, 0x4d, 0xa2, 0xc9, 0x0d, 0x18, 0x69, 0xa2, 0xd8, 0x7c, 0xad, 0x77, 0xae, 0xd7, + 0x0a, 0x6a, 0x54, 0x5d, 0x79, 0x17, 0xc6, 0x69, 0xf7, 0x4d, 0xa3, 0xda, 0x5b, 0x3b, 0x72, 0x87, + 0x5b, 0x9c, 0xbd, 0x02, 0xea, 0x15, 0xe8, 0x61, 0xd3, 0xcd, 0x47, 0xbd, 0x7f, 0xb5, 0xe1, 0x74, + 0xe4, 0x8f, 0x0a, 0x43, 0x37, 0x2b, 0xb8, 0x6f, 0xbe, 0xb0, 0xda, 0x19, 0xf2, 0x4d, 0x5a, 0x58, + 0x3e, 0x99, 0x7c, 0x53, 0x98, 0xbc, 0xe6, 0xdc, 0xb9, 0x59, 0xa6, 0x9b, 0x6c, 0xf1, 0x98, 0x88, + 0x6e, 0xad, 0x69, 0xfb, 0x94, 0x30, 0x6d, 0xee, 0xd0, 0x22, 0x4c, 0xdb, 0x4f, 0x66, 0x06, 0x5c, + 0x23, 0x17, 0xc1, 0xe6, 0xcf, 0xb0, 0x91, 0xfb, 0x81, 0x04, 0x87, 0xe8, 0x10, 0xfd, 0xf7, 0xc8, + 0x3a, 0x95, 0xfc, 0xbd, 0x80, 0x6c, 0xab, 0x54, 0x6c, 0xba, 0xe4, 0xd3, 0xb6, 0x55, 0xba, 0x1c, + 0xd8, 0x82, 0xee, 0x05, 0x54, 0xb6, 0x9d, 0x30, 0x34, 0x4b, 0xa6, 0xa7, 0xcb, 0xb6, 0x73, 0x79, + 0x8f, 0x0d, 0x2b, 0x71, 0x13, 0x66, 0xf5, 0x1b, 0x12, 0x64, 0x9b, 0x0d, 0xd9, 0xcd, 0x64, 0x1e, + 0x0c, 0x5c, 0x54, 0x0c, 0x4f, 0xe4, 0x03, 0x1d, 0x5c, 0xc8, 0x0b, 0x2d, 0xaa, 0x03, 0x16, 0xbe, + 0xd5, 0x1e, 0xc3, 0x78, 0x50, 0x5f, 0x1b, 0x3d, 0xf3, 0x9f, 0xd8, 0x62, 0xfa, 0xfd, 0x06, 0x63, + 0xfb, 0xb3, 0xe4, 0xbb, 0xef, 0xc0, 0x58, 0x0b, 0xe6, 0x6f, 0xf5, 0xd6, 0x68, 0xb4, 0x9c, 0xd3, + 0x5b, 0xe4, 0xfe, 0x3f, 0xc8, 0x97, 0x47, 0xf0, 0xc9, 0xbd, 0x2f, 0xb2, 0x6b, 0xf6, 0xcd, 0x1e, + 0xf9, 0x6f, 0xc3, 0xe1, 0xa6, 0x58, 0x9c, 0xc5, 0x1c, 0x24, 0xb6, 0x34, 0x5b, 0x9c, 0xf1, 0x9d, + 0x8a, 0xe0, 0x2e, 0x44, 0x84, 0xa2, 0xca, 0x08, 0xd2, 0xb4, 0x87, 0x15, 0xc3, 0xa8, 0x72, 0x6e, + 0x64, 0x05, 0x86, 0x7d, 0x75, 0xbc, 0xaf, 0x47, 0x20, 0x61, 0x1a, 0xfc, 0xb3, 0x94, 0x7d, 0xa7, + 0xef, 0x88, 0xe8, 0x8b, 0xa0, 0x72, 0x21, 0x50, 0x34, 0x79, 0x14, 0x10, 0xa3, 0x49, 0xef, 0xd8, + 0x8b, 0x9e, 0x9e, 0x86, 0x91, 0x40, 0x2d, 0xef, 0x6b, 0x06, 0x7a, 0x4c, 0x5a, 0xc3, 0x7b, 0x8b, + 0x7a, 0xf2, 0xc7, 0xd0, 0xdd, 0xcf, 0xfe, 0xd1, 0x92, 0x7c, 0x06, 0xee, 0xa0, 0xb4, 0x9b, 0xe4, + 0xa7, 0xf3, 0xbb, 0xf3, 0x65, 0x21, 0xfa, 0xd0, 0x0d, 0x55, 0x79, 0x07, 0xee, 0xdc, 0x1b, 0xcd, + 0x73, 0x9c, 0xd8, 0xb1, 0x67, 0x9b, 0x8e, 0x53, 0x33, 0x7a, 0x9c, 0x61, 0x46, 0x47, 0x7e, 0x14, + 0x8e, 0xb5, 0xee, 0x99, 0x5e, 0xdc, 0x17, 0x3c, 0x37, 0xfd, 0x36, 0xb1, 0xfc, 0x4e, 0x38, 0x1e, + 0x89, 0x7f, 0xcb, 0x98, 0x7f, 0x04, 0xee, 0x6a, 0xd5, 0xb9, 0xbd, 0x7c, 0x55, 0xc7, 0x65, 0x1f, + 0xef, 0xec, 0xa0, 0x57, 0xf2, 0xdd, 0x00, 0x96, 0x9f, 0x6f, 0x3d, 0x76, 0x81, 0xce, 0x59, 0x57, + 0xa0, 0x97, 0x75, 0xd9, 0xae, 0x0f, 0xd0, 0x9a, 0x77, 0x41, 0x48, 0xbe, 0x8b, 0xab, 0x4a, 0xae, + 0x5a, 0x6d, 0xc6, 0x80, 0xd0, 0xd6, 0xe7, 0xb8, 0x6a, 0xb4, 0x04, 0xbb, 0x85, 0x2c, 0x1e, 0xe7, + 0xf2, 0x5d, 0x50, 0x6d, 0x67, 0xad, 0xd9, 0xe9, 0xba, 0x60, 0xf2, 0x1c, 0x97, 0xe4, 0x1e, 0x80, + 0x9c, 0xcd, 0xb0, 0xe6, 0x1f, 0x77, 0xa7, 0xd0, 0xf7, 0x08, 0x99, 0xa2, 0x96, 0x73, 0xb6, 0x8d, + 0x1d, 0x57, 0x0e, 0x45, 0x77, 0xb2, 0x5a, 0x02, 0xf2, 0x2e, 0xdc, 0xab, 0x9e, 0x52, 0x27, 0x57, + 0x3d, 0x4f, 0x7f, 0x7e, 0x1c, 0xba, 0x69, 0x0f, 0xe8, 0xd3, 0x12, 0x80, 0xef, 0x9d, 0xcc, 0x99, + 0x08, 0x41, 0x36, 0x4f, 0x9c, 0x65, 0xcf, 0x76, 0x8a, 0xc6, 0x63, 0xb7, 0x93, 0xef, 0xfe, 0x37, + 0xdf, 0xfd, 0x95, 0xd8, 0x9d, 0x48, 0x16, 0x87, 0x14, 0xe1, 0xcc, 0x9e, 0x6f, 0x53, 0xfc, 0x62, + 0xe0, 0x53, 0xa6, 0x0f, 0x76, 0xd4, 0xa3, 0xe0, 0xf3, 0x4c, 0x87, 0x58, 0x9c, 0xcd, 0xf3, 0x94, + 0xcd, 0x33, 0xe8, 0x81, 0x68, 0x36, 0xa7, 0xde, 0x19, 0xdc, 0x27, 0xdf, 0x85, 0x5e, 0x93, 0x60, + 0xb4, 0x59, 0xfa, 0x07, 0x5d, 0xe8, 0x88, 0x99, 0xc6, 0x08, 0x23, 0xfb, 0xd6, 0xfd, 0x13, 0xe0, + 0x03, 0x9b, 0xa3, 0x03, 0xcb, 0xa1, 0x0b, 0xfb, 0x18, 0xd8, 0x94, 0xcf, 0x0d, 0x45, 0xbf, 0x18, + 0x83, 0xa3, 0x7b, 0xe6, 0x54, 0xd0, 0xa5, 0x8e, 0x98, 0xdd, 0x23, 0xb0, 0xca, 0xce, 0xdf, 0x04, + 0x4a, 0x7c, 0xfc, 0x4f, 0xd0, 0xf1, 0x3f, 0x8e, 0xe6, 0xf7, 0x33, 0x7e, 0x2f, 0x6a, 0xf2, 0x4b, + 0xe2, 0xdf, 0x4a, 0x81, 0x97, 0xd9, 0x6d, 0x69, 0x5c, 0x43, 0xc6, 0xa2, 0xbd, 0x05, 0xd5, 0xe4, + 0x02, 0xdc, 0x53, 0x74, 0x40, 0x0a, 0x5a, 0xb9, 0xc1, 0x09, 0x9d, 0x7a, 0x67, 0xd0, 0x2b, 0x7c, + 0x17, 0x7a, 0x6f, 0x8b, 0xe7, 0xd5, 0x8f, 0xb6, 0xc3, 0x69, 0xeb, 0xdc, 0x4c, 0xf6, 0xc2, 0xbe, + 0xf1, 0xf9, 0x90, 0x6b, 0x74, 0xc8, 0x15, 0x84, 0x6f, 0xf6, 0x90, 0x9b, 0x4e, 0x30, 0xfa, 0x86, + 0x04, 0xa3, 0xcd, 0x52, 0x1b, 0xed, 0x2d, 0xe7, 0x3d, 0x52, 0x36, 0xed, 0x2d, 0xe7, 0xbd, 0xb2, + 0x2a, 0xf2, 0x5b, 0xa8, 0x28, 0xce, 0xa2, 0x07, 0x5b, 0x89, 0x62, 0xcf, 0x19, 0x26, 0x6b, 0x78, + 0xcf, 0x94, 0x41, 0x7b, 0x6b, 0xb8, 0x9d, 0xe4, 0x48, 0x7b, 0x6b, 0xb8, 0xad, 0xfc, 0x45, 0xf4, + 0x1a, 0x76, 0xc7, 0xd9, 0xe6, 0x14, 0xdb, 0xe8, 0x5f, 0x4b, 0x30, 0x10, 0x08, 0xb3, 0xd1, 0xb9, + 0x76, 0xf8, 0x6d, 0x96, 0x8c, 0x88, 0xbc, 0x9d, 0xd4, 0x3a, 0xa6, 0x97, 0xe7, 0xe9, 0xc8, 0x66, + 0x50, 0x6e, 0x3f, 0x23, 0xb3, 0x02, 0xfc, 0x5f, 0x97, 0x60, 0xa4, 0x49, 0x04, 0xdb, 0xde, 0xea, + 0x6d, 0x1d, 0x97, 0x67, 0x2f, 0xec, 0x1b, 0x9f, 0x8f, 0xf1, 0x22, 0x1d, 0xe3, 0x5b, 0xd1, 0xa3, + 0xfb, 0x19, 0xa3, 0xcf, 0x3b, 0xf8, 0xbe, 0xf7, 0xe6, 0xd4, 0xd7, 0x4f, 0xe4, 0x2d, 0x9d, 0xbd, + 0xa3, 0xe3, 0xec, 0xa3, 0xfb, 0x45, 0xe7, 0xa3, 0x7b, 0x92, 0x8e, 0xee, 0x09, 0xb4, 0x7c, 0x63, + 0xa3, 0x6b, 0x74, 0x2a, 0xfe, 0xa0, 0xf1, 0xe3, 0x72, 0x6d, 0x29, 0x5a, 0xd3, 0xe8, 0x38, 0xf2, + 0xf2, 0xcf, 0x1e, 0x21, 0xb2, 0x7c, 0x8e, 0x0e, 0xf1, 0x34, 0xba, 0xaf, 0xd5, 0x10, 0x7d, 0xcf, + 0xaa, 0x35, 0x7d, 0xd3, 0x98, 0x7a, 0x27, 0x0b, 0xbd, 0xdf, 0x85, 0x3e, 0x20, 0x1e, 0x75, 0x4e, + 0xb5, 0xd3, 0xbd, 0x2f, 0x7e, 0xce, 0xde, 0xd7, 0x3e, 0x02, 0xe7, 0xf2, 0x4e, 0xca, 0xe5, 0x18, + 0x3a, 0xd2, 0x8a, 0x4b, 0x12, 0x43, 0xa3, 0x5f, 0x97, 0xdc, 0x37, 0xea, 0xf7, 0xb7, 0xd5, 0x85, + 0x3f, 0xd6, 0x8e, 0xbc, 0x01, 0xd9, 0x24, 0x10, 0x97, 0x8f, 0x51, 0xbe, 0x26, 0xd0, 0x58, 0x4b, + 0xbe, 0x18, 0x3b, 0x9f, 0x92, 0xe0, 0xb6, 0x16, 0x01, 0x33, 0xca, 0xb7, 0xd3, 0xef, 0xde, 0x41, + 0x7a, 0xe4, 0xdd, 0xc1, 0x76, 0x22, 0x76, 0xb9, 0x0b, 0xfd, 0xb6, 0x04, 0xd9, 0xd6, 0xd1, 0x31, + 0x2a, 0xec, 0xbb, 0x17, 0x7f, 0x74, 0x9e, 0xbd, 0x78, 0xa3, 0x64, 0x5c, 0x7e, 0x5f, 0x95, 0xe0, + 0x50, 0xcb, 0x88, 0x18, 0xcd, 0xee, 0xb3, 0x9f, 0x40, 0x3c, 0x9e, 0x2d, 0xdc, 0x20, 0x15, 0x97, + 0x59, 0xa2, 0x03, 0x2d, 0x22, 0xe3, 0xf6, 0x74, 0x60, 0xef, 0xe8, 0xbb, 0x3d, 0x1d, 0x88, 0x08, + 0xcd, 0xb9, 0x4c, 0x5b, 0xc6, 0xc6, 0xed, 0xc9, 0x34, 0x2a, 0x06, 0x6f, 0x4f, 0xa6, 0x91, 0x01, + 0xba, 0xab, 0x00, 0x2d, 0xa2, 0xec, 0x76, 0x15, 0x60, 0xef, 0x68, 0xbe, 0x5d, 0x05, 0x88, 0x08, + 0xf5, 0xe5, 0x37, 0xe5, 0x05, 0xf3, 0x8f, 0x7a, 0x1a, 0x6f, 0xfe, 0xa8, 0x75, 0x67, 0xeb, 0xb9, + 0x1b, 0xfa, 0x7c, 0xeb, 0xbe, 0x1f, 0x22, 0xcb, 0x7f, 0x11, 0x07, 0xb4, 0xea, 0xa8, 0xdb, 0x38, + 0x57, 0x77, 0xb6, 0x0c, 0x4b, 0x7b, 0x8e, 0x39, 0xe1, 0x18, 0xa0, 0xa6, 0xee, 0xf8, 0xdf, 0xff, + 0xef, 0x99, 0xfb, 0xb8, 0xe7, 0xd5, 0x6f, 0x8d, 0x1f, 0x6f, 0xe3, 0xb9, 0x27, 0x01, 0x56, 0x52, + 0x35, 0x75, 0x87, 0xdf, 0x3e, 0x7e, 0x07, 0x80, 0x5a, 0xad, 0x1a, 0x57, 0x8b, 0x55, 0xcd, 0x16, + 0xef, 0x49, 0xde, 0x12, 0x31, 0x9b, 0x8d, 0xdc, 0x4e, 0xfa, 0x7e, 0x8d, 0xa0, 0x4b, 0x49, 0x51, + 0x8a, 0x0b, 0x9a, 0xed, 0xa0, 0xb7, 0x43, 0xaa, 0x8c, 0xf5, 0x5d, 0x46, 0x3d, 0x7e, 0x53, 0xa8, + 0x27, 0x09, 0x41, 0x4a, 0xbc, 0x08, 0x48, 0xf5, 0xc3, 0xd1, 0xdf, 0xce, 0xe3, 0x9f, 0x8e, 0x8c, + 0xda, 0x3f, 0x03, 0x1d, 0xd0, 0xef, 0xa3, 0x0f, 0xab, 0xe1, 0xaa, 0xec, 0xb1, 0x40, 0xe2, 0x28, + 0xf0, 0xd3, 0x32, 0xf1, 0x13, 0x29, 0xf7, 0xa7, 0x65, 0xa6, 0x87, 0xff, 0xf4, 0x0b, 0xa7, 0x06, + 0x02, 0x14, 0xf3, 0xfd, 0xfe, 0xf3, 0x92, 0x93, 0x1f, 0x97, 0x60, 0xb8, 0xa1, 0x47, 0x24, 0xc3, + 0x58, 0x6e, 0x7d, 0xed, 0xd2, 0xb2, 0x32, 0xff, 0x74, 0x6e, 0x6d, 0x7e, 0x79, 0x49, 0x7c, 0x70, + 0xd9, 0xf7, 0x7d, 0x01, 0x34, 0x0e, 0x87, 0x9b, 0xc0, 0xcc, 0x16, 0x16, 0x0a, 0x73, 0xb9, 0xb5, + 0x42, 0x5a, 0x42, 0xb7, 0xc3, 0xd1, 0xa6, 0x44, 0x5c, 0x90, 0x58, 0x0b, 0x10, 0xa5, 0xe0, 0x82, + 0xc4, 0xdf, 0x8c, 0x75, 0xf7, 0xef, 0x53, 0x8d, 0x1f, 0x4e, 0xae, 0x60, 0x1d, 0xdb, 0x9a, 0x7d, + 0x23, 0x2b, 0x2f, 0xe2, 0x1d, 0xff, 0x67, 0x7b, 0xa1, 0x7f, 0x8e, 0xf5, 0xb2, 0xea, 0xa8, 0xce, + 0xcd, 0x39, 0x17, 0x40, 0x36, 0xff, 0x3d, 0x10, 0xf6, 0x11, 0x46, 0xef, 0x87, 0x77, 0xfa, 0x3b, + 0xfa, 0xfc, 0x0c, 0xfb, 0x3c, 0x14, 0xff, 0xfc, 0x4c, 0x98, 0x9e, 0xcc, 0x7e, 0x5a, 0x84, 0x1a, + 0x4d, 0xf6, 0x03, 0x43, 0xbf, 0x2c, 0xc1, 0x01, 0x0a, 0xe5, 0x79, 0xca, 0x14, 0x52, 0x7c, 0x5e, + 0x2d, 0xca, 0x9f, 0x23, 0x9b, 0x85, 0xab, 0xce, 0xec, 0x97, 0x81, 0xee, 0xe4, 0x5f, 0xc6, 0x3a, + 0xe2, 0xe3, 0x21, 0x4c, 0x5d, 0x56, 0x46, 0xaa, 0x0d, 0x98, 0x76, 0xe8, 0x40, 0x30, 0x71, 0xc3, + 0x07, 0x82, 0x4f, 0x40, 0x9f, 0x2f, 0x9a, 0xcb, 0x74, 0xb7, 0xf7, 0xf9, 0xc0, 0xf0, 0x91, 0xbc, + 0x9f, 0x06, 0x7a, 0xbf, 0x04, 0x07, 0x9a, 0x46, 0xbf, 0x99, 0x9e, 0x7d, 0x9f, 0xfc, 0x87, 0x24, + 0xd6, 0x94, 0xbc, 0xac, 0x8c, 0xd6, 0x9b, 0xe5, 0x16, 0x9e, 0x84, 0x81, 0x40, 0xc8, 0x9a, 0xe9, + 0xa5, 0x6c, 0xec, 0xe3, 0xd3, 0x34, 0x41, 0x3a, 0x28, 0x0b, 0x49, 0xbc, 0x63, 0x1a, 0x96, 0x83, + 0xcb, 0xf4, 0x82, 0x76, 0x52, 0x71, 0xcb, 0x48, 0x87, 0x83, 0x4d, 0x5f, 0xda, 0xd9, 0x99, 0xd4, + 0x0d, 0x9e, 0x2b, 0x8c, 0x3a, 0xcd, 0xdc, 0xb4, 0xb7, 0xc2, 0x51, 0xae, 0xca, 0x2d, 0x9e, 0xf7, + 0x01, 0x3d, 0x2c, 0x38, 0x54, 0x6d, 0xe5, 0xba, 0xc8, 0x4b, 0x80, 0x1a, 0x55, 0x35, 0xfc, 0xc3, + 0x5e, 0x9e, 0xf5, 0x45, 0xa3, 0xd0, 0xed, 0xff, 0xe9, 0x2b, 0x56, 0xf0, 0xce, 0x69, 0xdf, 0x04, + 0xdb, 0xf6, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x88, 0xd0, 0xb6, 0xa6, 0xab, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2214,6 +2217,9 @@ func (this *Params) Equal(that interface{}) bool { if !this.MinCommissionRate.Equal(that1.MinCommissionRate) { return false } + if !this.ExemptionFactor.Equal(that1.ExemptionFactor) { + return false + } return true } func (this *RedelegationEntryResponse) Equal(that interface{}) bool { @@ -3117,6 +3123,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size := m.ExemptionFactor.Size() + i -= size + if _, err := m.ExemptionFactor.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a { size := m.MinCommissionRate.Size() i -= size @@ -3724,6 +3740,8 @@ func (m *Params) Size() (n int) { } l = m.MinCommissionRate.Size() n += 1 + l + sovStaking(uint64(l)) + l = m.ExemptionFactor.Size() + n += 1 + l + sovStaking(uint64(l)) return n } @@ -6368,6 +6386,40 @@ func (m *Params) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExemptionFactor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + 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 ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ExemptionFactor.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) From 50a345a6d8f6aaaa72ba6d0cb43294563c0ed17f Mon Sep 17 00:00:00 2001 From: junkai121 Date: Fri, 5 Aug 2022 01:49:06 +0800 Subject: [PATCH 45/57] - Resolve exemption factor params validation - Exemption factor negative check --- x/staking/keeper/msg_server.go | 14 +++++++++----- x/staking/types/params.go | 7 ++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 04242d54..abb39369 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -368,8 +368,9 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( } // tokenize share vs exempt delegation check if exempt delegation - if delegation.Exempt { - maxTokenizeShareAfter := validator.TotalExemptShares.Sub(shares).Mul(k.ExemptionFactor(ctx)) + exemptionFactor := k.ExemptionFactor(ctx) + if delegation.Exempt && !exemptionFactor.IsNegative() { + maxTokenizeShareAfter := validator.TotalExemptShares.Sub(shares).Mul(exemptionFactor) if maxTokenizeShareAfter.GT(validator.TotalTokenizedShares) { return nil, types.ErrInsufficientExemptShares } @@ -578,9 +579,12 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS } // exempt shares check before tokenize operation - maxValTotalShare := validator.TotalExemptShares.Mul(k.ExemptionFactor(ctx)) - if validator.TotalTokenizedShares.Add(shares).GT(maxValTotalShare) { - return nil, types.ErrInsufficientExemptShares + exemptionFactor := k.ExemptionFactor(ctx) + if !exemptionFactor.IsNegative() { + maxValTotalShare := validator.TotalExemptShares.Mul(exemptionFactor) + if validator.TotalTokenizedShares.Add(shares).GT(maxValTotalShare) { + return nil, types.ErrInsufficientExemptShares + } } recordId := k.GetLastTokenizeShareRecordId(ctx) + 1 diff --git a/x/staking/types/params.go b/x/staking/types/params.go index fb3582b8..de821eb9 100644 --- a/x/staking/types/params.go +++ b/x/staking/types/params.go @@ -250,11 +250,8 @@ func validateExemptionFactor(i interface{}) error { return fmt.Errorf("invalid parameter type: %T", i) } - if v.IsNegative() { - return fmt.Errorf("exemption factor cannot be negative: %s", v) - } - if v.GT(sdk.OneDec()) { - return fmt.Errorf("exemption factor cannot be greater than 100%%: %s", v) + if v.IsNegative() && !v.Equal(sdk.NewDec(-1)) { + return fmt.Errorf("invalid exemption factor: %s", v) } return nil From 6b4818164daa5866da558362d206dbde63d3e59d Mon Sep 17 00:00:00 2001 From: junkai121 Date: Fri, 5 Aug 2022 01:53:42 +0800 Subject: [PATCH 46/57] exemption factor check on redelegation --- x/staking/keeper/msg_server.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index abb39369..ae388ee1 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -273,10 +273,6 @@ func (k msgServer) BeginRedelegate(goCtx context.Context, msg *types.MsgBeginRed ) } - if delegation.Exempt { - return nil, types.ErrRedelegationNotAllowedForExemptDelegation - } - shares, err := k.ValidateUnbondAmount( ctx, delegatorAddress, valSrcAddr, msg.Amount.Amount, ) @@ -284,6 +280,20 @@ func (k msgServer) BeginRedelegate(goCtx context.Context, msg *types.MsgBeginRed return nil, err } + // tokenize share vs exempt delegation check if exempt delegation + exemptionFactor := k.ExemptionFactor(ctx) + if delegation.Exempt && !exemptionFactor.IsNegative() { + validator, found := k.GetValidator(ctx, valSrcAddr) + if !found { + return nil, sdkstaking.ErrNoValidatorFound + } + + maxTokenizeShareAfter := validator.TotalExemptShares.Sub(shares).Mul(exemptionFactor) + if maxTokenizeShareAfter.GT(validator.TotalTokenizedShares) { + return nil, types.ErrInsufficientExemptShares + } + } + bondDenom := k.BondDenom(ctx) if msg.Amount.Denom != bondDenom { return nil, sdkerrors.Wrapf( From d4451aca73d1b4e01105c793dddc77d4531d1d39 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Fri, 5 Aug 2022 02:02:56 +0800 Subject: [PATCH 47/57] resolve build errors in tests --- app/app_test.go | 17 ++++++++--------- x/genutil/gentx_test.go | 5 ++--- x/genutil/types/genesis_state_test.go | 6 +++--- x/slashing/app_test.go | 2 +- x/staking/app_test.go | 4 ++-- x/staking/teststaking/helper.go | 4 ++-- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/app/app_test.go b/app/app_test.go index 23df9efc..17e8b88a 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -2,6 +2,7 @@ package simapp import ( "encoding/json" + "os" "testing" "github.com/golang/mock/gomock" @@ -19,7 +20,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" - authmiddleware "github.com/cosmos/cosmos-sdk/x/auth/middleware" "github.com/cosmos/cosmos-sdk/x/auth/vesting" authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/bank" @@ -39,7 +39,7 @@ import ( func TestSimAppExportAndBlockedAddrs(t *testing.T) { encCfg := MakeTestEncodingConfig() db := dbm.NewMemDB() - logger, _ := log.NewDefaultLogger("plain", "info", false) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) app := NewSimappWithCustomOptions(t, false, SetupOptions{ Logger: logger, DB: db, @@ -60,7 +60,7 @@ func TestSimAppExportAndBlockedAddrs(t *testing.T) { app.Commit() - logger2, _ := log.NewDefaultLogger("plain", "info", false) + logger2 := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) // Making a new app object with the db, so that initchain hasn't been called app2 := NewSimApp(logger2, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) _, err := app2.ExportAppStateAndValidators(false, []string{}) @@ -75,16 +75,15 @@ func TestGetMaccPerms(t *testing.T) { func TestRunMigrations(t *testing.T) { db := dbm.NewMemDB() encCfg := MakeTestEncodingConfig() - logger, _ := log.NewDefaultLogger("plain", "info", false) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) // Create a new baseapp and configurator for the purpose of this test. - bApp := baseapp.NewBaseApp(appName, logger, db) + bApp := baseapp.NewBaseApp(appName, logger, db, encCfg.TxConfig.TxDecoder()) bApp.SetCommitMultiStoreTracer(nil) bApp.SetInterfaceRegistry(encCfg.InterfaceRegistry) - msr := authmiddleware.NewMsgServiceRouter(encCfg.InterfaceRegistry) app.BaseApp = bApp - app.configurator = module.NewConfigurator(app.appCodec, msr, app.GRPCQueryRouter()) + app.configurator = module.NewConfigurator(app.appCodec, bApp.MsgServiceRouter(), app.GRPCQueryRouter()) // We register all modules on the Configurator, except x/bank. x/bank will // serve as the test subject on which we run the migration tests. @@ -205,7 +204,7 @@ func TestRunMigrations(t *testing.T) { func TestInitGenesisOnMigration(t *testing.T) { db := dbm.NewMemDB() encCfg := MakeTestEncodingConfig() - logger, _ := log.NewDefaultLogger("plain", "info", false) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()}) @@ -249,7 +248,7 @@ func TestInitGenesisOnMigration(t *testing.T) { func TestUpgradeStateOnGenesis(t *testing.T) { encCfg := MakeTestEncodingConfig() db := dbm.NewMemDB() - logger, _ := log.NewDefaultLogger("plain", "info", false) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) app := NewSimappWithCustomOptions(t, false, SetupOptions{ Logger: logger, DB: db, diff --git a/x/genutil/gentx_test.go b/x/genutil/gentx_test.go index 2e571534..3ecc7fde 100644 --- a/x/genutil/gentx_test.go +++ b/x/genutil/gentx_test.go @@ -53,12 +53,11 @@ func (suite *GenTxTestSuite) SetupTest() { var err error amount := sdk.NewInt64Coin(sdk.DefaultBondDenom, 50) - one := sdk.OneInt() suite.msg1, err = stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(pk1.Address()), pk1, amount, desc, comm, one) + sdk.ValAddress(pk1.Address()), pk1, amount, desc, comm) suite.NoError(err) suite.msg2, err = stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(pk2.Address()), pk1, amount, desc, comm, one) + sdk.ValAddress(pk2.Address()), pk1, amount, desc, comm) suite.NoError(err) } diff --git a/x/genutil/types/genesis_state_test.go b/x/genutil/types/genesis_state_test.go index a97b0d71..f9f46372 100644 --- a/x/genutil/types/genesis_state_test.go +++ b/x/genutil/types/genesis_state_test.go @@ -36,11 +36,11 @@ func TestValidateGenesisMultipleMessages(t *testing.T) { comm := stakingtypes.CommissionRates{} msg1, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(pk1.Address()), pk1, - sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm, sdk.OneInt()) + sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm) require.NoError(t, err) msg2, err := stakingtypes.NewMsgCreateValidator(sdk.ValAddress(pk2.Address()), pk2, - sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm, sdk.OneInt()) + sdk.NewInt64Coin(sdk.DefaultBondDenom, 50), desc, comm) require.NoError(t, err) txGen := simapp.MakeTestEncodingConfig().TxConfig @@ -57,7 +57,7 @@ func TestValidateGenesisMultipleMessages(t *testing.T) { func TestValidateGenesisBadMessage(t *testing.T) { desc := stakingtypes.NewDescription("testname", "", "", "", "") - msg1 := stakingtypes.NewMsgEditValidator(sdk.ValAddress(pk1.Address()), desc, nil, nil) + msg1 := stakingtypes.NewMsgEditValidator(sdk.ValAddress(pk1.Address()), desc, nil) txGen := simapp.MakeTestEncodingConfig().TxConfig txBuilder := txGen.NewTxBuilder() diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 7ff82387..3064be8d 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -66,7 +66,7 @@ func TestSlashingMsgs(t *testing.T) { commission := stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()) createValidatorMsg, err := stakingtypes.NewMsgCreateValidator( - sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commission, sdk.OneInt(), + sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commission, ) require.NoError(t, err) diff --git a/x/staking/app_test.go b/x/staking/app_test.go index c68d4f19..918d0e34 100644 --- a/x/staking/app_test.go +++ b/x/staking/app_test.go @@ -67,7 +67,7 @@ func TestStakingMsgs(t *testing.T) { // create validator description := types.NewDescription("foo_moniker", "", "", "", "") createValidatorMsg, err := types.NewMsgCreateValidator( - sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commissionRates, sdk.OneInt(), + sdk.ValAddress(addr1), valKey.PubKey(), bondCoin, description, commissionRates, ) require.NoError(t, err) @@ -90,7 +90,7 @@ func TestStakingMsgs(t *testing.T) { // edit the validator description = types.NewDescription("bar_moniker", "", "", "", "") - editValidatorMsg := types.NewMsgEditValidator(sdk.ValAddress(addr1), description, nil, nil) + editValidatorMsg := types.NewMsgEditValidator(sdk.ValAddress(addr1), description, nil) header = tmproto.Header{Height: app.LastBlockHeight() + 1} _, _, err = simapp.SignCheckDeliver(t, txGen, app.BaseApp, header, []sdk.Msg{editValidatorMsg}, "", []uint64{0}, []uint64{1}, true, true, priv1) diff --git a/x/staking/teststaking/helper.go b/x/staking/teststaking/helper.go index 6a148874..6ce79338 100644 --- a/x/staking/teststaking/helper.go +++ b/x/staking/teststaking/helper.go @@ -51,7 +51,7 @@ func (sh *Helper) CreateValidatorWithValPower(addr sdk.ValAddress, pk cryptotype // CreateValidatorMsg returns a message used to create validator in this service. func (sh *Helper) CreateValidatorMsg(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount sdk.Int) *stakingtypes.MsgCreateValidator { coin := sdk.NewCoin(sh.Denom, stakeAmount) - msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission) require.NoError(sh.t, err) return msg } @@ -62,7 +62,7 @@ func (sh *Helper) CreateValidatorWithMsg(ctx context.Context, msg *stakingtypes. } func (sh *Helper) createValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, coin sdk.Coin, ok bool) { - msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt()) + msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission) require.NoError(sh.t, err) res, err := sh.msgSrvr.CreateValidator(sdk.WrapSDKContext(sh.Ctx), msg) if ok { From f49fad403da04e9b913d577bf73da9c5e9abf72b Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 9 Aug 2022 18:00:17 +0800 Subject: [PATCH 48/57] resolve staking module keeper tests --- x/staking/keeper/delegation_test.go | 449 ---------------------------- x/staking/types/params.go | 4 +- x/staking/types/validator.go | 22 +- 3 files changed, 14 insertions(+), 461 deletions(-) diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 1fef2558..8df6471a 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -4,7 +4,6 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" @@ -307,245 +306,6 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { require.True(sdk.IntEq(t, newNotBonded, oldNotBonded.AddRaw(1))) } -func TestUndelegateFromUnbondingValidator(t *testing.T) { - _, app, ctx := createTestInput(t) - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) - addrVals := simapp.ConvertAddrsToValAddrs(addrDels) - - //create a validator with a self-delegation - validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) - app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) - - validator, issuedShares := validator.AddTokensFromDel(delTokens) - require.Equal(t, delTokens, issuedShares.RoundInt()) - - // add bonded tokens to pool for delegations - notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - require.True(t, validator.IsBonded()) - - selfDelegation := types.NewDelegation(addrVals[0].Bytes(), addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, selfDelegation) - - // add bonded tokens to pool for delegations - bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, bondedPool) - - // create a second delegation to this validator - app.StakingKeeper.DeleteValidatorByPowerIndex(ctx, validator) - - validator, issuedShares = validator.AddTokensFromDel(delTokens) - require.Equal(t, delTokens, issuedShares.RoundInt()) - - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, bondedPool) - - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - delegation := types.NewDelegation(addrDels[1], addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, bondedPool) - - header := ctx.BlockHeader() - blockHeight := int64(10) - header.Height = blockHeight - blockTime := time.Unix(333, 0) - header.Time = blockTime - ctx = ctx.WithBlockHeader(header) - - // unbond the all self-delegation to put validator in unbonding state - val0AccAddr := sdk.AccAddress(addrVals[0]) - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) - require.NoError(t, err) - - // end block - applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) - - validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, blockHeight, validator.UnbondingHeight) - params := app.StakingKeeper.GetParams(ctx) - require.True(t, blockTime.Add(params.UnbondingTime).Equal(validator.UnbondingTime)) - - blockHeight2 := int64(20) - blockTime2 := time.Unix(444, 0).UTC() - ctx = ctx.WithBlockHeight(blockHeight2) - ctx = ctx.WithBlockTime(blockTime2) - - // unbond some of the other delegation's shares - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDec(6)) - require.NoError(t, err) - - // retrieve the unbonding delegation - ubd, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[1], addrVals[0]) - require.True(t, found) - require.Len(t, ubd.Entries, 1) - require.True(t, ubd.Entries[0].Balance.Equal(sdk.NewInt(6))) - assert.Equal(t, blockHeight2, ubd.Entries[0].CreationHeight) - assert.True(t, blockTime2.Add(params.UnbondingTime).Equal(ubd.Entries[0].CompletionTime)) -} - -func TestUndelegateFromUnbondedValidator(t *testing.T) { - _, app, ctx := createTestInput(t) - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) - addrVals := simapp.ConvertAddrsToValAddrs(addrDels) - - // add bonded tokens to pool for delegations - notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - // create a validator with a self-delegation - validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) - app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) - - valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validator, issuedShares := validator.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares.RoundInt()) - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - require.True(t, validator.IsBonded()) - - val0AccAddr := sdk.AccAddress(addrVals[0]) - selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, selfDelegation) - - // add bonded tokens to pool for delegations - bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, bondedPool) - - // create a second delegation to this validator - app.StakingKeeper.DeleteValidatorByPowerIndex(ctx, validator) - validator, issuedShares = validator.AddTokensFromDel(delTokens) - require.Equal(t, delTokens, issuedShares.RoundInt()) - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - require.True(t, validator.IsBonded()) - delegation := types.NewDelegation(addrDels[1], addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - - ctx = ctx.WithBlockHeight(10) - ctx = ctx.WithBlockTime(time.Unix(333, 0)) - - // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(valTokens)) - require.NoError(t, err) - - // end block - applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) - - validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, ctx.BlockHeight(), validator.UnbondingHeight) - params := app.StakingKeeper.GetParams(ctx) - require.True(t, ctx.BlockHeader().Time.Add(params.UnbondingTime).Equal(validator.UnbondingTime)) - - // unbond the validator - ctx = ctx.WithBlockTime(validator.UnbondingTime) - app.StakingKeeper.UnbondAllMatureValidators(ctx) - - // Make sure validator is still in state because there is still an outstanding delegation - validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, validator.Status, sdkstaking.Unbonded) - - // unbond some of the other delegation's shares - unbondTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(unbondTokens)) - require.NoError(t, err) - - // unbond rest of the other delegation's shares - remainingTokens := delTokens.Sub(unbondTokens) - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(remainingTokens)) - require.NoError(t, err) - - // now validator should be deleted from state - validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.False(t, found, "%v", validator) -} - -func TestUnbondingAllDelegationFromValidator(t *testing.T) { - _, app, ctx := createTestInput(t) - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) - addrVals := simapp.ConvertAddrsToValAddrs(addrDels) - - // add bonded tokens to pool for delegations - notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - //create a validator with a self-delegation - validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) - app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) - - valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validator, issuedShares := validator.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares.RoundInt()) - - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - require.True(t, validator.IsBonded()) - val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - - selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, selfDelegation) - - // create a second delegation to this validator - app.StakingKeeper.DeleteValidatorByPowerIndex(ctx, validator) - validator, issuedShares = validator.AddTokensFromDel(delTokens) - require.Equal(t, delTokens, issuedShares.RoundInt()) - - // add bonded tokens to pool for delegations - bondedPool := app.StakingKeeper.GetBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, bondedPool.GetName(), delCoins)) - app.AccountKeeper.SetModuleAccount(ctx, bondedPool) - - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - require.True(t, validator.IsBonded()) - - delegation := types.NewDelegation(addrDels[1], addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - - ctx = ctx.WithBlockHeight(10) - ctx = ctx.WithBlockTime(time.Unix(333, 0)) - - // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(valTokens)) - require.NoError(t, err) - - // end block - applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) - - // unbond all the remaining delegation - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(delTokens)) - require.NoError(t, err) - - // validator should still be in state and still be in unbonding state - validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, validator.Status, sdkstaking.Unbonding) - - // unbond the validator - ctx = ctx.WithBlockTime(validator.UnbondingTime) - app.StakingKeeper.UnbondAllMatureValidators(ctx) - - // validator should now be deleted from state - _, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.False(t, found) -} - // Make sure that that the retrieving the delegations doesn't affect the state func TestGetRedelegationsFromSrcValidator(t *testing.T) { _, app, ctx := createTestInput(t) @@ -721,212 +481,3 @@ func TestRedelegationMaxEntries(t *testing.T) { _, err = app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDec(1)) require.NoError(t, err) } - -func TestRedelegateSelfDelegation(t *testing.T) { - _, app, ctx := createTestInput(t) - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) - addrVals := simapp.ConvertAddrsToValAddrs(addrDels) - - startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 30) - startCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)) - - // add bonded tokens to pool for delegations - notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - //create a validator with a self-delegation - validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) - app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) - - valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validator, issuedShares := validator.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares.RoundInt()) - - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - - val0AccAddr := sdk.AccAddress(addrVals[0]) - selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, selfDelegation) - - // create a second validator - validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) - validator2, issuedShares = validator2.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares.RoundInt()) - validator2 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) - require.Equal(t, sdkstaking.Bonded, validator2.Status) - - // create a second delegation to validator 1 - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validator, issuedShares = validator.AddTokensFromDel(delTokens) - require.Equal(t, delTokens, issuedShares.RoundInt()) - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - - delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - - _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDecFromInt(delTokens)) - require.NoError(t, err) - - // end block - applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 2) - - validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, valTokens, validator.Tokens) - require.Equal(t, sdkstaking.Unbonding, validator.Status) -} - -func TestRedelegateFromUnbondingValidator(t *testing.T) { - _, app, ctx := createTestInput(t) - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) - addrVals := simapp.ConvertAddrsToValAddrs(addrDels) - - startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 30) - startCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)) - - // add bonded tokens to pool for delegations - notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - //create a validator with a self-delegation - validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) - app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) - - valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validator, issuedShares := validator.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares.RoundInt()) - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, selfDelegation) - - // create a second delegation to this validator - app.StakingKeeper.DeleteValidatorByPowerIndex(ctx, validator) - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validator, issuedShares = validator.AddTokensFromDel(delTokens) - require.Equal(t, delTokens, issuedShares.RoundInt()) - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - delegation := types.NewDelegation(addrDels[1], addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - - // create a second validator - validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) - validator2, issuedShares = validator2.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares.RoundInt()) - validator2 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) - - header := ctx.BlockHeader() - blockHeight := int64(10) - header.Height = blockHeight - blockTime := time.Unix(333, 0) - header.Time = blockTime - ctx = ctx.WithBlockHeader(header) - - // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) - require.NoError(t, err) - - // end block - applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) - - validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, blockHeight, validator.UnbondingHeight) - params := app.StakingKeeper.GetParams(ctx) - require.True(t, blockTime.Add(params.UnbondingTime).Equal(validator.UnbondingTime)) - - //change the context - header = ctx.BlockHeader() - blockHeight2 := int64(20) - header.Height = blockHeight2 - blockTime2 := time.Unix(444, 0) - header.Time = blockTime2 - ctx = ctx.WithBlockHeader(header) - - // unbond some of the other delegation's shares - redelegateTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], sdk.NewDecFromInt(redelegateTokens)) - require.NoError(t, err) - - // retrieve the unbonding delegation - ubd, found := app.StakingKeeper.GetRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1]) - require.True(t, found) - require.Len(t, ubd.Entries, 1) - assert.Equal(t, blockHeight, ubd.Entries[0].CreationHeight) - assert.True(t, blockTime.Add(params.UnbondingTime).Equal(ubd.Entries[0].CompletionTime)) -} - -func TestRedelegateFromUnbondedValidator(t *testing.T) { - _, app, ctx := createTestInput(t) - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) - addrVals := simapp.ConvertAddrsToValAddrs(addrDels) - - startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 30) - startCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)) - - // add bonded tokens to pool for delegations - notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), startCoins)) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - //create a validator with a self-delegation - validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) - app.StakingKeeper.SetValidatorByConsAddr(ctx, validator) - - valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validator, issuedShares := validator.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares.RoundInt()) - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, selfDelegation) - - // create a second delegation to this validator - app.StakingKeeper.DeleteValidatorByPowerIndex(ctx, validator) - delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - validator, issuedShares = validator.AddTokensFromDel(delTokens) - require.Equal(t, delTokens, issuedShares.RoundInt()) - validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - delegation := types.NewDelegation(addrDels[1], addrVals[0], issuedShares) - app.StakingKeeper.SetDelegation(ctx, delegation) - - // create a second validator - validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) - validator2, issuedShares = validator2.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares.RoundInt()) - validator2 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) - require.Equal(t, sdkstaking.Bonded, validator2.Status) - - ctx = ctx.WithBlockHeight(10) - ctx = ctx.WithBlockTime(time.Unix(333, 0)) - - // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) - require.NoError(t, err) - - // end block - applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) - - validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, ctx.BlockHeight(), validator.UnbondingHeight) - params := app.StakingKeeper.GetParams(ctx) - require.True(t, ctx.BlockHeader().Time.Add(params.UnbondingTime).Equal(validator.UnbondingTime)) - - // unbond the validator - app.StakingKeeper.UnbondingToUnbonded(ctx, validator) - - // redelegate some of the delegation's shares - redelegationTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], sdk.NewDecFromInt(redelegationTokens)) - require.NoError(t, err) - - // no red should have been found - red, found := app.StakingKeeper.GetRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) - require.False(t, found, "%v", red) -} diff --git a/x/staking/types/params.go b/x/staking/types/params.go index de821eb9..86f3df4b 100644 --- a/x/staking/types/params.go +++ b/x/staking/types/params.go @@ -35,8 +35,8 @@ const ( var ( // DefaultMinCommissionRate is set to 0% DefaultMinCommissionRate = sdk.ZeroDec() - // DefaultExemptionFactor is set to 0% - DefaultExemptionFactor = sdk.ZeroDec() + // DefaultExemptionFactor is set to -1 (disabled) + DefaultExemptionFactor = sdk.NewDecFromInt(sdk.NewInt(-1)) ) var ( diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 96037e2f..be33e398 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -47,16 +47,18 @@ func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey, descriptio } return Validator{ - OperatorAddress: operator.String(), - ConsensusPubkey: pkAny, - Jailed: false, - Status: sdkstaking.Unbonded, - Tokens: sdk.ZeroInt(), - DelegatorShares: sdk.ZeroDec(), - Description: description, - UnbondingHeight: int64(0), - UnbondingTime: time.Unix(0, 0).UTC(), - Commission: NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), + OperatorAddress: operator.String(), + ConsensusPubkey: pkAny, + Jailed: false, + Status: sdkstaking.Unbonded, + Tokens: sdk.ZeroInt(), + DelegatorShares: sdk.ZeroDec(), + Description: description, + UnbondingHeight: int64(0), + UnbondingTime: time.Unix(0, 0).UTC(), + Commission: NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), + TotalExemptShares: sdk.ZeroDec(), + TotalTokenizedShares: sdk.ZeroDec(), }, nil } From 070c9e90d94d165e8c30e53436e96879f2bc9c68 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Tue, 9 Aug 2022 20:07:24 +0800 Subject: [PATCH 49/57] resolve individual modules test --- cmd/liquidstakingd/cmd/genaccounts.go | 4 +- cmd/liquidstakingd/cmd/testnet.go | 4 +- cmd/liquidstakingd/cmd/testnet_test.go | 4 +- x/slashing/keeper/keeper_test.go | 62 -------------------------- x/staking/handler_test.go | 4 +- 5 files changed, 8 insertions(+), 70 deletions(-) diff --git a/cmd/liquidstakingd/cmd/genaccounts.go b/cmd/liquidstakingd/cmd/genaccounts.go index 97275a41..dc7cdc87 100644 --- a/cmd/liquidstakingd/cmd/genaccounts.go +++ b/cmd/liquidstakingd/cmd/genaccounts.go @@ -16,8 +16,8 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + genutiltypes "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) const ( diff --git a/cmd/liquidstakingd/cmd/testnet.go b/cmd/liquidstakingd/cmd/testnet.go index a02e8090..9b447660 100644 --- a/cmd/liquidstakingd/cmd/testnet.go +++ b/cmd/liquidstakingd/cmd/testnet.go @@ -31,9 +31,9 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/iqlusioninc/liquidity-staking-module/testutil/network" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + genutiltypes "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) diff --git a/cmd/liquidstakingd/cmd/testnet_test.go b/cmd/liquidstakingd/cmd/testnet_test.go index 09134383..a40983fa 100644 --- a/cmd/liquidstakingd/cmd/testnet_test.go +++ b/cmd/liquidstakingd/cmd/testnet_test.go @@ -14,8 +14,8 @@ import ( "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/simapp" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + genutiltest "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/testutil" + genutiltypes "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) func Test_TestnetCmd(t *testing.T) { diff --git a/x/slashing/keeper/keeper_test.go b/x/slashing/keeper/keeper_test.go index 1ab69934..90ff537d 100644 --- a/x/slashing/keeper/keeper_test.go +++ b/x/slashing/keeper/keeper_test.go @@ -15,68 +15,6 @@ import ( "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" ) -func TestUnJailNotBonded(t *testing.T) { - app := simapp.Setup(t, false) - ctx := app.BaseApp.NewContext(false, tmproto.Header{}) - - p := app.StakingKeeper.GetParams(ctx) - p.MaxValidators = 5 - app.StakingKeeper.SetParams(ctx, p) - - addrDels := simapp.AddTestAddrsIncremental(app, ctx, 6, app.StakingKeeper.TokensFromConsensusPower(ctx, 200)) - valAddrs := simapp.ConvertAddrsToValAddrs(addrDels) - pks := simapp.CreateTestPubKeys(6) - tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) - - // create max (5) validators all with the same power - for i := uint32(0); i < p.MaxValidators; i++ { - addr, val := valAddrs[i], pks[i] - tstaking.CreateValidatorWithValPower(addr, val, 100, true) - } - - staking.EndBlocker(ctx, app.StakingKeeper) - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - - // create a 6th validator with less power than the cliff validator (won't be bonded) - addr, val := valAddrs[5], pks[5] - amt := app.StakingKeeper.TokensFromConsensusPower(ctx, 50) - msg := tstaking.CreateValidatorMsg(addr, val, amt) - res, err := tstaking.CreateValidatorWithMsg(sdk.WrapSDKContext(ctx), msg) - require.NoError(t, err) - require.NotNil(t, res) - - staking.EndBlocker(ctx, app.StakingKeeper) - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - - tstaking.CheckValidator(addr, sdkstaking.Unbonded, false) - - // unbond below minimum self-delegation - require.Equal(t, p.BondDenom, tstaking.Denom) - tstaking.Undelegate(sdk.AccAddress(addr), addr, app.StakingKeeper.TokensFromConsensusPower(ctx, 1), true) - - staking.EndBlocker(ctx, app.StakingKeeper) - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - - // verify that validator is jailed - tstaking.CheckValidator(addr, -1, true) - - // verify we cannot unjail (yet) - require.Error(t, app.SlashingKeeper.Unjail(ctx, addr)) - - staking.EndBlocker(ctx, app.StakingKeeper) - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - // bond to meet minimum self-delegation - tstaking.DelegateWithPower(sdk.AccAddress(addr), addr, 1) - - staking.EndBlocker(ctx, app.StakingKeeper) - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - - // verify we can immediately unjail - require.NoError(t, app.SlashingKeeper.Unjail(ctx, addr)) - - tstaking.CheckValidator(addr, -1, false) -} - // Test a new validator entering the validator set // Ensure that SigningInfo.StartHeight is set correctly // and that they are not immediately jailed diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index d1501333..97f14e5c 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -61,8 +61,8 @@ func TestTokenizeShares(t *testing.T) { 0, 0, sdk.TokensFromConsensusPower(50, sdk.DefaultPowerReduction), true, - sdkstaking.Unbonding, - true, + sdkstaking.Bonded, + false, }, { "tokenize shares for less than delegation", From 8cf5c7b3c80a21bd85c6522f9dbe3004aacd1c74 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 10 Aug 2022 09:21:24 +0800 Subject: [PATCH 50/57] update genutil route --- app/app_test.go | 2 +- cmd/liquidstakingd/cmd/cmd_test.go | 2 +- cmd/liquidstakingd/cmd/genaccounts_test.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/app_test.go b/app/app_test.go index 17e8b88a..b9514b87 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -28,12 +28,12 @@ import ( "github.com/cosmos/cosmos-sdk/x/crisis" "github.com/cosmos/cosmos-sdk/x/evidence" feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module" - "github.com/cosmos/cosmos-sdk/x/genutil" "github.com/cosmos/cosmos-sdk/x/gov" group "github.com/cosmos/cosmos-sdk/x/group/module" "github.com/cosmos/cosmos-sdk/x/mint" "github.com/cosmos/cosmos-sdk/x/params" "github.com/cosmos/cosmos-sdk/x/upgrade" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" ) func TestSimAppExportAndBlockedAddrs(t *testing.T) { diff --git a/cmd/liquidstakingd/cmd/cmd_test.go b/cmd/liquidstakingd/cmd/cmd_test.go index 3ad57712..c9b47ac2 100644 --- a/cmd/liquidstakingd/cmd/cmd_test.go +++ b/cmd/liquidstakingd/cmd/cmd_test.go @@ -7,9 +7,9 @@ import ( "github.com/stretchr/testify/require" svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" - "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/cmd/liquidstakingd/cmd" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/cli" ) func TestInitCmd(t *testing.T) { diff --git a/cmd/liquidstakingd/cmd/genaccounts_test.go b/cmd/liquidstakingd/cmd/genaccounts_test.go index 00bb4f64..f99f15cf 100644 --- a/cmd/liquidstakingd/cmd/genaccounts_test.go +++ b/cmd/liquidstakingd/cmd/genaccounts_test.go @@ -18,10 +18,10 @@ import ( "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/testutil/testdata" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" simapp "github.com/iqlusioninc/liquidity-staking-module/app" simcmd "github.com/iqlusioninc/liquidity-staking-module/cmd/liquidstakingd/cmd" + "github.com/iqlusioninc/liquidity-staking-module/x/genutil" + genutiltest "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/testutil" ) var testMbm = module.NewBasicManager(genutil.AppModuleBasic{}) From 7ad45e27862e73de1f66000c9a30d62016a93204 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 10 Aug 2022 09:36:29 +0800 Subject: [PATCH 51/57] resolve integration test --- cmd/liquidstakingd/cmd/testnet_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/liquidstakingd/cmd/testnet_test.go b/cmd/liquidstakingd/cmd/testnet_test.go index a40983fa..7761589f 100644 --- a/cmd/liquidstakingd/cmd/testnet_test.go +++ b/cmd/liquidstakingd/cmd/testnet_test.go @@ -12,8 +12,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/server" - "github.com/cosmos/cosmos-sdk/simapp" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" genutiltest "github.com/iqlusioninc/liquidity-staking-module/x/genutil/client/testutil" genutiltypes "github.com/iqlusioninc/liquidity-staking-module/x/genutil/types" ) From 94a039d4acd1e2ff74f3b6247ead1ad98163802d Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 10 Aug 2022 09:44:25 +0800 Subject: [PATCH 52/57] add separator on share denom --- x/staking/types/tokenize_share_record.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/staking/types/tokenize_share_record.go b/x/staking/types/tokenize_share_record.go index c452b615..c68a1771 100644 --- a/x/staking/types/tokenize_share_record.go +++ b/x/staking/types/tokenize_share_record.go @@ -1,6 +1,7 @@ package types import ( + fmt "fmt" "strconv" "strings" @@ -13,5 +14,5 @@ func (r TokenizeShareRecord) GetModuleAddress() sdk.AccAddress { } func (r TokenizeShareRecord) GetShareTokenDenom() string { - return strings.ToLower(r.Validator) + strconv.Itoa(int(r.Id)) + return fmt.Sprintf("%s/%s", strings.ToLower(r.Validator), strconv.Itoa(int(r.Id))) } From 61567c24ddfcc4b9f067a9e2cca5864a312685f9 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Fri, 12 Aug 2022 21:44:17 +0800 Subject: [PATCH 53/57] add cli command for exempt delegation and fix exempt flag response on delegation query --- app/test_helpers.go | 2 +- start.sh | 2 ++ x/distribution/simulation/operations_test.go | 2 +- x/slashing/simulation/operations_test.go | 2 +- x/staking/client/cli/tx.go | 36 ++++++++++++++++++++ x/staking/client/testutil/grpc.go | 4 +-- x/staking/client/testutil/suite.go | 4 +-- x/staking/keeper/delegation.go | 2 +- x/staking/keeper/delegation_test.go | 20 +++++------ x/staking/keeper/querier.go | 1 + x/staking/keeper/slash_test.go | 6 ++-- x/staking/simulation/decoder_test.go | 2 +- x/staking/simulation/genesis.go | 2 +- x/staking/types/delegation.go | 7 ++-- x/staking/types/delegation_test.go | 8 ++--- 15 files changed, 70 insertions(+), 30 deletions(-) diff --git a/app/test_helpers.go b/app/test_helpers.go index a1c77214..5353d305 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -176,7 +176,7 @@ func genesisStateWithValSet(t *testing.T, Commission: stakingtypes.NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), } validators = append(validators, validator) - delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), sdk.OneDec())) + delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), sdk.OneDec(), false)) } // set validators and delegations diff --git a/start.sh b/start.sh index 8ad81006..b66faeca 100644 --- a/start.sh +++ b/start.sh @@ -8,5 +8,7 @@ liquidstakingd add-genesis-account $(liquidstakingd keys show validator -a --key liquidstakingd gentx validator 100000000stake --keyring-backend="test" --chain-id test liquidstakingd collect-gentxs +sed -i '' 's/"exemption_factor": "-1.000000000000000000"/"exemption_factor": "10.000000000000000000"/g' ~/.simapp/config/genesis.json + liquidstakingd start # liquidstakingd start --home=home --mode=validator diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index 9e423f42..7018dc7d 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -102,7 +102,7 @@ func (suite *SimTestSuite) TestSimulateMsgWithdrawDelegatorReward() { delTokens := suite.app.StakingKeeper.TokensFromConsensusPower(suite.ctx, 2) validator0, issuedShares := validator0.AddTokensFromDel(delTokens) delegator := accounts[1] - delegation := stakingtypes.NewDelegation(delegator.Address, validator0.GetOperator(), issuedShares) + delegation := stakingtypes.NewDelegation(delegator.Address, validator0.GetOperator(), issuedShares, false) suite.app.StakingKeeper.SetDelegation(suite.ctx, delegation) suite.app.DistrKeeper.SetDelegatorStartingInfo(suite.ctx, validator0.GetOperator(), delegator.Address, distrtypes.NewDelegatorStartingInfo(2, sdk.OneDec(), 200)) diff --git a/x/slashing/simulation/operations_test.go b/x/slashing/simulation/operations_test.go index 4d32852a..cccda8c7 100644 --- a/x/slashing/simulation/operations_test.go +++ b/x/slashing/simulation/operations_test.go @@ -88,7 +88,7 @@ func TestSimulateMsgUnjail(t *testing.T) { validator0, issuedShares := validator0.AddTokensFromDel(delTokens) val0AccAddress, err := sdk.ValAddressFromBech32(validator0.OperatorAddress) require.NoError(t, err) - selfDelegation := stakingtypes.NewDelegation(val0AccAddress.Bytes(), validator0.GetOperator(), issuedShares) + selfDelegation := stakingtypes.NewDelegation(val0AccAddress.Bytes(), validator0.GetOperator(), issuedShares, false) app.StakingKeeper.SetDelegation(ctx, selfDelegation) app.DistrKeeper.SetDelegatorStartingInfo(ctx, validator0.GetOperator(), val0AccAddress.Bytes(), distrtypes.NewDelegatorStartingInfo(2, sdk.OneDec(), 200)) diff --git a/x/staking/client/cli/tx.go b/x/staking/client/cli/tx.go index 6887f211..e47b7dcb 100644 --- a/x/staking/client/cli/tx.go +++ b/x/staking/client/cli/tx.go @@ -46,6 +46,7 @@ func NewTxCmd() *cobra.Command { NewTokenizeSharesCmd(), NewRedeemTokensCmd(), NewTransferTokenizeShareRecordCmd(), + NewExemptDelegationCmd(), ) return stakingTxCmd @@ -648,3 +649,38 @@ $ %s tx staking transfer-tokenize-share-record 1 %s1gghjut3ccd8ay0zduzj64hwre2fx return cmd } + +// NewExemptDelegationCmd defines a command to make delegation to a validator as exempt delegation +func NewExemptDelegationCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "exempt-delegation [validator]", + Short: "Make delegation to a validator as exempt delegation", + Args: cobra.ExactArgs(1), + Long: strings.TrimSpace( + fmt.Sprintf(`Make delegation to a validator as exempt delegation. + +Example: +$ %s tx staking exempt-delegation cosmosvaloper13h5xdxhsdaugwdrkusf8lkgu406h8t62jkqv3h --from mykey +`, + version.AppName, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := &types.MsgExemptDelegation{ + DelegatorAddress: clientCtx.GetFromAddress().String(), + ValidatorAddress: args[0], + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/staking/client/testutil/grpc.go b/x/staking/client/testutil/grpc.go index 6fe3bbf1..609fc2cf 100644 --- a/x/staking/client/testutil/grpc.go +++ b/x/staking/client/testutil/grpc.go @@ -148,7 +148,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryValidatorDelegations() { &types.QueryValidatorDelegationsResponse{}, &types.QueryValidatorDelegationsResponse{ DelegationResponses: types.DelegationResponses{ - types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), + types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), false, sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), }, Pagination: &query.PageResponse{Total: 1}, }, @@ -398,7 +398,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryDelegatorDelegations() { &types.QueryDelegatorDelegationsResponse{}, &types.QueryDelegatorDelegationsResponse{ DelegationResponses: types.DelegationResponses{ - types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), + types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), false, sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), }, Pagination: &query.PageResponse{Total: 1}, }, diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index 97891fdf..63fa725c 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -404,7 +404,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryDelegations() { &types.QueryDelegatorDelegationsResponse{}, &types.QueryDelegatorDelegationsResponse{ DelegationResponses: types.DelegationResponses{ - types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), + types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), false, sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), }, Pagination: &query.PageResponse{}, }, @@ -460,7 +460,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryValidatorDelegations() { &types.QueryValidatorDelegationsResponse{}, &types.QueryValidatorDelegationsResponse{ DelegationResponses: types.DelegationResponses{ - types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), + types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), false, sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), }, Pagination: &query.PageResponse{}, }, diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index ed7f0a47..51eabb32 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -625,7 +625,7 @@ func (k Keeper) Delegate( // Get or create the delegation object delegation, found := k.GetDelegation(ctx, delAddr, validator.GetOperator()) if !found { - delegation = types.NewDelegation(delAddr, validator.GetOperator(), sdk.ZeroDec()) + delegation = types.NewDelegation(delAddr, validator.GetOperator(), sdk.ZeroDec(), false) } // call the appropriate hook if present diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 8df6471a..a3726019 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -44,7 +44,7 @@ func TestDelegation(t *testing.T) { validators[2] = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validators[2], true) // first add a validators[0] to delegate too - bond1to1 := types.NewDelegation(addrDels[0], valAddrs[0], sdk.NewDec(9)) + bond1to1 := types.NewDelegation(addrDels[0], valAddrs[0], sdk.NewDec(9), false) // check the empty keeper first _, found := app.StakingKeeper.GetDelegation(ctx, addrDels[0], valAddrs[0]) @@ -64,11 +64,11 @@ func TestDelegation(t *testing.T) { require.Equal(t, bond1to1, resBond) // add some more records - bond1to2 := types.NewDelegation(addrDels[0], valAddrs[1], sdk.NewDec(9)) - bond1to3 := types.NewDelegation(addrDels[0], valAddrs[2], sdk.NewDec(9)) - bond2to1 := types.NewDelegation(addrDels[1], valAddrs[0], sdk.NewDec(9)) - bond2to2 := types.NewDelegation(addrDels[1], valAddrs[1], sdk.NewDec(9)) - bond2to3 := types.NewDelegation(addrDels[1], valAddrs[2], sdk.NewDec(9)) + bond1to2 := types.NewDelegation(addrDels[0], valAddrs[1], sdk.NewDec(9), false) + bond1to3 := types.NewDelegation(addrDels[0], valAddrs[2], sdk.NewDec(9), false) + bond2to1 := types.NewDelegation(addrDels[1], valAddrs[0], sdk.NewDec(9), false) + bond2to2 := types.NewDelegation(addrDels[1], valAddrs[1], sdk.NewDec(9), false) + bond2to3 := types.NewDelegation(addrDels[1], valAddrs[2], sdk.NewDec(9), false) app.StakingKeeper.SetDelegation(ctx, bond1to2) app.StakingKeeper.SetDelegation(ctx, bond1to3) app.StakingKeeper.SetDelegation(ctx, bond2to1) @@ -208,7 +208,7 @@ func TestUnbondDelegation(t *testing.T) { validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) - delegation := types.NewDelegation(delAddrs[0], valAddrs[0], issuedShares) + delegation := types.NewDelegation(delAddrs[0], valAddrs[0], issuedShares, false) app.StakingKeeper.SetDelegation(ctx, delegation) bondTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) @@ -250,7 +250,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { require.True(sdk.IntEq(t, startTokens, validator.BondedTokens())) require.True(t, validator.IsBonded()) - delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares) + delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares, false) app.StakingKeeper.SetDelegation(ctx, delegation) maxEntries := app.StakingKeeper.MaxEntries(ctx) @@ -419,7 +419,7 @@ func TestRedelegateToSameValidator(t *testing.T) { require.True(t, validator.IsBonded()) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares, false) app.StakingKeeper.SetDelegation(ctx, selfDelegation) _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[0], sdk.NewDec(5)) @@ -447,7 +447,7 @@ func TestRedelegationMaxEntries(t *testing.T) { require.Equal(t, valTokens, issuedShares.RoundInt()) validator = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator, true) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) + selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares, false) app.StakingKeeper.SetDelegation(ctx, selfDelegation) // create a second validator diff --git a/x/staking/keeper/querier.go b/x/staking/keeper/querier.go index 96cacafd..a043b551 100644 --- a/x/staking/keeper/querier.go +++ b/x/staking/keeper/querier.go @@ -461,6 +461,7 @@ func DelegationToDelegationResponse(ctx sdk.Context, k Keeper, del types.Delegat delegatorAddress, del.GetValidatorAddr(), del.Shares, + del.Exempt, sdk.NewCoin(k.BondDenom(ctx), val.TokensFromShares(del.Shares).TruncateInt()), ), nil } diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index 3745717a..6e055227 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -138,7 +138,7 @@ func TestSlashRedelegation(t *testing.T) { app.StakingKeeper.SetRedelegation(ctx, rd) // set the associated delegation - del := types.NewDelegation(addrDels[0], addrVals[1], sdk.NewDec(10)) + del := types.NewDelegation(addrDels[0], addrVals[1], sdk.NewDec(10), false) app.StakingKeeper.SetDelegation(ctx, del) // started redelegating prior to the current height, stake didn't contribute to infraction @@ -396,7 +396,7 @@ func TestSlashWithRedelegation(t *testing.T) { app.StakingKeeper.SetRedelegation(ctx, rd) // set the associated delegation - del := types.NewDelegation(addrDels[0], addrVals[1], sdk.NewDecFromInt(rdTokens)) + del := types.NewDelegation(addrDels[0], addrVals[1], sdk.NewDecFromInt(rdTokens), false) app.StakingKeeper.SetDelegation(ctx, del) // update bonded tokens @@ -550,7 +550,7 @@ func TestSlashBoth(t *testing.T) { app.StakingKeeper.SetRedelegation(ctx, rdA) // set the associated delegation - delA := types.NewDelegation(addrDels[0], addrVals[1], sdk.NewDecFromInt(rdATokens)) + delA := types.NewDelegation(addrDels[0], addrVals[1], sdk.NewDecFromInt(rdATokens), false) app.StakingKeeper.SetDelegation(ctx, delA) // set an unbonding delegation with expiration timestamp (beyond which the diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index d06de8d9..563640b9 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -38,7 +38,7 @@ func TestDecodeStore(t *testing.T) { val, err := types.NewValidator(valAddr1, delPk1, types.NewDescription("test", "test", "test", "test", "test")) require.NoError(t, err) - del := types.NewDelegation(delAddr1, valAddr1, sdk.OneDec()) + del := types.NewDelegation(delAddr1, valAddr1, sdk.OneDec(), false) ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, sdk.OneInt()) red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, sdk.OneInt(), sdk.OneDec()) diff --git a/x/staking/simulation/genesis.go b/x/staking/simulation/genesis.go index 1b54fc77..2ac68403 100644 --- a/x/staking/simulation/genesis.go +++ b/x/staking/simulation/genesis.go @@ -94,7 +94,7 @@ func RandomizedGenState(simState *module.SimulationState) { validator.DelegatorShares = sdk.NewDecFromInt(simState.InitialStake) validator.Commission = commission - delegation := types.NewDelegation(simState.Accounts[i].Address, valAddr, sdk.NewDecFromInt(simState.InitialStake)) + delegation := types.NewDelegation(simState.Accounts[i].Address, valAddr, sdk.NewDecFromInt(simState.InitialStake), false) validators = append(validators, validator) delegations = append(delegations, delegation) diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index 1942fbb7..6294b81c 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -30,11 +30,12 @@ func (dvv DVVTriplet) String() string { // NewDelegation creates a new delegation object //nolint:interfacer -func NewDelegation(delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, shares sdk.Dec) Delegation { +func NewDelegation(delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, shares sdk.Dec, exempt bool) Delegation { return Delegation{ DelegatorAddress: delegatorAddr.String(), ValidatorAddress: validatorAddr.String(), Shares: shares, + Exempt: exempt, } } @@ -295,10 +296,10 @@ func (d Redelegations) String() (out string) { // NewDelegationResp creates a new DelegationResponse instance func NewDelegationResp( - delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, shares sdk.Dec, balance sdk.Coin, + delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, shares sdk.Dec, exempt bool, balance sdk.Coin, ) DelegationResponse { return DelegationResponse{ - Delegation: NewDelegation(delegatorAddr, validatorAddr, shares), + Delegation: NewDelegation(delegatorAddr, validatorAddr, shares, exempt), Balance: balance, } } diff --git a/x/staking/types/delegation_test.go b/x/staking/types/delegation_test.go index cda7bce4..4302e4b8 100644 --- a/x/staking/types/delegation_test.go +++ b/x/staking/types/delegation_test.go @@ -13,7 +13,7 @@ import ( ) func TestDelegationEqual(t *testing.T) { - d1 := types.NewDelegation(sdk.AccAddress(valAddr1), valAddr2, sdk.NewDec(100)) + d1 := types.NewDelegation(sdk.AccAddress(valAddr1), valAddr2, sdk.NewDec(100), false) d2 := d1 ok := d1.String() == d2.String() @@ -27,7 +27,7 @@ func TestDelegationEqual(t *testing.T) { } func TestDelegationString(t *testing.T) { - d := types.NewDelegation(sdk.AccAddress(valAddr1), valAddr2, sdk.NewDec(100)) + d := types.NewDelegation(sdk.AccAddress(valAddr1), valAddr2, sdk.NewDec(100), false) require.NotEmpty(t, d.String()) } @@ -81,9 +81,9 @@ func TestRedelegationString(t *testing.T) { func TestDelegationResponses(t *testing.T) { cdc := codec.NewLegacyAmino() - dr1 := types.NewDelegationResp(sdk.AccAddress(valAddr1), valAddr2, sdk.NewDec(5), + dr1 := types.NewDelegationResp(sdk.AccAddress(valAddr1), valAddr2, sdk.NewDec(5), false, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(5))) - dr2 := types.NewDelegationResp(sdk.AccAddress(valAddr1), valAddr3, sdk.NewDec(5), + dr2 := types.NewDelegationResp(sdk.AccAddress(valAddr1), valAddr3, sdk.NewDec(5), false, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(5))) drs := types.DelegationResponses{dr1, dr2} From 9cd6458172ab94201a86e09e7607234f315368f7 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Fri, 12 Aug 2022 23:08:27 +0800 Subject: [PATCH 54/57] resolve single node test --- x/staking/keeper/msg_server.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index ae388ee1..f6170830 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -289,7 +289,7 @@ func (k msgServer) BeginRedelegate(goCtx context.Context, msg *types.MsgBeginRed } maxTokenizeShareAfter := validator.TotalExemptShares.Sub(shares).Mul(exemptionFactor) - if maxTokenizeShareAfter.GT(validator.TotalTokenizedShares) { + if maxTokenizeShareAfter.LT(validator.TotalTokenizedShares) { return nil, types.ErrInsufficientExemptShares } } @@ -381,7 +381,7 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( exemptionFactor := k.ExemptionFactor(ctx) if delegation.Exempt && !exemptionFactor.IsNegative() { maxTokenizeShareAfter := validator.TotalExemptShares.Sub(shares).Mul(exemptionFactor) - if maxTokenizeShareAfter.GT(validator.TotalTokenizedShares) { + if maxTokenizeShareAfter.LT(validator.TotalTokenizedShares) { return nil, types.ErrInsufficientExemptShares } } @@ -761,6 +761,10 @@ func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemToken return nil, err } + validator, _ = k.GetValidator(ctx, valAddr) + validator.TotalTokenizedShares = validator.TotalTokenizedShares.Sub(shares) + k.SetValidator(ctx, validator) + ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeRedeemShares, From b863b618b66bc9d9287bffa870772f7f16b881d9 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Mon, 15 Aug 2022 22:58:29 +0800 Subject: [PATCH 55/57] - Prevent tokenize share operation from exempt delegation - Add tests for exempt delegation related keeper functions --- x/staking/keeper/delegation_test.go | 152 +++++++++++++++++++++++++++ x/staking/keeper/msg_server.go | 4 + x/staking/keeper/msg_server_test.go | 155 ++++++++++++++++++++++++++++ x/staking/types/errors.go | 17 +-- 4 files changed, 320 insertions(+), 8 deletions(-) diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index a3726019..5eea2508 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -481,3 +481,155 @@ func TestRedelegationMaxEntries(t *testing.T) { _, err = app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDec(1)) require.NoError(t, err) } + +func TestExemptDelegationUndelegate(t *testing.T) { + _, app, ctx := createTestInput(t) + + addrDels := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000)) + addrVals := simapp.ConvertAddrsToValAddrs(addrDels) + + startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) + + bondDenom := app.StakingKeeper.BondDenom(ctx) + notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) + + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) + app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) + + // create a validator and a delegator to that validator + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) + app.StakingKeeper.SetValidator(ctx, validator) + + // set exemption factor + params := app.StakingKeeper.GetParams(ctx) + params.ExemptionFactor = sdk.NewDec(1) + app.StakingKeeper.SetParams(ctx, params) + + // convert to exempt delegation + msgServer := keeper.NewMsgServerImpl(app.StakingKeeper) + + validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + err := delegateCoinsFromAccount(ctx, app, addrDels[0], startTokens, validator) + require.NoError(t, err) + _, err = msgServer.ExemptDelegation(sdk.WrapSDKContext(ctx), &types.MsgExemptDelegation{ + DelegatorAddress: addrDels[0].String(), + ValidatorAddress: addrVals[0].String(), + }) + require.NoError(t, err) + + // tokenize share for 2nd account delegation + validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + err = delegateCoinsFromAccount(ctx, app, addrDels[1], startTokens, validator) + require.NoError(t, err) + tokenizeShareResp, err := msgServer.TokenizeShares(sdk.WrapSDKContext(ctx), &types.MsgTokenizeShares{ + DelegatorAddress: addrDels[1].String(), + ValidatorAddress: addrVals[0].String(), + Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), + TokenizedShareOwner: addrDels[0].String(), + }) + require.NoError(t, err) + + // try undelegating + _, err = msgServer.Undelegate(ctx, &types.MsgUndelegate{ + DelegatorAddress: addrDels[1].String(), + ValidatorAddress: addrVals[0].String(), + Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), + }) + require.Error(t, err) + + // redeem full amount on 2nd account and try undelegation + validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + err = delegateCoinsFromAccount(ctx, app, addrDels[1], startTokens, validator) + require.NoError(t, err) + _, err = msgServer.RedeemTokens(sdk.WrapSDKContext(ctx), &types.MsgRedeemTokensforShares{ + DelegatorAddress: addrDels[1].String(), + Amount: tokenizeShareResp.Amount, + }) + require.NoError(t, err) + + // try undelegating + _, err = msgServer.Undelegate(ctx, &types.MsgUndelegate{ + DelegatorAddress: addrDels[1].String(), + ValidatorAddress: addrVals[0].String(), + Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), + }) + require.NoError(t, err) +} + +func TestExemptDelegationRedelegate(t *testing.T) { + _, app, ctx := createTestInput(t) + + addrDels := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000)) + addrVals := simapp.ConvertAddrsToValAddrs(addrDels) + + startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) + + bondDenom := app.StakingKeeper.BondDenom(ctx) + notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) + + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) + app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) + + // create a validator and a delegator to that validator + validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) + app.StakingKeeper.SetValidator(ctx, validator) + validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) + app.StakingKeeper.SetValidator(ctx, validator2) + + // set exemption factor + params := app.StakingKeeper.GetParams(ctx) + params.ExemptionFactor = sdk.NewDec(1) + app.StakingKeeper.SetParams(ctx, params) + + // convert to exempt delegation + msgServer := keeper.NewMsgServerImpl(app.StakingKeeper) + + validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + err := delegateCoinsFromAccount(ctx, app, addrDels[0], startTokens, validator) + require.NoError(t, err) + _, err = msgServer.ExemptDelegation(sdk.WrapSDKContext(ctx), &types.MsgExemptDelegation{ + DelegatorAddress: addrDels[0].String(), + ValidatorAddress: addrVals[0].String(), + }) + require.NoError(t, err) + + // tokenize share for 2nd account delegation + validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + err = delegateCoinsFromAccount(ctx, app, addrDels[1], startTokens, validator) + require.NoError(t, err) + tokenizeShareResp, err := msgServer.TokenizeShares(sdk.WrapSDKContext(ctx), &types.MsgTokenizeShares{ + DelegatorAddress: addrDels[1].String(), + ValidatorAddress: addrVals[0].String(), + Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), + TokenizedShareOwner: addrDels[0].String(), + }) + require.NoError(t, err) + + // try undelegating + _, err = msgServer.BeginRedelegate(ctx, &types.MsgBeginRedelegate{ + DelegatorAddress: addrDels[1].String(), + ValidatorSrcAddress: addrVals[0].String(), + ValidatorDstAddress: addrVals[1].String(), + Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), + }) + require.Error(t, err) + + // redeem full amount on 2nd account and try undelegation + validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + err = delegateCoinsFromAccount(ctx, app, addrDels[1], startTokens, validator) + require.NoError(t, err) + _, err = msgServer.RedeemTokens(sdk.WrapSDKContext(ctx), &types.MsgRedeemTokensforShares{ + DelegatorAddress: addrDels[1].String(), + Amount: tokenizeShareResp.Amount, + }) + require.NoError(t, err) + + // try undelegating + _, err = msgServer.BeginRedelegate(ctx, &types.MsgBeginRedelegate{ + DelegatorAddress: addrDels[1].String(), + ValidatorSrcAddress: addrVals[0].String(), + ValidatorDstAddress: addrVals[1].String(), + Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), + }) + require.NoError(t, err) +} diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index f6170830..675f0cbf 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -557,6 +557,10 @@ func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeS return nil, sdkstaking.ErrNoDelegatorForAddress } + if delegation.Exempt { + return nil, types.ErrExemptDelegationNotAllowedForTokenizeShare + } + if msg.Amount.Denom != k.BondDenom(ctx) { return nil, types.ErrOnlyBondDenomAllowdForTokenize } diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 2a48db8c..33358b9c 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -28,6 +28,9 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { targetVestingDelAfterShare sdk.Int targetVestingDelAfterRedeem sdk.Int slashFactor sdk.Dec + exemptionFactor sdk.Dec + exemptDelegate bool + exemptDelegatorIndex int expTokenizeErr bool expRedeemErr bool prevAccountDelegationExists bool @@ -40,6 +43,8 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(-1), + exemptDelegate: false, expTokenizeErr: false, expRedeemErr: false, prevAccountDelegationExists: false, @@ -52,6 +57,8 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), slashFactor: sdk.NewDecWithPrec(10, 2), + exemptionFactor: sdk.NewDec(-1), + exemptDelegate: false, expTokenizeErr: false, expRedeemErr: false, prevAccountDelegationExists: false, @@ -64,6 +71,8 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(-1), + exemptDelegate: false, expTokenizeErr: false, expRedeemErr: false, prevAccountDelegationExists: true, @@ -76,6 +85,8 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 30), redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(-1), + exemptDelegate: false, expTokenizeErr: true, expRedeemErr: false, }, @@ -86,6 +97,8 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 40), slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(-1), + exemptDelegate: false, expTokenizeErr: false, expRedeemErr: true, }, @@ -96,6 +109,8 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(-1), + exemptDelegate: false, expTokenizeErr: true, expRedeemErr: false, prevAccountDelegationExists: true, @@ -109,6 +124,55 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { targetVestingDelAfterShare: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), targetVestingDelAfterRedeem: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(-1), + exemptDelegate: false, + expTokenizeErr: false, + expRedeemErr: false, + prevAccountDelegationExists: true, + }, + { + name: "try tokenize share for exempt delegation", + vestingAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + targetVestingDelAfterShare: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + targetVestingDelAfterRedeem: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(10), + exemptDelegate: true, + exemptDelegatorIndex: 1, + expTokenizeErr: true, + expRedeemErr: false, + prevAccountDelegationExists: true, + }, + { + name: "exempt factor enabled without exempt delegation tokenize share", + vestingAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + targetVestingDelAfterShare: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + targetVestingDelAfterRedeem: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(10), + exemptDelegate: false, + expTokenizeErr: true, + expRedeemErr: false, + prevAccountDelegationExists: true, + }, + { + name: "exempt factor enabled with exempt delegation - successful tokenize share", + vestingAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + targetVestingDelAfterShare: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + targetVestingDelAfterRedeem: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + slashFactor: sdk.ZeroDec(), + exemptionFactor: sdk.NewDec(10), + exemptDelegate: true, + exemptDelegatorIndex: 0, expTokenizeErr: false, expRedeemErr: false, prevAccountDelegationExists: true, @@ -122,6 +186,11 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { addrAcc1, addrAcc2 := addrs[0], addrs[1] addrVal1, addrVal2 := sdk.ValAddress(addrAcc1), sdk.ValAddress(addrAcc2) + // set exemption factor + params := app.StakingKeeper.GetParams(ctx) + params.ExemptionFactor = tc.exemptionFactor + app.StakingKeeper.SetParams(ctx, params) + if !tc.vestingAmount.IsZero() { // create vesting account pubkey := secp256k1.GenPrivKey().PubKey() @@ -163,6 +232,16 @@ func TestTokenizeSharesAndRedeemTokens(t *testing.T) { require.True(t, found) msgServer := keeper.NewMsgServerImpl(app.StakingKeeper) + if tc.exemptDelegate { + err := delegateCoinsFromAccount(ctx, app, addrs[tc.exemptDelegatorIndex], delTokens, val1) + require.NoError(t, err) + _, err = msgServer.ExemptDelegation(sdk.WrapSDKContext(ctx), &types.MsgExemptDelegation{ + DelegatorAddress: addrs[tc.exemptDelegatorIndex].String(), + ValidatorAddress: addrVal1.String(), + }) + require.NoError(t, err) + } + resp, err := msgServer.TokenizeShares(sdk.WrapSDKContext(ctx), &types.MsgTokenizeShares{ DelegatorAddress: addrAcc2.String(), ValidatorAddress: addrVal1.String(), @@ -336,3 +415,79 @@ func TestTransferTokenizeShareRecord(t *testing.T) { records = app.StakingKeeper.GetTokenizeShareRecordsByOwner(ctx, addrAcc2) require.Len(t, records, 1) } + +func TestExemptDelegation(t *testing.T) { + _, app, ctx := createTestInput(t) + + testCases := []struct { + name string + delegationAmount sdk.Int + alreadyExempt bool + expectErr bool + }{ + { + name: "delegation not exist case", + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + alreadyExempt: false, + expectErr: false, + }, + { + name: "already exempt delegation case", + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + alreadyExempt: true, + expectErr: false, + }, + { + name: "successful exempt share case", + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + alreadyExempt: false, + expectErr: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + _, app, ctx = createTestInput(t) + addrs := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000)) + addrAcc1 := addrs[0] + addrVal1 := sdk.ValAddress(addrAcc1) + + pubKeys := simapp.CreateTestPubKeys(1) + pk1 := pubKeys[0] + + // Create Validators and Delegation + val1 := teststaking.NewValidator(t, addrVal1, pk1) + val1.Status = sdkstaking.Bonded + app.StakingKeeper.SetValidator(ctx, val1) + app.StakingKeeper.SetValidatorByPowerIndex(ctx, val1) + app.StakingKeeper.SetValidatorByConsAddr(ctx, val1) + + delTokens := tc.delegationAmount + if delTokens.IsPositive() { + err := delegateCoinsFromAccount(ctx, app, addrAcc1, delTokens, val1) + require.NoError(t, err) + } + + msgServer := keeper.NewMsgServerImpl(app.StakingKeeper) + _, err := msgServer.ExemptDelegation(sdk.WrapSDKContext(ctx), &types.MsgExemptDelegation{ + DelegatorAddress: addrAcc1.String(), + ValidatorAddress: addrVal1.String(), + }) + if tc.expectErr { + require.Error(t, err) + } else { + require.NoError(t, err) + + // check exempt true + delegation, found := app.StakingKeeper.GetDelegation(ctx, addrAcc1, addrVal1) + require.True(t, found) + require.True(t, delegation.Exempt) + + // check total exempt shares value increase + validator, found := app.StakingKeeper.GetValidator(ctx, addrVal1) + require.True(t, found) + require.True(t, validator.TotalExemptShares.Equal(delegation.Shares)) + } + }) + } +} diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index b582273e..a8a43c73 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -50,12 +50,13 @@ var ( // ErrNoHistoricalInfo = sdkerrors.Register(ModuleName, 38, "no historical info found") // ErrEmptyValidatorPubKey = sdkerrors.Register(ModuleName, 39, "empty validator public key") // ErrCommissionLTMinRate = sdkerrors.Register(ModuleName, 40, "commission cannot be less than min rate") - ErrNotEnoughBalance = sdkerrors.Register(ModuleName, 41, "not enough balance") - ErrTokenizeShareRecordNotExists = sdkerrors.Register(ModuleName, 42, "tokenize share record not exists") - ErrTokenizeShareRecordAlreadyExists = sdkerrors.Register(ModuleName, 43, "tokenize share record already exists") - ErrNotTokenizeShareRecordOwner = sdkerrors.Register(ModuleName, 44, "not tokenize share record owner") - ErrExceedingFreeVestingDelegations = sdkerrors.Register(ModuleName, 45, "trying to exceed vested free delegation for vesting account") - ErrOnlyBondDenomAllowdForTokenize = sdkerrors.Register(ModuleName, 46, "only bond denom is allowed for tokenize") - ErrInsufficientExemptShares = sdkerrors.Register(ModuleName, 47, "insufficient exempt shares") - ErrRedelegationNotAllowedForExemptDelegation = sdkerrors.Register(ModuleName, 48, "redelegation is not allowed for exempt delegation") + ErrNotEnoughBalance = sdkerrors.Register(ModuleName, 41, "not enough balance") + ErrTokenizeShareRecordNotExists = sdkerrors.Register(ModuleName, 42, "tokenize share record not exists") + ErrTokenizeShareRecordAlreadyExists = sdkerrors.Register(ModuleName, 43, "tokenize share record already exists") + ErrNotTokenizeShareRecordOwner = sdkerrors.Register(ModuleName, 44, "not tokenize share record owner") + ErrExceedingFreeVestingDelegations = sdkerrors.Register(ModuleName, 45, "trying to exceed vested free delegation for vesting account") + ErrOnlyBondDenomAllowdForTokenize = sdkerrors.Register(ModuleName, 46, "only bond denom is allowed for tokenize") + ErrInsufficientExemptShares = sdkerrors.Register(ModuleName, 47, "insufficient exempt shares") + ErrRedelegationNotAllowedForExemptDelegation = sdkerrors.Register(ModuleName, 48, "redelegation is not allowed for exempt delegation") + ErrExemptDelegationNotAllowedForTokenizeShare = sdkerrors.Register(ModuleName, 49, "exempt delegation is not allowed for tokenize share") ) From 7ca24b125cb8438fdea33c5dba93f49639abcd87 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 17 Aug 2022 21:12:00 +0800 Subject: [PATCH 56/57] resolve total exemption share not decrease issue on redelegation and undelegation --- cmd/liquidstakingd/cmd/testnet.go | 4 ++-- x/staking/keeper/msg_server.go | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cmd/liquidstakingd/cmd/testnet.go b/cmd/liquidstakingd/cmd/testnet.go index 9b447660..4fe18677 100644 --- a/cmd/liquidstakingd/cmd/testnet.go +++ b/cmd/liquidstakingd/cmd/testnet.go @@ -114,7 +114,7 @@ or a similar setup where each node has a manually configurable IP address. Note, strict routability for addresses is turned off in the config file. Example: - simd testnet init-files --v 4 --output-dir ./.testnets --starting-ip-address 192.168.10.2 + liquidstakingd testnet init-files --keyring-backend=test --chain-id="liquidstaking-2" --v 4 --output-dir ./testnet --starting-ip-address 192.168.10.2 `, RunE: func(cmd *cobra.Command, _ []string) error { clientCtx, err := client.GetClientQueryContext(cmd) @@ -160,7 +160,7 @@ and generate "v" directories, populated with necessary validator configuration f (private validator, genesis, config, etc.). Example: - simd testnet --v 4 --output-dir ./.testnets + liquidstakingd testnet start --v 4 --output-dir ./.testnets `, RunE: func(cmd *cobra.Command, _ []string) error { diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 675f0cbf..23ef4ca0 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -292,6 +292,10 @@ func (k msgServer) BeginRedelegate(goCtx context.Context, msg *types.MsgBeginRed if maxTokenizeShareAfter.LT(validator.TotalTokenizedShares) { return nil, types.ErrInsufficientExemptShares } + + // reduce exempt delegation on redelegation + validator.TotalExemptShares = validator.TotalExemptShares.Sub(shares) + k.SetValidator(ctx, validator) } bondDenom := k.BondDenom(ctx) @@ -384,6 +388,10 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( if maxTokenizeShareAfter.LT(validator.TotalTokenizedShares) { return nil, types.ErrInsufficientExemptShares } + + // reduce total exempt delegation on unbond + validator.TotalExemptShares = validator.TotalExemptShares.Sub(shares) + k.SetValidator(ctx, validator) } bondDenom := k.BondDenom(ctx) From e9e413ed1cd6896a242e065d5f84cad460649025 Mon Sep 17 00:00:00 2001 From: junkai121 Date: Wed, 17 Aug 2022 21:38:45 +0800 Subject: [PATCH 57/57] add updates for total exempt shares check --- x/staking/keeper/delegation_test.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 5eea2508..ac803eac 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -531,7 +531,7 @@ func TestExemptDelegationUndelegate(t *testing.T) { // try undelegating _, err = msgServer.Undelegate(ctx, &types.MsgUndelegate{ - DelegatorAddress: addrDels[1].String(), + DelegatorAddress: addrDels[0].String(), ValidatorAddress: addrVals[0].String(), Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), }) @@ -549,11 +549,14 @@ func TestExemptDelegationUndelegate(t *testing.T) { // try undelegating _, err = msgServer.Undelegate(ctx, &types.MsgUndelegate{ - DelegatorAddress: addrDels[1].String(), + DelegatorAddress: addrDels[0].String(), ValidatorAddress: addrVals[0].String(), Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), }) require.NoError(t, err) + + validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.Equal(t, validator.TotalExemptShares, sdk.ZeroDec()) } func TestExemptDelegationRedelegate(t *testing.T) { @@ -607,7 +610,7 @@ func TestExemptDelegationRedelegate(t *testing.T) { // try undelegating _, err = msgServer.BeginRedelegate(ctx, &types.MsgBeginRedelegate{ - DelegatorAddress: addrDels[1].String(), + DelegatorAddress: addrDels[0].String(), ValidatorSrcAddress: addrVals[0].String(), ValidatorDstAddress: addrVals[1].String(), Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), @@ -626,10 +629,13 @@ func TestExemptDelegationRedelegate(t *testing.T) { // try undelegating _, err = msgServer.BeginRedelegate(ctx, &types.MsgBeginRedelegate{ - DelegatorAddress: addrDels[1].String(), + DelegatorAddress: addrDels[0].String(), ValidatorSrcAddress: addrVals[0].String(), ValidatorDstAddress: addrVals[1].String(), Amount: sdk.NewCoin(sdk.DefaultBondDenom, startTokens), }) require.NoError(t, err) + + validator, _ = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.Equal(t, validator.TotalExemptShares, sdk.ZeroDec()) }