From 83260b0c2f9afcc7ec94a102f83906e8e56ef18e Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 29 Sep 2022 12:00:53 +0200 Subject: [PATCH 01/12] feat: IS rebase (squash da53124..b45dd5f) --- api/cosmos/staking/v1beta1/staking.pulsar.go | 1883 ++++++++++++---- proto/cosmos/staking/v1beta1/staking.proto | 37 +- .../distribution/keeper/delegation_test.go | 14 +- .../staking/keeper/msg_server_test.go | 1 + .../integration/staking/keeper/slash_test.go | 46 +- .../staking/keeper/validator_test.go | 2 +- x/distribution/keeper/hooks.go | 4 + x/evidence/README.md | 30 +- x/evidence/keeper/infraction.go | 17 + x/evidence/testutil/expected_keepers_mocks.go | 8 +- x/evidence/types/expected_keepers.go | 2 +- x/slashing/README.md | 24 +- x/slashing/keeper/hooks.go | 4 + x/slashing/keeper/infractions.go | 8 +- x/slashing/keeper/keeper.go | 5 +- x/slashing/testutil/expected_keepers_mocks.go | 22 +- x/slashing/types/expected_keepers.go | 7 +- x/staking/README.md | 59 +- x/staking/keeper/delegation.go | 28 +- x/staking/keeper/delegation_test.go | 5 +- x/staking/keeper/grpc_query.go | 1 + x/staking/keeper/keeper.go | 17 + x/staking/keeper/slash.go | 6 +- x/staking/keeper/slash_test.go | 2 +- x/staking/keeper/unbonding.go | 454 ++++ x/staking/keeper/unbonding_test.go | 424 ++++ x/staking/keeper/val_state_change.go | 11 + x/staking/keeper/validator.go | 28 +- x/staking/simulation/decoder_test.go | 4 +- x/staking/simulation/operations_test.go | 2 +- x/staking/testutil/expected_keepers_mocks.go | 22 +- x/staking/types/delegation.go | 75 +- x/staking/types/delegation_test.go | 14 +- x/staking/types/errors.go | 2 + x/staking/types/expected_keepers.go | 3 +- x/staking/types/hooks.go | 9 + x/staking/types/keys.go | 31 +- x/staking/types/staking.pb.go | 1890 +++++++++++------ x/staking/types/validator.go | 23 +- 39 files changed, 4101 insertions(+), 1123 deletions(-) create mode 100644 x/staking/keeper/unbonding.go create mode 100644 x/staking/keeper/unbonding_test.go diff --git a/api/cosmos/staking/v1beta1/staking.pulsar.go b/api/cosmos/staking/v1beta1/staking.pulsar.go index c674415af918..b9acb126a61c 100644 --- a/api/cosmos/staking/v1beta1/staking.pulsar.go +++ b/api/cosmos/staking/v1beta1/staking.pulsar.go @@ -3,6 +3,7 @@ package stakingv1beta1 import ( v1beta1 "cosmossdk.io/api/cosmos/base/v1beta1" + abci "cosmossdk.io/api/tendermint/abci" types "cosmossdk.io/api/tendermint/types" fmt "fmt" _ "github.com/cosmos/cosmos-proto" @@ -2330,19 +2331,67 @@ func (x *fastReflection_Description) ProtoMethods() *protoiface.Methods { } } +var _ protoreflect.List = (*_Validator_13_list)(nil) + +type _Validator_13_list struct { + list *[]uint64 +} + +func (x *_Validator_13_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_Validator_13_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfUint64((*x.list)[i]) +} + +func (x *_Validator_13_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_Validator_13_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_Validator_13_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message Validator at list field UnbondingIds as it is not of Message kind")) +} + +func (x *_Validator_13_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_Validator_13_list) NewElement() protoreflect.Value { + v := uint64(0) + return protoreflect.ValueOfUint64(v) +} + +func (x *_Validator_13_list) IsValid() bool { + return x.list != nil +} + var ( - md_Validator protoreflect.MessageDescriptor - fd_Validator_operator_address protoreflect.FieldDescriptor - fd_Validator_consensus_pubkey protoreflect.FieldDescriptor - fd_Validator_jailed protoreflect.FieldDescriptor - fd_Validator_status protoreflect.FieldDescriptor - fd_Validator_tokens protoreflect.FieldDescriptor - fd_Validator_delegator_shares protoreflect.FieldDescriptor - fd_Validator_description protoreflect.FieldDescriptor - fd_Validator_unbonding_height protoreflect.FieldDescriptor - fd_Validator_unbonding_time protoreflect.FieldDescriptor - fd_Validator_commission protoreflect.FieldDescriptor - fd_Validator_min_self_delegation protoreflect.FieldDescriptor + md_Validator protoreflect.MessageDescriptor + fd_Validator_operator_address protoreflect.FieldDescriptor + fd_Validator_consensus_pubkey protoreflect.FieldDescriptor + fd_Validator_jailed protoreflect.FieldDescriptor + fd_Validator_status protoreflect.FieldDescriptor + fd_Validator_tokens protoreflect.FieldDescriptor + fd_Validator_delegator_shares protoreflect.FieldDescriptor + fd_Validator_description protoreflect.FieldDescriptor + fd_Validator_unbonding_height protoreflect.FieldDescriptor + fd_Validator_unbonding_time protoreflect.FieldDescriptor + fd_Validator_commission protoreflect.FieldDescriptor + fd_Validator_min_self_delegation protoreflect.FieldDescriptor + fd_Validator_unbonding_on_hold_ref_count protoreflect.FieldDescriptor + fd_Validator_unbonding_ids protoreflect.FieldDescriptor ) func init() { @@ -2359,6 +2408,8 @@ func init() { fd_Validator_unbonding_time = md_Validator.Fields().ByName("unbonding_time") fd_Validator_commission = md_Validator.Fields().ByName("commission") fd_Validator_min_self_delegation = md_Validator.Fields().ByName("min_self_delegation") + fd_Validator_unbonding_on_hold_ref_count = md_Validator.Fields().ByName("unbonding_on_hold_ref_count") + fd_Validator_unbonding_ids = md_Validator.Fields().ByName("unbonding_ids") } var _ protoreflect.Message = (*fastReflection_Validator)(nil) @@ -2492,6 +2543,18 @@ func (x *fastReflection_Validator) Range(f func(protoreflect.FieldDescriptor, pr return } } + if x.UnbondingOnHoldRefCount != int64(0) { + value := protoreflect.ValueOfInt64(x.UnbondingOnHoldRefCount) + if !f(fd_Validator_unbonding_on_hold_ref_count, value) { + return + } + } + if len(x.UnbondingIds) != 0 { + value := protoreflect.ValueOfList(&_Validator_13_list{list: &x.UnbondingIds}) + if !f(fd_Validator_unbonding_ids, value) { + return + } + } } // Has reports whether a field is populated. @@ -2529,6 +2592,10 @@ func (x *fastReflection_Validator) Has(fd protoreflect.FieldDescriptor) bool { return x.Commission != nil case "cosmos.staking.v1beta1.Validator.min_self_delegation": return x.MinSelfDelegation != "" + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + return x.UnbondingOnHoldRefCount != int64(0) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + return len(x.UnbondingIds) != 0 default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2567,6 +2634,10 @@ func (x *fastReflection_Validator) Clear(fd protoreflect.FieldDescriptor) { x.Commission = nil case "cosmos.staking.v1beta1.Validator.min_self_delegation": x.MinSelfDelegation = "" + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = int64(0) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + x.UnbondingIds = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2616,6 +2687,15 @@ func (x *fastReflection_Validator) Get(descriptor protoreflect.FieldDescriptor) case "cosmos.staking.v1beta1.Validator.min_self_delegation": value := x.MinSelfDelegation return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + value := x.UnbondingOnHoldRefCount + return protoreflect.ValueOfInt64(value) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + if len(x.UnbondingIds) == 0 { + return protoreflect.ValueOfList(&_Validator_13_list{}) + } + listValue := &_Validator_13_list{list: &x.UnbondingIds} + return protoreflect.ValueOfList(listValue) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2658,6 +2738,12 @@ func (x *fastReflection_Validator) Set(fd protoreflect.FieldDescriptor, value pr x.Commission = value.Message().Interface().(*Commission) case "cosmos.staking.v1beta1.Validator.min_self_delegation": x.MinSelfDelegation = value.Interface().(string) + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = value.Int() + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + lv := value.List() + clv := lv.(*_Validator_13_list) + x.UnbondingIds = *clv.list default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2698,6 +2784,12 @@ func (x *fastReflection_Validator) Mutable(fd protoreflect.FieldDescriptor) prot x.Commission = new(Commission) } return protoreflect.ValueOfMessage(x.Commission.ProtoReflect()) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + if x.UnbondingIds == nil { + x.UnbondingIds = []uint64{} + } + value := &_Validator_13_list{list: &x.UnbondingIds} + return protoreflect.ValueOfList(value) case "cosmos.staking.v1beta1.Validator.operator_address": panic(fmt.Errorf("field operator_address of message cosmos.staking.v1beta1.Validator is not mutable")) case "cosmos.staking.v1beta1.Validator.jailed": @@ -2712,6 +2804,8 @@ func (x *fastReflection_Validator) Mutable(fd protoreflect.FieldDescriptor) prot panic(fmt.Errorf("field unbonding_height of message cosmos.staking.v1beta1.Validator is not mutable")) case "cosmos.staking.v1beta1.Validator.min_self_delegation": panic(fmt.Errorf("field min_self_delegation of message cosmos.staking.v1beta1.Validator is not mutable")) + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + panic(fmt.Errorf("field unbonding_on_hold_ref_count of message cosmos.staking.v1beta1.Validator is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2751,6 +2845,11 @@ func (x *fastReflection_Validator) NewField(fd protoreflect.FieldDescriptor) pro return protoreflect.ValueOfMessage(m.ProtoReflect()) case "cosmos.staking.v1beta1.Validator.min_self_delegation": return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + return protoreflect.ValueOfInt64(int64(0)) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + list := []uint64{} + return protoreflect.ValueOfList(&_Validator_13_list{list: &list}) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2861,6 +2960,16 @@ func (x *fastReflection_Validator) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.UnbondingOnHoldRefCount != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingOnHoldRefCount)) + } + if len(x.UnbondingIds) > 0 { + l = 0 + for _, e := range x.UnbondingIds { + l += runtime.Sov(uint64(e)) + } + n += 1 + runtime.Sov(uint64(l)) + l + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -2890,6 +2999,31 @@ func (x *fastReflection_Validator) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if len(x.UnbondingIds) > 0 { + var pksize2 int + for _, num := range x.UnbondingIds { + pksize2 += runtime.Sov(uint64(num)) + } + i -= pksize2 + j1 := i + for _, num := range x.UnbondingIds { + for num >= 1<<7 { + dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA[j1] = uint8(num) + j1++ + } + i = runtime.EncodeVarint(dAtA, i, uint64(pksize2)) + i-- + dAtA[i] = 0x6a + } + if x.UnbondingOnHoldRefCount != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x60 + } if len(x.MinSelfDelegation) > 0 { i -= len(x.MinSelfDelegation) copy(dAtA[i:], x.MinSelfDelegation) @@ -3373,6 +3507,101 @@ func (x *fastReflection_Validator) ProtoMethods() *protoiface.Methods { } x.MinSelfDelegation = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 12: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + x.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.UnbondingIds = append(x.UnbondingIds, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(x.UnbondingIds) == 0 { + x.UnbondingIds = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.UnbondingIds = append(x.UnbondingIds, v) + } + } else { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingIds", wireType) + } default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -7079,11 +7308,13 @@ func (x *fastReflection_UnbondingDelegation) ProtoMethods() *protoiface.Methods } var ( - md_UnbondingDelegationEntry protoreflect.MessageDescriptor - fd_UnbondingDelegationEntry_creation_height protoreflect.FieldDescriptor - fd_UnbondingDelegationEntry_completion_time protoreflect.FieldDescriptor - fd_UnbondingDelegationEntry_initial_balance protoreflect.FieldDescriptor - fd_UnbondingDelegationEntry_balance protoreflect.FieldDescriptor + md_UnbondingDelegationEntry protoreflect.MessageDescriptor + fd_UnbondingDelegationEntry_creation_height protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_completion_time protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_initial_balance protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_balance protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_unbonding_id protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_unbonding_on_hold_ref_count protoreflect.FieldDescriptor ) func init() { @@ -7093,6 +7324,8 @@ func init() { fd_UnbondingDelegationEntry_completion_time = md_UnbondingDelegationEntry.Fields().ByName("completion_time") fd_UnbondingDelegationEntry_initial_balance = md_UnbondingDelegationEntry.Fields().ByName("initial_balance") fd_UnbondingDelegationEntry_balance = md_UnbondingDelegationEntry.Fields().ByName("balance") + fd_UnbondingDelegationEntry_unbonding_id = md_UnbondingDelegationEntry.Fields().ByName("unbonding_id") + fd_UnbondingDelegationEntry_unbonding_on_hold_ref_count = md_UnbondingDelegationEntry.Fields().ByName("unbonding_on_hold_ref_count") } var _ protoreflect.Message = (*fastReflection_UnbondingDelegationEntry)(nil) @@ -7184,6 +7417,18 @@ func (x *fastReflection_UnbondingDelegationEntry) Range(f func(protoreflect.Fiel return } } + if x.UnbondingId != uint64(0) { + value := protoreflect.ValueOfUint64(x.UnbondingId) + if !f(fd_UnbondingDelegationEntry_unbonding_id, value) { + return + } + } + if x.UnbondingOnHoldRefCount != int64(0) { + value := protoreflect.ValueOfInt64(x.UnbondingOnHoldRefCount) + if !f(fd_UnbondingDelegationEntry_unbonding_on_hold_ref_count, value) { + return + } + } } // Has reports whether a field is populated. @@ -7207,6 +7452,10 @@ func (x *fastReflection_UnbondingDelegationEntry) Has(fd protoreflect.FieldDescr return x.InitialBalance != "" case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": return x.Balance != "" + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + return x.UnbondingId != uint64(0) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + return x.UnbondingOnHoldRefCount != int64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7231,6 +7480,10 @@ func (x *fastReflection_UnbondingDelegationEntry) Clear(fd protoreflect.FieldDes x.InitialBalance = "" case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": x.Balance = "" + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + x.UnbondingId = uint64(0) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = int64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7259,6 +7512,12 @@ func (x *fastReflection_UnbondingDelegationEntry) Get(descriptor protoreflect.Fi case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": value := x.Balance return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + value := x.UnbondingId + return protoreflect.ValueOfUint64(value) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + value := x.UnbondingOnHoldRefCount + return protoreflect.ValueOfInt64(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7287,6 +7546,10 @@ func (x *fastReflection_UnbondingDelegationEntry) Set(fd protoreflect.FieldDescr x.InitialBalance = value.Interface().(string) case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": x.Balance = value.Interface().(string) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + x.UnbondingId = value.Uint() + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = value.Int() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7318,6 +7581,10 @@ func (x *fastReflection_UnbondingDelegationEntry) Mutable(fd protoreflect.FieldD panic(fmt.Errorf("field initial_balance of message cosmos.staking.v1beta1.UnbondingDelegationEntry is not mutable")) case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": panic(fmt.Errorf("field balance of message cosmos.staking.v1beta1.UnbondingDelegationEntry is not mutable")) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + panic(fmt.Errorf("field unbonding_id of message cosmos.staking.v1beta1.UnbondingDelegationEntry is not mutable")) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + panic(fmt.Errorf("field unbonding_on_hold_ref_count of message cosmos.staking.v1beta1.UnbondingDelegationEntry is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7340,6 +7607,10 @@ func (x *fastReflection_UnbondingDelegationEntry) NewField(fd protoreflect.Field return protoreflect.ValueOfString("") case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + return protoreflect.ValueOfUint64(uint64(0)) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + return protoreflect.ValueOfInt64(int64(0)) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7424,6 +7695,12 @@ func (x *fastReflection_UnbondingDelegationEntry) ProtoMethods() *protoiface.Met if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.UnbondingId != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingId)) + } + if x.UnbondingOnHoldRefCount != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingOnHoldRefCount)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -7453,6 +7730,16 @@ func (x *fastReflection_UnbondingDelegationEntry) ProtoMethods() *protoiface.Met i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.UnbondingOnHoldRefCount != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if x.UnbondingId != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingId)) + i-- + dAtA[i] = 0x28 + } if len(x.Balance) > 0 { i -= len(x.Balance) copy(dAtA[i:], x.Balance) @@ -7654,6 +7941,44 @@ func (x *fastReflection_UnbondingDelegationEntry) ProtoMethods() *protoiface.Met } x.Balance = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + x.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + x.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -7690,11 +8015,13 @@ func (x *fastReflection_UnbondingDelegationEntry) ProtoMethods() *protoiface.Met } var ( - md_RedelegationEntry protoreflect.MessageDescriptor - fd_RedelegationEntry_creation_height protoreflect.FieldDescriptor - fd_RedelegationEntry_completion_time protoreflect.FieldDescriptor - fd_RedelegationEntry_initial_balance protoreflect.FieldDescriptor - fd_RedelegationEntry_shares_dst protoreflect.FieldDescriptor + md_RedelegationEntry protoreflect.MessageDescriptor + fd_RedelegationEntry_creation_height protoreflect.FieldDescriptor + fd_RedelegationEntry_completion_time protoreflect.FieldDescriptor + fd_RedelegationEntry_initial_balance protoreflect.FieldDescriptor + fd_RedelegationEntry_shares_dst protoreflect.FieldDescriptor + fd_RedelegationEntry_unbonding_id protoreflect.FieldDescriptor + fd_RedelegationEntry_unbonding_on_hold_ref_count protoreflect.FieldDescriptor ) func init() { @@ -7704,6 +8031,8 @@ func init() { fd_RedelegationEntry_completion_time = md_RedelegationEntry.Fields().ByName("completion_time") fd_RedelegationEntry_initial_balance = md_RedelegationEntry.Fields().ByName("initial_balance") fd_RedelegationEntry_shares_dst = md_RedelegationEntry.Fields().ByName("shares_dst") + fd_RedelegationEntry_unbonding_id = md_RedelegationEntry.Fields().ByName("unbonding_id") + fd_RedelegationEntry_unbonding_on_hold_ref_count = md_RedelegationEntry.Fields().ByName("unbonding_on_hold_ref_count") } var _ protoreflect.Message = (*fastReflection_RedelegationEntry)(nil) @@ -7795,6 +8124,18 @@ func (x *fastReflection_RedelegationEntry) Range(f func(protoreflect.FieldDescri return } } + if x.UnbondingId != uint64(0) { + value := protoreflect.ValueOfUint64(x.UnbondingId) + if !f(fd_RedelegationEntry_unbonding_id, value) { + return + } + } + if x.UnbondingOnHoldRefCount != int64(0) { + value := protoreflect.ValueOfInt64(x.UnbondingOnHoldRefCount) + if !f(fd_RedelegationEntry_unbonding_on_hold_ref_count, value) { + return + } + } } // Has reports whether a field is populated. @@ -7818,6 +8159,10 @@ func (x *fastReflection_RedelegationEntry) Has(fd protoreflect.FieldDescriptor) return x.InitialBalance != "" case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": return x.SharesDst != "" + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + return x.UnbondingId != uint64(0) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + return x.UnbondingOnHoldRefCount != int64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7842,6 +8187,10 @@ func (x *fastReflection_RedelegationEntry) Clear(fd protoreflect.FieldDescriptor x.InitialBalance = "" case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": x.SharesDst = "" + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + x.UnbondingId = uint64(0) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = int64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7870,6 +8219,12 @@ func (x *fastReflection_RedelegationEntry) Get(descriptor protoreflect.FieldDesc case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": value := x.SharesDst return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + value := x.UnbondingId + return protoreflect.ValueOfUint64(value) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + value := x.UnbondingOnHoldRefCount + return protoreflect.ValueOfInt64(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7898,6 +8253,10 @@ func (x *fastReflection_RedelegationEntry) Set(fd protoreflect.FieldDescriptor, x.InitialBalance = value.Interface().(string) case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": x.SharesDst = value.Interface().(string) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + x.UnbondingId = value.Uint() + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = value.Int() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7929,6 +8288,10 @@ func (x *fastReflection_RedelegationEntry) Mutable(fd protoreflect.FieldDescript panic(fmt.Errorf("field initial_balance of message cosmos.staking.v1beta1.RedelegationEntry is not mutable")) case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": panic(fmt.Errorf("field shares_dst of message cosmos.staking.v1beta1.RedelegationEntry is not mutable")) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + panic(fmt.Errorf("field unbonding_id of message cosmos.staking.v1beta1.RedelegationEntry is not mutable")) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + panic(fmt.Errorf("field unbonding_on_hold_ref_count of message cosmos.staking.v1beta1.RedelegationEntry is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7951,6 +8314,10 @@ func (x *fastReflection_RedelegationEntry) NewField(fd protoreflect.FieldDescrip return protoreflect.ValueOfString("") case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + return protoreflect.ValueOfUint64(uint64(0)) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + return protoreflect.ValueOfInt64(int64(0)) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -8035,6 +8402,12 @@ func (x *fastReflection_RedelegationEntry) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.UnbondingId != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingId)) + } + if x.UnbondingOnHoldRefCount != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingOnHoldRefCount)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -8064,6 +8437,16 @@ func (x *fastReflection_RedelegationEntry) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.UnbondingOnHoldRefCount != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if x.UnbondingId != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingId)) + i-- + dAtA[i] = 0x28 + } if len(x.SharesDst) > 0 { i -= len(x.SharesDst) copy(dAtA[i:], x.SharesDst) @@ -8265,6 +8648,44 @@ func (x *fastReflection_RedelegationEntry) ProtoMethods() *protoiface.Methods { } x.SharesDst = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + x.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + x.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -11763,93 +12184,640 @@ func (x *fastReflection_Pool) ProtoMethods() *protoiface.Methods { } } -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: cosmos/staking/v1beta1/staking.proto +var _ protoreflect.List = (*_ValidatorUpdates_1_list)(nil) -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) +type _ValidatorUpdates_1_list struct { + list *[]*abci.ValidatorUpdate +} -// BondStatus is the status of a validator. -type BondStatus int32 +func (x *_ValidatorUpdates_1_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} -const ( - // UNSPECIFIED defines an invalid validator status. - BondStatus_BOND_STATUS_UNSPECIFIED BondStatus = 0 - // UNBONDED defines a validator that is not bonded. - BondStatus_BOND_STATUS_UNBONDED BondStatus = 1 - // UNBONDING defines a validator that is unbonding. - BondStatus_BOND_STATUS_UNBONDING BondStatus = 2 - // BONDED defines a validator that is bonded. - BondStatus_BOND_STATUS_BONDED BondStatus = 3 -) +func (x *_ValidatorUpdates_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) +} -// Enum value maps for BondStatus. -var ( - BondStatus_name = map[int32]string{ - 0: "BOND_STATUS_UNSPECIFIED", - 1: "BOND_STATUS_UNBONDED", - 2: "BOND_STATUS_UNBONDING", - 3: "BOND_STATUS_BONDED", - } - BondStatus_value = map[string]int32{ - "BOND_STATUS_UNSPECIFIED": 0, - "BOND_STATUS_UNBONDED": 1, - "BOND_STATUS_UNBONDING": 2, - "BOND_STATUS_BONDED": 3, - } -) +func (x *_ValidatorUpdates_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*abci.ValidatorUpdate) + (*x.list)[i] = concreteValue +} -func (x BondStatus) Enum() *BondStatus { - p := new(BondStatus) - *p = x - return p +func (x *_ValidatorUpdates_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*abci.ValidatorUpdate) + *x.list = append(*x.list, concreteValue) } -func (x BondStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +func (x *_ValidatorUpdates_1_list) AppendMutable() protoreflect.Value { + v := new(abci.ValidatorUpdate) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) } -func (BondStatus) Descriptor() protoreflect.EnumDescriptor { - return file_cosmos_staking_v1beta1_staking_proto_enumTypes[0].Descriptor() +func (x *_ValidatorUpdates_1_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] } -func (BondStatus) Type() protoreflect.EnumType { - return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[0] +func (x *_ValidatorUpdates_1_list) NewElement() protoreflect.Value { + v := new(abci.ValidatorUpdate) + return protoreflect.ValueOfMessage(v.ProtoReflect()) } -func (x BondStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) +func (x *_ValidatorUpdates_1_list) IsValid() bool { + return x.list != nil } -// Deprecated: Use BondStatus.Descriptor instead. -func (BondStatus) EnumDescriptor() ([]byte, []int) { - return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{0} +var ( + md_ValidatorUpdates protoreflect.MessageDescriptor + fd_ValidatorUpdates_updates protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_staking_v1beta1_staking_proto_init() + md_ValidatorUpdates = File_cosmos_staking_v1beta1_staking_proto.Messages().ByName("ValidatorUpdates") + fd_ValidatorUpdates_updates = md_ValidatorUpdates.Fields().ByName("updates") } -// 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 { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +var _ protoreflect.Message = (*fastReflection_ValidatorUpdates)(nil) - Header *types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - Valset []*Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset,omitempty"` +type fastReflection_ValidatorUpdates ValidatorUpdates + +func (x *ValidatorUpdates) ProtoReflect() protoreflect.Message { + return (*fastReflection_ValidatorUpdates)(x) } -func (x *HistoricalInfo) Reset() { - *x = HistoricalInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[0] +func (x *ValidatorUpdates) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_ValidatorUpdates_messageType fastReflection_ValidatorUpdates_messageType +var _ protoreflect.MessageType = fastReflection_ValidatorUpdates_messageType{} + +type fastReflection_ValidatorUpdates_messageType struct{} + +func (x fastReflection_ValidatorUpdates_messageType) Zero() protoreflect.Message { + return (*fastReflection_ValidatorUpdates)(nil) +} +func (x fastReflection_ValidatorUpdates_messageType) New() protoreflect.Message { + return new(fastReflection_ValidatorUpdates) +} +func (x fastReflection_ValidatorUpdates_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_ValidatorUpdates +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_ValidatorUpdates) Descriptor() protoreflect.MessageDescriptor { + return md_ValidatorUpdates +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_ValidatorUpdates) Type() protoreflect.MessageType { + return _fastReflection_ValidatorUpdates_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_ValidatorUpdates) New() protoreflect.Message { + return new(fastReflection_ValidatorUpdates) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_ValidatorUpdates) Interface() protoreflect.ProtoMessage { + return (*ValidatorUpdates)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_ValidatorUpdates) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Updates) != 0 { + value := protoreflect.ValueOfList(&_ValidatorUpdates_1_list{list: &x.Updates}) + if !f(fd_ValidatorUpdates_updates, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_ValidatorUpdates) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + return len(x.Updates) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValidatorUpdates) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + x.Updates = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_ValidatorUpdates) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + if len(x.Updates) == 0 { + return protoreflect.ValueOfList(&_ValidatorUpdates_1_list{}) + } + listValue := &_ValidatorUpdates_1_list{list: &x.Updates} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValidatorUpdates) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + lv := value.List() + clv := lv.(*_ValidatorUpdates_1_list) + x.Updates = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValidatorUpdates) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + if x.Updates == nil { + x.Updates = []*abci.ValidatorUpdate{} + } + value := &_ValidatorUpdates_1_list{list: &x.Updates} + return protoreflect.ValueOfList(value) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_ValidatorUpdates) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + list := []*abci.ValidatorUpdate{} + return protoreflect.ValueOfList(&_ValidatorUpdates_1_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_ValidatorUpdates) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.staking.v1beta1.ValidatorUpdates", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_ValidatorUpdates) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValidatorUpdates) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_ValidatorUpdates) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_ValidatorUpdates) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*ValidatorUpdates) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if len(x.Updates) > 0 { + for _, e := range x.Updates { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*ValidatorUpdates) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Updates) > 0 { + for iNdEx := len(x.Updates) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.Updates[iNdEx]) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*ValidatorUpdates) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ValidatorUpdates: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ValidatorUpdates: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Updates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Updates = append(x.Updates, &abci.ValidatorUpdate{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Updates[len(x.Updates)-1]); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: cosmos/staking/v1beta1/staking.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// BondStatus is the status of a validator. +type BondStatus int32 + +const ( + // UNSPECIFIED defines an invalid validator status. + BondStatus_BOND_STATUS_UNSPECIFIED BondStatus = 0 + // UNBONDED defines a validator that is not bonded. + BondStatus_BOND_STATUS_UNBONDED BondStatus = 1 + // UNBONDING defines a validator that is unbonding. + BondStatus_BOND_STATUS_UNBONDING BondStatus = 2 + // BONDED defines a validator that is bonded. + BondStatus_BOND_STATUS_BONDED BondStatus = 3 +) + +// Enum value maps for BondStatus. +var ( + BondStatus_name = map[int32]string{ + 0: "BOND_STATUS_UNSPECIFIED", + 1: "BOND_STATUS_UNBONDED", + 2: "BOND_STATUS_UNBONDING", + 3: "BOND_STATUS_BONDED", + } + BondStatus_value = map[string]int32{ + "BOND_STATUS_UNSPECIFIED": 0, + "BOND_STATUS_UNBONDED": 1, + "BOND_STATUS_UNBONDING": 2, + "BOND_STATUS_BONDED": 3, + } +) + +func (x BondStatus) Enum() *BondStatus { + p := new(BondStatus) + *p = x + return p +} + +func (x BondStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BondStatus) Descriptor() protoreflect.EnumDescriptor { + return file_cosmos_staking_v1beta1_staking_proto_enumTypes[0].Descriptor() +} + +func (BondStatus) Type() protoreflect.EnumType { + return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[0] +} + +func (x BondStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BondStatus.Descriptor instead. +func (BondStatus) EnumDescriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{0} +} + +// Infraction indicates the infraction a validator commited. +type Infraction int32 + +const ( + // UNSPECIFIED defines an empty infraction. + Infraction_INFRACTION_UNSPECIFIED Infraction = 0 + // DOUBLE_SIGN defines a validator that double-signs a block. + Infraction_INFRACTION_DOUBLE_SIGN Infraction = 1 + // DOWNTIME defines a validator that missed signing too many blocks. + Infraction_INFRACTION_DOWNTIME Infraction = 2 +) + +// Enum value maps for Infraction. +var ( + Infraction_name = map[int32]string{ + 0: "INFRACTION_UNSPECIFIED", + 1: "INFRACTION_DOUBLE_SIGN", + 2: "INFRACTION_DOWNTIME", + } + Infraction_value = map[string]int32{ + "INFRACTION_UNSPECIFIED": 0, + "INFRACTION_DOUBLE_SIGN": 1, + "INFRACTION_DOWNTIME": 2, + } +) + +func (x Infraction) Enum() *Infraction { + p := new(Infraction) + *p = x + return p +} + +func (x Infraction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Infraction) Descriptor() protoreflect.EnumDescriptor { + return file_cosmos_staking_v1beta1_staking_proto_enumTypes[1].Descriptor() +} + +func (Infraction) Type() protoreflect.EnumType { + return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[1] +} + +func (x Infraction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Infraction.Descriptor instead. +func (Infraction) EnumDescriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{1} +} + +// 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 { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + Valset []*Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset,omitempty"` +} + +func (x *HistoricalInfo) Reset() { + *x = HistoricalInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12092,6 +13060,10 @@ type Validator struct { // // Since: cosmos-sdk 0.46 MinSelfDelegation string `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3" json:"min_self_delegation,omitempty"` + // strictly positive if this validator's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,12,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` + // list of unbonding ids, each uniquely identifing an unbonding of this validator + UnbondingIds []uint64 `protobuf:"varint,13,rep,packed,name=unbonding_ids,json=unbondingIds,proto3" json:"unbonding_ids,omitempty"` } func (x *Validator) Reset() { @@ -12191,6 +13163,20 @@ func (x *Validator) GetMinSelfDelegation() string { return "" } +func (x *Validator) GetUnbondingOnHoldRefCount() int64 { + if x != nil { + return x.UnbondingOnHoldRefCount + } + return 0 +} + +func (x *Validator) GetUnbondingIds() []uint64 { + if x != nil { + return x.UnbondingIds + } + return nil +} + // ValAddresses defines a repeated set of validator addresses. type ValAddresses struct { state protoimpl.MessageState @@ -12527,6 +13513,10 @@ type UnbondingDelegationEntry struct { InitialBalance string `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3" json:"initial_balance,omitempty"` // balance defines the tokens to receive at completion. Balance string `protobuf:"bytes,4,opt,name=balance,proto3" json:"balance,omitempty"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (x *UnbondingDelegationEntry) Reset() { @@ -12577,6 +13567,20 @@ func (x *UnbondingDelegationEntry) GetBalance() string { return "" } +func (x *UnbondingDelegationEntry) GetUnbondingId() uint64 { + if x != nil { + return x.UnbondingId + } + return 0 +} + +func (x *UnbondingDelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if x != nil { + return x.UnbondingOnHoldRefCount + } + return 0 +} + // RedelegationEntry defines a redelegation object with relevant metadata. type RedelegationEntry struct { state protoimpl.MessageState @@ -12591,6 +13595,10 @@ type RedelegationEntry struct { InitialBalance string `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3" json:"initial_balance,omitempty"` // shares_dst is the amount of destination-validator shares created by redelegation. SharesDst string `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3" json:"shares_dst,omitempty"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (x *RedelegationEntry) Reset() { @@ -12641,6 +13649,20 @@ func (x *RedelegationEntry) GetSharesDst() string { return "" } +func (x *RedelegationEntry) GetUnbondingId() uint64 { + if x != nil { + return x.UnbondingId + } + return 0 +} + +func (x *RedelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if x != nil { + return x.UnbondingOnHoldRefCount + } + return 0 +} + // Redelegation contains the list of a particular delegator's redelegating bonds // from a particular source validator to a particular destination validator. type Redelegation struct { @@ -12970,6 +13992,43 @@ func (x *Pool) GetBondedTokens() string { return "" } +// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. +// TODO: explore moving this to proto/cosmos/base to separate modules from tendermint dependence +type ValidatorUpdates struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Updates []*abci.ValidatorUpdate `protobuf:"bytes,1,rep,name=updates,proto3" json:"updates,omitempty"` +} + +func (x *ValidatorUpdates) Reset() { + *x = ValidatorUpdates{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidatorUpdates) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatorUpdates) ProtoMessage() {} + +// Deprecated: Use ValidatorUpdates.ProtoReflect.Descriptor instead. +func (*ValidatorUpdates) Descriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{20} +} + +func (x *ValidatorUpdates) GetUpdates() []*abci.ValidatorUpdate { + if x != nil { + return x.Updates + } + return nil +} + var File_cosmos_staking_v1beta1_staking_proto protoreflect.FileDescriptor var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ @@ -12989,109 +14048,117 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x6d, 0x6f, 0x73, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x89, 0x01, 0x0a, 0x0e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x06, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x73, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, - 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x76, - 0x61, 0x6c, 0x73, 0x65, 0x74, 0x22, 0xac, 0x02, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x04, 0x72, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, - 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, - 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, - 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, - 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x07, 0x6d, 0x61, 0x78, - 0x52, 0x61, 0x74, 0x65, 0x12, 0x64, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, - 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, - 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, - 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x0d, 0x6d, 0x61, 0x78, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, - 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xbb, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x61, 0x74, 0x65, 0x73, 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0xd0, 0xde, 0x1f, 0x01, - 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, - 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, - 0x1f, 0x01, 0x22, 0xac, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x6b, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, - 0x01, 0x22, 0xc9, 0x06, 0x0a, 0x09, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x43, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x59, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, - 0x73, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x18, 0xca, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x6a, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6a, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x42, 0x6f, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x54, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, - 0x74, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, - 0x63, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x29, 0x0a, 0x10, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4b, 0x0a, 0x0e, 0x75, 0x6e, - 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, - 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0d, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, - 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x6c, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, - 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, - 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x11, 0x6d, 0x69, - 0x6e, 0x53, 0x65, 0x6c, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x74, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2f, 0x61, 0x62, 0x63, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x89, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x06, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x73, + 0x65, 0x74, 0x22, 0xac, 0x02, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x04, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, + 0x65, 0x63, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, + 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, + 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x61, 0x74, + 0x65, 0x12, 0x64, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, + 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, + 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, + 0x01, 0x22, 0xbb, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x5c, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, + 0x74, 0x65, 0x73, 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0xd0, 0xde, 0x1f, 0x01, 0x52, 0x0f, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x45, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, + 0xac, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x6b, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, + 0x29, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xac, + 0x07, 0x0a, 0x09, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x10, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x59, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x70, + 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x42, 0x18, 0xca, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, + 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x6a, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6a, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x42, 0x6f, + 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x54, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, + 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x06, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, + 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x0f, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x68, 0x61, 0x72, 0x65, 0x73, 0x12, + 0x4b, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, + 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4b, 0x0a, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, 0x1f, + 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0d, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6c, + 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, + 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, + 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x53, 0x65, + 0x6c, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x1b, + 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, 0x6c, + 0x64, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x17, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4f, 0x6e, 0x48, 0x6f, + 0x6c, 0x64, 0x52, 0x65, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x6e, + 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x04, 0x52, 0x0c, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x73, 0x3a, 0x0c, 0x88, 0xa0, 0x1f, 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x50, 0x0a, 0x0c, 0x56, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, @@ -13166,7 +14233,7 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x74, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x0c, 0x88, 0xa0, 0x1f, - 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0xdb, 0x02, 0x0a, 0x18, 0x55, 0x6e, + 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0xbc, 0x03, 0x0a, 0x18, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, @@ -13187,152 +14254,176 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x08, 0x98, - 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x52, 0x65, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x27, 0x0a, - 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4d, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, 0x1f, - 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x65, 0x0a, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, - 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, - 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0e, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0a, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x5f, 0x64, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, - 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x09, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x44, 0x73, 0x74, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, - 0xa0, 0x1f, 0x01, 0x22, 0xca, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, 0x15, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, + 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x64, + 0x12, 0x3c, 0x0a, 0x1b, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, + 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x4f, 0x6e, 0x48, 0x6f, 0x6c, 0x64, 0x52, 0x65, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x08, + 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xba, 0x03, 0x0a, 0x11, 0x52, 0x65, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4d, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, + 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x65, 0x0a, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, + 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0e, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x5b, 0x0a, + 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x5f, 0x64, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, + 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, + 0x09, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x44, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, + 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0b, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x3c, 0x0a, + 0x1b, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, + 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x17, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4f, 0x6e, 0x48, + 0x6f, 0x6c, 0x64, 0x52, 0x65, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x08, 0x98, 0xa0, 0x1f, + 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xca, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, + 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, + 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, 0x15, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, - 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, 0x15, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x73, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, + 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x3a, 0x0c, 0x88, 0xa0, 0x1f, 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, + 0x1f, 0x00, 0x22, 0xf2, 0x02, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4a, 0x0a, + 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x98, 0xdf, 0x1f, 0x01, 0x52, 0x0d, 0x75, 0x6e, 0x62, 0x6f, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6f, 0x6e, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, + 0x7c, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0xc8, 0xde, + 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, + 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xf2, 0xde, 0x1f, 0x1a, + 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x22, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x22, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0x98, + 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa3, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, + 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0a, 0x64, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x43, 0x6f, 0x69, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0xd9, 0x01, + 0x0a, 0x19, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x12, 0x72, + 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x11, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x07, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, + 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, + 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xbf, 0x01, 0x0a, 0x14, 0x52, 0x65, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0c, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x3a, 0x0c, 0x88, 0xa0, 0x1f, 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, - 0x22, 0xf2, 0x02, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4a, 0x0a, 0x0e, 0x75, - 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, - 0xc8, 0xde, 0x1f, 0x00, 0x98, 0xdf, 0x1f, 0x01, 0x52, 0x0d, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0d, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x2d, 0x0a, 0x12, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x65, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x68, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, - 0x0a, 0x0a, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x62, 0x6f, 0x6e, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x7c, 0x0a, - 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0xc8, 0xde, 0x1f, 0x00, - 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, - 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xf2, 0xde, 0x1f, 0x1a, 0x79, 0x61, - 0x6d, 0x6c, 0x3a, 0x22, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x22, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, - 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa3, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0a, - 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, - 0x69, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0xd9, 0x01, 0x0a, 0x19, - 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x12, 0x72, 0x65, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, - 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x11, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x07, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, + 0x31, 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, + 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x83, 0x02, 0x0a, 0x04, + 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x7d, 0x0a, 0x11, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x6e, 0x64, + 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x51, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xea, + 0xde, 0x1f, 0x11, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, + 0x6e, 0x74, 0x52, 0x0f, 0x6e, 0x6f, 0x74, 0x42, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x12, 0x72, 0x0a, 0x0d, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, - 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xbf, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4e, 0x0a, 0x0c, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x51, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x83, 0x02, 0x0a, 0x04, 0x50, 0x6f, - 0x6f, 0x6c, 0x12, 0x7d, 0x0a, 0x11, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xc8, - 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, - 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xea, 0xde, 0x1f, - 0x11, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, - 0x52, 0x0f, 0x6e, 0x6f, 0x74, 0x42, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x12, 0x72, 0x0a, 0x0d, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, - 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xea, 0xde, 0x1f, 0x0d, 0x62, 0x6f, 0x6e, 0x64, - 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0c, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x3a, 0x08, 0xe8, 0xa0, 0x1f, 0x01, 0xf0, 0xa0, 0x1f, 0x01, 0x2a, - 0xb6, 0x01, 0x0a, 0x0a, 0x42, 0x6f, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, - 0x0a, 0x17, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x1a, 0x0f, 0x8a, 0x9d, 0x20, - 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x14, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xea, 0xde, 0x1f, 0x0d, 0x62, 0x6f, + 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0c, 0x62, 0x6f, 0x6e, 0x64, 0x65, + 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x3a, 0x08, 0xe8, 0xa0, 0x1f, 0x01, 0xf0, 0xa0, 0x1f, + 0x01, 0x22, 0x54, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x74, 0x2e, 0x61, 0x62, 0x63, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x2a, 0xb6, 0x01, 0x0a, 0x0a, 0x42, 0x6f, 0x6e, 0x64, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x17, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x1a, 0x0f, 0x8a, 0x9d, 0x20, 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x14, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x01, 0x1a, 0x0c, + 0x8a, 0x9d, 0x20, 0x08, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x15, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, - 0x4e, 0x44, 0x45, 0x44, 0x10, 0x01, 0x1a, 0x0c, 0x8a, 0x9d, 0x20, 0x08, 0x55, 0x6e, 0x62, 0x6f, - 0x6e, 0x64, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x15, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x1a, - 0x0d, 0x8a, 0x9d, 0x20, 0x09, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x22, - 0x0a, 0x12, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4f, - 0x4e, 0x44, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x0a, 0x8a, 0x9d, 0x20, 0x06, 0x42, 0x6f, 0x6e, 0x64, - 0x65, 0x64, 0x1a, 0x04, 0x88, 0xa3, 0x1e, 0x00, 0x42, 0xdc, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, - 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, - 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x53, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, - 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, - 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x43, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x1a, 0x0d, 0x8a, 0x9d, 0x20, 0x09, 0x55, 0x6e, 0x62, + 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x22, 0x0a, 0x12, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x0a, + 0x8a, 0x9d, 0x20, 0x06, 0x42, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x1a, 0x04, 0x88, 0xa3, 0x1e, 0x00, + 0x2a, 0x5d, 0x0a, 0x0a, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x16, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, + 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, + 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, 0x42, + 0xdc, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, + 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, 0x16, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, + 0x22, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -13347,63 +14438,67 @@ func file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP() []byte { return file_cosmos_staking_v1beta1_staking_proto_rawDescData } -var file_cosmos_staking_v1beta1_staking_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_cosmos_staking_v1beta1_staking_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_cosmos_staking_v1beta1_staking_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_cosmos_staking_v1beta1_staking_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_cosmos_staking_v1beta1_staking_proto_goTypes = []interface{}{ (BondStatus)(0), // 0: cosmos.staking.v1beta1.BondStatus - (*HistoricalInfo)(nil), // 1: cosmos.staking.v1beta1.HistoricalInfo - (*CommissionRates)(nil), // 2: cosmos.staking.v1beta1.CommissionRates - (*Commission)(nil), // 3: cosmos.staking.v1beta1.Commission - (*Description)(nil), // 4: cosmos.staking.v1beta1.Description - (*Validator)(nil), // 5: cosmos.staking.v1beta1.Validator - (*ValAddresses)(nil), // 6: cosmos.staking.v1beta1.ValAddresses - (*DVPair)(nil), // 7: cosmos.staking.v1beta1.DVPair - (*DVPairs)(nil), // 8: cosmos.staking.v1beta1.DVPairs - (*DVVTriplet)(nil), // 9: cosmos.staking.v1beta1.DVVTriplet - (*DVVTriplets)(nil), // 10: cosmos.staking.v1beta1.DVVTriplets - (*Delegation)(nil), // 11: cosmos.staking.v1beta1.Delegation - (*UnbondingDelegation)(nil), // 12: cosmos.staking.v1beta1.UnbondingDelegation - (*UnbondingDelegationEntry)(nil), // 13: cosmos.staking.v1beta1.UnbondingDelegationEntry - (*RedelegationEntry)(nil), // 14: cosmos.staking.v1beta1.RedelegationEntry - (*Redelegation)(nil), // 15: cosmos.staking.v1beta1.Redelegation - (*Params)(nil), // 16: cosmos.staking.v1beta1.Params - (*DelegationResponse)(nil), // 17: cosmos.staking.v1beta1.DelegationResponse - (*RedelegationEntryResponse)(nil), // 18: cosmos.staking.v1beta1.RedelegationEntryResponse - (*RedelegationResponse)(nil), // 19: cosmos.staking.v1beta1.RedelegationResponse - (*Pool)(nil), // 20: cosmos.staking.v1beta1.Pool - (*types.Header)(nil), // 21: tendermint.types.Header - (*timestamppb.Timestamp)(nil), // 22: google.protobuf.Timestamp - (*anypb.Any)(nil), // 23: google.protobuf.Any - (*durationpb.Duration)(nil), // 24: google.protobuf.Duration - (*v1beta1.Coin)(nil), // 25: cosmos.base.v1beta1.Coin + (Infraction)(0), // 1: cosmos.staking.v1beta1.Infraction + (*HistoricalInfo)(nil), // 2: cosmos.staking.v1beta1.HistoricalInfo + (*CommissionRates)(nil), // 3: cosmos.staking.v1beta1.CommissionRates + (*Commission)(nil), // 4: cosmos.staking.v1beta1.Commission + (*Description)(nil), // 5: cosmos.staking.v1beta1.Description + (*Validator)(nil), // 6: cosmos.staking.v1beta1.Validator + (*ValAddresses)(nil), // 7: cosmos.staking.v1beta1.ValAddresses + (*DVPair)(nil), // 8: cosmos.staking.v1beta1.DVPair + (*DVPairs)(nil), // 9: cosmos.staking.v1beta1.DVPairs + (*DVVTriplet)(nil), // 10: cosmos.staking.v1beta1.DVVTriplet + (*DVVTriplets)(nil), // 11: cosmos.staking.v1beta1.DVVTriplets + (*Delegation)(nil), // 12: cosmos.staking.v1beta1.Delegation + (*UnbondingDelegation)(nil), // 13: cosmos.staking.v1beta1.UnbondingDelegation + (*UnbondingDelegationEntry)(nil), // 14: cosmos.staking.v1beta1.UnbondingDelegationEntry + (*RedelegationEntry)(nil), // 15: cosmos.staking.v1beta1.RedelegationEntry + (*Redelegation)(nil), // 16: cosmos.staking.v1beta1.Redelegation + (*Params)(nil), // 17: cosmos.staking.v1beta1.Params + (*DelegationResponse)(nil), // 18: cosmos.staking.v1beta1.DelegationResponse + (*RedelegationEntryResponse)(nil), // 19: cosmos.staking.v1beta1.RedelegationEntryResponse + (*RedelegationResponse)(nil), // 20: cosmos.staking.v1beta1.RedelegationResponse + (*Pool)(nil), // 21: cosmos.staking.v1beta1.Pool + (*ValidatorUpdates)(nil), // 22: cosmos.staking.v1beta1.ValidatorUpdates + (*types.Header)(nil), // 23: tendermint.types.Header + (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp + (*anypb.Any)(nil), // 25: google.protobuf.Any + (*durationpb.Duration)(nil), // 26: google.protobuf.Duration + (*v1beta1.Coin)(nil), // 27: cosmos.base.v1beta1.Coin + (*abci.ValidatorUpdate)(nil), // 28: tendermint.abci.ValidatorUpdate } var file_cosmos_staking_v1beta1_staking_proto_depIdxs = []int32{ - 21, // 0: cosmos.staking.v1beta1.HistoricalInfo.header:type_name -> tendermint.types.Header - 5, // 1: cosmos.staking.v1beta1.HistoricalInfo.valset:type_name -> cosmos.staking.v1beta1.Validator - 2, // 2: cosmos.staking.v1beta1.Commission.commission_rates:type_name -> cosmos.staking.v1beta1.CommissionRates - 22, // 3: cosmos.staking.v1beta1.Commission.update_time:type_name -> google.protobuf.Timestamp - 23, // 4: cosmos.staking.v1beta1.Validator.consensus_pubkey:type_name -> google.protobuf.Any + 23, // 0: cosmos.staking.v1beta1.HistoricalInfo.header:type_name -> tendermint.types.Header + 6, // 1: cosmos.staking.v1beta1.HistoricalInfo.valset:type_name -> cosmos.staking.v1beta1.Validator + 3, // 2: cosmos.staking.v1beta1.Commission.commission_rates:type_name -> cosmos.staking.v1beta1.CommissionRates + 24, // 3: cosmos.staking.v1beta1.Commission.update_time:type_name -> google.protobuf.Timestamp + 25, // 4: cosmos.staking.v1beta1.Validator.consensus_pubkey:type_name -> google.protobuf.Any 0, // 5: cosmos.staking.v1beta1.Validator.status:type_name -> cosmos.staking.v1beta1.BondStatus - 4, // 6: cosmos.staking.v1beta1.Validator.description:type_name -> cosmos.staking.v1beta1.Description - 22, // 7: cosmos.staking.v1beta1.Validator.unbonding_time:type_name -> google.protobuf.Timestamp - 3, // 8: cosmos.staking.v1beta1.Validator.commission:type_name -> cosmos.staking.v1beta1.Commission - 7, // 9: cosmos.staking.v1beta1.DVPairs.pairs:type_name -> cosmos.staking.v1beta1.DVPair - 9, // 10: cosmos.staking.v1beta1.DVVTriplets.triplets:type_name -> cosmos.staking.v1beta1.DVVTriplet - 13, // 11: cosmos.staking.v1beta1.UnbondingDelegation.entries:type_name -> cosmos.staking.v1beta1.UnbondingDelegationEntry - 22, // 12: cosmos.staking.v1beta1.UnbondingDelegationEntry.completion_time:type_name -> google.protobuf.Timestamp - 22, // 13: cosmos.staking.v1beta1.RedelegationEntry.completion_time:type_name -> google.protobuf.Timestamp - 14, // 14: cosmos.staking.v1beta1.Redelegation.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntry - 24, // 15: cosmos.staking.v1beta1.Params.unbonding_time:type_name -> google.protobuf.Duration - 11, // 16: cosmos.staking.v1beta1.DelegationResponse.delegation:type_name -> cosmos.staking.v1beta1.Delegation - 25, // 17: cosmos.staking.v1beta1.DelegationResponse.balance:type_name -> cosmos.base.v1beta1.Coin - 14, // 18: cosmos.staking.v1beta1.RedelegationEntryResponse.redelegation_entry:type_name -> cosmos.staking.v1beta1.RedelegationEntry - 15, // 19: cosmos.staking.v1beta1.RedelegationResponse.redelegation:type_name -> cosmos.staking.v1beta1.Redelegation - 18, // 20: cosmos.staking.v1beta1.RedelegationResponse.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntryResponse - 21, // [21:21] is the sub-list for method output_type - 21, // [21:21] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 5, // 6: cosmos.staking.v1beta1.Validator.description:type_name -> cosmos.staking.v1beta1.Description + 24, // 7: cosmos.staking.v1beta1.Validator.unbonding_time:type_name -> google.protobuf.Timestamp + 4, // 8: cosmos.staking.v1beta1.Validator.commission:type_name -> cosmos.staking.v1beta1.Commission + 8, // 9: cosmos.staking.v1beta1.DVPairs.pairs:type_name -> cosmos.staking.v1beta1.DVPair + 10, // 10: cosmos.staking.v1beta1.DVVTriplets.triplets:type_name -> cosmos.staking.v1beta1.DVVTriplet + 14, // 11: cosmos.staking.v1beta1.UnbondingDelegation.entries:type_name -> cosmos.staking.v1beta1.UnbondingDelegationEntry + 24, // 12: cosmos.staking.v1beta1.UnbondingDelegationEntry.completion_time:type_name -> google.protobuf.Timestamp + 24, // 13: cosmos.staking.v1beta1.RedelegationEntry.completion_time:type_name -> google.protobuf.Timestamp + 15, // 14: cosmos.staking.v1beta1.Redelegation.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntry + 26, // 15: cosmos.staking.v1beta1.Params.unbonding_time:type_name -> google.protobuf.Duration + 12, // 16: cosmos.staking.v1beta1.DelegationResponse.delegation:type_name -> cosmos.staking.v1beta1.Delegation + 27, // 17: cosmos.staking.v1beta1.DelegationResponse.balance:type_name -> cosmos.base.v1beta1.Coin + 15, // 18: cosmos.staking.v1beta1.RedelegationEntryResponse.redelegation_entry:type_name -> cosmos.staking.v1beta1.RedelegationEntry + 16, // 19: cosmos.staking.v1beta1.RedelegationResponse.redelegation:type_name -> cosmos.staking.v1beta1.Redelegation + 19, // 20: cosmos.staking.v1beta1.RedelegationResponse.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntryResponse + 28, // 21: cosmos.staking.v1beta1.ValidatorUpdates.updates:type_name -> tendermint.abci.ValidatorUpdate + 22, // [22:22] is the sub-list for method output_type + 22, // [22:22] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_cosmos_staking_v1beta1_staking_proto_init() } @@ -13652,14 +14747,26 @@ func file_cosmos_staking_v1beta1_staking_proto_init() { return nil } } + file_cosmos_staking_v1beta1_staking_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatorUpdates); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cosmos_staking_v1beta1_staking_proto_rawDesc, - NumEnums: 1, - NumMessages: 20, + NumEnums: 2, + NumMessages: 21, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/cosmos/staking/v1beta1/staking.proto b/proto/cosmos/staking/v1beta1/staking.proto index 193ff3c0def4..570ce074adf2 100644 --- a/proto/cosmos/staking/v1beta1/staking.proto +++ b/proto/cosmos/staking/v1beta1/staking.proto @@ -9,6 +9,7 @@ import "google/protobuf/timestamp.proto"; import "cosmos_proto/cosmos.proto"; import "cosmos/base/v1beta1/coin.proto"; import "tendermint/types/types.proto"; +import "tendermint/abci/types.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; @@ -124,6 +125,12 @@ message Validator { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false ]; + + // strictly positive if this validator's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 12; + + // list of unbonding ids, each uniquely identifing an unbonding of this validator + repeated uint64 unbonding_ids = 13; } // BondStatus is the status of a validator. @@ -216,7 +223,7 @@ message UnbondingDelegation { // validator_address is the bech32-encoded address of the validator. string validator_address = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // entries are the unbonding delegation entries. - repeated UnbondingDelegationEntry entries = 3 [(gogoproto.nullable) = false]; // unbonding delegation entries + repeated UnbondingDelegationEntry entries = 3 [(gogoproto.nullable) = false]; // unbonding delegation entries } // UnbondingDelegationEntry defines an unbonding object with relevant metadata. @@ -240,6 +247,11 @@ message UnbondingDelegationEntry { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false ]; + // Incrementing id that uniquely identifies this entry + uint64 unbonding_id = 5; + + // Strictly positive if this entry's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 6; } // RedelegationEntry defines a redelegation object with relevant metadata. @@ -263,6 +275,11 @@ message RedelegationEntry { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false ]; + // Incrementing id that uniquely identifies this entry + uint64 unbonding_id = 5; + + // Strictly positive if this entry's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 6; } // Redelegation contains the list of a particular delegator's redelegating bonds @@ -279,7 +296,7 @@ message Redelegation { // validator_dst_address is the validator redelegation destination operator address. string validator_dst_address = 3 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // entries are the redelegation entries. - repeated RedelegationEntry entries = 4 [(gogoproto.nullable) = false]; // redelegation entries + repeated RedelegationEntry entries = 4 [(gogoproto.nullable) = false]; // redelegation entries } // Params defines the parameters for the x/staking module. @@ -358,3 +375,19 @@ message Pool { (gogoproto.jsontag) = "bonded_tokens" ]; } + +// Infraction indicates the infraction a validator commited. +enum Infraction { + // UNSPECIFIED defines an empty infraction. + INFRACTION_UNSPECIFIED = 0; + // DOUBLE_SIGN defines a validator that double-signs a block. + INFRACTION_DOUBLE_SIGN = 1; + // DOWNTIME defines a validator that missed signing too many blocks. + INFRACTION_DOWNTIME = 2; +} + +// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. +// TODO: explore moving this to proto/cosmos/base to separate modules from tendermint dependence +message ValidatorUpdates { + repeated tendermint.abci.ValidatorUpdate updates = 1 [(gogoproto.nullable) = false]; +} diff --git a/tests/integration/distribution/keeper/delegation_test.go b/tests/integration/distribution/keeper/delegation_test.go index 0bb991158114..a17603eb2ef9 100644 --- a/tests/integration/distribution/keeper/delegation_test.go +++ b/tests/integration/distribution/keeper/delegation_test.go @@ -137,7 +137,7 @@ func TestCalculateRewardsAfterSlash(t *testing.T) { ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // slash the validator by 50% - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // retrieve validator val = stakingKeeper.Validator(ctx, valAddrs[0]) @@ -212,7 +212,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // slash the validator by 50% - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // fetch the validator again val = stakingKeeper.Validator(ctx, valAddrs[0]) @@ -226,7 +226,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { distrKeeper.AllocateTokensToValidator(ctx, val, tokens) // slash the validator by 50% again - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // fetch the validator again val = stakingKeeper.Validator(ctx, valAddrs[0]) @@ -466,10 +466,10 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) { distrKeeper.AllocateTokensToValidator(ctx, val, tokens) // slash the validator by 50% - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // slash the validator by 50% again - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // fetch the validator again val = stakingKeeper.Validator(ctx, valAddrs[0]) @@ -535,7 +535,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { // slash the validator ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // second delegation @@ -554,7 +554,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { // slash the validator again ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // fetch updated validator diff --git a/tests/integration/staking/keeper/msg_server_test.go b/tests/integration/staking/keeper/msg_server_test.go index 9ca6e69118b8..45efcde992bd 100644 --- a/tests/integration/staking/keeper/msg_server_test.go +++ b/tests/integration/staking/keeper/msg_server_test.go @@ -45,6 +45,7 @@ func TestCancelUnbondingDelegation(t *testing.T) { delegatorAddr, validatorAddr, 10, ctx.BlockTime().Add(time.Minute*10), unbondingAmount.Amount, + 0, ) // set and retrieve a record diff --git a/tests/integration/staking/keeper/slash_test.go b/tests/integration/staking/keeper/slash_test.go index 7d9c26a81ebd..005119a0a377 100644 --- a/tests/integration/staking/keeper/slash_test.go +++ b/tests/integration/staking/keeper/slash_test.go @@ -58,7 +58,7 @@ func TestSlashUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp (beyond which the // unbonding delegation shouldn't be slashed) ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 0, - time.Unix(5, 0), sdk.NewInt(10)) + time.Unix(5, 0), sdk.NewInt(10), 0) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) @@ -109,7 +109,7 @@ func TestSlashRedelegation(t *testing.T) { // set a redelegation with an expiration timestamp beyond which the // redelegation shouldn't be slashed rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, - time.Unix(5, 0), sdk.NewInt(10), math.LegacyNewDec(10)) + time.Unix(5, 0), sdk.NewInt(10), math.LegacyNewDec(10), 0) app.StakingKeeper.SetRedelegation(ctx, rd) @@ -172,7 +172,7 @@ func TestSlashAtNegativeHeight(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, -2, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, -2, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) // read updated state validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) @@ -203,7 +203,7 @@ func TestSlashValidatorAtCurrentHeight(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) // read updated state validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) @@ -233,7 +233,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp beyond which the // unbonding delegation shouldn't be slashed ubdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) - ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens) + ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens, 0) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) // slash validator for the first time @@ -243,7 +243,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) // end block applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) @@ -273,7 +273,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // slash validator again ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -299,7 +299,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // on the unbonding delegation, but it will slash stake bonded since the infraction // this may not be the desirable behaviour, ref https://github.com/cosmos/cosmos-sdk/issues/1440 ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -325,7 +325,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // on the unbonding delegation, but it will slash stake bonded since the infraction // this may not be the desirable behaviour, ref https://github.com/cosmos/cosmos-sdk/issues/1440 ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -358,7 +358,7 @@ 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, sdk.NewDecFromInt(rdTokens)) + rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdTokens, sdk.NewDecFromInt(rdTokens), 0) app.StakingKeeper.SetRedelegation(ctx, rd) // set the associated delegation @@ -382,7 +382,9 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction) }) + require.NotPanics(t, func() { + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) + }) burnAmount := sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(fraction).TruncateInt() bondedPool = app.StakingKeeper.GetBondedPool(ctx) @@ -413,7 +415,9 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec()) }) + require.NotPanics(t, func() { + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec(), types.Infraction_INFRACTION_UNSPECIFIED) + }) burnAmount = app.StakingKeeper.TokensFromConsensusPower(ctx, 7) // read updated pool @@ -447,7 +451,9 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec()) }) + require.NotPanics(t, func() { + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec(), types.Infraction_INFRACTION_UNSPECIFIED) + }) burnAmount = sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(math.LegacyOneDec()).TruncateInt() burnAmount = burnAmount.Sub(math.LegacyOneDec().MulInt(rdTokens).TruncateInt()) @@ -480,7 +486,9 @@ func TestSlashWithRedelegation(t *testing.T) { validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.Equal(t, validator.GetStatus(), types.Unbonding) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec()) }) + require.NotPanics(t, func() { + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec(), types.Infraction_INFRACTION_UNSPECIFIED) + }) // read updated pool bondedPool = app.StakingKeeper.GetBondedPool(ctx) @@ -510,7 +518,7 @@ func TestSlashBoth(t *testing.T) { // set a redelegation with expiration timestamp beyond which the // redelegation shouldn't be slashed rdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, sdk.NewDecFromInt(rdATokens)) + rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, sdk.NewDecFromInt(rdATokens), 0) app.StakingKeeper.SetRedelegation(ctx, rdA) // set the associated delegation @@ -521,7 +529,7 @@ func TestSlashBoth(t *testing.T) { // unbonding delegation shouldn't be slashed) ubdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) ubdA := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, - time.Unix(0, 0), ubdATokens) + time.Unix(0, 0), ubdATokens, 0) app.StakingKeeper.SetUnbondingDelegation(ctx, ubdA) bondedCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, rdATokens.MulRaw(2))) @@ -544,7 +552,7 @@ func TestSlashBoth(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(PKs[0])) require.True(t, found) consAddr0 := sdk.ConsAddress(PKs[0].Address()) - app.StakingKeeper.Slash(ctx, consAddr0, 10, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr0, 10, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) burnedNotBondedAmount := fraction.MulInt(ubdATokens).TruncateInt() burnedBondAmount := sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(fraction).TruncateInt() @@ -575,11 +583,11 @@ 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) + burnedCoins := app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) require.True(t, burnedCoins.GT(math.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) + noBurned := app.StakingKeeper.Slash(ctx, sdk.ConsAddress(addrVals[0]), ctx.BlockHeight(), 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) require.True(t, sdk.NewInt(0).Equal(noBurned)) } diff --git a/tests/integration/staking/keeper/validator_test.go b/tests/integration/staking/keeper/validator_test.go index 5190e4135666..72f34d378ee7 100644 --- a/tests/integration/staking/keeper/validator_test.go +++ b/tests/integration/staking/keeper/validator_test.go @@ -150,7 +150,7 @@ func TestSlashToZeroPowerRemoved(t *testing.T) { require.Equal(t, valTokens, validator.Tokens, "\nvalidator %v\npool %v", validator, valTokens) // slash the validator by 100% - app.StakingKeeper.Slash(ctx, sdk.ConsAddress(PKs[0].Address()), 0, 100, math.LegacyOneDec()) + app.StakingKeeper.Slash(ctx, sdk.ConsAddress(PKs[0].Address()), 0, 100, math.LegacyOneDec(), types.Infraction_INFRACTION_UNSPECIFIED) // apply TM updates applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // validator should be unbonding diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index aa7a68422ea2..cb8ca0c3f757 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -126,3 +126,7 @@ func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { return nil } + +func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) error { + return nil +} diff --git a/x/evidence/README.md b/x/evidence/README.md index bdec9cc1701a..4ed007016c53 100644 --- a/x/evidence/README.md +++ b/x/evidence/README.md @@ -264,19 +264,6 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi logger := k.Logger(ctx) consAddr := evidence.GetConsensusAddress() - if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { - // Ignore evidence that cannot be handled. - // - // NOTE: We used to panic with: - // `panic(fmt.Sprintf("Validator consensus-address %v not found", consAddr))`, - // but this couples the expectations of the app to both Tendermint and - // the simulator. Both are expected to provide the full range of - // allowable but none of the disallowed evidence types. Instead of - // getting this coordination right, it is easier to relax the - // constraints and ignore evidence that cannot be handled. - return - } - // calculate the age of the evidence infractionHeight := evidence.GetHeight() infractionTime := evidence.GetTime() @@ -308,6 +295,22 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi return } + if !validator.GetOperator().Empty() { + if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { + // Ignore evidence that cannot be handled. + // + // NOTE: We used to panic with: + // `panic(fmt.Sprintf("Validator consensus-address %v not found", consAddr))`, + // but this couples the expectations of the app to both Tendermint and + // the simulator. Both are expected to provide the full range of + // allowable but none of the disallowed evidence types. Instead of + // getting this coordination right, it is easier to relax the + // constraints and ignore evidence that cannot be handled. + return + } + } + + if ok := k.slashingKeeper.HasValidatorSigningInfo(ctx, consAddr); !ok { panic(fmt.Sprintf("expected signing info for validator %s but not found", consAddr)) } @@ -347,6 +350,7 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi consAddr, k.slashingKeeper.SlashFractionDoubleSign(ctx), evidence.GetValidatorPower(), distributionHeight, + stakingtypes.DoubleSign, ) // Jail the validator if not already jailed. This will begin unbonding the diff --git a/x/evidence/keeper/infraction.go b/x/evidence/keeper/infraction.go index 3ae74bc216de..1c667c46ad8c 100644 --- a/x/evidence/keeper/infraction.go +++ b/x/evidence/keeper/infraction.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/evidence/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // HandleEquivocationEvidence implements an equivocation evidence handler. Assuming the @@ -70,6 +71,21 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi return } + if !validator.GetOperator().Empty() { + if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { + // Ignore evidence that cannot be handled. + // + // NOTE: We used to panic with: + // `panic(fmt.Sprintf("Validator consensus-address %v not found", consAddr))`, + // but this couples the expectations of the app to both Tendermint and + // the simulator. Both are expected to provide the full range of + // allowable but none of the disallowed evidence types. Instead of + // getting this coordination right, it is easier to relax the + // constraints and ignore evidence that cannot be handled. + return + } + } + if ok := k.slashingKeeper.HasValidatorSigningInfo(ctx, consAddr); !ok { panic(fmt.Sprintf("expected signing info for validator %s but not found", consAddr)) } @@ -109,6 +125,7 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi consAddr, k.slashingKeeper.SlashFractionDoubleSign(ctx), evidence.GetValidatorPower(), distributionHeight, + stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, ) // Jail the validator if not already jailed. This will begin unbonding the diff --git a/x/evidence/testutil/expected_keepers_mocks.go b/x/evidence/testutil/expected_keepers_mocks.go index 7222ecf3f4c8..7f609130b457 100644 --- a/x/evidence/testutil/expected_keepers_mocks.go +++ b/x/evidence/testutil/expected_keepers_mocks.go @@ -157,15 +157,15 @@ func (mr *MockSlashingKeeperMockRecorder) JailUntil(arg0, arg1, arg2 interface{} } // Slash mocks base method. -func (m *MockSlashingKeeper) Slash(arg0 types0.Context, arg1 types0.ConsAddress, arg2 types0.Dec, arg3, arg4 int64) { +func (m *MockSlashingKeeper) Slash(arg0 types0.Context, arg1 types0.ConsAddress, arg2 types0.Dec, arg3, arg4 int64, arg5 types2.Infraction) { m.ctrl.T.Helper() - m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4) + m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4, arg5) } // Slash indicates an expected call of Slash. -func (mr *MockSlashingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { +func (mr *MockSlashingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockSlashingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockSlashingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4, arg5) } // SlashFractionDoubleSign mocks base method. diff --git a/x/evidence/types/expected_keepers.go b/x/evidence/types/expected_keepers.go index 1101b8ae2031..8c157aff0c97 100644 --- a/x/evidence/types/expected_keepers.go +++ b/x/evidence/types/expected_keepers.go @@ -25,7 +25,7 @@ type ( IsTombstoned(sdk.Context, sdk.ConsAddress) bool HasValidatorSigningInfo(sdk.Context, sdk.ConsAddress) bool Tombstone(sdk.Context, sdk.ConsAddress) - Slash(sdk.Context, sdk.ConsAddress, sdk.Dec, int64, int64) + Slash(sdk.Context, sdk.ConsAddress, sdk.Dec, int64, int64, stakingtypes.Infraction) SlashFractionDoubleSign(sdk.Context) sdk.Dec Jail(sdk.Context, sdk.ConsAddress) JailUntil(sdk.Context, sdk.ConsAddress, time.Time) diff --git a/x/slashing/README.md b/x/slashing/README.md index 9647d6912989..985f4ad84029 100644 --- a/x/slashing/README.md +++ b/x/slashing/README.md @@ -25,25 +25,25 @@ This module will be used by the Cosmos Hub, the first hub in the Cosmos ecosyste ## Contents * [Concepts](#concepts) - * [States](#states) - * [Tombstone Caps](#tombstone-caps) - * [Infraction Timelines](#infraction-timelines) + * [States](#states) + * [Tombstone Caps](#tombstone-caps) + * [Infraction Timelines](#infraction-timelines) * [State](#state) - * [Signing Info (Liveness)](#signing-info-liveness) - * [Params](#params) + * [Signing Info (Liveness)](#signing-info-liveness) + * [Params](#params) * [Messages](#messages) - * [Unjail](#unjail) + * [Unjail](#unjail) * [BeginBlock](#beginblock) - * [Liveness Tracking](#liveness-tracking) + * [Liveness Tracking](#liveness-tracking) * [Hooks](#hooks) * [Events](#events) * [Staking Tombstone](#staking-tombstone) * [Parameters](#parameters) * [CLI](#cli) - * [Query](#query) - * [Transactions](#transactions) - * [gRPC](#grpc) - * [REST](#rest) + * [Query](#query) + * [Transactions](#transactions) + * [gRPC](#grpc) + * [REST](#rest) @@ -291,7 +291,7 @@ for vote in block.LastCommitInfo.Votes { // That's fine since this is just used to filter unbonding delegations & redelegations. distributionHeight := height - sdk.ValidatorUpdateDelay - 1 - Slash(vote.Validator.Address, distributionHeight, vote.Validator.Power, SlashFractionDowntime()) + Slash(vote.Validator.Address, distributionHeight, vote.Validator.Power, SlashFractionDowntime(), stakingtypes.Downtime) Jail(vote.Validator.Address) signInfo.JailedUntil = block.Time.Add(DowntimeJailDuration()) diff --git a/x/slashing/keeper/hooks.go b/x/slashing/keeper/hooks.go index 01f2c2690a60..a10e44e4cb67 100644 --- a/x/slashing/keeper/hooks.go +++ b/x/slashing/keeper/hooks.go @@ -86,3 +86,7 @@ func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.Va func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) error { return nil } + +func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) error { + return nil +} diff --git a/x/slashing/keeper/infractions.go b/x/slashing/keeper/infractions.go index 426e54733a93..d89ddc14806b 100644 --- a/x/slashing/keeper/infractions.go +++ b/x/slashing/keeper/infractions.go @@ -6,6 +6,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // HandleValidatorSignature handles a validator signature, must be called once per validator per block. @@ -19,6 +20,11 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre panic(fmt.Sprintf("Validator consensus-address %s not found", consAddr)) } + // don't update missed blocks when validator's jailed + if k.sk.IsValidatorJailed(ctx, consAddr) { + return + } + // fetch signing info signInfo, found := k.GetValidatorSigningInfo(ctx, consAddr) if !found { @@ -84,7 +90,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)) + coinsBurned := k.sk.Slash(ctx, consAddr, distributionHeight, power, k.SlashFractionDowntime(ctx), stakingtypes.Infraction_INFRACTION_DOWNTIME) ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, diff --git a/x/slashing/keeper/keeper.go b/x/slashing/keeper/keeper.go index 8fe32f9edb32..50aef706dbe7 100644 --- a/x/slashing/keeper/keeper.go +++ b/x/slashing/keeper/keeper.go @@ -10,6 +10,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // Keeper of the slashing store @@ -70,8 +71,8 @@ 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) +func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, fraction sdk.Dec, power, distributionHeight int64, infraction stakingtypes.Infraction) { + coinsBurned := k.sk.Slash(ctx, consAddr, distributionHeight, power, fraction, infraction) ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, diff --git a/x/slashing/testutil/expected_keepers_mocks.go b/x/slashing/testutil/expected_keepers_mocks.go index 321ca0561f44..d30b21f06178 100644 --- a/x/slashing/testutil/expected_keepers_mocks.go +++ b/x/slashing/testutil/expected_keepers_mocks.go @@ -281,6 +281,20 @@ func (mr *MockStakingKeeperMockRecorder) GetAllValidators(ctx interface{}) *gomo return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllValidators", reflect.TypeOf((*MockStakingKeeper)(nil).GetAllValidators), ctx) } +// IsValidatorJailed mocks base method. +func (m *MockStakingKeeper) IsValidatorJailed(ctx types.Context, addr types.ConsAddress) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsValidatorJailed", ctx, addr) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsValidatorJailed indicates an expected call of IsValidatorJailed. +func (mr *MockStakingKeeperMockRecorder) IsValidatorJailed(ctx, addr interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsValidatorJailed", reflect.TypeOf((*MockStakingKeeper)(nil).IsValidatorJailed), ctx, addr) +} + // IterateValidators mocks base method. func (m *MockStakingKeeper) IterateValidators(arg0 types.Context, arg1 func(int64, types2.ValidatorI) bool) { m.ctrl.T.Helper() @@ -320,17 +334,17 @@ func (mr *MockStakingKeeperMockRecorder) MaxValidators(arg0 interface{}) *gomock } // Slash mocks base method. -func (m *MockStakingKeeper) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec) math.Int { +func (m *MockStakingKeeper) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec, arg5 types2.Infraction) math.Int { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4) + ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4, arg5) ret0, _ := ret[0].(math.Int) return ret0 } // Slash indicates an expected call of Slash. -func (mr *MockStakingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { +func (mr *MockStakingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockStakingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockStakingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4, arg5) } // Unjail mocks base method. diff --git a/x/slashing/types/expected_keepers.go b/x/slashing/types/expected_keepers.go index 0b1a8afe8c9c..1f00036f9e98 100644 --- a/x/slashing/types/expected_keepers.go +++ b/x/slashing/types/expected_keepers.go @@ -1,5 +1,3 @@ -// noalias -// DONTCOVER package types import ( @@ -43,7 +41,7 @@ type StakingKeeper interface { ValidatorByConsAddr(sdk.Context, sdk.ConsAddress) stakingtypes.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) math.Int + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, stakingtypes.Infraction) math.Int Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator @@ -54,6 +52,9 @@ type StakingKeeper interface { // MaxValidators returns the maximum amount of bonded validators MaxValidators(sdk.Context) uint32 + + // return if the validator is jailed + IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool } // StakingHooks event hooks for staking validator object (noalias) diff --git a/x/staking/README.md b/x/staking/README.md index e6ea53b42572..4d3352fb5103 100644 --- a/x/staking/README.md +++ b/x/staking/README.md @@ -75,6 +75,19 @@ Store entries prefixed with "Last" must remain unchanged until EndBlock. * LastTotalPower: `0x12 -> ProtocolBuffer(math.Int)` +## ValidatorUpdates + +ValidatorUpdates contains the validator updates returned to ABCI at the end of every block. +The values are overwritten in every block. + +* ValidatorUpdates `0x51 -> []abci.ValidatorUpdate` + +## UnbondingId + +UnbondingId stores the ID of the latest unbonding operation. It enables to create unique IDs for unbonding operation, i.e., UnbondingId is incremented every time a new unbonding operation (validator unbonding, unbonding delegation, redelegation) is initiated. + +* UnbondingId: `0x37 -> uint64` + ## Params The staking module stores its params in state with the prefix of `0x51`, @@ -113,12 +126,16 @@ records within a block. * ValidatorsByConsAddr: `0x22 | ConsAddrLen (1 byte) | ConsAddr -> OperatorAddr` * ValidatorsByPower: `0x23 | BigEndian(ConsensusPower) | OperatorAddrLen (1 byte) | OperatorAddr -> OperatorAddr` * LastValidatorsPower: `0x11 | OperatorAddrLen (1 byte) | OperatorAddr -> ProtocolBuffer(ConsensusPower)` +* ValidatorsByUnbondingId: `0x38 | UnbondingId -> 0x21 | OperatorAddrLen (1 byte) | OperatorAddr` `Validators` is the primary index - it ensures that each operator can have only one associated validator, where the public key of that validator can change in the future. Delegators can refer to the immutable operator of the validator, without concern for the changing public key. +`ValidatorsByUnbondingId` is an additional index that enables lookups for + validators by the unbonding IDs corresponding to their current unbonding. + `ValidatorByConsAddr` is an additional index that enables lookups for slashing. When Tendermint reports evidence, it provides the validator address, so this map is needed to find the operator. Note that the `ConsAddr` corresponds to the @@ -182,11 +199,18 @@ detected. * UnbondingDelegation: `0x32 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorAddr -> ProtocolBuffer(unbondingDelegation)` * UnbondingDelegationsFromValidator: `0x33 | ValidatorAddrLen (1 byte) | ValidatorAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` +* UnbondingDelegationByUnbondingId: `0x38 | UnbondingId -> 0x32 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorAddr` + `UnbondingDelegation` is used in queries, to lookup all unbonding delegations for + a given delegator. + +`UnbondingDelegationsFromValidator` is used in slashing, to lookup all + unbonding delegations associated with a given validator that need to be + slashed. + + `UnbondingDelegationByUnbondingId` is an additional index that enables + lookups for unbonding delegations by the unbonding IDs of the containing + unbonding delegation entries. -The first map here is used in queries, to lookup all unbonding delegations for -a given delegator, while the second map is used in slashing, to lookup all -unbonding delegations associated with a given validator that need to be -slashed. A UnbondingDelegation object is created every time an unbonding is initiated. @@ -205,11 +229,23 @@ committed by the source validator. * Redelegations: `0x34 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddr -> ProtocolBuffer(redelegation)` * RedelegationsBySrc: `0x35 | ValidatorSrcAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddrLen (1 byte) | ValidatorDstAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` * RedelegationsByDst: `0x36 | ValidatorDstAddrLen (1 byte) | ValidatorDstAddr | ValidatorSrcAddrLen (1 byte) | ValidatorSrcAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` +* RedelegationByUnbondingId: `0x38 | UnbondingId -> 0x34 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddr` + + `Redelegations` is used for queries, to lookup all redelegations for a given + delegator. + + `RedelegationsBySrc` is used for slashing based on the `ValidatorSrcAddr`. + + `RedelegationsByDst` is used for slashing based on the `ValidatorDstAddr` The first map here is used for queries, to lookup all redelegations for a given delegator. The second map is used for slashing based on the `ValidatorSrcAddr`, while the third map is for slashing based on the `ValidatorDstAddr`. +`RedelegationByUnbondingId` is an additional index that enables + lookups for redelegations by the unbonding IDs of the containing + redelegation entries. + A redelegation object is created every time a redelegation occurs. To prevent "redelegation hopping" redelegations may not occur under the situation that: @@ -359,13 +395,17 @@ As a part of the Undelegate and Complete Unbonding state transitions Unbond Delegation may be called. * subtract the unbonded shares from delegator -* add the unbonded tokens to an `UnbondingDelegation` Entry +* add the unbonded tokens to an `UnbondingDelegationEntry` * update the delegation or remove the delegation if there are no more shares * if the delegation is the operator of the validator and no more shares exist then trigger a jail validator * update the validator with removed the delegator shares and associated coins * if the validator state is `Bonded`, transfer the `Coins` worth of the unbonded shares from the `BondedPool` to the `NotBondedPool` `ModuleAccount` * remove the validator if it is unbonded and there are no more delegation shares. +* remove the validator if it is unbonded and there are no more delegation shares +* get a unique `unbondingId` and map it to the `UnbondingDelegationEntry` in `UnbondingDelegationByUnbondingId` +* call the `AfterUnbondingInitiated(unbondingId)` hook +* add the unbonding delegation to `UnbondingDelegationQueue` with the completion time set to `UnbondingTime` ### Cancel an `UnbondingDelegation` Entry @@ -715,6 +755,12 @@ validators that still have remaining delegations, the `validator.Status` is switched from `types.Unbonding` to `types.Unbonded`. +Unbonding operations can be put on hold by external modules via the `PutUnbondingOnHold(unbondingId)` method. + As a result, an unbonding operation (e.g., an unbonding delegation) that is on hold, cannot complete + even if it reaches maturity. For an unbonding operation with `unbondingId` to eventually complete + (after it reaches maturity), every call to `PutUnbondingOnHold(unbondingId)` must be matched + by a call to `UnbondingCanComplete(unbondingId)`. + ### Unbonding Delegations Complete the unbonding of all mature `UnbondingDelegations.Entries` within the @@ -761,6 +807,9 @@ following hooks can registered with staking: * called when a delegation is created or modified * `BeforeDelegationRemoved(Context, AccAddress, ValAddress) error` * called when a delegation is removed +* `AfterUnbondingInitiated(Context, UnbondingID)` + * called when an unbonding operation (validator unbonding, unbonding delegation, redelegation) was initiated + diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index 94ab596d337d..2f0410265287 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -305,14 +305,21 @@ func (k Keeper) SetUnbondingDelegationEntry( creationHeight int64, minTime time.Time, balance math.Int, ) types.UnbondingDelegation { ubd, found := k.GetUnbondingDelegation(ctx, delegatorAddr, validatorAddr) + id := k.IncrementUnbondingId(ctx) if found { - ubd.AddEntry(creationHeight, minTime, balance) + ubd.AddEntry(creationHeight, minTime, balance, id) } else { - ubd = types.NewUnbondingDelegation(delegatorAddr, validatorAddr, creationHeight, minTime, balance) + ubd = types.NewUnbondingDelegation(delegatorAddr, validatorAddr, creationHeight, minTime, balance, id) } k.SetUnbondingDelegation(ctx, ubd) + // Add to the UBDByUnbondingOp index to look up the UBD by the UBDE ID + k.SetUnbondingDelegationByUnbondingId(ctx, ubd, id) + + // Call hook + k.AfterUnbondingInitiated(ctx, id) + return ubd } @@ -488,15 +495,22 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, sharesSrc, sharesDst sdk.Dec, ) types.Redelegation { red, found := k.GetRedelegation(ctx, delegatorAddr, validatorSrcAddr, validatorDstAddr) + id := k.IncrementUnbondingId(ctx) if found { - red.AddEntry(creationHeight, minTime, balance, sharesDst) + red.AddEntry(creationHeight, minTime, balance, sharesDst, id) } else { red = types.NewRedelegation(delegatorAddr, validatorSrcAddr, - validatorDstAddr, creationHeight, minTime, balance, sharesDst) + validatorDstAddr, creationHeight, minTime, balance, sharesDst, id) } k.SetRedelegation(ctx, red) + // Add to the UBDByEntry index to look up the UBD by the UBDE ID + k.SetRedelegationByUnbondingId(ctx, red, id) + + // Call hook + k.AfterUnbondingInitiated(ctx, id) + return red } @@ -846,9 +860,10 @@ func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAd // loop through all the entries and complete unbonding mature entries for i := 0; i < len(ubd.Entries); i++ { entry := ubd.Entries[i] - if entry.IsMature(ctxTime) { + if entry.IsMature(ctxTime) && !entry.OnHold() { ubd.RemoveEntry(int64(i)) i-- + k.DeleteUnbondingIndex(ctx, entry.UnbondingId) // track undelegation only when remaining or truncated shares are non-zero if !entry.Balance.IsZero() { @@ -950,9 +965,10 @@ func (k Keeper) CompleteRedelegation( // loop through all the entries and complete mature redelegation entries for i := 0; i < len(red.Entries); i++ { entry := red.Entries[i] - if entry.IsMature(ctxTime) { + if entry.IsMature(ctxTime) && !entry.OnHold() { red.RemoveEntry(int64(i)) i-- + k.DeleteUnbondingIndex(ctx, entry.UnbondingId) if !entry.InitialBalance.IsZero() { balances = balances.Add(sdk.NewCoin(bondDenom, entry.InitialBalance)) diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 669818b3b34f..418a0507790c 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -152,6 +152,7 @@ func (s *KeeperTestSuite) TestUnbondingDelegation() { 0, time.Unix(0, 0).UTC(), sdk.NewInt(5), + 0, ) // set and retrieve a record @@ -491,7 +492,7 @@ func (s *KeeperTestSuite) TestGetRedelegationsFromSrcValidator() { rd := stakingtypes.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0), sdk.NewInt(5), - math.LegacyNewDec(5)) + math.LegacyNewDec(5), 0) // set and retrieve a record keeper.SetRedelegation(ctx, rd) @@ -518,7 +519,7 @@ func (s *KeeperTestSuite) TestRedelegation() { rd := stakingtypes.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0).UTC(), sdk.NewInt(5), - math.LegacyNewDec(5)) + math.LegacyNewDec(5), 0) // test shouldn't have and redelegations has := keeper.HasReceivingRedelegation(ctx, addrDels[0], addrVals[1]) diff --git a/x/staking/keeper/grpc_query.go b/x/staking/keeper/grpc_query.go index 1389d7c05c92..2ff23e2f4cf0 100644 --- a/x/staking/keeper/grpc_query.go +++ b/x/staking/keeper/grpc_query.go @@ -597,6 +597,7 @@ func RedelegationsToRedelegationResponses(ctx sdk.Context, k *Keeper, redels typ entry.SharesDst, entry.InitialBalance, val.TokensFromShares(entry.SharesDst).TruncateInt(), + entry.UnbondingId, ) } diff --git a/x/staking/keeper/keeper.go b/x/staking/keeper/keeper.go index 675b0d41b067..97ca845e5712 100644 --- a/x/staking/keeper/keeper.go +++ b/x/staking/keeper/keeper.go @@ -6,6 +6,7 @@ import ( "cosmossdk.io/math" storetypes "github.com/cosmos/cosmos-sdk/store/types" + abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" "github.com/cosmos/cosmos-sdk/codec" @@ -111,3 +112,19 @@ func (k Keeper) SetLastTotalPower(ctx sdk.Context, power math.Int) { func (k Keeper) GetAuthority() string { return k.authority } + +// SetValidatorUpdates sets the ABCI validator power updates for the current block. +func (k Keeper) SetValidatorUpdates(ctx sdk.Context, valUpdates []abci.ValidatorUpdate) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&types.ValidatorUpdates{Updates: valUpdates}) + store.Set(types.ValidatorUpdatesKey, bz) +} + +// GetValidatorUpdates returns the ABCI validator power updates within the current block. +func (k Keeper) GetValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.ValidatorUpdatesKey) + var valUpdates types.ValidatorUpdates + k.cdc.MustUnmarshal(bz, &valUpdates) + return valUpdates.Updates +} diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index 7b239e588f11..1089c26ad68a 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -30,7 +30,7 @@ import ( // // 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) math.Int { +func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeight int64, power int64, slashFactor sdk.Dec, _ types.Infraction) math.Int { logger := k.Logger(ctx) if slashFactor.IsNegative() { @@ -191,7 +191,7 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty continue } - if entry.IsMature(now) { + if entry.IsMature(now) && !entry.OnHold() { // Unbonding delegation no longer eligible for slashing, skip it continue } @@ -245,7 +245,7 @@ func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, continue } - if entry.IsMature(now) { + if entry.IsMature(now) && !entry.OnHold() { // Redelegation no longer eligible for slashing, skip it continue } diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index 273256fb42ee..f4fd418b64b0 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -46,5 +46,5 @@ func (s *KeeperTestSuite) TestSlashAtFutureHeight() { require.NoError(err) fraction := sdk.NewDecWithPrec(5, 1) - require.Panics(func() { keeper.Slash(ctx, consAddr, 1, 10, fraction) }) + require.Panics(func() { keeper.Slash(ctx, consAddr, 1, 10, fraction, 0) }) } diff --git a/x/staking/keeper/unbonding.go b/x/staking/keeper/unbonding.go new file mode 100644 index 000000000000..81f95f2b4a62 --- /dev/null +++ b/x/staking/keeper/unbonding.go @@ -0,0 +1,454 @@ +package keeper + +import ( + "encoding/binary" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// Increments and returns a unique ID for an unbonding operation +func (k Keeper) IncrementUnbondingId(ctx sdk.Context) (unbondingId uint64) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.UnbondingIdKey) + + if bz == nil { + unbondingId = 0 + } else { + unbondingId = binary.BigEndian.Uint64(bz) + } + + unbondingId = unbondingId + 1 + + // Convert back into bytes for storage + bz = make([]byte, 8) + binary.BigEndian.PutUint64(bz, unbondingId) + + store.Set(types.UnbondingIdKey, bz) + + return unbondingId +} + +// Remove a mapping from UnbondingId to unbonding operation +func (k Keeper) DeleteUnbondingIndex(ctx sdk.Context, id uint64) { + store := ctx.KVStore(k.storeKey) + store.Delete(types.GetUnbondingIndexKey(id)) +} + +func (k Keeper) GetUnbondingType(ctx sdk.Context, id uint64) (unbondingType types.UnbondingType, found bool) { + store := ctx.KVStore(k.storeKey) + + bz := store.Get(types.GetUnbondingTypeKey(id)) + if bz == nil { + return unbondingType, false + } + + return types.UnbondingType(binary.BigEndian.Uint64(bz)), true +} + +func (k Keeper) SetUnbondingType(ctx sdk.Context, id uint64, unbondingType types.UnbondingType) { + store := ctx.KVStore(k.storeKey) + + // Convert into bytes for storage + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, uint64(unbondingType)) + + store.Set(types.GetUnbondingTypeKey(id), bz) +} + +// return a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetUnbondingDelegationByUnbondingId( + ctx sdk.Context, id uint64, +) (ubd types.UnbondingDelegation, found bool) { + store := ctx.KVStore(k.storeKey) + + ubdeKey := store.Get(types.GetUnbondingIndexKey(id)) + if ubdeKey == nil { + return types.UnbondingDelegation{}, false + } + + value := store.Get(ubdeKey) + if value == nil { + return types.UnbondingDelegation{}, false + } + + ubd, err := types.UnmarshalUBD(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.UnbondingDelegation{}, false + } + + return ubd, true +} + +// return a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetRedelegationByUnbondingId( + ctx sdk.Context, id uint64, +) (red types.Redelegation, found bool) { + store := ctx.KVStore(k.storeKey) + + redKey := store.Get(types.GetUnbondingIndexKey(id)) + if redKey == nil { + return types.Redelegation{}, false + } + + value := store.Get(redKey) + if value == nil { + return types.Redelegation{}, false + } + + red, err := types.UnmarshalRED(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.Redelegation{}, false + } + + return red, true +} + +// return the validator that is unbonding with a certain unbonding op ID +func (k Keeper) GetValidatorByUnbondingId( + ctx sdk.Context, id uint64, +) (val types.Validator, found bool) { + store := ctx.KVStore(k.storeKey) + + valKey := store.Get(types.GetUnbondingIndexKey(id)) + if valKey == nil { + return types.Validator{}, false + } + + value := store.Get(valKey) + if value == nil { + return types.Validator{}, false + } + + val, err := types.UnmarshalValidator(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.Validator{}, false + } + + return val, true +} + +// Set an index to look up an UnbondingDelegation by the unbondingId of an UnbondingDelegationEntry that it contains +func (k Keeper) SetUnbondingDelegationByUnbondingId( + ctx sdk.Context, ubd types.UnbondingDelegation, id uint64, +) { + store := ctx.KVStore(k.storeKey) + + delAddr, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) + if err != nil { + panic(err) + } + + valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + if err != nil { + panic(err) + } + + ubdKey := types.GetUBDKey(delAddr, valAddr) + store.Set(types.GetUnbondingIndexKey(id), ubdKey) + + // Set unbonding type so that we know how to deserialize it later + k.SetUnbondingType(ctx, id, types.UnbondingType_UnbondingDelegation) +} + +// Set an index to look up an Redelegation by the unbondingId of an RedelegationEntry that it contains +func (k Keeper) SetRedelegationByUnbondingId(ctx sdk.Context, red types.Redelegation, id uint64) { + store := ctx.KVStore(k.storeKey) + + delAddr, err := sdk.AccAddressFromBech32(red.DelegatorAddress) + if err != nil { + panic(err) + } + + valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) + if err != nil { + panic(err) + } + + valDstAddr, err := sdk.ValAddressFromBech32(red.ValidatorDstAddress) + if err != nil { + panic(err) + } + + redKey := types.GetREDKey(delAddr, valSrcAddr, valDstAddr) + store.Set(types.GetUnbondingIndexKey(id), redKey) + + // Set unbonding type so that we know how to deserialize it later + k.SetUnbondingType(ctx, id, types.UnbondingType_Redelegation) +} + +// Set an index to look up a Validator by the unbondingId corresponding to its current unbonding +func (k Keeper) SetValidatorByUnbondingId(ctx sdk.Context, val types.Validator, id uint64) { + store := ctx.KVStore(k.storeKey) + + valAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress) + if err != nil { + panic(err) + } + + valKey := types.GetValidatorKey(valAddr) + store.Set(types.GetUnbondingIndexKey(id), valKey) + + // Set unbonding type so that we know how to deserialize it later + k.SetUnbondingType(ctx, id, types.UnbondingType_ValidatorUnbonding) +} + +// unbondingDelegationEntryArrayIndex and redelegationEntryArrayIndex are utilities to find +// at which position in the Entries array the entry with a given id is +// ---------------------------------------------------------------------------------------- + +func unbondingDelegationEntryArrayIndex(ubd types.UnbondingDelegation, id uint64) (index int, found bool) { + for i, entry := range ubd.Entries { + // we find the entry with the right ID + if entry.UnbondingId == id { + return i, true + } + } + + return 0, false +} + +func redelegationEntryArrayIndex(red types.Redelegation, id uint64) (index int, found bool) { + for i, entry := range red.Entries { + // we find the entry with the right ID + if entry.UnbondingId == id { + return i, true + } + } + + return 0, false +} + +// UnbondingCanComplete allows a stopped unbonding operation, such as an +// unbonding delegation, a redelegation, or a validator unbonding to complete. +// In order for the unbonding operation with `id` to eventually complete, every call +// to PutUnbondingOnHold(id) must be matched by a call to UnbondingCanComplete(id). +// ---------------------------------------------------------------------------------------- + +func (k Keeper) UnbondingCanComplete(ctx sdk.Context, id uint64) error { + unbondingType, found := k.GetUnbondingType(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + switch unbondingType { + case types.UnbondingType_UnbondingDelegation: + err := k.unbondingDelegationEntryCanComplete(ctx, id) + if err != nil { + return err + } + case types.UnbondingType_Redelegation: + err := k.redelegationEntryCanComplete(ctx, id) + if err != nil { + return err + } + case types.UnbondingType_ValidatorUnbonding: + err := k.validatorUnbondingCanComplete(ctx, id) + if err != nil { + return err + } + } + + // If an entry was not found + return types.ErrUnbondingNotFound +} + +func (k Keeper) unbondingDelegationEntryCanComplete(ctx sdk.Context, id uint64) error { + ubd, found := k.GetUnbondingDelegationByUnbondingId(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + i, found := unbondingDelegationEntryArrayIndex(ubd, id) + + if !found { + return types.ErrUnbondingNotFound + } + + // The entry must be on hold + if !ubd.Entries[i].OnHold() { + return sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "undelegation unbondingId(%d), expecting UnbondingOnHoldRefCount > 0, got %T", + id, ubd.Entries[i].UnbondingOnHoldRefCount, + ) + } + ubd.Entries[i].UnbondingOnHoldRefCount-- + + // Check if entry is matured. + if !ubd.Entries[i].OnHold() && ubd.Entries[i].IsMature(ctx.BlockHeader().Time) { + // If matured, complete it. + delegatorAddress, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) + if err != nil { + return err + } + + bondDenom := k.GetParams(ctx).BondDenom + + // track undelegation only when remaining or truncated shares are non-zero + if !ubd.Entries[i].Balance.IsZero() { + amt := sdk.NewCoin(bondDenom, ubd.Entries[i].Balance) + if err := k.bankKeeper.UndelegateCoinsFromModuleToAccount( + ctx, types.NotBondedPoolName, delegatorAddress, sdk.NewCoins(amt), + ); err != nil { + return err + } + } + + // Remove entry + ubd.RemoveEntry(int64(i)) + // Remove from the UnbondingIndex + k.DeleteUnbondingIndex(ctx, id) + } + + // 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) + } + + // Successfully completed unbonding + return nil +} + +func (k Keeper) redelegationEntryCanComplete(ctx sdk.Context, id uint64) error { + red, found := k.GetRedelegationByUnbondingId(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + i, found := redelegationEntryArrayIndex(red, id) + if !found { + return types.ErrUnbondingNotFound + } + + // The entry must be on hold + if !red.Entries[i].OnHold() { + return sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "redelegation unbondingId(%d), expecting UnbondingOnHoldRefCount > 0, got %T", + id, red.Entries[i].UnbondingOnHoldRefCount, + ) + } + red.Entries[i].UnbondingOnHoldRefCount-- + + if !red.Entries[i].OnHold() && red.Entries[i].IsMature(ctx.BlockHeader().Time) { + // If matured, complete it. + // Remove entry + red.RemoveEntry(int64(i)) + // Remove from the Unbonding index + k.DeleteUnbondingIndex(ctx, id) + } + + // set the redelegation or remove it if there are no more entries + if len(red.Entries) == 0 { + k.RemoveRedelegation(ctx, red) + } else { + k.SetRedelegation(ctx, red) + } + + // Successfully completed unbonding + return nil +} + +func (k Keeper) validatorUnbondingCanComplete(ctx sdk.Context, id uint64) error { + val, found := k.GetValidatorByUnbondingId(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + if val.UnbondingOnHoldRefCount <= 0 { + return sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "val(%s), expecting UnbondingOnHoldRefCount > 0, got %T", + val.OperatorAddress, val.UnbondingOnHoldRefCount, + ) + } + val.UnbondingOnHoldRefCount-- + k.SetValidator(ctx, val) + + return nil +} + +// PutUnbondingOnHold allows an external module to stop an unbonding operation, +// such as an unbonding delegation, a redelegation, or a validator unbonding. +// In order for the unbonding operation with `id` to eventually complete, every call +// to PutUnbondingOnHold(id) must be matched by a call to UnbondingCanComplete(id). +// ---------------------------------------------------------------------------------------- +func (k Keeper) PutUnbondingOnHold(ctx sdk.Context, id uint64) error { + unbondingType, found := k.GetUnbondingType(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + switch unbondingType { + case types.UnbondingType_UnbondingDelegation: + err := k.putUnbondingDelegationEntryOnHold(ctx, id) + if err != nil { + return err + } + case types.UnbondingType_Redelegation: + err := k.putRedelegationEntryOnHold(ctx, id) + if err != nil { + return err + } + case types.UnbondingType_ValidatorUnbonding: + err := k.putValidatorOnHold(ctx, id) + if err != nil { + return err + } + } + + // If an entry was not found + return types.ErrUnbondingNotFound +} + +func (k Keeper) putUnbondingDelegationEntryOnHold(ctx sdk.Context, id uint64) error { + ubd, found := k.GetUnbondingDelegationByUnbondingId(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + i, found := unbondingDelegationEntryArrayIndex(ubd, id) + if !found { + return types.ErrUnbondingNotFound + } + + ubd.Entries[i].UnbondingOnHoldRefCount++ + k.SetUnbondingDelegation(ctx, ubd) + + return nil +} + +func (k Keeper) putRedelegationEntryOnHold(ctx sdk.Context, id uint64) error { + red, found := k.GetRedelegationByUnbondingId(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + i, found := redelegationEntryArrayIndex(red, id) + if !found { + return types.ErrUnbondingNotFound + } + + red.Entries[i].UnbondingOnHoldRefCount++ + k.SetRedelegation(ctx, red) + + return nil +} + +func (k Keeper) putValidatorOnHold(ctx sdk.Context, id uint64) error { + val, found := k.GetValidatorByUnbondingId(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + val.UnbondingOnHoldRefCount++ + k.SetValidator(ctx, val) + + return nil +} diff --git a/x/staking/keeper/unbonding_test.go b/x/staking/keeper/unbonding_test.go new file mode 100644 index 000000000000..f598904ea928 --- /dev/null +++ b/x/staking/keeper/unbonding_test.go @@ -0,0 +1,424 @@ +package keeper_test + +import ( + "testing" + "time" + + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" + "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" +) + +type StakingHooksTemplate struct{} + +var _ types.StakingHooks = StakingHooksTemplate{} + +func (h StakingHooksTemplate) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { + return nil +} +func (h StakingHooksTemplate) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) error { + return nil +} +func (h StakingHooksTemplate) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { + return nil +} + +type MockStakingHooks struct { + StakingHooksTemplate + afterUnbondingInitiated func(uint64) +} + +func (h MockStakingHooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { + h.afterUnbondingInitiated(id) + return nil +} + +func (s *KeeperTestSuite) SetupUnbondingTests(t *testing.T, hookCalled *bool, ubdeID *uint64) ( + ctx sdk.Context, bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, +) { + ctx, keeper := s.ctx, s.stakingKeeper + // _, app, ctx = createTestInput() + + // stakingKeeper := keeper.NewKeeper( + // app.AppCodec(), + // app.GetKey(types.StoreKey), + // app.AccountKeeper, + // app.BankKeeper, + // app.GetSubspace(types.ModuleName), + // ) + + myHooks := MockStakingHooks{ + afterUnbondingInitiated: func(id uint64) { + *hookCalled = true + // save id + *ubdeID = id + // call back to stop unbonding + err := keeper.PutUnbondingOnHold(ctx, id) + require.NoError(t, err) + }, + } + + keeper.SetHooks( + types.NewMultiStakingHooks(myHooks), + ) + + addrDels = simtestutil.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(10000)) + addrVals = simtestutil.ConvertAddrsToValAddrs(addrDels) + + valTokens := keeper.TokensFromConsensusPower(ctx, 10) + startTokens := keeper.TokensFromConsensusPower(ctx, 20) + + bondDenom = keeper.BondDenom(ctx) + notBondedPool := keeper.GetNotBondedPool(ctx) + + // require.NoError(t, banktestutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) + s.bankKeeper.SendCoinsFromModuleToModule(ctx, types.NotBondedPoolName, types.BondedPoolName, startTokens) + app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) + + // Create a validator + validator1 := teststaking.NewValidator(t, addrVals[0], PKs[0]) + validator1, issuedShares1 := validator1.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares1.RoundInt()) + + validator1 = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator1, true) + require.True(sdk.IntEq(t, valTokens, validator1.BondedTokens())) + require.True(t, validator1.IsBonded()) + + // Create a delegator + delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares1) + keeper.SetDelegation(ctx, delegation) + + // Create a validator to redelegate to + validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) + validator2, issuedShares2 := validator2.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares2.RoundInt()) + + validator2 = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator2, true) + require.Equal(t, types.Bonded, validator2.Status) + require.True(t, validator2.IsBonded()) + + return +} + +func doUnbondingDelegation( + t *testing.T, app *simtestutil.SimApp, ctx sdk.Context, bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, +) (completionTime time.Time, bondedAmt sdk.Int, notBondedAmt sdk.Int) { + // UNDELEGATE + // Save original bonded and unbonded amounts + bondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + var err error + completionTime, err = app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) + require.NoError(t, err) + + // check that the unbonding actually happened + bondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + // Bonded amount is less + require.True(sdk.IntEq(t, bondedAmt1.SubRaw(1), bondedAmt2)) + // Unbonded amount is more + require.True(sdk.IntEq(t, notBondedAmt1.AddRaw(1), notBondedAmt2)) + + // Check that the unbonding happened- we look up the entry and see that it has the correct number of shares + unbondingDelegations := app.StakingKeeper.GetUnbondingDelegationsFromValidator(ctx, addrVals[0]) + require.Equal(t, sdk.NewInt(1), unbondingDelegations[0].Entries[0].Balance) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime, bondedAmt2, notBondedAmt2 +} + +func doRedelegation( + t *testing.T, app *simtestutil.SimApp, ctx sdk.Context, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, +) (completionTime time.Time) { + var err error + completionTime, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1], sdk.NewDec(1)) + require.NoError(t, err) + + // Check that the redelegation happened- we look up the entry and see that it has the correct number of shares + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + require.Equal(t, sdk.NewDec(1), redelegations[0].Entries[0].SharesDst) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime +} + +func doValidatorUnbonding( + t *testing.T, app *simtestutil.SimApp, ctx sdk.Context, addrVal sdk.ValAddress, hookCalled *bool, +) (validator types.Validator) { + validator, found := app.StakingKeeper.GetValidator(ctx, addrVal) + require.True(t, found) + // Check that status is bonded + require.Equal(t, types.BondStatus(3), validator.Status) + + validator, err := app.StakingKeeper.BeginUnbondingValidator(ctx, validator) + require.NoError(t, err) + + // Check that status is unbonding + require.Equal(t, types.BondStatus(2), validator.Status) + + // check that our hook was called + require.True(t, *hookCalled) + + return validator +} + +func (s *KeeperTestSuite) TestValidatorUnbondingOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + + app, ctx, _, _, addrVals := s.SetupUnbondingTests(t, &hookCalled, &ubdeID) + + // Start unbonding first validator + validator := doValidatorUnbonding(t, app, ctx, addrVals[0], &hookCalled) + + completionTime := validator.UnbondingTime + completionHeight := validator.UnbondingHeight + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Try to unbond validator + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that validator unbonding is not complete (is not mature yet) + validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator.Status) + unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 1, len(unbondingVals)) + require.Equal(t, validator.OperatorAddress, unbondingVals[0]) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) + ctx = ctx.WithBlockHeight(completionHeight + 1) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that validator unbonding is complete + validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 0, len(unbondingVals)) +} + +// func TestValidatorUnbondingOnHold2(t *testing.T) { +// var hookCalled bool +// var ubdeID uint64 +// var ubdeIDs []uint64 +// app, ctx, _, _, addrVals := setup(t, &hookCalled, &ubdeID) + +// // Start unbonding first validator +// validator1 := doValidatorUnbonding(t, app, ctx, addrVals[0], &hookCalled) +// ubdeIDs = append(ubdeIDs, ubdeID) + +// // Reset hookCalled flag +// hookCalled = false + +// // Start unbonding second validator +// validator2 := doValidatorUnbonding(t, app, ctx, addrVals[1], &hookCalled) +// ubdeIDs = append(ubdeIDs, ubdeID) + +// // Check that there are two unbonding operations +// require.Equal(t, 2, len(ubdeIDs)) + +// // Check that both validators have same unbonding time +// require.Equal(t, validator1.UnbondingTime, validator2.UnbondingTime) + +// completionTime := validator1.UnbondingTime +// completionHeight := validator1.UnbondingHeight + +// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE +// ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) +// ctx = ctx.WithBlockHeight(completionHeight + 1) +// app.StakingKeeper.UnbondAllMatureValidators(ctx) + +// // Check that unbonding is not complete for both validators +// validator1, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) +// require.True(t, found) +// require.Equal(t, types.Unbonding, validator1.Status) +// validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) +// require.True(t, found) +// require.Equal(t, types.Unbonding, validator2.Status) +// unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) +// require.Equal(t, 2, len(unbondingVals)) +// require.Equal(t, validator1.OperatorAddress, unbondingVals[0]) +// require.Equal(t, validator2.OperatorAddress, unbondingVals[1]) + +// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE +// err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[0]) +// require.NoError(t, err) + +// // Try again to unbond validators +// app.StakingKeeper.UnbondAllMatureValidators(ctx) + +// // Check that unbonding is complete for validator1, but not for validator2 +// validator1, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) +// require.True(t, found) +// require.Equal(t, types.Unbonded, validator1.Status) +// validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) +// require.True(t, found) +// require.Equal(t, types.Unbonding, validator2.Status) +// unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) +// require.Equal(t, 1, len(unbondingVals)) +// require.Equal(t, validator2.OperatorAddress, unbondingVals[0]) + +// // Unbonding for validator2 can complete +// err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[1]) +// require.NoError(t, err) + +// // Try again to unbond validators +// app.StakingKeeper.UnbondAllMatureValidators(ctx) + +// // Check that unbonding is complete for validator2 +// validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) +// require.True(t, found) +// require.Equal(t, types.Unbonded, validator2.Status) +// unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) +// require.Equal(t, 0, len(unbondingVals)) +// } + +// func TestRedelegationOnHold1(t *testing.T) { +// var hookCalled bool +// var ubdeID uint64 +// app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) +// completionTime := doRedelegation(t, app, ctx, addrDels, addrVals, &hookCalled) + +// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE +// err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) +// require.NoError(t, err) + +// // Redelegation is not complete - still exists +// redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) +// require.Equal(t, 1, len(redelegations)) + +// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE +// ctx = ctx.WithBlockTime(completionTime) +// _, err = app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) +// require.NoError(t, err) + +// // Redelegation is complete and record is gone +// redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) +// require.Equal(t, 0, len(redelegations)) +// } + +// func TestRedelegationOnHold2(t *testing.T) { +// var hookCalled bool +// var ubdeID uint64 +// app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) +// completionTime := doRedelegation(t, app, ctx, addrDels, addrVals, &hookCalled) + +// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE +// ctx = ctx.WithBlockTime(completionTime) +// _, err := app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) +// require.NoError(t, err) + +// // Redelegation is not complete - still exists +// redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) +// require.Equal(t, 1, len(redelegations)) + +// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE +// err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) +// require.NoError(t, err) + +// // Redelegation is complete and record is gone +// redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) +// require.Equal(t, 0, len(redelegations)) +// } + +// func TestUnbondingDelegationOnHold1(t *testing.T) { +// var hookCalled bool +// var ubdeID uint64 +// app, ctx, bondDenom, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) +// completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app, ctx, bondDenom, addrDels, addrVals, &hookCalled) + +// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE +// err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) +// require.NoError(t, err) + +// bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount +// notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + +// // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the +// // unbondingDelegation has not completed +// require.True(sdk.IntEq(t, bondedAmt1, bondedAmt3)) +// require.True(sdk.IntEq(t, notBondedAmt1, notBondedAmt3)) + +// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE +// ctx = ctx.WithBlockTime(completionTime) +// _, err = app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) +// require.NoError(t, err) + +// // Check that the unbonding was finally completed +// bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount +// notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + +// require.True(sdk.IntEq(t, bondedAmt1, bondedAmt5)) +// // Not bonded amount back to what it was originaly +// require.True(sdk.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +// } + +// func TestUnbondingDelegationOnHold2(t *testing.T) { +// var hookCalled bool +// var ubdeID uint64 +// app, ctx, bondDenom, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) +// completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app, ctx, bondDenom, addrDels, addrVals, &hookCalled) + +// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE +// ctx = ctx.WithBlockTime(completionTime) +// _, err := app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) +// require.NoError(t, err) + +// bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount +// notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + +// // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the +// // unbondingDelegation has not completed +// require.True(sdk.IntEq(t, bondedAmt1, bondedAmt3)) +// require.True(sdk.IntEq(t, notBondedAmt1, notBondedAmt3)) + +// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE +// err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) +// require.NoError(t, err) + +// // Check that the unbonding was finally completed +// bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount +// notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + +// require.True(sdk.IntEq(t, bondedAmt1, bondedAmt5)) +// // Not bonded amount back to what it was originaly +// require.True(sdk.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +// } diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 5d63c458dca5..c805a0575783 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -219,6 +219,9 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab k.SetLastTotalPower(ctx, totalPower) } + // set the list of validator updates + k.SetValidatorUpdates(ctx, updates) + return updates, err } @@ -318,12 +321,16 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat panic(fmt.Sprintf("should not already be unbonded or unbonding, validator: %v\n", validator)) } + id := k.IncrementUnbondingId(ctx) + validator = validator.UpdateStatus(types.Unbonding) // set the unbonding completion time and completion height appropriately validator.UnbondingTime = ctx.BlockHeader().Time.Add(params.UnbondingTime) validator.UnbondingHeight = ctx.BlockHeader().Height + validator.UnbondingIds = append(validator.UnbondingIds, id) + // save the now unbonded validator record and power index k.SetValidator(ctx, validator) k.SetValidatorByPowerIndex(ctx, validator) @@ -341,6 +348,10 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat return validator, err } + k.SetValidatorByUnbondingId(ctx, validator, id) + + k.AfterUnbondingInitiated(ctx, id) + return validator, nil } diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index 2589de1af881..79ccdd015b68 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -417,7 +417,6 @@ func (k Keeper) ValidatorQueueIterator(ctx sdk.Context, endTime time.Time, endHe // UnbondAllMatureValidators unbonds all the mature unbonding validators that // have finished their unbonding period. func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { - store := ctx.KVStore(k.storeKey) blockTime := ctx.BlockTime() blockHeight := ctx.BlockHeight() @@ -458,13 +457,30 @@ func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { panic("unexpected validator in unbonding queue; status was not unbonding") } - val = k.UnbondingToUnbonded(ctx, val) - if val.GetDelegatorShares().IsZero() { - k.RemoveValidator(ctx, val.GetOperator()) + if val.UnbondingOnHoldRefCount == 0 { + for _, id := range val.UnbondingIds { + k.DeleteUnbondingIndex(ctx, id) + } + val = k.UnbondingToUnbonded(ctx, val) + if val.GetDelegatorShares().IsZero() { + k.RemoveValidator(ctx, val.GetOperator()) + } else { + // remove unbonding ids + val.UnbondingIds = []uint64{} + } + // remove validator from queue + k.DeleteValidatorQueue(ctx, val) } } - - store.Delete(key) } } } + +func (k Keeper) IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool { + v, f := k.GetValidatorByConsAddr(ctx, addr) + if !f { + return false + } + + return v.Jailed +} diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index 06033a4cdb86..67fbd65760c5 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -40,8 +40,8 @@ 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, math.LegacyOneDec()) - ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, math.OneInt()) - red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, math.OneInt(), math.LegacyOneDec()) + ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, math.OneInt(), 1) + red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, math.OneInt(), math.LegacyOneDec(), 0) kvPairs := kv.Pairs{ Pairs: []kv.Pair{ diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index bf9b4fa2a40c..36d2e692d426 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -196,7 +196,7 @@ func (s *SimTestSuite) TestSimulateMsgCancelUnbondingDelegation() { s.setupValidatorRewards(ctx, validator0.GetOperator()) // unbonding delegation - udb := types.NewUnbondingDelegation(delegator.Address, validator0.GetOperator(), s.app.LastBlockHeight(), blockTime.Add(2*time.Minute), delTokens) + udb := types.NewUnbondingDelegation(delegator.Address, validator0.GetOperator(), s.app.LastBlockHeight(), blockTime.Add(2*time.Minute), delTokens, 0) s.stakingKeeper.SetUnbondingDelegation(ctx, udb) s.setupValidatorRewards(ctx, validator0.GetOperator()) diff --git a/x/staking/testutil/expected_keepers_mocks.go b/x/staking/testutil/expected_keepers_mocks.go index e84885bb5209..18f3e82fce2b 100644 --- a/x/staking/testutil/expected_keepers_mocks.go +++ b/x/staking/testutil/expected_keepers_mocks.go @@ -403,17 +403,17 @@ func (mr *MockValidatorSetMockRecorder) MaxValidators(arg0 interface{}) *gomock. } // Slash mocks base method. -func (m *MockValidatorSet) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec) math.Int { +func (m *MockValidatorSet) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec, arg5 types1.Infraction) math.Int { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4) + ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4, arg5) ret0, _ := ret[0].(math.Int) return ret0 } // Slash indicates an expected call of Slash. -func (mr *MockValidatorSetMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { +func (mr *MockValidatorSetMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockValidatorSet)(nil).Slash), arg0, arg1, arg2, arg3, arg4) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockValidatorSet)(nil).Slash), arg0, arg1, arg2, arg3, arg4, arg5) } // StakingTokenSupply mocks base method. @@ -570,6 +570,20 @@ func (mr *MockStakingHooksMockRecorder) AfterDelegationModified(ctx, delAddr, va return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterDelegationModified", reflect.TypeOf((*MockStakingHooks)(nil).AfterDelegationModified), ctx, delAddr, valAddr) } +// AfterUnbondingInitiated mocks base method. +func (m *MockStakingHooks) AfterUnbondingInitiated(ctx types.Context, id uint64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AfterUnbondingInitiated", ctx, id) + ret0, _ := ret[0].(error) + return ret0 +} + +// AfterUnbondingInitiated indicates an expected call of AfterUnbondingInitiated. +func (mr *MockStakingHooksMockRecorder) AfterUnbondingInitiated(ctx, id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterUnbondingInitiated", reflect.TypeOf((*MockStakingHooks)(nil).AfterUnbondingInitiated), ctx, id) +} + // AfterValidatorBeginUnbonding mocks base method. func (m *MockStakingHooks) AfterValidatorBeginUnbonding(ctx types.Context, consAddr types.ConsAddress, valAddr types.ValAddress) error { m.ctrl.T.Helper() diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index 51df1eb78b68..7b577e875c06 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -92,12 +92,14 @@ func (d Delegations) String() (out string) { return strings.TrimSpace(out) } -func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int) UnbondingDelegationEntry { +func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, id uint64) UnbondingDelegationEntry { return UnbondingDelegationEntry{ - CreationHeight: creationHeight, - CompletionTime: completionTime, - InitialBalance: balance, - Balance: balance, + CreationHeight: creationHeight, + CompletionTime: completionTime, + InitialBalance: balance, + Balance: balance, + UnbondingId: id, + UnbondingOnHoldRefCount: 0, } } @@ -112,24 +114,50 @@ func (e UnbondingDelegationEntry) IsMature(currentTime time.Time) bool { return !e.CompletionTime.After(currentTime) } +// OnHold - is the current entry on hold due to external modules +func (e UnbondingDelegationEntry) OnHold() bool { + return e.UnbondingOnHoldRefCount > 0 +} + +// return the unbonding delegation entry +func MustMarshalUBDE(cdc codec.BinaryCodec, ubd UnbondingDelegationEntry) []byte { + return cdc.MustMarshal(&ubd) +} + +// unmarshal a unbonding delegation entry from a store value +func MustUnmarshalUBDE(cdc codec.BinaryCodec, value []byte) UnbondingDelegationEntry { + ubd, err := UnmarshalUBDE(cdc, value) + if err != nil { + panic(err) + } + + return ubd +} + +// unmarshal a unbonding delegation entry from a store value +func UnmarshalUBDE(cdc codec.BinaryCodec, value []byte) (ubd UnbondingDelegationEntry, err error) { + err = cdc.Unmarshal(value, &ubd) + return ubd, err +} + // NewUnbondingDelegation - create a new unbonding delegation object // //nolint:interfacer func NewUnbondingDelegation( delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance math.Int, + creationHeight int64, minTime time.Time, balance math.Int, id uint64, ) UnbondingDelegation { return UnbondingDelegation{ DelegatorAddress: delegatorAddr.String(), ValidatorAddress: validatorAddr.String(), Entries: []UnbondingDelegationEntry{ - NewUnbondingDelegationEntry(creationHeight, minTime, balance), + NewUnbondingDelegationEntry(creationHeight, minTime, balance, id), }, } } // AddEntry - append entry to the unbonding delegation -func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int) { +func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, id uint64) { // Check the entries exists with creation_height and complete_time entryIndex := -1 for index, ubdEntry := range ubd.Entries { @@ -148,7 +176,7 @@ func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time ubd.Entries[entryIndex] = ubdEntry } else { // append the new unbond delegation entry - entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance) + entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance, id) ubd.Entries = append(ubd.Entries, entry) } } @@ -207,12 +235,14 @@ func (ubds UnbondingDelegations) String() (out string) { return strings.TrimSpace(out) } -func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, sharesDst sdk.Dec) RedelegationEntry { +func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, sharesDst sdk.Dec, id uint64) RedelegationEntry { return RedelegationEntry{ - CreationHeight: creationHeight, - CompletionTime: completionTime, - InitialBalance: balance, - SharesDst: sharesDst, + CreationHeight: creationHeight, + CompletionTime: completionTime, + InitialBalance: balance, + SharesDst: sharesDst, + UnbondingId: id, + UnbondingOnHoldRefCount: 0, } } @@ -227,24 +257,29 @@ func (e RedelegationEntry) IsMature(currentTime time.Time) bool { return !e.CompletionTime.After(currentTime) } +// OnHold - is the current entry on hold due to external modules +func (e RedelegationEntry) OnHold() bool { + return e.UnbondingOnHoldRefCount > 0 +} + //nolint:interfacer func NewRedelegation( delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec, + creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec, id uint64, ) Redelegation { return Redelegation{ DelegatorAddress: delegatorAddr.String(), ValidatorSrcAddress: validatorSrcAddr.String(), ValidatorDstAddress: validatorDstAddr.String(), Entries: []RedelegationEntry{ - NewRedelegationEntry(creationHeight, minTime, balance, sharesDst), + NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, id), }, } } // AddEntry - append entry to the unbonding delegation -func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec) { - entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst) +func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec, id uint64) { + entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, id) red.Entries = append(red.Entries, entry) } @@ -371,10 +406,10 @@ func NewRedelegationResponse( // NewRedelegationEntryResponse creates a new RedelegationEntryResponse instance. func NewRedelegationEntryResponse( - creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance math.Int, + creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance math.Int, id uint64, ) RedelegationEntryResponse { return RedelegationEntryResponse{ - RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst), + RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst, id), Balance: balance, } } diff --git a/x/staking/types/delegation_test.go b/x/staking/types/delegation_test.go index 5cd9caca23b8..b259f95f45d9 100644 --- a/x/staking/types/delegation_test.go +++ b/x/staking/types/delegation_test.go @@ -34,7 +34,7 @@ func TestDelegationString(t *testing.T) { func TestUnbondingDelegationEqual(t *testing.T) { ubd1 := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), sdk.NewInt(0)) + time.Unix(0, 0), sdk.NewInt(0), 1) ubd2 := ubd1 ok := ubd1.String() == ubd2.String() @@ -49,7 +49,7 @@ func TestUnbondingDelegationEqual(t *testing.T) { func TestUnbondingDelegationString(t *testing.T) { ubd := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), sdk.NewInt(0)) + time.Unix(0, 0), sdk.NewInt(0), 1) require.NotEmpty(t, ubd.String()) } @@ -57,10 +57,10 @@ func TestUnbondingDelegationString(t *testing.T) { func TestRedelegationEqual(t *testing.T) { r1 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - math.LegacyNewDec(0)) + math.LegacyNewDec(0), 1) r2 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - math.LegacyNewDec(0)) + math.LegacyNewDec(0), 2) ok := r1.String() == r2.String() require.True(t, ok) @@ -75,7 +75,7 @@ func TestRedelegationEqual(t *testing.T) { func TestRedelegationString(t *testing.T) { r := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - math.LegacyNewDec(10)) + math.LegacyNewDec(10), 1) require.NotEmpty(t, r.String()) } @@ -112,8 +112,8 @@ func TestDelegationResponses(t *testing.T) { func TestRedelegationResponses(t *testing.T) { cdc := codec.NewLegacyAmino() entries := []types.RedelegationEntryResponse{ - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), sdk.NewInt(5), sdk.NewInt(5)), - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), sdk.NewInt(5), sdk.NewInt(5)), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), sdk.NewInt(5), sdk.NewInt(5), 0), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), sdk.NewInt(5), sdk.NewInt(5), 0), } rdr1 := types.NewRedelegationResponse(sdk.AccAddress(valAddr1), valAddr2, valAddr3, entries) rdr2 := types.NewRedelegationResponse(sdk.AccAddress(valAddr2), valAddr1, valAddr3, entries) diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index a9a6e43e35b6..5cf482984dc5 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -50,4 +50,6 @@ 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") + ErrUnbondingNotFound = sdkerrors.Register(ModuleName, 41, "unbonding operation not found") + ErrUnbondingOnHoldRefCountNegative = sdkerrors.Register(ModuleName, 42, "cannot un-hold unbonding operation that is not on hold") ) diff --git a/x/staking/types/expected_keepers.go b/x/staking/types/expected_keepers.go index 871adcba9202..0a3ef7477ab4 100644 --- a/x/staking/types/expected_keepers.go +++ b/x/staking/types/expected_keepers.go @@ -61,7 +61,7 @@ type ValidatorSet interface { StakingTokenSupply(sdk.Context) math.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) math.Int + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, Infraction) math.Int Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator @@ -103,6 +103,7 @@ type StakingHooks interface { 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 + AfterUnbondingInitiated(ctx sdk.Context, id uint64) error } // StakingHooksWrapper is a wrapper for modules to inject StakingHooks using depinject. diff --git a/x/staking/types/hooks.go b/x/staking/types/hooks.go index 93e0d21cc085..6fad1df77d6b 100644 --- a/x/staking/types/hooks.go +++ b/x/staking/types/hooks.go @@ -103,3 +103,12 @@ func (h MultiStakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.V } return nil } + +func (h MultiStakingHooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { + for i := range h { + if err := h[i].AfterUnbondingInitiated(ctx, id); err != nil { + return err + } + } + return nil +} diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index c56348789a66..3d3aba807529 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -42,15 +42,44 @@ var ( 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 + UnbondingIdKey = []byte{0x37} // key for the counter for the incrementing id for UnbondingOperations + UnbondingIndexKey = []byte{0x38} // prefix for an index for looking up unbonding operations by their IDs + UnbondingTypeKey = []byte{0x39} // prefix for an index containing the type of unbonding operations + 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 + HistoricalInfoKey = []byte{0x50} // prefix for the historical info + ValidatorUpdatesKey = []byte{0x51} // prefix for the end block validator updates key ParamsKey = []byte{0x51} // prefix for parameters for module x/staking ) +// TODO: Cosmos-SDK team- Is this the way I should do an enum? Is this the right place to do it? +type UnbondingType int + +const ( + UnbondingType_Undefined UnbondingType = iota + UnbondingType_UnbondingDelegation + UnbondingType_Redelegation + UnbondingType_ValidatorUnbonding +) + +// Returns a key for an index containing the type of unbonding operations +func GetUnbondingTypeKey(id uint64) []byte { + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, id) + return append(UnbondingTypeKey, bz...) +} + +// Returns a key for the index for looking up UnbondingDelegations by the UnbondingDelegationEntries they contain +func GetUnbondingIndexKey(id uint64) []byte { + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, id) + return append(UnbondingIndexKey, bz...) +} + // GetValidatorKey creates the key for the validator with address // VALUE: staking/Validator func GetValidatorKey(operatorAddr sdk.ValAddress) []byte { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index b4d7523c1243..a4b53d53c671 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -16,6 +16,7 @@ import ( proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor "github.com/cosmos/gogoproto/protoc-gen-gogo/descriptor" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + types3 "github.com/tendermint/tendermint/abci/types" types "github.com/tendermint/tendermint/proto/tendermint/types" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" @@ -76,6 +77,38 @@ func (BondStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_64c30c6cf92913c9, []int{0} } +// Infraction indicates the infraction a validator commited. +type Infraction int32 + +const ( + // UNSPECIFIED defines an empty infraction. + Infraction_INFRACTION_UNSPECIFIED Infraction = 0 + // DOUBLE_SIGN defines a validator that double-signs a block. + Infraction_INFRACTION_DOUBLE_SIGN Infraction = 1 + // DOWNTIME defines a validator that missed signing too many blocks. + Infraction_INFRACTION_DOWNTIME Infraction = 2 +) + +var Infraction_name = map[int32]string{ + 0: "INFRACTION_UNSPECIFIED", + 1: "INFRACTION_DOUBLE_SIGN", + 2: "INFRACTION_DOWNTIME", +} + +var Infraction_value = map[string]int32{ + "INFRACTION_UNSPECIFIED": 0, + "INFRACTION_DOUBLE_SIGN": 1, + "INFRACTION_DOWNTIME": 2, +} + +func (x Infraction) String() string { + return proto.EnumName(Infraction_name, int32(x)) +} + +func (Infraction) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{1} +} + // 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 @@ -336,6 +369,10 @@ type Validator struct { // // Since: cosmos-sdk 0.46 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"` + // strictly positive if this validator's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,12,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` + // list of unbonding ids, each uniquely identifing an unbonding of this validator + UnbondingIds []uint64 `protobuf:"varint,13,rep,packed,name=unbonding_ids,json=unbondingIds,proto3" json:"unbonding_ids,omitempty"` } func (m *Validator) Reset() { *m = Validator{} } @@ -683,6 +720,10 @@ type UnbondingDelegationEntry struct { 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"` // balance defines the tokens to receive at completion. 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"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (m *UnbondingDelegationEntry) Reset() { *m = UnbondingDelegationEntry{} } @@ -731,6 +772,20 @@ func (m *UnbondingDelegationEntry) GetCompletionTime() time.Time { return time.Time{} } +func (m *UnbondingDelegationEntry) GetUnbondingId() uint64 { + if m != nil { + return m.UnbondingId + } + return 0 +} + +func (m *UnbondingDelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if m != nil { + return m.UnbondingOnHoldRefCount + } + return 0 +} + // RedelegationEntry defines a redelegation object with relevant metadata. type RedelegationEntry struct { // creation_height defines the height which the redelegation took place. @@ -741,6 +796,10 @@ type RedelegationEntry struct { 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"` // shares_dst is the amount of destination-validator shares created by redelegation. 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"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (m *RedelegationEntry) Reset() { *m = RedelegationEntry{} } @@ -789,6 +848,20 @@ func (m *RedelegationEntry) GetCompletionTime() time.Time { return time.Time{} } +func (m *RedelegationEntry) GetUnbondingId() uint64 { + if m != nil { + return m.UnbondingId + } + return 0 +} + +func (m *RedelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if m != nil { + return m.UnbondingOnHoldRefCount + } + return 0 +} + // Redelegation contains the list of a particular delegator's redelegating bonds // from a particular source validator to a particular destination validator. type Redelegation struct { @@ -1113,8 +1186,55 @@ func (m *Pool) XXX_DiscardUnknown() { var xxx_messageInfo_Pool proto.InternalMessageInfo +// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. +// TODO: explore moving this to proto/cosmos/base to separate modules from tendermint dependence +type ValidatorUpdates struct { + Updates []types3.ValidatorUpdate `protobuf:"bytes,1,rep,name=updates,proto3" json:"updates"` +} + +func (m *ValidatorUpdates) Reset() { *m = ValidatorUpdates{} } +func (m *ValidatorUpdates) String() string { return proto.CompactTextString(m) } +func (*ValidatorUpdates) ProtoMessage() {} +func (*ValidatorUpdates) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{20} +} +func (m *ValidatorUpdates) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatorUpdates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ValidatorUpdates.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 *ValidatorUpdates) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatorUpdates.Merge(m, src) +} +func (m *ValidatorUpdates) XXX_Size() int { + return m.Size() +} +func (m *ValidatorUpdates) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatorUpdates.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatorUpdates proto.InternalMessageInfo + +func (m *ValidatorUpdates) GetUpdates() []types3.ValidatorUpdate { + if m != nil { + return m.Updates + } + return nil +} + func init() { proto.RegisterEnum("cosmos.staking.v1beta1.BondStatus", BondStatus_name, BondStatus_value) + proto.RegisterEnum("cosmos.staking.v1beta1.Infraction", Infraction_name, Infraction_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") @@ -1135,6 +1255,7 @@ func init() { proto.RegisterType((*RedelegationEntryResponse)(nil), "cosmos.staking.v1beta1.RedelegationEntryResponse") proto.RegisterType((*RedelegationResponse)(nil), "cosmos.staking.v1beta1.RedelegationResponse") proto.RegisterType((*Pool)(nil), "cosmos.staking.v1beta1.Pool") + proto.RegisterType((*ValidatorUpdates)(nil), "cosmos.staking.v1beta1.ValidatorUpdates") } func init() { @@ -1142,112 +1263,123 @@ func init() { } var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1669 bytes of a gzipped FileDescriptorProto + // 1843 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4d, 0x6c, 0x1b, 0xc7, - 0x15, 0xe6, 0x52, 0x0c, 0x45, 0x3d, 0x4a, 0xa2, 0x34, 0x56, 0x52, 0x9a, 0x68, 0x49, 0x96, 0x4d, - 0x13, 0xa7, 0x88, 0xa9, 0x5a, 0x05, 0x02, 0x54, 0x28, 0x50, 0x98, 0x22, 0x53, 0xab, 0x4e, 0x5c, - 0x86, 0x94, 0x55, 0xf4, 0x07, 0x5d, 0x0c, 0x77, 0x47, 0xd4, 0x54, 0xbb, 0xb3, 0xc4, 0xce, 0xd0, - 0x15, 0x81, 0x16, 0x28, 0xd0, 0x4b, 0xea, 0x53, 0x8e, 0xb9, 0x18, 0x30, 0x90, 0x1e, 0x73, 0x0c, - 0x7a, 0xe9, 0xa1, 0xd7, 0x34, 0x27, 0x23, 0xa7, 0xa6, 0x2d, 0xd4, 0xc2, 0xbe, 0x14, 0x3d, 0x15, - 0xb9, 0xb7, 0x28, 0xe6, 0x67, 0x7f, 0x4c, 0x8a, 0x8a, 0x14, 0xa8, 0x40, 0x00, 0x5f, 0xec, 0x9d, - 0x99, 0xf7, 0xbe, 0x79, 0xef, 0x7b, 0x3f, 0x7a, 0x43, 0x78, 0xd1, 0x09, 0xb8, 0x1f, 0xf0, 0x4d, - 0x2e, 0xf0, 0x11, 0x65, 0xc3, 0xcd, 0x7b, 0x37, 0x06, 0x44, 0xe0, 0x1b, 0xd1, 0xba, 0x39, 0x0a, - 0x03, 0x11, 0xa0, 0x17, 0xb4, 0x54, 0x33, 0xda, 0x35, 0x52, 0x95, 0x8d, 0x61, 0x30, 0x0c, 0x94, - 0xc8, 0xa6, 0xfc, 0xd2, 0xd2, 0x95, 0xab, 0xc3, 0x20, 0x18, 0x7a, 0x64, 0x53, 0xad, 0x06, 0xe3, - 0x83, 0x4d, 0xcc, 0x26, 0xe6, 0xa8, 0x3a, 0x7d, 0xe4, 0x8e, 0x43, 0x2c, 0x68, 0xc0, 0xcc, 0x79, - 0x6d, 0xfa, 0x5c, 0x50, 0x9f, 0x70, 0x81, 0xfd, 0x51, 0x84, 0xad, 0x2d, 0xb1, 0xf5, 0xa5, 0xc6, - 0x2c, 0x83, 0x6d, 0x5c, 0x19, 0x60, 0x4e, 0x62, 0x3f, 0x9c, 0x80, 0x46, 0xd8, 0x5f, 0x16, 0x84, - 0xb9, 0x24, 0xf4, 0x29, 0x13, 0x9b, 0x62, 0x32, 0x22, 0x5c, 0xff, 0xab, 0x4f, 0x1b, 0xbf, 0xb5, - 0x60, 0xf5, 0x16, 0xe5, 0x22, 0x08, 0xa9, 0x83, 0xbd, 0x5d, 0x76, 0x10, 0xa0, 0xd7, 0x20, 0x7f, - 0x48, 0xb0, 0x4b, 0xc2, 0xb2, 0x55, 0xb7, 0xae, 0x15, 0xb7, 0xca, 0xcd, 0x04, 0xa1, 0xa9, 0x75, - 0x6f, 0xa9, 0xf3, 0x56, 0xee, 0xc3, 0x93, 0x5a, 0xa6, 0x67, 0xa4, 0xd1, 0x77, 0x21, 0x7f, 0x0f, - 0x7b, 0x9c, 0x88, 0x72, 0xb6, 0xbe, 0x70, 0xad, 0xb8, 0xf5, 0xd5, 0xe6, 0xe9, 0xf4, 0x35, 0xf7, - 0xb1, 0x47, 0x5d, 0x2c, 0x82, 0x18, 0x40, 0xab, 0x35, 0xde, 0xcf, 0x42, 0x69, 0x27, 0xf0, 0x7d, - 0xca, 0x39, 0x0d, 0x58, 0x0f, 0x0b, 0xc2, 0x51, 0x17, 0x72, 0x21, 0x16, 0x44, 0x99, 0xb2, 0xd4, - 0xfa, 0x8e, 0x94, 0xff, 0xcb, 0x49, 0xed, 0xa5, 0x21, 0x15, 0x87, 0xe3, 0x41, 0xd3, 0x09, 0x7c, - 0x43, 0x86, 0xf9, 0xef, 0x3a, 0x77, 0x8f, 0x8c, 0x7f, 0x6d, 0xe2, 0x7c, 0xfc, 0xc1, 0x75, 0x30, - 0x36, 0xb4, 0x89, 0xd3, 0x53, 0x48, 0xe8, 0x87, 0x50, 0xf0, 0xf1, 0xb1, 0xad, 0x50, 0xb3, 0x97, - 0x80, 0xba, 0xe8, 0xe3, 0x63, 0x69, 0x2b, 0x72, 0xa1, 0x24, 0x81, 0x9d, 0x43, 0xcc, 0x86, 0x44, - 0xe3, 0x2f, 0x5c, 0x02, 0xfe, 0x8a, 0x8f, 0x8f, 0x77, 0x14, 0xa6, 0xbc, 0x65, 0xbb, 0xf0, 0xee, - 0xc3, 0x5a, 0xe6, 0x9f, 0x0f, 0x6b, 0x56, 0xe3, 0x0f, 0x16, 0x40, 0x42, 0x17, 0xfa, 0x29, 0xac, - 0x39, 0xf1, 0x4a, 0x5d, 0xcf, 0x4d, 0x00, 0x5f, 0x9e, 0x17, 0x88, 0x29, 0xb2, 0x5b, 0x05, 0x69, - 0xe8, 0xa3, 0x93, 0x9a, 0xd5, 0x2b, 0x39, 0x53, 0x71, 0xe8, 0x40, 0x71, 0x3c, 0x72, 0xb1, 0x20, - 0xb6, 0x4c, 0x4d, 0x45, 0x5c, 0x71, 0xab, 0xd2, 0xd4, 0x79, 0xdb, 0x8c, 0xf2, 0xb6, 0xb9, 0x17, - 0xe5, 0xad, 0xc6, 0x7a, 0xe7, 0xef, 0x35, 0xab, 0x07, 0x5a, 0x51, 0x1e, 0xa5, 0xac, 0x7f, 0xdf, - 0x82, 0x62, 0x9b, 0x70, 0x27, 0xa4, 0x23, 0x59, 0x08, 0xa8, 0x0c, 0x8b, 0x7e, 0xc0, 0xe8, 0x91, - 0x49, 0xbb, 0xa5, 0x5e, 0xb4, 0x44, 0x15, 0x28, 0x50, 0x97, 0x30, 0x41, 0xc5, 0x44, 0x07, 0xac, - 0x17, 0xaf, 0xa5, 0xd6, 0x2f, 0xc8, 0x80, 0xd3, 0x88, 0xeb, 0x5e, 0xb4, 0x44, 0xaf, 0xc0, 0x1a, - 0x27, 0xce, 0x38, 0xa4, 0x62, 0x62, 0x3b, 0x01, 0x13, 0xd8, 0x11, 0xe5, 0x9c, 0x12, 0x29, 0x45, - 0xfb, 0x3b, 0x7a, 0x5b, 0x82, 0xb8, 0x44, 0x60, 0xea, 0xf1, 0xf2, 0x73, 0x1a, 0xc4, 0x2c, 0x53, - 0xe6, 0xfe, 0x29, 0x0f, 0x4b, 0x71, 0xde, 0xa2, 0x1d, 0x58, 0x0b, 0x46, 0x24, 0x94, 0xdf, 0x36, - 0x76, 0xdd, 0x90, 0x70, 0x6e, 0x32, 0xb4, 0xfc, 0xf1, 0x07, 0xd7, 0x37, 0x0c, 0xdd, 0x37, 0xf5, - 0x49, 0x5f, 0x84, 0x94, 0x0d, 0x7b, 0xa5, 0x48, 0xc3, 0x6c, 0xa3, 0x1f, 0xc9, 0x80, 0x31, 0x4e, - 0x18, 0x1f, 0x73, 0x7b, 0x34, 0x1e, 0x1c, 0x91, 0x89, 0xe1, 0x75, 0x63, 0x86, 0xd7, 0x9b, 0x6c, - 0xd2, 0x2a, 0x7f, 0x94, 0x40, 0x3b, 0xe1, 0x64, 0x24, 0x82, 0x66, 0x77, 0x3c, 0xb8, 0x4d, 0x26, - 0x32, 0x5a, 0x06, 0xa7, 0xab, 0x60, 0xd0, 0x0b, 0x90, 0xff, 0x39, 0xa6, 0x1e, 0x71, 0x15, 0x2b, - 0x85, 0x9e, 0x59, 0xa1, 0x6d, 0xc8, 0x73, 0x81, 0xc5, 0x98, 0x2b, 0x2a, 0x56, 0xb7, 0x1a, 0xf3, - 0x32, 0xa3, 0x15, 0x30, 0xb7, 0xaf, 0x24, 0x7b, 0x46, 0x03, 0xed, 0x41, 0x5e, 0x04, 0x47, 0x84, - 0x19, 0x92, 0x2e, 0x94, 0xd5, 0xbb, 0x4c, 0xa4, 0xb2, 0x7a, 0x97, 0x89, 0x9e, 0xc1, 0x42, 0x43, - 0x58, 0x73, 0x89, 0x47, 0x86, 0x8a, 0x4a, 0x7e, 0x88, 0x43, 0xc2, 0xcb, 0xf9, 0x4b, 0xa8, 0x9a, - 0x52, 0x8c, 0xda, 0x57, 0xa0, 0xe8, 0x36, 0x14, 0xdd, 0x24, 0xdd, 0xca, 0x8b, 0x8a, 0xe8, 0xaf, - 0xcd, 0xf3, 0x3f, 0x95, 0x99, 0xa6, 0x49, 0xa5, 0xb5, 0x65, 0x72, 0x8d, 0xd9, 0x20, 0x60, 0x2e, - 0x65, 0x43, 0xfb, 0x90, 0xd0, 0xe1, 0xa1, 0x28, 0x17, 0xea, 0xd6, 0xb5, 0x85, 0x5e, 0x29, 0xde, - 0xbf, 0xa5, 0xb6, 0xd1, 0x6d, 0x58, 0x4d, 0x44, 0x55, 0xed, 0x2c, 0x5d, 0xa0, 0x76, 0x56, 0x62, - 0x5d, 0x79, 0x8a, 0x6e, 0x01, 0x24, 0x85, 0x59, 0x06, 0x05, 0xd4, 0xf8, 0xec, 0xea, 0x36, 0x2e, - 0xa4, 0x74, 0x91, 0x07, 0x57, 0x7c, 0xca, 0x6c, 0x4e, 0xbc, 0x03, 0xdb, 0x50, 0x25, 0x21, 0x8b, - 0x97, 0x10, 0xda, 0x75, 0x9f, 0xb2, 0x3e, 0xf1, 0x0e, 0xda, 0x31, 0xec, 0xf6, 0xf2, 0xdb, 0x0f, - 0x6b, 0x19, 0x53, 0x4b, 0x99, 0x46, 0x17, 0x96, 0xf7, 0xb1, 0x67, 0xca, 0x80, 0x70, 0xf4, 0x1a, - 0x2c, 0xe1, 0x68, 0x51, 0xb6, 0xea, 0x0b, 0x67, 0x96, 0x51, 0x22, 0xaa, 0xab, 0xf3, 0xd7, 0x7f, - 0xab, 0x5b, 0x8d, 0xdf, 0x59, 0x90, 0x6f, 0xef, 0x77, 0x31, 0x0d, 0x51, 0x07, 0xd6, 0x93, 0x84, - 0x3a, 0x6f, 0x6d, 0x26, 0x39, 0x18, 0x15, 0x67, 0x07, 0xd6, 0xef, 0x45, 0xe5, 0x1e, 0xc3, 0x64, - 0x3f, 0x0b, 0x26, 0x56, 0x31, 0xfb, 0x53, 0x8e, 0x77, 0x60, 0x51, 0x5b, 0xc9, 0xd1, 0x36, 0x3c, - 0x37, 0x92, 0x1f, 0xca, 0xdf, 0xe2, 0x56, 0x75, 0x6e, 0x22, 0x2a, 0x79, 0x13, 0x40, 0xad, 0xd2, - 0xf8, 0x8f, 0x05, 0xd0, 0xde, 0xdf, 0xdf, 0x0b, 0xe9, 0xc8, 0x23, 0xe2, 0xb2, 0x3c, 0x7e, 0x03, - 0x9e, 0x4f, 0x3c, 0xe6, 0xa1, 0x73, 0x6e, 0xaf, 0xaf, 0xc4, 0x6a, 0xfd, 0xd0, 0x39, 0x15, 0xcd, - 0xe5, 0x22, 0x46, 0x5b, 0x38, 0x37, 0x5a, 0x9b, 0x8b, 0xd3, 0x69, 0xec, 0x43, 0x31, 0x71, 0x9f, - 0xa3, 0x36, 0x14, 0x84, 0xf9, 0x36, 0x6c, 0x36, 0xe6, 0xb3, 0x19, 0xa9, 0x19, 0x46, 0x63, 0xcd, - 0xc6, 0x7f, 0x25, 0xa9, 0x71, 0xc6, 0x7e, 0xb1, 0xd2, 0x48, 0xf6, 0x5e, 0xd3, 0x1b, 0x2f, 0x63, - 0xa2, 0x30, 0x58, 0x53, 0xac, 0xfe, 0x26, 0x0b, 0x57, 0xee, 0x46, 0xdd, 0xe6, 0x0b, 0xcb, 0x44, - 0x17, 0x16, 0x09, 0x13, 0x21, 0x55, 0x54, 0xc8, 0x58, 0x7f, 0x73, 0x5e, 0xac, 0x4f, 0xf1, 0xa5, - 0xc3, 0x44, 0x38, 0x31, 0x91, 0x8f, 0x60, 0xa6, 0x58, 0xf8, 0x6b, 0x16, 0xca, 0xf3, 0x34, 0xd1, - 0xcb, 0x50, 0x72, 0x42, 0xa2, 0x36, 0xa2, 0xae, 0x6f, 0xa9, 0xae, 0xbf, 0x1a, 0x6d, 0x9b, 0xa6, - 0xff, 0x26, 0xc8, 0x01, 0x4a, 0x26, 0x96, 0x14, 0xbd, 0xf0, 0xc4, 0xb4, 0x9a, 0x28, 0xab, 0xb6, - 0x4f, 0xa0, 0x44, 0x19, 0x15, 0x14, 0x7b, 0xf6, 0x00, 0x7b, 0x98, 0x39, 0x9f, 0x67, 0xb2, 0x9c, - 0x6d, 0xd4, 0xab, 0x06, 0xb4, 0xa5, 0x31, 0xd1, 0x3e, 0x2c, 0x46, 0xf0, 0xb9, 0x4b, 0x80, 0x8f, - 0xc0, 0x52, 0x53, 0xd4, 0x27, 0x59, 0x58, 0xef, 0x11, 0xf7, 0xd9, 0xa2, 0xf5, 0x27, 0x00, 0xba, - 0xe0, 0x64, 0x1f, 0xfc, 0x1c, 0xcc, 0xce, 0x16, 0xf0, 0x92, 0xc6, 0x6b, 0x73, 0x91, 0xe2, 0xf6, - 0xa3, 0x2c, 0x2c, 0xa7, 0xb9, 0x7d, 0x06, 0xfe, 0x2e, 0xa0, 0xdd, 0xa4, 0x1b, 0xe4, 0x54, 0x37, - 0x78, 0x65, 0x5e, 0x37, 0x98, 0xc9, 0xba, 0xb3, 0xdb, 0xc0, 0xa7, 0x59, 0xc8, 0x77, 0x71, 0x88, - 0x7d, 0x8e, 0xbe, 0x3f, 0x33, 0xc0, 0xe9, 0x57, 0xd5, 0xd5, 0x99, 0x9c, 0x6b, 0x9b, 0x47, 0xbd, - 0x4e, 0xb9, 0x77, 0x4f, 0x99, 0xdf, 0xbe, 0x0e, 0xab, 0xf2, 0x89, 0x18, 0xbb, 0xa2, 0x49, 0x5c, - 0x51, 0x6f, 0xbc, 0xf8, 0x75, 0xc1, 0x51, 0x0d, 0x8a, 0x52, 0x2c, 0x69, 0x74, 0x52, 0x06, 0x7c, - 0x7c, 0xdc, 0xd1, 0x3b, 0xe8, 0x3a, 0xa0, 0xc3, 0xf8, 0xd1, 0x6e, 0x27, 0x14, 0x48, 0xb9, 0xf5, - 0xe4, 0x24, 0x12, 0xff, 0x0a, 0x80, 0xb4, 0xc2, 0x76, 0x09, 0x0b, 0x7c, 0xf3, 0xc6, 0x59, 0x92, - 0x3b, 0x6d, 0xb9, 0x81, 0x7e, 0xa9, 0x67, 0xc1, 0xa9, 0xd7, 0xa3, 0x19, 0xc3, 0xdf, 0xb8, 0x58, - 0xa6, 0x7e, 0x7a, 0x52, 0xab, 0x4c, 0xb0, 0xef, 0x6d, 0x37, 0x4e, 0x81, 0x6c, 0xa8, 0xd9, 0xf0, - 0xe9, 0x57, 0x67, 0x2a, 0x83, 0xdf, 0xb3, 0x00, 0x25, 0x2d, 0xb7, 0x47, 0xf8, 0x48, 0x3e, 0x6b, - 0xe4, 0xd0, 0x9b, 0x9a, 0x50, 0xad, 0xb3, 0x87, 0xde, 0x44, 0x3f, 0x1a, 0x7a, 0x53, 0x15, 0xf1, - 0xed, 0xa4, 0xc1, 0x65, 0x4d, 0x0c, 0x0d, 0xcc, 0x00, 0x73, 0x92, 0x1a, 0x9c, 0x69, 0xa4, 0x3d, - 0xd3, 0xc3, 0x32, 0x8d, 0x4f, 0x2c, 0xb8, 0x3a, 0x93, 0x4d, 0xb1, 0xb1, 0x3f, 0x03, 0x14, 0xa6, - 0x0e, 0x55, 0x6c, 0x26, 0xc6, 0xe8, 0x0b, 0x27, 0xe7, 0x7a, 0x38, 0xd3, 0x2b, 0xff, 0x5f, 0x3d, - 0x3a, 0xa7, 0x22, 0xf0, 0x47, 0x0b, 0x36, 0xd2, 0xc6, 0xc4, 0x6e, 0xdd, 0x81, 0xe5, 0xb4, 0x2d, - 0xc6, 0xa1, 0x17, 0xcf, 0xe3, 0x90, 0xf1, 0xe5, 0x29, 0x7d, 0xf4, 0x56, 0x52, 0xb8, 0xfa, 0xc7, - 0xa2, 0x1b, 0xe7, 0xe6, 0x26, 0xb2, 0x69, 0xba, 0x80, 0x73, 0xd1, 0x14, 0x93, 0xeb, 0x06, 0x81, - 0x87, 0x7e, 0x05, 0xeb, 0x2c, 0x10, 0xb6, 0xcc, 0x72, 0xe2, 0xda, 0xe6, 0xe5, 0xaa, 0xbb, 0xdf, - 0x5b, 0x17, 0xa3, 0xec, 0x5f, 0x27, 0xb5, 0x59, 0xa8, 0x29, 0x1e, 0x4b, 0x2c, 0x10, 0x2d, 0x75, - 0xbe, 0xa7, 0xdf, 0xb5, 0x21, 0xac, 0x3c, 0x7d, 0xb5, 0xee, 0x96, 0x6f, 0x5e, 0xf8, 0xea, 0x95, - 0xb3, 0xae, 0x5d, 0x1e, 0xa4, 0xee, 0xdc, 0x2e, 0xc8, 0x18, 0xfe, 0xfb, 0x61, 0xcd, 0xfa, 0xc6, - 0xef, 0x2d, 0x80, 0xe4, 0x09, 0x8f, 0x5e, 0x85, 0x2f, 0xb5, 0x7e, 0x70, 0xa7, 0x6d, 0xf7, 0xf7, - 0x6e, 0xee, 0xdd, 0xed, 0xdb, 0x77, 0xef, 0xf4, 0xbb, 0x9d, 0x9d, 0xdd, 0xd7, 0x77, 0x3b, 0xed, - 0xb5, 0x4c, 0xa5, 0x74, 0xff, 0x41, 0xbd, 0x78, 0x97, 0xf1, 0x11, 0x71, 0xe8, 0x01, 0x25, 0x2e, - 0x7a, 0x09, 0x36, 0x9e, 0x96, 0x96, 0xab, 0x4e, 0x7b, 0xcd, 0xaa, 0x2c, 0xdf, 0x7f, 0x50, 0x2f, - 0xe8, 0xe9, 0x88, 0xb8, 0xe8, 0x1a, 0x3c, 0x3f, 0x2b, 0xb7, 0x7b, 0xe7, 0x7b, 0x6b, 0xd9, 0xca, - 0xca, 0xfd, 0x07, 0xf5, 0xa5, 0x78, 0x8c, 0x42, 0x0d, 0x40, 0x69, 0x49, 0x83, 0xb7, 0x50, 0x81, - 0xfb, 0x0f, 0xea, 0x79, 0x4d, 0x5b, 0x25, 0xf7, 0xf6, 0x7b, 0xd5, 0x4c, 0xeb, 0xf5, 0x0f, 0x1f, - 0x57, 0xad, 0x47, 0x8f, 0xab, 0xd6, 0x3f, 0x1e, 0x57, 0xad, 0x77, 0x9e, 0x54, 0x33, 0x8f, 0x9e, - 0x54, 0x33, 0x7f, 0x7e, 0x52, 0xcd, 0xfc, 0xf8, 0xd5, 0x33, 0x19, 0x3b, 0x8e, 0x7f, 0xc9, 0x55, - 0xdc, 0x0d, 0xf2, 0xaa, 0x29, 0x7f, 0xeb, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x49, 0x0e, 0x8f, - 0x94, 0xe8, 0x15, 0x00, 0x00, + 0x15, 0xe6, 0x52, 0x0c, 0x25, 0x3d, 0x4a, 0x22, 0x35, 0x76, 0x6c, 0x9a, 0x69, 0x45, 0x86, 0x49, + 0x13, 0x25, 0x88, 0xa9, 0x5a, 0x05, 0x02, 0x54, 0x08, 0xd0, 0x9a, 0x22, 0x1d, 0xb1, 0xb6, 0x65, + 0x65, 0x49, 0x29, 0xe8, 0xef, 0x62, 0xb8, 0x3b, 0xa2, 0xa6, 0x5a, 0xce, 0x12, 0x3b, 0x43, 0x57, + 0x04, 0x5a, 0xa0, 0x40, 0x2f, 0xa9, 0x4f, 0x39, 0xe6, 0x62, 0xc0, 0x40, 0x7a, 0xcc, 0x31, 0xe8, + 0xa1, 0x2d, 0xd0, 0x6b, 0x90, 0x93, 0x91, 0x53, 0x5b, 0x14, 0x6a, 0x61, 0x5f, 0x8a, 0x9e, 0x8a, + 0xdc, 0x5b, 0x14, 0x33, 0x3b, 0xfb, 0x23, 0x52, 0x92, 0xa5, 0x40, 0x2d, 0x02, 0xe4, 0x22, 0x71, + 0x66, 0xde, 0xfb, 0xf6, 0xbd, 0xef, 0xfd, 0xcc, 0x0f, 0xbc, 0x6c, 0x7b, 0xbc, 0xef, 0xf1, 0x15, + 0x2e, 0xf0, 0x3e, 0x65, 0xbd, 0x95, 0xfb, 0x37, 0xba, 0x44, 0xe0, 0x1b, 0xe1, 0xb8, 0x36, 0xf0, + 0x3d, 0xe1, 0xa1, 0x2b, 0x81, 0x54, 0x2d, 0x9c, 0xd5, 0x52, 0xa5, 0xcb, 0x3d, 0xaf, 0xe7, 0x29, + 0x91, 0x15, 0xf9, 0x2b, 0x90, 0x2e, 0x5d, 0xeb, 0x79, 0x5e, 0xcf, 0x25, 0x2b, 0x6a, 0xd4, 0x1d, + 0xee, 0xae, 0x60, 0x36, 0xd2, 0x4b, 0x4b, 0xe3, 0x4b, 0xce, 0xd0, 0xc7, 0x82, 0x7a, 0x4c, 0xaf, + 0x97, 0xc7, 0xd7, 0x05, 0xed, 0x13, 0x2e, 0x70, 0x7f, 0x10, 0x62, 0x07, 0x96, 0x58, 0xc1, 0x47, + 0xb5, 0x59, 0x1a, 0x5b, 0xbb, 0xd2, 0xc5, 0x9c, 0x44, 0x7e, 0xd8, 0x1e, 0x0d, 0xb1, 0xbf, 0x26, + 0x08, 0x73, 0x88, 0xdf, 0xa7, 0x4c, 0xac, 0x88, 0xd1, 0x80, 0xf0, 0xe0, 0xaf, 0x5e, 0x7d, 0x21, + 0xb1, 0x8a, 0xbb, 0x36, 0x4d, 0x2e, 0x56, 0x7f, 0x6d, 0xc0, 0xc2, 0x06, 0xe5, 0xc2, 0xf3, 0xa9, + 0x8d, 0xdd, 0x16, 0xdb, 0xf5, 0xd0, 0x9b, 0x90, 0xdd, 0x23, 0xd8, 0x21, 0x7e, 0xd1, 0xa8, 0x18, + 0xcb, 0xb9, 0xd5, 0x62, 0x2d, 0x06, 0xa8, 0x05, 0xba, 0x1b, 0x6a, 0xbd, 0x9e, 0xf9, 0xe4, 0xb0, + 0x9c, 0x32, 0xb5, 0x34, 0xfa, 0x0e, 0x64, 0xef, 0x63, 0x97, 0x13, 0x51, 0x4c, 0x57, 0xa6, 0x96, + 0x73, 0xab, 0x2f, 0xd6, 0x8e, 0xe7, 0xb6, 0xb6, 0x83, 0x5d, 0xea, 0x60, 0xe1, 0x45, 0x00, 0x81, + 0x5a, 0xf5, 0xa3, 0x34, 0xe4, 0xd7, 0xbd, 0x7e, 0x9f, 0x72, 0x4e, 0x3d, 0x66, 0x62, 0x41, 0x38, + 0xda, 0x82, 0x8c, 0x8f, 0x05, 0x51, 0xa6, 0xcc, 0xd6, 0xdf, 0x92, 0xf2, 0x7f, 0x39, 0x2c, 0xbf, + 0xd2, 0xa3, 0x62, 0x6f, 0xd8, 0xad, 0xd9, 0x5e, 0x5f, 0x33, 0xa5, 0xff, 0x5d, 0xe7, 0xce, 0xbe, + 0xf6, 0xaf, 0x41, 0xec, 0xcf, 0x3e, 0xbe, 0x0e, 0xda, 0x86, 0x06, 0xb1, 0x4d, 0x85, 0x84, 0xde, + 0x85, 0x99, 0x3e, 0x3e, 0xb0, 0x14, 0x6a, 0xfa, 0x02, 0x50, 0xa7, 0xfb, 0xf8, 0x40, 0xda, 0x8a, + 0x1c, 0xc8, 0x4b, 0x60, 0x7b, 0x0f, 0xb3, 0x1e, 0x09, 0xf0, 0xa7, 0x2e, 0x00, 0x7f, 0xbe, 0x8f, + 0x0f, 0xd6, 0x15, 0xa6, 0xfc, 0xca, 0xda, 0xcc, 0x07, 0x8f, 0xca, 0xa9, 0x7f, 0x3c, 0x2a, 0x1b, + 0xd5, 0xdf, 0x1b, 0x00, 0x31, 0x5d, 0xe8, 0x47, 0x50, 0xb0, 0xa3, 0x91, 0xfa, 0x3c, 0xd7, 0x01, + 0x7c, 0xf5, 0xa4, 0x40, 0x8c, 0x91, 0x5d, 0x9f, 0x91, 0x86, 0x3e, 0x3e, 0x2c, 0x1b, 0x66, 0xde, + 0x1e, 0x8b, 0x43, 0x13, 0x72, 0xc3, 0x81, 0x83, 0x05, 0xb1, 0x64, 0xde, 0x2a, 0xe2, 0x72, 0xab, + 0xa5, 0x5a, 0x90, 0xd4, 0xb5, 0x30, 0xa9, 0x6b, 0x9d, 0x30, 0xa9, 0x03, 0xac, 0xf7, 0xff, 0x56, + 0x36, 0x4c, 0x08, 0x14, 0xe5, 0x52, 0xc2, 0xfa, 0x8f, 0x0c, 0xc8, 0x35, 0x08, 0xb7, 0x7d, 0x3a, + 0x90, 0x55, 0x82, 0x8a, 0x30, 0xdd, 0xf7, 0x18, 0xdd, 0xd7, 0x69, 0x37, 0x6b, 0x86, 0x43, 0x54, + 0x82, 0x19, 0xea, 0x10, 0x26, 0xa8, 0x18, 0x05, 0x01, 0x33, 0xa3, 0xb1, 0xd4, 0xfa, 0x19, 0xe9, + 0x72, 0x1a, 0x72, 0x6d, 0x86, 0x43, 0xf4, 0x1a, 0x14, 0x38, 0xb1, 0x87, 0x3e, 0x15, 0x23, 0xcb, + 0xf6, 0x98, 0xc0, 0xb6, 0x28, 0x66, 0x94, 0x48, 0x3e, 0x9c, 0x5f, 0x0f, 0xa6, 0x25, 0x88, 0x43, + 0x04, 0xa6, 0x2e, 0x2f, 0x3e, 0x17, 0x80, 0xe8, 0x61, 0xd2, 0xdc, 0x69, 0x98, 0x8d, 0xf2, 0x16, + 0xad, 0x43, 0xc1, 0x1b, 0x10, 0x5f, 0xfe, 0xb6, 0xb0, 0xe3, 0xf8, 0x84, 0x73, 0x9d, 0xa1, 0xc5, + 0xcf, 0x3e, 0xbe, 0x7e, 0x59, 0xd3, 0x7d, 0x33, 0x58, 0x69, 0x0b, 0x9f, 0xb2, 0x9e, 0x99, 0x0f, + 0x35, 0xf4, 0x34, 0xfa, 0xbe, 0x0c, 0x18, 0xe3, 0x84, 0xf1, 0x21, 0xb7, 0x06, 0xc3, 0xee, 0x3e, + 0x19, 0x69, 0x5e, 0x2f, 0x4f, 0xf0, 0x7a, 0x93, 0x8d, 0xea, 0xc5, 0x4f, 0x63, 0x68, 0xdb, 0x1f, + 0x0d, 0x84, 0x57, 0xdb, 0x1a, 0x76, 0x6f, 0x93, 0x91, 0x8c, 0x96, 0xc6, 0xd9, 0x52, 0x30, 0xe8, + 0x0a, 0x64, 0x7f, 0x8a, 0xa9, 0x4b, 0x1c, 0xc5, 0xca, 0x8c, 0xa9, 0x47, 0x68, 0x0d, 0xb2, 0x5c, + 0x60, 0x31, 0xe4, 0x8a, 0x8a, 0x85, 0xd5, 0xea, 0x49, 0x99, 0x51, 0xf7, 0x98, 0xd3, 0x56, 0x92, + 0xa6, 0xd6, 0x40, 0x1d, 0xc8, 0x0a, 0x6f, 0x9f, 0x30, 0x4d, 0xd2, 0xb9, 0xb2, 0xba, 0xc5, 0x44, + 0x22, 0xab, 0x5b, 0x4c, 0x98, 0x1a, 0x0b, 0xf5, 0xa0, 0xe0, 0x10, 0x97, 0xf4, 0x14, 0x95, 0x7c, + 0x0f, 0xfb, 0x84, 0x17, 0xb3, 0x17, 0x50, 0x35, 0xf9, 0x08, 0xb5, 0xad, 0x40, 0xd1, 0x6d, 0xc8, + 0x39, 0x71, 0xba, 0x15, 0xa7, 0x15, 0xd1, 0x2f, 0x9d, 0xe4, 0x7f, 0x22, 0x33, 0x75, 0x93, 0x4a, + 0x6a, 0xcb, 0xe4, 0x1a, 0xb2, 0xae, 0xc7, 0x1c, 0xca, 0x7a, 0xd6, 0x1e, 0xa1, 0xbd, 0x3d, 0x51, + 0x9c, 0xa9, 0x18, 0xcb, 0x53, 0x66, 0x3e, 0x9a, 0xdf, 0x50, 0xd3, 0xe8, 0x36, 0x2c, 0xc4, 0xa2, + 0xaa, 0x76, 0x66, 0xcf, 0x51, 0x3b, 0xf3, 0x91, 0xae, 0x5c, 0x45, 0x1b, 0x00, 0x71, 0x61, 0x16, + 0x41, 0x01, 0x55, 0x9f, 0x5d, 0xdd, 0xda, 0x85, 0x84, 0x2e, 0x72, 0xe1, 0x52, 0x9f, 0x32, 0x8b, + 0x13, 0x77, 0xd7, 0xd2, 0x54, 0x49, 0xc8, 0xdc, 0x05, 0x84, 0x76, 0xb1, 0x4f, 0x59, 0x9b, 0xb8, + 0xbb, 0x8d, 0x08, 0x16, 0xbd, 0x05, 0x2f, 0xc4, 0x24, 0x78, 0xcc, 0xda, 0xf3, 0x5c, 0xc7, 0xf2, + 0xc9, 0xae, 0x65, 0x7b, 0x43, 0x26, 0x8a, 0x73, 0x8a, 0xba, 0xab, 0x91, 0xc8, 0x3d, 0xb6, 0xe1, + 0xb9, 0x8e, 0x49, 0x76, 0xd7, 0xe5, 0x32, 0x7a, 0x09, 0x62, 0x1a, 0x2c, 0xea, 0xf0, 0xe2, 0x7c, + 0x65, 0x6a, 0x39, 0x63, 0xce, 0x45, 0x93, 0x2d, 0x87, 0xaf, 0xcd, 0xbd, 0xf7, 0xa8, 0x9c, 0xd2, + 0xe5, 0x9a, 0xaa, 0x6e, 0xc1, 0xdc, 0x0e, 0x76, 0x75, 0xa5, 0x11, 0x8e, 0xde, 0x84, 0x59, 0x1c, + 0x0e, 0x8a, 0x46, 0x65, 0xea, 0xd4, 0x4a, 0x8d, 0x45, 0x83, 0x06, 0xf0, 0xcb, 0xbf, 0x56, 0x8c, + 0xea, 0x6f, 0x0c, 0xc8, 0x36, 0x76, 0xb6, 0x30, 0xf5, 0x51, 0x13, 0x16, 0xe3, 0x9c, 0x3d, 0x6b, + 0xf9, 0xc7, 0x69, 0x1e, 0xd6, 0x7f, 0x13, 0x16, 0xef, 0x87, 0x1d, 0x25, 0x82, 0x49, 0x3f, 0x0b, + 0x26, 0x52, 0xd1, 0xf3, 0x63, 0x8e, 0x37, 0x61, 0x3a, 0xb0, 0x92, 0xa3, 0x35, 0x78, 0x6e, 0x20, + 0x7f, 0x28, 0x7f, 0x73, 0xab, 0x4b, 0x27, 0xe6, 0xba, 0x92, 0xd7, 0x39, 0x12, 0xa8, 0x54, 0xff, + 0x6d, 0x00, 0x34, 0x76, 0x76, 0x3a, 0x3e, 0x1d, 0xb8, 0x44, 0x5c, 0x94, 0xc7, 0x77, 0xe0, 0xf9, + 0xd8, 0x63, 0xee, 0xdb, 0x67, 0xf6, 0xfa, 0x52, 0xa4, 0xd6, 0xf6, 0xed, 0x63, 0xd1, 0x1c, 0x2e, + 0x22, 0xb4, 0xa9, 0x33, 0xa3, 0x35, 0xb8, 0x38, 0x9e, 0xc6, 0x36, 0xe4, 0x62, 0xf7, 0x39, 0x6a, + 0xc0, 0x8c, 0xd0, 0xbf, 0x35, 0x9b, 0xd5, 0x93, 0xd9, 0x0c, 0xd5, 0x34, 0xa3, 0x91, 0x66, 0xf5, + 0x3f, 0x92, 0xd4, 0xb8, 0x28, 0xbe, 0x54, 0x69, 0x24, 0xdb, 0xbb, 0x6e, 0xbf, 0x17, 0x71, 0x68, + 0xd1, 0x58, 0x63, 0xac, 0xfe, 0x2a, 0x0d, 0x97, 0xb6, 0xc3, 0xa2, 0xfd, 0xd2, 0x32, 0xb1, 0x05, + 0xd3, 0x84, 0x09, 0x9f, 0x2a, 0x2a, 0x64, 0xac, 0xbf, 0x79, 0x52, 0xac, 0x8f, 0xf1, 0xa5, 0xc9, + 0x84, 0x3f, 0xd2, 0x91, 0x0f, 0x61, 0xc6, 0x58, 0xf8, 0xc3, 0x14, 0x14, 0x4f, 0xd2, 0x44, 0xaf, + 0x42, 0xde, 0xf6, 0x89, 0x9a, 0x08, 0x37, 0x16, 0x43, 0x75, 0xc7, 0x85, 0x70, 0x5a, 0xef, 0x2b, + 0x77, 0x41, 0x9e, 0xd1, 0x64, 0x62, 0x49, 0xd1, 0x73, 0x1f, 0xca, 0x16, 0x62, 0x65, 0xb5, 0xb3, + 0x10, 0xc8, 0x53, 0x46, 0x05, 0xc5, 0xae, 0xd5, 0xc5, 0x2e, 0x66, 0xf6, 0x17, 0x39, 0xbc, 0x4e, + 0xee, 0x05, 0x0b, 0x1a, 0xb4, 0x1e, 0x60, 0xa2, 0x1d, 0x98, 0x0e, 0xe1, 0x33, 0x17, 0x00, 0x1f, + 0x82, 0xa1, 0x17, 0x61, 0x2e, 0xb9, 0x45, 0xa8, 0x23, 0x4a, 0xc6, 0xcc, 0x25, 0x76, 0x88, 0x67, + 0xed, 0x41, 0xd9, 0x53, 0xf7, 0xa0, 0xc4, 0x49, 0xf0, 0x77, 0x53, 0xb0, 0x68, 0x12, 0xe7, 0xab, + 0x15, 0xb7, 0x1f, 0x02, 0x04, 0x15, 0x2d, 0x1b, 0xed, 0x17, 0x08, 0xdd, 0x64, 0x87, 0x98, 0x0d, + 0xf0, 0x1a, 0x5c, 0xfc, 0x3f, 0x83, 0xf7, 0x69, 0x1a, 0xe6, 0x92, 0xc1, 0xfb, 0x0a, 0xec, 0x6c, + 0xa8, 0x15, 0xf7, 0xb3, 0x8c, 0xea, 0x67, 0xaf, 0x9d, 0xd4, 0xcf, 0x26, 0xd2, 0xfa, 0xf4, 0x46, + 0xf6, 0x79, 0x1a, 0xb2, 0x5b, 0xd8, 0xc7, 0x7d, 0x8e, 0xbe, 0x37, 0x71, 0xca, 0x0d, 0xae, 0x9e, + 0xd7, 0x26, 0x92, 0xba, 0xa1, 0x9f, 0x45, 0x82, 0x9c, 0xfe, 0xe0, 0x98, 0x43, 0xee, 0x37, 0x60, + 0x41, 0xde, 0xa3, 0x23, 0x57, 0x02, 0x12, 0xe7, 0xd5, 0x45, 0x38, 0xba, 0x82, 0x71, 0x54, 0x86, + 0x9c, 0x14, 0x8b, 0x5b, 0xb5, 0x94, 0x81, 0x3e, 0x3e, 0x68, 0x06, 0x33, 0xe8, 0x3a, 0xa0, 0xbd, + 0xe8, 0x65, 0xc3, 0x8a, 0x29, 0x90, 0x72, 0x8b, 0xf1, 0x4a, 0x28, 0xfe, 0x75, 0x00, 0x69, 0x85, + 0xe5, 0x10, 0xe6, 0xf5, 0xf5, 0x45, 0x70, 0x56, 0xce, 0x34, 0xe4, 0x04, 0xfa, 0x79, 0x70, 0x60, + 0x1e, 0xbb, 0x62, 0xeb, 0xbb, 0xca, 0x9d, 0xf3, 0x95, 0xc2, 0xe7, 0x87, 0xe5, 0xd2, 0x08, 0xf7, + 0xdd, 0xb5, 0xea, 0x31, 0x90, 0x55, 0x75, 0x80, 0x3e, 0x7a, 0x35, 0x4f, 0x64, 0xf0, 0x87, 0x06, + 0xa0, 0x78, 0xd3, 0x30, 0x09, 0x1f, 0xc8, 0xbb, 0x9f, 0xbc, 0x19, 0x24, 0x8e, 0xf1, 0xc6, 0xe9, + 0x37, 0x83, 0x58, 0x3f, 0xbc, 0x19, 0x24, 0x2a, 0xe2, 0xdb, 0x71, 0x8b, 0x4e, 0xeb, 0x18, 0x6a, + 0x98, 0x2e, 0xe6, 0x24, 0x71, 0xbb, 0xa0, 0xa1, 0x76, 0x28, 0x1f, 0x59, 0x99, 0xaa, 0xfe, 0xd9, + 0x80, 0x6b, 0x13, 0xd9, 0x14, 0x19, 0xfb, 0x13, 0x40, 0x7e, 0x62, 0x51, 0xc5, 0x66, 0xa4, 0x8d, + 0x3e, 0x77, 0x72, 0x2e, 0xfa, 0x13, 0xcd, 0xf8, 0x7f, 0xb4, 0xcb, 0xac, 0x65, 0x54, 0x04, 0xfe, + 0x68, 0xc0, 0xe5, 0xa4, 0x31, 0x91, 0x5b, 0x9b, 0x30, 0x97, 0xb4, 0x45, 0x3b, 0xf4, 0xf2, 0x59, + 0x1c, 0xd2, 0xbe, 0x1c, 0xd1, 0x47, 0xef, 0xc4, 0x85, 0x1b, 0xbc, 0xa8, 0xdd, 0x38, 0x33, 0x37, + 0xa1, 0x4d, 0xe3, 0x05, 0x9c, 0x09, 0xcf, 0x61, 0x99, 0x2d, 0xcf, 0x73, 0xd1, 0x2f, 0x60, 0x91, + 0x79, 0xc2, 0x92, 0x59, 0x4e, 0x1c, 0x4b, 0x5f, 0xef, 0x83, 0xee, 0xf7, 0xce, 0xf9, 0x28, 0xfb, + 0xe7, 0x61, 0x79, 0x12, 0x6a, 0x8c, 0xc7, 0x3c, 0xf3, 0x44, 0x5d, 0xad, 0x77, 0x82, 0xcb, 0xbf, + 0x0f, 0xf3, 0x47, 0x3f, 0x1d, 0x74, 0xcb, 0xbb, 0xe7, 0xfe, 0xf4, 0xfc, 0x69, 0x9f, 0x9d, 0xeb, + 0x26, 0xbe, 0xb9, 0x36, 0x23, 0x63, 0xf8, 0x2f, 0x19, 0xc7, 0x0e, 0x14, 0xa2, 0x76, 0xb2, 0xad, + 0x9e, 0xa8, 0x38, 0xfa, 0x2e, 0x4c, 0x07, 0xaf, 0x55, 0xe1, 0x39, 0xbf, 0x92, 0x7c, 0xfc, 0xc4, + 0x5d, 0x9b, 0xd6, 0xc6, 0x74, 0x42, 0x86, 0xb5, 0xda, 0xeb, 0xbf, 0x35, 0x00, 0xe2, 0xd7, 0x13, + 0xf4, 0x06, 0x5c, 0xad, 0xdf, 0xdb, 0x6c, 0x58, 0xed, 0xce, 0xcd, 0xce, 0x76, 0xdb, 0xda, 0xde, + 0x6c, 0x6f, 0x35, 0xd7, 0x5b, 0xb7, 0x5a, 0xcd, 0x46, 0x21, 0x55, 0xca, 0x3f, 0x78, 0x58, 0xc9, + 0x6d, 0x33, 0x3e, 0x20, 0x36, 0xdd, 0xa5, 0xc4, 0x41, 0xaf, 0xc0, 0xe5, 0xa3, 0xd2, 0x72, 0xd4, + 0x6c, 0x14, 0x8c, 0xd2, 0xdc, 0x83, 0x87, 0x95, 0x99, 0xe0, 0xd4, 0x48, 0x1c, 0xb4, 0x0c, 0xcf, + 0x4f, 0xca, 0xb5, 0x36, 0xdf, 0x2e, 0xa4, 0x4b, 0xf3, 0x0f, 0x1e, 0x56, 0x66, 0xa3, 0xe3, 0x25, + 0xaa, 0x02, 0x4a, 0x4a, 0x6a, 0xbc, 0xa9, 0x12, 0x3c, 0x78, 0x58, 0xc9, 0x06, 0xc1, 0x28, 0x65, + 0xde, 0xfb, 0x70, 0x29, 0xf5, 0xfa, 0x8f, 0x01, 0x5a, 0x6c, 0xd7, 0xc7, 0xb6, 0xca, 0xbd, 0x12, + 0x5c, 0x69, 0x6d, 0xde, 0x32, 0x6f, 0xae, 0x77, 0x5a, 0xf7, 0x36, 0x8f, 0x9a, 0x3d, 0xb6, 0xd6, + 0xb8, 0xb7, 0x5d, 0xbf, 0xd3, 0xb4, 0xda, 0xad, 0xb7, 0x37, 0x0b, 0x06, 0xba, 0x0a, 0x97, 0x8e, + 0xac, 0xbd, 0xbb, 0xd9, 0x69, 0xdd, 0x6d, 0x16, 0xd2, 0xf5, 0x5b, 0x9f, 0x3c, 0x59, 0x32, 0x1e, + 0x3f, 0x59, 0x32, 0xfe, 0xfe, 0x64, 0xc9, 0x78, 0xff, 0xe9, 0x52, 0xea, 0xf1, 0xd3, 0xa5, 0xd4, + 0x9f, 0x9e, 0x2e, 0xa5, 0x7e, 0xf0, 0xc6, 0xa9, 0x61, 0x3e, 0x88, 0x1e, 0xf0, 0x55, 0xc0, 0xbb, + 0x59, 0xb5, 0x93, 0x7c, 0xeb, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x65, 0x79, 0x74, 0xab, 0xdf, + 0x17, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1256,477 +1388,659 @@ func (this *Pool) Description() (desc *github_com_cosmos_gogoproto_protoc_gen_go func StakingDescription() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 7520 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0xbc, 0x6b, 0x70, 0x24, 0xd7, - 0x75, 0x1f, 0x8e, 0x79, 0x60, 0x30, 0x73, 0x66, 0x30, 0xd3, 0xb8, 0xc0, 0xee, 0xce, 0x82, 0x24, - 0x00, 0x0e, 0x1f, 0xbb, 0x7c, 0x61, 0xc9, 0x25, 0x77, 0x97, 0x3b, 0x6b, 0x89, 0x7f, 0xcc, 0x63, - 0x41, 0xec, 0xe2, 0x31, 0xec, 0x01, 0x96, 0x0f, 0xff, 0x93, 0x4e, 0xa3, 0xe7, 0x62, 0xd0, 0x44, - 0x4f, 0x77, 0xbb, 0xbb, 0x67, 0x77, 0xc1, 0x72, 0x52, 0x74, 0x29, 0x0f, 0x69, 0x53, 0x71, 0x64, - 0x3b, 0x15, 0xcb, 0xb2, 0x56, 0xa1, 0x2c, 0x27, 0x72, 0x14, 0xe5, 0x61, 0x4b, 0x51, 0xe2, 0xb8, - 0x92, 0x28, 0xa9, 0x4a, 0x22, 0xeb, 0x43, 0x4a, 0xf6, 0x87, 0xd8, 0xce, 0x83, 0x71, 0x28, 0x55, - 0xc2, 0x38, 0x72, 0xec, 0xc8, 0x4c, 0x55, 0x52, 0x2a, 0xa5, 0x52, 0xf7, 0xd5, 0x8f, 0x79, 0x60, - 0x06, 0x9b, 0xa5, 0xec, 0x2a, 0x7f, 0xc2, 0xf4, 0xb9, 0xe7, 0xf7, 0xeb, 0x73, 0xcf, 0x3d, 0xf7, - 0xdc, 0x73, 0x6f, 0x77, 0x03, 0xfe, 0xe0, 0x0a, 0x2c, 0xb5, 0x2d, 0xab, 0x6d, 0xe0, 0x73, 0xb6, - 0x63, 0x79, 0xd6, 0x6e, 0x77, 0xef, 0x5c, 0x0b, 0xbb, 0x9a, 0xa3, 0xdb, 0x9e, 0xe5, 0x2c, 0x53, - 0x19, 0x2a, 0x30, 0x8d, 0x65, 0xa1, 0x51, 0xda, 0x80, 0x99, 0xab, 0xba, 0x81, 0x6b, 0xbe, 0x62, - 0x13, 0x7b, 0xe8, 0x45, 0x48, 0xee, 0xe9, 0x06, 0x2e, 0xc6, 0x96, 0x12, 0x67, 0xb3, 0xe7, 0x1f, - 0x5d, 0xee, 0x01, 0x2d, 0x47, 0x11, 0x0d, 0x22, 0x96, 0x29, 0xa2, 0xf4, 0xed, 0x24, 0xcc, 0x0e, - 0x68, 0x45, 0x08, 0x92, 0xa6, 0xda, 0x21, 0x8c, 0xb1, 0xb3, 0x19, 0x99, 0xfe, 0x46, 0x45, 0x98, - 0xb2, 0x55, 0xed, 0x40, 0x6d, 0xe3, 0x62, 0x9c, 0x8a, 0xc5, 0x25, 0x5a, 0x00, 0x68, 0x61, 0x1b, - 0x9b, 0x2d, 0x6c, 0x6a, 0x87, 0xc5, 0xc4, 0x52, 0xe2, 0x6c, 0x46, 0x0e, 0x49, 0xd0, 0x53, 0x30, - 0x63, 0x77, 0x77, 0x0d, 0x5d, 0x53, 0x42, 0x6a, 0xb0, 0x94, 0x38, 0x3b, 0x29, 0x4b, 0xac, 0xa1, - 0x16, 0x28, 0x9f, 0x81, 0xc2, 0x2d, 0xac, 0x1e, 0x84, 0x55, 0xb3, 0x54, 0x35, 0x4f, 0xc4, 0x21, - 0xc5, 0x2a, 0xe4, 0x3a, 0xd8, 0x75, 0xd5, 0x36, 0x56, 0xbc, 0x43, 0x1b, 0x17, 0x93, 0xb4, 0xf7, - 0x4b, 0x7d, 0xbd, 0xef, 0xed, 0x79, 0x96, 0xa3, 0xb6, 0x0f, 0x6d, 0x8c, 0x56, 0x20, 0x83, 0xcd, - 0x6e, 0x87, 0x31, 0x4c, 0x0e, 0xf1, 0x5f, 0xdd, 0xec, 0x76, 0x7a, 0x59, 0xd2, 0x04, 0xc6, 0x29, - 0xa6, 0x5c, 0xec, 0xdc, 0xd4, 0x35, 0x5c, 0x4c, 0x51, 0x82, 0x33, 0x7d, 0x04, 0x4d, 0xd6, 0xde, - 0xcb, 0x21, 0x70, 0xa8, 0x0a, 0x19, 0x7c, 0xdb, 0xc3, 0xa6, 0xab, 0x5b, 0x66, 0x71, 0x8a, 0x92, - 0x3c, 0x36, 0x60, 0x14, 0xb1, 0xd1, 0xea, 0xa5, 0x08, 0x70, 0xe8, 0x22, 0x4c, 0x59, 0xb6, 0xa7, - 0x5b, 0xa6, 0x5b, 0x4c, 0x2f, 0xc5, 0xce, 0x66, 0xcf, 0x3f, 0x38, 0x30, 0x10, 0xb6, 0x98, 0x8e, - 0x2c, 0x94, 0xd1, 0x1a, 0x48, 0xae, 0xd5, 0x75, 0x34, 0xac, 0x68, 0x56, 0x0b, 0x2b, 0xba, 0xb9, - 0x67, 0x15, 0x33, 0x94, 0x60, 0xb1, 0xbf, 0x23, 0x54, 0xb1, 0x6a, 0xb5, 0xf0, 0x9a, 0xb9, 0x67, - 0xc9, 0x79, 0x37, 0x72, 0x8d, 0x4e, 0x42, 0xca, 0x3d, 0x34, 0x3d, 0xf5, 0x76, 0x31, 0x47, 0x23, - 0x84, 0x5f, 0x95, 0x7e, 0x39, 0x05, 0x85, 0x71, 0x42, 0xec, 0x0a, 0x4c, 0xee, 0x91, 0x5e, 0x16, - 0xe3, 0xc7, 0xf1, 0x01, 0xc3, 0x44, 0x9d, 0x98, 0xba, 0x47, 0x27, 0xae, 0x40, 0xd6, 0xc4, 0xae, - 0x87, 0x5b, 0x2c, 0x22, 0x12, 0x63, 0xc6, 0x14, 0x30, 0x50, 0x7f, 0x48, 0x25, 0xef, 0x29, 0xa4, - 0x5e, 0x83, 0x82, 0x6f, 0x92, 0xe2, 0xa8, 0x66, 0x5b, 0xc4, 0xe6, 0xb9, 0x51, 0x96, 0x2c, 0xd7, - 0x05, 0x4e, 0x26, 0x30, 0x39, 0x8f, 0x23, 0xd7, 0xa8, 0x06, 0x60, 0x99, 0xd8, 0xda, 0x53, 0x5a, - 0x58, 0x33, 0x8a, 0xe9, 0x21, 0x5e, 0xda, 0x22, 0x2a, 0x7d, 0x5e, 0xb2, 0x98, 0x54, 0x33, 0xd0, - 0xe5, 0x20, 0xd4, 0xa6, 0x86, 0x44, 0xca, 0x06, 0x9b, 0x64, 0x7d, 0xd1, 0xb6, 0x03, 0x79, 0x07, - 0x93, 0xb8, 0xc7, 0x2d, 0xde, 0xb3, 0x0c, 0x35, 0x62, 0x79, 0x64, 0xcf, 0x64, 0x0e, 0x63, 0x1d, - 0x9b, 0x76, 0xc2, 0x97, 0xe8, 0x11, 0xf0, 0x05, 0x0a, 0x0d, 0x2b, 0xa0, 0x59, 0x28, 0x27, 0x84, - 0x9b, 0x6a, 0x07, 0xcf, 0xbf, 0x05, 0xf9, 0xa8, 0x7b, 0xd0, 0x1c, 0x4c, 0xba, 0x9e, 0xea, 0x78, - 0x34, 0x0a, 0x27, 0x65, 0x76, 0x81, 0x24, 0x48, 0x60, 0xb3, 0x45, 0xb3, 0xdc, 0xa4, 0x4c, 0x7e, - 0xa2, 0xff, 0x2f, 0xe8, 0x70, 0x82, 0x76, 0xf8, 0xf1, 0xfe, 0x11, 0x8d, 0x30, 0xf7, 0xf6, 0x7b, - 0xfe, 0x12, 0x4c, 0x47, 0x3a, 0x30, 0xee, 0xad, 0x4b, 0x3f, 0x0a, 0x27, 0x06, 0x52, 0xa3, 0xd7, - 0x60, 0xae, 0x6b, 0xea, 0xa6, 0x87, 0x1d, 0xdb, 0xc1, 0x24, 0x62, 0xd9, 0xad, 0x8a, 0xff, 0x65, - 0x6a, 0x48, 0xcc, 0xed, 0x84, 0xb5, 0x19, 0x8b, 0x3c, 0xdb, 0xed, 0x17, 0x3e, 0x99, 0x49, 0xbf, - 0x3f, 0x25, 0xbd, 0xfd, 0xf6, 0xdb, 0x6f, 0xc7, 0x4b, 0xff, 0x2c, 0x05, 0x73, 0x83, 0xe6, 0xcc, - 0xc0, 0xe9, 0x7b, 0x12, 0x52, 0x66, 0xb7, 0xb3, 0x8b, 0x1d, 0xea, 0xa4, 0x49, 0x99, 0x5f, 0xa1, - 0x15, 0x98, 0x34, 0xd4, 0x5d, 0x6c, 0x14, 0x93, 0x4b, 0xb1, 0xb3, 0xf9, 0xf3, 0x4f, 0x8d, 0x35, - 0x2b, 0x97, 0xd7, 0x09, 0x44, 0x66, 0x48, 0xf4, 0x51, 0x48, 0xf2, 0x14, 0x4d, 0x18, 0x9e, 0x1c, - 0x8f, 0x81, 0xcc, 0x25, 0x99, 0xe2, 0xd0, 0x03, 0x90, 0x21, 0x7f, 0x59, 0x6c, 0xa4, 0xa8, 0xcd, - 0x69, 0x22, 0x20, 0x71, 0x81, 0xe6, 0x21, 0x4d, 0xa7, 0x49, 0x0b, 0x8b, 0xa5, 0xcd, 0xbf, 0x26, - 0x81, 0xd5, 0xc2, 0x7b, 0x6a, 0xd7, 0xf0, 0x94, 0x9b, 0xaa, 0xd1, 0xc5, 0x34, 0xe0, 0x33, 0x72, - 0x8e, 0x0b, 0x6f, 0x10, 0x19, 0x5a, 0x84, 0x2c, 0x9b, 0x55, 0xba, 0xd9, 0xc2, 0xb7, 0x69, 0xf6, - 0x9c, 0x94, 0xd9, 0x44, 0x5b, 0x23, 0x12, 0x72, 0xfb, 0x37, 0x5d, 0xcb, 0x14, 0xa1, 0x49, 0x6f, - 0x41, 0x04, 0xf4, 0xf6, 0x97, 0x7a, 0x13, 0xf7, 0x43, 0x83, 0xbb, 0xd7, 0x37, 0x97, 0xce, 0x40, - 0x81, 0x6a, 0x3c, 0xcf, 0x87, 0x5e, 0x35, 0x8a, 0x33, 0x4b, 0xb1, 0xb3, 0x69, 0x39, 0xcf, 0xc4, - 0x5b, 0x5c, 0x5a, 0xfa, 0x6a, 0x1c, 0x92, 0x34, 0xb1, 0x14, 0x20, 0xbb, 0xfd, 0x7a, 0xa3, 0xae, - 0xd4, 0xb6, 0x76, 0x2a, 0xeb, 0x75, 0x29, 0x86, 0xf2, 0x00, 0x54, 0x70, 0x75, 0x7d, 0x6b, 0x65, - 0x5b, 0x8a, 0xfb, 0xd7, 0x6b, 0x9b, 0xdb, 0x17, 0x5f, 0x90, 0x12, 0x3e, 0x60, 0x87, 0x09, 0x92, - 0x61, 0x85, 0xe7, 0xcf, 0x4b, 0x93, 0x48, 0x82, 0x1c, 0x23, 0x58, 0x7b, 0xad, 0x5e, 0xbb, 0xf8, - 0x82, 0x94, 0x8a, 0x4a, 0x9e, 0x3f, 0x2f, 0x4d, 0xa1, 0x69, 0xc8, 0x50, 0x49, 0x65, 0x6b, 0x6b, - 0x5d, 0x4a, 0xfb, 0x9c, 0xcd, 0x6d, 0x79, 0x6d, 0x73, 0x55, 0xca, 0xf8, 0x9c, 0xab, 0xf2, 0xd6, - 0x4e, 0x43, 0x02, 0x9f, 0x61, 0xa3, 0xde, 0x6c, 0xae, 0xac, 0xd6, 0xa5, 0xac, 0xaf, 0x51, 0x79, - 0x7d, 0xbb, 0xde, 0x94, 0x72, 0x11, 0xb3, 0x9e, 0x3f, 0x2f, 0x4d, 0xfb, 0xb7, 0xa8, 0x6f, 0xee, - 0x6c, 0x48, 0x79, 0x34, 0x03, 0xd3, 0xec, 0x16, 0xc2, 0x88, 0x42, 0x8f, 0xe8, 0xe2, 0x0b, 0x92, - 0x14, 0x18, 0xc2, 0x58, 0x66, 0x22, 0x82, 0x8b, 0x2f, 0x48, 0xa8, 0x54, 0x85, 0x49, 0x1a, 0x86, - 0x08, 0x41, 0x7e, 0x7d, 0xa5, 0x52, 0x5f, 0x57, 0xb6, 0x1a, 0xdb, 0x6b, 0x5b, 0x9b, 0x2b, 0xeb, - 0x52, 0x2c, 0x90, 0xc9, 0xf5, 0x57, 0x76, 0xd6, 0xe4, 0x7a, 0x4d, 0x8a, 0x87, 0x65, 0x8d, 0xfa, - 0xca, 0x76, 0xbd, 0x26, 0x25, 0x4a, 0x1a, 0xcc, 0x0d, 0x4a, 0xa8, 0x03, 0xa7, 0x50, 0x28, 0x16, - 0xe2, 0x43, 0x62, 0x81, 0x72, 0xf5, 0xc6, 0x42, 0xe9, 0x5b, 0x71, 0x98, 0x1d, 0xb0, 0xa8, 0x0c, - 0xbc, 0xc9, 0x4b, 0x30, 0xc9, 0x62, 0x99, 0x2d, 0xb3, 0x4f, 0x0c, 0x5c, 0x9d, 0x68, 0x64, 0xf7, - 0x2d, 0xb5, 0x14, 0x17, 0x2e, 0x35, 0x12, 0x43, 0x4a, 0x0d, 0x42, 0xd1, 0x17, 0xb0, 0x7f, 0xa2, - 0x2f, 0xf9, 0xb3, 0xf5, 0xf1, 0xe2, 0x38, 0xeb, 0x23, 0x95, 0x1d, 0x6f, 0x11, 0x98, 0x1c, 0xb0, - 0x08, 0x5c, 0x81, 0x99, 0x3e, 0xa2, 0xb1, 0x93, 0xf1, 0xc7, 0x62, 0x50, 0x1c, 0xe6, 0x9c, 0x11, - 0x29, 0x31, 0x1e, 0x49, 0x89, 0x57, 0x7a, 0x3d, 0xf8, 0xf0, 0xf0, 0x41, 0xe8, 0x1b, 0xeb, 0x2f, - 0xc4, 0xe0, 0xe4, 0xe0, 0x92, 0x72, 0xa0, 0x0d, 0x1f, 0x85, 0x54, 0x07, 0x7b, 0xfb, 0x96, 0x28, - 0xab, 0x1e, 0x1f, 0xb0, 0x58, 0x93, 0xe6, 0xde, 0xc1, 0xe6, 0xa8, 0xf0, 0x6a, 0x9f, 0x18, 0x56, - 0x17, 0x32, 0x6b, 0xfa, 0x2c, 0xfd, 0x44, 0x1c, 0x4e, 0x0c, 0x24, 0x1f, 0x68, 0xe8, 0x43, 0x00, - 0xba, 0x69, 0x77, 0x3d, 0x56, 0x3a, 0xb1, 0x4c, 0x9c, 0xa1, 0x12, 0x9a, 0xbc, 0x48, 0x96, 0xed, - 0x7a, 0x7e, 0x7b, 0x82, 0xb6, 0x03, 0x13, 0x51, 0x85, 0x17, 0x03, 0x43, 0x93, 0xd4, 0xd0, 0x85, - 0x21, 0x3d, 0xed, 0x0b, 0xcc, 0x67, 0x41, 0xd2, 0x0c, 0x1d, 0x9b, 0x9e, 0xe2, 0x7a, 0x0e, 0x56, - 0x3b, 0xba, 0xd9, 0xa6, 0x4b, 0x4d, 0xba, 0x3c, 0xb9, 0xa7, 0x1a, 0x2e, 0x96, 0x0b, 0xac, 0xb9, - 0x29, 0x5a, 0x09, 0x82, 0x06, 0x90, 0x13, 0x42, 0xa4, 0x22, 0x08, 0xd6, 0xec, 0x23, 0x4a, 0x3f, - 0x91, 0x81, 0x6c, 0xa8, 0x00, 0x47, 0x0f, 0x43, 0xee, 0x4d, 0xf5, 0xa6, 0xaa, 0x88, 0x4d, 0x15, - 0xf3, 0x44, 0x96, 0xc8, 0x1a, 0x7c, 0x63, 0xf5, 0x2c, 0xcc, 0x51, 0x15, 0xab, 0xeb, 0x61, 0x47, - 0xd1, 0x0c, 0xd5, 0x75, 0xa9, 0xd3, 0xd2, 0x54, 0x15, 0x91, 0xb6, 0x2d, 0xd2, 0x54, 0x15, 0x2d, - 0xe8, 0x02, 0xcc, 0x52, 0x44, 0xa7, 0x6b, 0x78, 0xba, 0x6d, 0x60, 0x85, 0x6c, 0xf3, 0x5c, 0xba, - 0xe4, 0xf8, 0x96, 0xcd, 0x10, 0x8d, 0x0d, 0xae, 0x40, 0x2c, 0x72, 0x51, 0x0d, 0x1e, 0xa2, 0xb0, - 0x36, 0x36, 0xb1, 0xa3, 0x7a, 0x58, 0xc1, 0x3f, 0xd2, 0x55, 0x0d, 0x57, 0x51, 0xcd, 0x96, 0xb2, - 0xaf, 0xba, 0xfb, 0xc5, 0x39, 0x42, 0x50, 0x89, 0x17, 0x63, 0xf2, 0x69, 0xa2, 0xb8, 0xca, 0xf5, - 0xea, 0x54, 0x6d, 0xc5, 0x6c, 0xbd, 0xac, 0xba, 0xfb, 0xa8, 0x0c, 0x27, 0x29, 0x8b, 0xeb, 0x39, - 0xba, 0xd9, 0x56, 0xb4, 0x7d, 0xac, 0x1d, 0x28, 0x5d, 0x6f, 0xef, 0xc5, 0xe2, 0x03, 0xe1, 0xfb, - 0x53, 0x0b, 0x9b, 0x54, 0xa7, 0x4a, 0x54, 0x76, 0xbc, 0xbd, 0x17, 0x51, 0x13, 0x72, 0x64, 0x30, - 0x3a, 0xfa, 0x5b, 0x58, 0xd9, 0xb3, 0x1c, 0xba, 0x86, 0xe6, 0x07, 0xa4, 0xa6, 0x90, 0x07, 0x97, - 0xb7, 0x38, 0x60, 0xc3, 0x6a, 0xe1, 0xf2, 0x64, 0xb3, 0x51, 0xaf, 0xd7, 0xe4, 0xac, 0x60, 0xb9, - 0x6a, 0x39, 0x24, 0xa0, 0xda, 0x96, 0xef, 0xe0, 0x2c, 0x0b, 0xa8, 0xb6, 0x25, 0xdc, 0x7b, 0x01, - 0x66, 0x35, 0x8d, 0xf5, 0x59, 0xd7, 0x14, 0xbe, 0x19, 0x73, 0x8b, 0x52, 0xc4, 0x59, 0x9a, 0xb6, - 0xca, 0x14, 0x78, 0x8c, 0xbb, 0xe8, 0x32, 0x9c, 0x08, 0x9c, 0x15, 0x06, 0xce, 0xf4, 0xf5, 0xb2, - 0x17, 0x7a, 0x01, 0x66, 0xed, 0xc3, 0x7e, 0x20, 0x8a, 0xdc, 0xd1, 0x3e, 0xec, 0x85, 0x5d, 0x82, - 0x39, 0x7b, 0xdf, 0xee, 0xc7, 0x3d, 0x19, 0xc6, 0x21, 0x7b, 0xdf, 0xee, 0x05, 0x3e, 0x46, 0x77, - 0xe6, 0x0e, 0xd6, 0x54, 0x0f, 0xb7, 0x8a, 0xa7, 0xc2, 0xea, 0xa1, 0x06, 0xb4, 0x0c, 0x92, 0xa6, - 0x29, 0xd8, 0x54, 0x77, 0x0d, 0xac, 0xa8, 0x0e, 0x36, 0x55, 0xb7, 0xb8, 0x48, 0x95, 0x93, 0x9e, - 0xd3, 0xc5, 0x72, 0x5e, 0xd3, 0xea, 0xb4, 0x71, 0x85, 0xb6, 0xa1, 0x27, 0x61, 0xc6, 0xda, 0x7d, - 0x53, 0x63, 0x11, 0xa9, 0xd8, 0x0e, 0xde, 0xd3, 0x6f, 0x17, 0x1f, 0xa5, 0xee, 0x2d, 0x90, 0x06, - 0x1a, 0x8f, 0x0d, 0x2a, 0x46, 0x4f, 0x80, 0xa4, 0xb9, 0xfb, 0xaa, 0x63, 0xd3, 0x94, 0xec, 0xda, - 0xaa, 0x86, 0x8b, 0x8f, 0x31, 0x55, 0x26, 0xdf, 0x14, 0x62, 0x32, 0x23, 0xdc, 0x5b, 0xfa, 0x9e, - 0x27, 0x18, 0xcf, 0xb0, 0x19, 0x41, 0x65, 0x9c, 0xed, 0x2c, 0x48, 0xc4, 0x13, 0x91, 0x1b, 0x9f, - 0xa5, 0x6a, 0x79, 0x7b, 0xdf, 0x0e, 0xdf, 0xf7, 0x11, 0x98, 0x26, 0x9a, 0xc1, 0x4d, 0x9f, 0x60, - 0x85, 0x9b, 0xbd, 0x1f, 0xba, 0xe3, 0x0b, 0x70, 0x92, 0x28, 0x75, 0xb0, 0xa7, 0xb6, 0x54, 0x4f, - 0x0d, 0x69, 0x3f, 0x4d, 0xb5, 0x89, 0xdb, 0x37, 0x78, 0x63, 0xc4, 0x4e, 0xa7, 0xbb, 0x7b, 0xe8, - 0x07, 0xd6, 0x33, 0xcc, 0x4e, 0x22, 0x13, 0xa1, 0xf5, 0xa1, 0x15, 0xe7, 0xa5, 0x32, 0xe4, 0xc2, - 0x71, 0x8f, 0x32, 0xc0, 0x22, 0x5f, 0x8a, 0x91, 0x22, 0xa8, 0xba, 0x55, 0x23, 0xe5, 0xcb, 0x1b, - 0x75, 0x29, 0x4e, 0xca, 0xa8, 0xf5, 0xb5, 0xed, 0xba, 0x22, 0xef, 0x6c, 0x6e, 0xaf, 0x6d, 0xd4, - 0xa5, 0x44, 0xa8, 0xb0, 0xbf, 0x96, 0x4c, 0x3f, 0x2e, 0x9d, 0x21, 0x55, 0x43, 0x3e, 0xba, 0x53, - 0x43, 0x3f, 0x04, 0xa7, 0xc4, 0xb1, 0x8a, 0x8b, 0x3d, 0xe5, 0x96, 0xee, 0xd0, 0x09, 0xd9, 0x51, - 0xd9, 0xe2, 0xe8, 0xc7, 0xcf, 0x1c, 0xd7, 0x6a, 0x62, 0xef, 0x55, 0xdd, 0x21, 0xd3, 0xad, 0xa3, - 0x7a, 0x68, 0x1d, 0x16, 0x4d, 0x4b, 0x71, 0x3d, 0xd5, 0x6c, 0xa9, 0x4e, 0x4b, 0x09, 0x0e, 0xb4, - 0x14, 0x55, 0xd3, 0xb0, 0xeb, 0x5a, 0x6c, 0x21, 0xf4, 0x59, 0x1e, 0x34, 0xad, 0x26, 0x57, 0x0e, - 0x56, 0x88, 0x15, 0xae, 0xda, 0x13, 0xbe, 0x89, 0x61, 0xe1, 0xfb, 0x00, 0x64, 0x3a, 0xaa, 0xad, - 0x60, 0xd3, 0x73, 0x0e, 0x69, 0x7d, 0x9e, 0x96, 0xd3, 0x1d, 0xd5, 0xae, 0x93, 0xeb, 0x1f, 0xc8, - 0x36, 0xe9, 0x5a, 0x32, 0x9d, 0x94, 0x26, 0xaf, 0x25, 0xd3, 0x93, 0x52, 0xea, 0x5a, 0x32, 0x9d, - 0x92, 0xa6, 0xae, 0x25, 0xd3, 0x69, 0x29, 0x73, 0x2d, 0x99, 0xce, 0x48, 0x50, 0xfa, 0xc9, 0x24, - 0xe4, 0xc2, 0x15, 0x3c, 0xd9, 0x10, 0x69, 0x74, 0x0d, 0x8b, 0xd1, 0x2c, 0xf7, 0xc8, 0x91, 0xf5, - 0xfe, 0x72, 0x95, 0x2c, 0x6e, 0xe5, 0x14, 0x2b, 0x97, 0x65, 0x86, 0x24, 0x85, 0x05, 0x09, 0x3f, - 0xcc, 0xca, 0x93, 0xb4, 0xcc, 0xaf, 0xd0, 0x2a, 0xa4, 0xde, 0x74, 0x29, 0x77, 0x8a, 0x72, 0x3f, - 0x7a, 0x34, 0xf7, 0xb5, 0x26, 0x25, 0xcf, 0x5c, 0x6b, 0x2a, 0x9b, 0x5b, 0xf2, 0xc6, 0xca, 0xba, - 0xcc, 0xe1, 0xe8, 0x34, 0x24, 0x0d, 0xf5, 0xad, 0xc3, 0xe8, 0x32, 0x48, 0x45, 0x68, 0x19, 0x0a, - 0x5d, 0xf3, 0x26, 0x76, 0xf4, 0x3d, 0x1d, 0xb7, 0x14, 0xaa, 0x55, 0x08, 0x6b, 0xe5, 0x83, 0xd6, - 0x75, 0xa2, 0x3f, 0xe6, 0x30, 0x9e, 0x86, 0xe4, 0x2d, 0xac, 0x1e, 0x44, 0x17, 0x2b, 0x2a, 0xfa, - 0x10, 0xa7, 0xd3, 0x39, 0x98, 0xa4, 0xfe, 0x45, 0x00, 0xdc, 0xc3, 0xd2, 0x04, 0x4a, 0x43, 0xb2, - 0xba, 0x25, 0x93, 0x29, 0x25, 0x41, 0x8e, 0x49, 0x95, 0xc6, 0x5a, 0xbd, 0x5a, 0x97, 0xe2, 0xa5, - 0x0b, 0x90, 0x62, 0x4e, 0x23, 0xd3, 0xcd, 0x77, 0x9b, 0x34, 0xc1, 0x2f, 0x39, 0x47, 0x4c, 0xb4, - 0xee, 0x6c, 0x54, 0xea, 0xb2, 0x14, 0xef, 0x0b, 0x96, 0x92, 0x0b, 0xb9, 0x70, 0x25, 0xff, 0x83, - 0xd9, 0xce, 0x7f, 0x2d, 0x06, 0xd9, 0x50, 0x65, 0x4e, 0x4a, 0x2a, 0xd5, 0x30, 0xac, 0x5b, 0x8a, - 0x6a, 0xe8, 0xaa, 0xcb, 0x43, 0x09, 0xa8, 0x68, 0x85, 0x48, 0xc6, 0x1d, 0xba, 0x1f, 0xd0, 0x24, - 0x9b, 0x94, 0x52, 0xa5, 0xcf, 0xc6, 0x40, 0xea, 0x2d, 0x8d, 0x7b, 0xcc, 0x8c, 0xfd, 0x61, 0x9a, - 0x59, 0xfa, 0x4c, 0x0c, 0xf2, 0xd1, 0x7a, 0xb8, 0xc7, 0xbc, 0x87, 0xff, 0x50, 0xcd, 0xfb, 0xed, - 0x38, 0x4c, 0x47, 0xaa, 0xe0, 0x71, 0xad, 0xfb, 0x11, 0x98, 0xd1, 0x5b, 0xb8, 0x63, 0x5b, 0x1e, - 0x36, 0xb5, 0x43, 0xc5, 0xc0, 0x37, 0xb1, 0x51, 0x2c, 0xd1, 0x24, 0x73, 0xee, 0xe8, 0x3a, 0x7b, - 0x79, 0x2d, 0xc0, 0xad, 0x13, 0x58, 0x79, 0x76, 0xad, 0x56, 0xdf, 0x68, 0x6c, 0x6d, 0xd7, 0x37, - 0xab, 0xaf, 0x2b, 0x3b, 0x9b, 0xd7, 0x37, 0xb7, 0x5e, 0xdd, 0x94, 0x25, 0xbd, 0x47, 0xed, 0x43, - 0x9c, 0xf6, 0x0d, 0x90, 0x7a, 0x8d, 0x42, 0xa7, 0x60, 0x90, 0x59, 0xd2, 0x04, 0x9a, 0x85, 0xc2, - 0xe6, 0x96, 0xd2, 0x5c, 0xab, 0xd5, 0x95, 0xfa, 0xd5, 0xab, 0xf5, 0xea, 0x76, 0x93, 0x9d, 0x9c, - 0xf8, 0xda, 0xdb, 0x91, 0x09, 0x5e, 0xfa, 0x74, 0x02, 0x66, 0x07, 0x58, 0x82, 0x56, 0xf8, 0x9e, - 0x87, 0x6d, 0xc3, 0x9e, 0x19, 0xc7, 0xfa, 0x65, 0x52, 0x75, 0x34, 0x54, 0xc7, 0xe3, 0x5b, 0xa4, - 0x27, 0x80, 0x78, 0xc9, 0xf4, 0x48, 0x72, 0x75, 0xf8, 0x89, 0x14, 0xdb, 0x08, 0x15, 0x02, 0x39, - 0x3b, 0x94, 0x7a, 0x1a, 0x90, 0x6d, 0xb9, 0xba, 0xa7, 0xdf, 0xc4, 0x8a, 0x6e, 0x8a, 0xe3, 0x2b, - 0xb2, 0x31, 0x4a, 0xca, 0x92, 0x68, 0x59, 0x33, 0x3d, 0x5f, 0xdb, 0xc4, 0x6d, 0xb5, 0x47, 0x9b, - 0x24, 0xff, 0x84, 0x2c, 0x89, 0x16, 0x5f, 0xfb, 0x61, 0xc8, 0xb5, 0xac, 0x2e, 0xa9, 0x16, 0x99, - 0x1e, 0x59, 0x6b, 0x62, 0x72, 0x96, 0xc9, 0x7c, 0x15, 0xbe, 0x0f, 0x08, 0xce, 0xcd, 0x72, 0x72, - 0x96, 0xc9, 0x98, 0xca, 0x19, 0x28, 0xa8, 0xed, 0xb6, 0x43, 0xc8, 0x05, 0x11, 0xdb, 0xd9, 0xe4, - 0x7d, 0x31, 0x55, 0x9c, 0xbf, 0x06, 0x69, 0xe1, 0x07, 0xb2, 0xd8, 0x13, 0x4f, 0x28, 0x36, 0xdb, - 0xae, 0xc7, 0xcf, 0x66, 0xe4, 0xb4, 0x29, 0x1a, 0x1f, 0x86, 0x9c, 0xee, 0x2a, 0xc1, 0x63, 0x80, - 0xf8, 0x52, 0xfc, 0x6c, 0x5a, 0xce, 0xea, 0xae, 0x7f, 0x84, 0x5a, 0xfa, 0x42, 0x1c, 0xf2, 0xd1, - 0xc7, 0x18, 0xa8, 0x06, 0x69, 0xc3, 0xd2, 0x54, 0x1a, 0x5a, 0xec, 0x19, 0xda, 0xd9, 0x11, 0x4f, - 0x3e, 0x96, 0xd7, 0xb9, 0xbe, 0xec, 0x23, 0xe7, 0xff, 0x75, 0x0c, 0xd2, 0x42, 0x8c, 0x4e, 0x42, - 0xd2, 0x56, 0xbd, 0x7d, 0x4a, 0x37, 0x59, 0x89, 0x4b, 0x31, 0x99, 0x5e, 0x13, 0xb9, 0x6b, 0xab, - 0x26, 0x0d, 0x01, 0x2e, 0x27, 0xd7, 0x64, 0x5c, 0x0d, 0xac, 0xb6, 0xe8, 0xb6, 0xc9, 0xea, 0x74, - 0xb0, 0xe9, 0xb9, 0x62, 0x5c, 0xb9, 0xbc, 0xca, 0xc5, 0xe8, 0x29, 0x98, 0xf1, 0x1c, 0x55, 0x37, - 0x22, 0xba, 0x49, 0xaa, 0x2b, 0x89, 0x06, 0x5f, 0xb9, 0x0c, 0xa7, 0x05, 0x6f, 0x0b, 0x7b, 0xaa, - 0xb6, 0x8f, 0x5b, 0x01, 0x28, 0x45, 0x8f, 0x47, 0x4e, 0x71, 0x85, 0x1a, 0x6f, 0x17, 0xd8, 0xd2, - 0xaf, 0xc5, 0x60, 0x46, 0x6c, 0xf4, 0x5a, 0xbe, 0xb3, 0x36, 0x00, 0x54, 0xd3, 0xb4, 0xbc, 0xb0, - 0xbb, 0xfa, 0x43, 0xb9, 0x0f, 0xb7, 0xbc, 0xe2, 0x83, 0xe4, 0x10, 0xc1, 0x7c, 0x07, 0x20, 0x68, - 0x19, 0xea, 0xb6, 0x45, 0xc8, 0xf2, 0x67, 0x54, 0xf4, 0x41, 0x27, 0x3b, 0x1a, 0x00, 0x26, 0x22, - 0x3b, 0x42, 0x34, 0x07, 0x93, 0xbb, 0xb8, 0xad, 0x9b, 0xfc, 0xe4, 0x99, 0x5d, 0x88, 0x03, 0x9c, - 0xa4, 0x7f, 0x80, 0x53, 0xf9, 0x33, 0x30, 0xab, 0x59, 0x9d, 0x5e, 0x73, 0x2b, 0x52, 0xcf, 0xf1, - 0x84, 0xfb, 0x72, 0xec, 0x8d, 0x67, 0xb8, 0x52, 0xdb, 0x32, 0x54, 0xb3, 0xbd, 0x6c, 0x39, 0xed, - 0xe0, 0x41, 0x2d, 0xa9, 0x90, 0xdc, 0xd0, 0xe3, 0x5a, 0x7b, 0xf7, 0x7f, 0xc5, 0x62, 0x3f, 0x17, - 0x4f, 0xac, 0x36, 0x2a, 0x5f, 0x8c, 0xcf, 0xaf, 0x32, 0x60, 0x43, 0x38, 0x43, 0xc6, 0x7b, 0x06, - 0xd6, 0x48, 0x07, 0xe1, 0x77, 0x9f, 0x82, 0xb9, 0xb6, 0xd5, 0xb6, 0x28, 0xd3, 0x39, 0xf2, 0x8b, - 0x3f, 0xe9, 0xcd, 0xf8, 0xd2, 0xf9, 0x91, 0x8f, 0x85, 0xcb, 0x9b, 0x30, 0xcb, 0x95, 0x15, 0xfa, - 0xa8, 0x89, 0x6d, 0x84, 0xd0, 0x91, 0xa7, 0x70, 0xc5, 0x5f, 0xfc, 0x36, 0x5d, 0xbe, 0xe5, 0x19, - 0x0e, 0x25, 0x6d, 0x6c, 0xaf, 0x54, 0x96, 0xe1, 0x44, 0x84, 0x8f, 0x4d, 0x52, 0xec, 0x8c, 0x60, - 0xfc, 0x17, 0x9c, 0x71, 0x36, 0xc4, 0xd8, 0xe4, 0xd0, 0x72, 0x15, 0xa6, 0x8f, 0xc3, 0xf5, 0x2f, - 0x39, 0x57, 0x0e, 0x87, 0x49, 0x56, 0xa1, 0x40, 0x49, 0xb4, 0xae, 0xeb, 0x59, 0x1d, 0x9a, 0x01, - 0x8f, 0xa6, 0xf9, 0x57, 0xdf, 0x66, 0xb3, 0x26, 0x4f, 0x60, 0x55, 0x1f, 0x55, 0x2e, 0x03, 0x7d, - 0xba, 0xd6, 0xc2, 0x9a, 0x31, 0x82, 0xe1, 0xeb, 0xdc, 0x10, 0x5f, 0xbf, 0x7c, 0x03, 0xe6, 0xc8, - 0x6f, 0x9a, 0xa0, 0xc2, 0x96, 0x8c, 0x3e, 0xb2, 0x2b, 0xfe, 0xda, 0xc7, 0xd8, 0xc4, 0x9c, 0xf5, - 0x09, 0x42, 0x36, 0x85, 0x46, 0xb1, 0x8d, 0x3d, 0x0f, 0x3b, 0xae, 0xa2, 0x1a, 0x83, 0xcc, 0x0b, - 0x9d, 0x79, 0x14, 0x7f, 0xe6, 0x3b, 0xd1, 0x51, 0x5c, 0x65, 0xc8, 0x15, 0xc3, 0x28, 0xef, 0xc0, - 0xa9, 0x01, 0x51, 0x31, 0x06, 0xe7, 0xa7, 0x39, 0xe7, 0x5c, 0x5f, 0x64, 0x10, 0xda, 0x06, 0x08, - 0xb9, 0x3f, 0x96, 0x63, 0x70, 0xfe, 0x2c, 0xe7, 0x44, 0x1c, 0x2b, 0x86, 0x94, 0x30, 0x5e, 0x83, - 0x99, 0x9b, 0xd8, 0xd9, 0xb5, 0x5c, 0x7e, 0xce, 0x34, 0x06, 0xdd, 0x67, 0x38, 0x5d, 0x81, 0x03, - 0xe9, 0xc1, 0x13, 0xe1, 0xba, 0x0c, 0xe9, 0x3d, 0x55, 0xc3, 0x63, 0x50, 0xdc, 0xe5, 0x14, 0x53, - 0x44, 0x9f, 0x40, 0x57, 0x20, 0xd7, 0xb6, 0xf8, 0x1a, 0x35, 0x1a, 0xfe, 0x59, 0x0e, 0xcf, 0x0a, - 0x0c, 0xa7, 0xb0, 0x2d, 0xbb, 0x6b, 0x90, 0x05, 0x6c, 0x34, 0xc5, 0x5f, 0x13, 0x14, 0x02, 0xc3, - 0x29, 0x8e, 0xe1, 0xd6, 0x77, 0x04, 0x85, 0x1b, 0xf2, 0xe7, 0x4b, 0x90, 0xb5, 0x4c, 0xe3, 0xd0, - 0x32, 0xc7, 0x31, 0xe2, 0x73, 0x9c, 0x01, 0x38, 0x84, 0x10, 0x5c, 0x81, 0xcc, 0xb8, 0x03, 0xf1, - 0xd7, 0xbf, 0x23, 0xa6, 0x87, 0x18, 0x81, 0x55, 0x28, 0x88, 0x04, 0xa5, 0x5b, 0xe6, 0x18, 0x14, - 0x7f, 0x83, 0x53, 0xe4, 0x43, 0x30, 0xde, 0x0d, 0x0f, 0xbb, 0x5e, 0x1b, 0x8f, 0x43, 0xf2, 0x05, - 0xd1, 0x0d, 0x0e, 0xe1, 0xae, 0xdc, 0xc5, 0xa6, 0xb6, 0x3f, 0x1e, 0xc3, 0x2f, 0x08, 0x57, 0x0a, - 0x0c, 0xa1, 0xa8, 0xc2, 0x74, 0x47, 0x75, 0xdc, 0x7d, 0xd5, 0x18, 0x6b, 0x38, 0xfe, 0x26, 0xe7, - 0xc8, 0xf9, 0x20, 0xee, 0x91, 0xae, 0x79, 0x1c, 0x9a, 0x2f, 0x0a, 0x8f, 0x84, 0x60, 0x7c, 0xea, - 0xb9, 0x1e, 0x3d, 0x94, 0x3b, 0x0e, 0xdb, 0xdf, 0x12, 0x53, 0x8f, 0x61, 0x37, 0xc2, 0x8c, 0x57, - 0x20, 0xe3, 0xea, 0x6f, 0x8d, 0x45, 0xf3, 0x25, 0x31, 0xd2, 0x14, 0x40, 0xc0, 0xaf, 0xc3, 0xe9, - 0x81, 0xcb, 0xc4, 0x18, 0x64, 0x7f, 0x9b, 0x93, 0x9d, 0x1c, 0xb0, 0x54, 0xf0, 0x94, 0x70, 0x5c, - 0xca, 0xbf, 0x23, 0x52, 0x02, 0xee, 0xe1, 0x6a, 0x90, 0x5d, 0x83, 0xab, 0xee, 0x1d, 0xcf, 0x6b, - 0x7f, 0x57, 0x78, 0x8d, 0x61, 0x23, 0x5e, 0xdb, 0x86, 0x93, 0x9c, 0xf1, 0x78, 0xe3, 0xfa, 0xf7, - 0x44, 0x62, 0x65, 0xe8, 0x9d, 0xe8, 0xe8, 0xfe, 0x30, 0xcc, 0xfb, 0xee, 0x14, 0xe5, 0xa9, 0xab, - 0x74, 0x54, 0x7b, 0x0c, 0xe6, 0x5f, 0xe4, 0xcc, 0x22, 0xe3, 0xfb, 0xf5, 0xad, 0xbb, 0xa1, 0xda, - 0x84, 0xfc, 0x35, 0x28, 0x0a, 0xf2, 0xae, 0xe9, 0x60, 0xcd, 0x6a, 0x9b, 0xfa, 0x5b, 0xb8, 0x35, - 0x06, 0xf5, 0x2f, 0xf5, 0x0c, 0xd5, 0x4e, 0x08, 0x4e, 0x98, 0xd7, 0x40, 0xf2, 0x6b, 0x15, 0x45, - 0xef, 0xd8, 0x96, 0xe3, 0x8d, 0x60, 0xfc, 0xb2, 0x18, 0x29, 0x1f, 0xb7, 0x46, 0x61, 0xe5, 0x3a, - 0xb0, 0x27, 0xd5, 0xe3, 0x86, 0xe4, 0x57, 0x38, 0xd1, 0x74, 0x80, 0xe2, 0x89, 0x43, 0xb3, 0x3a, - 0xb6, 0xea, 0x8c, 0x93, 0xff, 0xfe, 0xbe, 0x48, 0x1c, 0x1c, 0xc2, 0x13, 0x07, 0xa9, 0xe8, 0xc8, - 0x6a, 0x3f, 0x06, 0xc3, 0x57, 0x45, 0xe2, 0x10, 0x18, 0x4e, 0x21, 0x0a, 0x86, 0x31, 0x28, 0xfe, - 0x81, 0xa0, 0x10, 0x18, 0x42, 0xf1, 0x4a, 0xb0, 0xd0, 0x3a, 0xb8, 0xad, 0xbb, 0x9e, 0xc3, 0x8a, - 0xe2, 0xa3, 0xa9, 0xfe, 0xe1, 0x77, 0xa2, 0x45, 0x98, 0x1c, 0x82, 0x92, 0x4c, 0xc4, 0x8f, 0x69, - 0xe9, 0x9e, 0x69, 0xb4, 0x61, 0xbf, 0x2c, 0x32, 0x51, 0x08, 0x46, 0x6c, 0x0b, 0x55, 0x88, 0xc4, - 0xed, 0x1a, 0xd9, 0x29, 0x8c, 0x41, 0xf7, 0x8f, 0x7a, 0x8c, 0x6b, 0x0a, 0x2c, 0xe1, 0x0c, 0xd5, - 0x3f, 0x5d, 0xf3, 0x00, 0x1f, 0x8e, 0x15, 0x9d, 0xbf, 0xd2, 0x53, 0xff, 0xec, 0x30, 0x24, 0xcb, - 0x21, 0x85, 0x9e, 0x7a, 0x0a, 0x8d, 0x7a, 0x2f, 0xa9, 0xf8, 0x63, 0x1f, 0xf0, 0xfe, 0x46, 0xcb, - 0xa9, 0xf2, 0x3a, 0x09, 0xf2, 0x68, 0xd1, 0x33, 0x9a, 0xec, 0x63, 0x1f, 0xf8, 0x71, 0x1e, 0xa9, - 0x79, 0xca, 0x57, 0x61, 0x3a, 0x52, 0xf0, 0x8c, 0xa6, 0xfa, 0xb3, 0x9c, 0x2a, 0x17, 0xae, 0x77, - 0xca, 0x17, 0x20, 0x49, 0x8a, 0x97, 0xd1, 0xf0, 0x3f, 0xc7, 0xe1, 0x54, 0xbd, 0xfc, 0x11, 0x48, - 0x8b, 0xa2, 0x65, 0x34, 0xf4, 0xcf, 0x73, 0xa8, 0x0f, 0x21, 0x70, 0x51, 0xb0, 0x8c, 0x86, 0xff, - 0x05, 0x01, 0x17, 0x10, 0x02, 0x1f, 0xdf, 0x85, 0x5f, 0xfb, 0x8b, 0x49, 0xbe, 0xe8, 0x08, 0xdf, - 0x5d, 0x81, 0x29, 0x5e, 0xa9, 0x8c, 0x46, 0x7f, 0x82, 0xdf, 0x5c, 0x20, 0xca, 0x97, 0x60, 0x72, - 0x4c, 0x87, 0xff, 0x25, 0x0e, 0x65, 0xfa, 0xe5, 0x2a, 0x64, 0x43, 0xd5, 0xc9, 0x68, 0xf8, 0x8f, - 0x73, 0x78, 0x18, 0x45, 0x4c, 0xe7, 0xd5, 0xc9, 0x68, 0x82, 0xbf, 0x2c, 0x4c, 0xe7, 0x08, 0xe2, - 0x36, 0x51, 0x98, 0x8c, 0x46, 0x7f, 0x52, 0x78, 0x5d, 0x40, 0xca, 0x2f, 0x41, 0xc6, 0x5f, 0x6c, - 0x46, 0xe3, 0x7f, 0x82, 0xe3, 0x03, 0x0c, 0xf1, 0x40, 0x68, 0xb1, 0x1b, 0x4d, 0xf1, 0x93, 0xc2, - 0x03, 0x21, 0x14, 0x99, 0x46, 0xbd, 0x05, 0xcc, 0x68, 0xa6, 0x9f, 0x12, 0xd3, 0xa8, 0xa7, 0x7e, - 0x21, 0xa3, 0x49, 0x73, 0xfe, 0x68, 0x8a, 0xbf, 0x22, 0x46, 0x93, 0xea, 0x13, 0x33, 0x7a, 0x2b, - 0x82, 0xd1, 0x1c, 0x3f, 0x2d, 0xcc, 0xe8, 0x29, 0x08, 0xca, 0x0d, 0x40, 0xfd, 0xd5, 0xc0, 0x68, - 0xbe, 0x4f, 0x71, 0xbe, 0x99, 0xbe, 0x62, 0xa0, 0xfc, 0x2a, 0x9c, 0x1c, 0x5c, 0x09, 0x8c, 0x66, - 0xfd, 0x99, 0x0f, 0x7a, 0xf6, 0x6e, 0xe1, 0x42, 0xa0, 0xbc, 0x1d, 0x2c, 0x29, 0xe1, 0x2a, 0x60, - 0x34, 0xed, 0xa7, 0x3f, 0x88, 0x26, 0xee, 0x70, 0x11, 0x50, 0x5e, 0x01, 0x08, 0x16, 0xe0, 0xd1, - 0x5c, 0x9f, 0xe1, 0x5c, 0x21, 0x10, 0x99, 0x1a, 0x7c, 0xfd, 0x1d, 0x8d, 0xbf, 0x2b, 0xa6, 0x06, - 0x47, 0x90, 0xa9, 0x21, 0x96, 0xde, 0xd1, 0xe8, 0xcf, 0x8a, 0xa9, 0x21, 0x20, 0x24, 0xb2, 0x43, - 0xab, 0xdb, 0x68, 0x86, 0xcf, 0x89, 0xc8, 0x0e, 0xa1, 0xca, 0x9b, 0x30, 0xd3, 0xb7, 0x20, 0x8e, - 0xa6, 0xfa, 0x39, 0x4e, 0x25, 0xf5, 0xae, 0x87, 0xe1, 0xc5, 0x8b, 0x2f, 0x86, 0xa3, 0xd9, 0x3e, - 0xdf, 0xb3, 0x78, 0xf1, 0xb5, 0xb0, 0x7c, 0x05, 0xd2, 0x66, 0xd7, 0x30, 0xc8, 0xe4, 0x41, 0x47, - 0xbf, 0x4b, 0x58, 0xfc, 0xaf, 0xdf, 0xe3, 0xde, 0x11, 0x80, 0xf2, 0x05, 0x98, 0xc4, 0x9d, 0x5d, - 0xdc, 0x1a, 0x85, 0xfc, 0x9d, 0xef, 0x89, 0x84, 0x49, 0xb4, 0xcb, 0x2f, 0x01, 0xb0, 0xa3, 0x11, - 0xfa, 0xf0, 0x70, 0x04, 0xf6, 0xbf, 0x7d, 0x8f, 0xbf, 0xbc, 0x13, 0x40, 0x02, 0x02, 0xf6, 0x2a, - 0xd0, 0xd1, 0x04, 0xdf, 0x89, 0x12, 0xd0, 0x11, 0xb9, 0x0c, 0x53, 0x6f, 0xba, 0x96, 0xe9, 0xa9, - 0xed, 0x51, 0xe8, 0xdf, 0xe5, 0x68, 0xa1, 0x4f, 0x1c, 0xd6, 0xb1, 0x1c, 0xec, 0xa9, 0x6d, 0x77, - 0x14, 0xf6, 0xbf, 0x73, 0xac, 0x0f, 0x20, 0x60, 0x4d, 0x75, 0xbd, 0x71, 0xfa, 0xfd, 0x7b, 0x02, - 0x2c, 0x00, 0xc4, 0x68, 0xf2, 0xfb, 0x00, 0x1f, 0x8e, 0xc2, 0xfe, 0xbe, 0x30, 0x9a, 0xeb, 0x97, - 0x3f, 0x02, 0x19, 0xf2, 0x93, 0xbd, 0x91, 0x37, 0x02, 0xfc, 0x3f, 0x38, 0x38, 0x40, 0x90, 0x3b, - 0xbb, 0x5e, 0xcb, 0xd3, 0x47, 0x3b, 0xfb, 0xbb, 0x7c, 0xa4, 0x85, 0x7e, 0x79, 0x05, 0xb2, 0xae, - 0xd7, 0x6a, 0x75, 0x79, 0x7d, 0x3a, 0x02, 0xfe, 0x07, 0xdf, 0xf3, 0x8f, 0x2c, 0x7c, 0x0c, 0x19, - 0xed, 0x5b, 0x07, 0x9e, 0x6d, 0xd1, 0x07, 0x1e, 0xa3, 0x18, 0x3e, 0xe0, 0x0c, 0x21, 0x48, 0xb9, - 0x0a, 0x39, 0xd2, 0x17, 0x07, 0xdb, 0x98, 0x3e, 0x9d, 0x1a, 0x41, 0xf1, 0x3f, 0xb9, 0x03, 0x22, - 0xa0, 0xca, 0x9f, 0xfa, 0xfa, 0x7b, 0x0b, 0xb1, 0x6f, 0xbe, 0xb7, 0x10, 0xfb, 0xed, 0xf7, 0x16, - 0x62, 0x9f, 0xfc, 0xd6, 0xc2, 0xc4, 0x37, 0xbf, 0xb5, 0x30, 0xf1, 0x9b, 0xdf, 0x5a, 0x98, 0x18, - 0x7c, 0x4a, 0x0c, 0xab, 0xd6, 0xaa, 0xc5, 0xce, 0x87, 0xdf, 0x78, 0xac, 0xad, 0x7b, 0xfb, 0xdd, - 0xdd, 0x65, 0xcd, 0xea, 0x9c, 0xd3, 0x2c, 0xb7, 0x63, 0xb9, 0xe7, 0xa2, 0xe7, 0xba, 0xf4, 0x17, - 0x7c, 0x3f, 0x46, 0xf6, 0xcc, 0xd1, 0xe3, 0x5c, 0xd5, 0x3c, 0x1c, 0xf6, 0x79, 0xcf, 0x45, 0x48, - 0xac, 0x98, 0x87, 0xe8, 0x34, 0x4b, 0x70, 0x4a, 0xd7, 0x31, 0xf8, 0x6b, 0x61, 0x53, 0xe4, 0x7a, - 0xc7, 0x31, 0xd0, 0x5c, 0xf0, 0xee, 0x66, 0xec, 0x6c, 0x8e, 0xbf, 0x90, 0x59, 0xf9, 0xf1, 0xd8, - 0xf1, 0x7a, 0x92, 0x5e, 0x31, 0x0f, 0x69, 0x47, 0x1a, 0xb1, 0x37, 0x9e, 0x1e, 0x79, 0xce, 0x7d, - 0x60, 0x5a, 0xb7, 0x4c, 0x62, 0xb6, 0xbd, 0x2b, 0xce, 0xb8, 0x17, 0x7a, 0xcf, 0xb8, 0x5f, 0xc5, - 0x86, 0x71, 0x9d, 0xe8, 0x6d, 0x13, 0xc8, 0x6e, 0x8a, 0xbd, 0x81, 0x0c, 0x3f, 0x15, 0x87, 0x85, - 0xbe, 0xe3, 0x6c, 0x1e, 0x04, 0xc3, 0x9c, 0x50, 0x86, 0x74, 0x4d, 0xc4, 0x56, 0x11, 0xa6, 0x5c, - 0xac, 0x59, 0x66, 0xcb, 0xa5, 0x8e, 0x48, 0xc8, 0xe2, 0x92, 0x38, 0xc2, 0x54, 0x4d, 0xcb, 0xe5, - 0x2f, 0x56, 0xb2, 0x8b, 0xca, 0xcf, 0x1e, 0xd3, 0x11, 0xd3, 0xe2, 0x4e, 0xc2, 0x1b, 0xcf, 0x8d, - 0xe9, 0x0d, 0xd1, 0x89, 0xc8, 0xc9, 0xff, 0xb8, 0x5e, 0xf9, 0xe9, 0x38, 0x2c, 0xf6, 0x7a, 0x85, - 0xcc, 0x2c, 0xd7, 0x53, 0x3b, 0xf6, 0x30, 0xb7, 0x5c, 0x81, 0xcc, 0xb6, 0xd0, 0x39, 0xb6, 0x5f, - 0xee, 0x1e, 0xd3, 0x2f, 0x79, 0xff, 0x56, 0xc2, 0x31, 0xe7, 0xc7, 0x74, 0x8c, 0xdf, 0x8f, 0x7b, - 0xf2, 0xcc, 0xff, 0x4e, 0xc1, 0x69, 0x36, 0x9d, 0x14, 0x36, 0x95, 0xd8, 0x05, 0xf7, 0x49, 0x2e, - 0xdc, 0x34, 0xfa, 0x39, 0x49, 0xe9, 0x3a, 0xcc, 0xae, 0x91, 0x6c, 0x41, 0x76, 0x41, 0xc1, 0x13, - 0x9e, 0x81, 0xef, 0x9e, 0x2e, 0x45, 0x0a, 0x7e, 0xfe, 0x84, 0x29, 0x2c, 0x2a, 0xfd, 0x58, 0x0c, - 0xa4, 0xa6, 0xa6, 0x1a, 0xaa, 0xf3, 0xff, 0x4a, 0x85, 0x2e, 0x01, 0xd0, 0x6f, 0x96, 0x82, 0x8f, - 0x8c, 0xf2, 0xe7, 0x8b, 0xcb, 0xe1, 0xce, 0x2d, 0xb3, 0x3b, 0xd1, 0x2f, 0x18, 0x32, 0x54, 0x97, - 0xfc, 0x7c, 0xf2, 0x35, 0x80, 0xa0, 0x01, 0x3d, 0x00, 0xa7, 0x9a, 0xd5, 0x95, 0xf5, 0x15, 0x59, - 0x61, 0x2f, 0xc3, 0x6f, 0x36, 0x1b, 0xf5, 0xea, 0xda, 0xd5, 0xb5, 0x7a, 0x4d, 0x9a, 0x40, 0x27, - 0x01, 0x85, 0x1b, 0xfd, 0xf7, 0x52, 0x4e, 0xc0, 0x4c, 0x58, 0xce, 0xde, 0xa8, 0x8f, 0x93, 0x4a, - 0x51, 0xef, 0xd8, 0x06, 0xa6, 0x8f, 0xfe, 0x14, 0x5d, 0x78, 0x6d, 0x74, 0x11, 0xf2, 0xab, 0xff, - 0x86, 0xbd, 0x65, 0x3d, 0x1b, 0xc0, 0x7d, 0x9f, 0x97, 0xd7, 0x61, 0x46, 0xd5, 0x34, 0x6c, 0x47, - 0x28, 0x47, 0xa4, 0x6a, 0x42, 0x48, 0x1f, 0x66, 0x72, 0x64, 0xc0, 0x76, 0x09, 0x52, 0x2e, 0xed, - 0xfd, 0x28, 0x8a, 0x6f, 0x70, 0x0a, 0xae, 0x5e, 0x36, 0x61, 0x86, 0x54, 0x7e, 0xaa, 0x83, 0x43, - 0x66, 0x1c, 0x7d, 0xce, 0xf0, 0x8f, 0xbf, 0xfc, 0x2c, 0x7d, 0xb4, 0xf9, 0x70, 0x74, 0x58, 0x06, - 0x84, 0x93, 0x2c, 0x71, 0xee, 0xc0, 0x50, 0x0c, 0x79, 0x71, 0x3f, 0x6e, 0xf0, 0xd1, 0x37, 0xfb, - 0x27, 0xfc, 0x66, 0x0b, 0x83, 0x62, 0x20, 0x74, 0xa7, 0x69, 0xce, 0xca, 0x1a, 0x2a, 0xf5, 0x61, - 0x73, 0xfa, 0x8d, 0xa7, 0xfa, 0x57, 0x27, 0xf6, 0xe7, 0x19, 0xca, 0x7c, 0x25, 0x7c, 0x1b, 0x7f, - 0xee, 0xfd, 0x46, 0x02, 0x16, 0xb8, 0xf2, 0xae, 0xea, 0xe2, 0x73, 0x37, 0x9f, 0xdb, 0xc5, 0x9e, - 0xfa, 0xdc, 0x39, 0xcd, 0xd2, 0x45, 0xae, 0x9e, 0xe5, 0xd3, 0x91, 0xb4, 0x2f, 0xf3, 0xf6, 0xf9, - 0x81, 0x0f, 0x34, 0xe7, 0x87, 0x4f, 0xe3, 0xd2, 0x0e, 0x24, 0xab, 0x96, 0x6e, 0x92, 0x54, 0xd5, - 0xc2, 0xa6, 0xd5, 0xe1, 0xb3, 0x87, 0x5d, 0xa0, 0xe7, 0x20, 0xa5, 0x76, 0xac, 0xae, 0xe9, 0xb1, - 0x99, 0x53, 0x39, 0xfd, 0xf5, 0x77, 0x17, 0x27, 0xfe, 0xed, 0xbb, 0x8b, 0x89, 0x35, 0xd3, 0xfb, - 0xf5, 0xaf, 0x3c, 0x03, 0x9c, 0x6a, 0xcd, 0xf4, 0x64, 0xae, 0x58, 0x4e, 0xbe, 0xff, 0xce, 0x62, - 0xac, 0xf4, 0x1a, 0x4c, 0xd5, 0xb0, 0x76, 0x2f, 0xcc, 0x35, 0xac, 0x85, 0x98, 0x6b, 0x58, 0xeb, - 0x61, 0xbe, 0x04, 0xe9, 0x35, 0xd3, 0x63, 0x2f, 0xae, 0x3f, 0x05, 0x09, 0xdd, 0x64, 0xef, 0x42, - 0x1e, 0x69, 0x1b, 0xd1, 0x22, 0xc0, 0x1a, 0xd6, 0x7c, 0x60, 0x0b, 0x6b, 0xbd, 0xc0, 0xfe, 0x5b, - 0x13, 0xad, 0x4a, 0xed, 0x37, 0xff, 0xd3, 0xc2, 0xc4, 0xdb, 0xef, 0x2d, 0x4c, 0x0c, 0x1d, 0xe2, - 0xd2, 0xd0, 0x21, 0x76, 0x5b, 0x07, 0x2c, 0x23, 0xfb, 0x23, 0xfb, 0xc5, 0x24, 0x3c, 0x44, 0xbf, - 0x67, 0x72, 0x3a, 0xba, 0xe9, 0x9d, 0xd3, 0x9c, 0x43, 0xdb, 0xb3, 0x48, 0xde, 0xb4, 0xf6, 0xf8, - 0xc0, 0xce, 0x04, 0xcd, 0xcb, 0xac, 0x79, 0xf0, 0xb0, 0x96, 0xf6, 0x60, 0xb2, 0x41, 0x70, 0xc4, - 0xc5, 0x9e, 0xe5, 0xa9, 0x06, 0x5f, 0x7f, 0xd8, 0x05, 0x91, 0xb2, 0x6f, 0xa0, 0xe2, 0x4c, 0xaa, - 0x8b, 0xcf, 0x9f, 0x0c, 0xac, 0xee, 0xb1, 0x57, 0xc9, 0x13, 0xb4, 0x70, 0x49, 0x13, 0x01, 0x7d, - 0x6b, 0x7c, 0x0e, 0x26, 0xd5, 0x2e, 0x7b, 0x87, 0x21, 0x41, 0x2a, 0x1a, 0x7a, 0x51, 0xba, 0x0e, - 0x53, 0xfc, 0x49, 0x2a, 0x92, 0x20, 0x71, 0x80, 0x0f, 0xe9, 0x7d, 0x72, 0x32, 0xf9, 0x89, 0x96, - 0x61, 0x92, 0x1a, 0xcf, 0xbf, 0x91, 0x29, 0x2e, 0xf7, 0x59, 0xbf, 0x4c, 0x8d, 0x94, 0x99, 0x5a, - 0xe9, 0x1a, 0xa4, 0x6b, 0x56, 0x47, 0x37, 0xad, 0x28, 0x5b, 0x86, 0xb1, 0x51, 0x9b, 0xed, 0x2e, - 0x8f, 0x0a, 0x99, 0x5d, 0xa0, 0x93, 0x90, 0x62, 0x9f, 0x16, 0xf0, 0xf7, 0x30, 0xf8, 0x55, 0xa9, - 0x0a, 0x53, 0x94, 0x7b, 0xcb, 0x26, 0xc9, 0xdf, 0x7f, 0x8b, 0x33, 0xc3, 0x3f, 0x34, 0xe3, 0xf4, - 0xf1, 0xc0, 0x58, 0x04, 0xc9, 0x96, 0xea, 0xa9, 0xbc, 0xdf, 0xf4, 0x77, 0xe9, 0xa3, 0x90, 0xe6, - 0x24, 0x2e, 0x3a, 0x0f, 0x09, 0xcb, 0x76, 0xf9, 0x9b, 0x14, 0xf3, 0xc3, 0xba, 0xb2, 0x65, 0x57, - 0x92, 0x24, 0x66, 0x64, 0xa2, 0x5c, 0x91, 0x87, 0x86, 0xc5, 0x8b, 0xa1, 0xb0, 0x08, 0x0d, 0x79, - 0xe8, 0x27, 0x1b, 0xd2, 0xbe, 0x70, 0xf0, 0x83, 0xe5, 0x73, 0x71, 0x58, 0x08, 0xb5, 0xde, 0xc4, - 0x8e, 0xab, 0x5b, 0x26, 0x8b, 0x28, 0x1e, 0x2d, 0x28, 0x64, 0x24, 0x6f, 0x1f, 0x12, 0x2e, 0x1f, - 0x81, 0xc4, 0x8a, 0x6d, 0xa3, 0x79, 0x48, 0xd3, 0x6b, 0xcd, 0x62, 0xf1, 0x92, 0x94, 0xfd, 0x6b, - 0xd2, 0xe6, 0x5a, 0x7b, 0xde, 0x2d, 0xd5, 0xf1, 0xbf, 0xbe, 0x13, 0xd7, 0xa5, 0xcb, 0x90, 0xa9, - 0x5a, 0xa6, 0x8b, 0x4d, 0xb7, 0x4b, 0x2b, 0x9b, 0x5d, 0xc3, 0xd2, 0x0e, 0x38, 0x03, 0xbb, 0x20, - 0x0e, 0x57, 0x6d, 0x9b, 0x22, 0x93, 0x32, 0xf9, 0xc9, 0xe6, 0x6c, 0xa5, 0x39, 0xd4, 0x45, 0x97, - 0x8f, 0xef, 0x22, 0xde, 0x49, 0xdf, 0x47, 0xdf, 0x8f, 0xc1, 0x83, 0xfd, 0x13, 0xea, 0x00, 0x1f, - 0xba, 0xc7, 0x9d, 0x4f, 0xaf, 0x41, 0xa6, 0x41, 0x3f, 0x81, 0xbf, 0x8e, 0x0f, 0xd1, 0x3c, 0x4c, - 0xe1, 0xd6, 0xf9, 0x0b, 0x17, 0x9e, 0xbb, 0xcc, 0xa2, 0xfd, 0xe5, 0x09, 0x59, 0x08, 0xd0, 0x02, - 0x64, 0x5c, 0xac, 0xd9, 0xe7, 0x2f, 0x5c, 0x3c, 0x78, 0x8e, 0x85, 0xd7, 0xcb, 0x13, 0x72, 0x20, - 0x2a, 0xa7, 0x49, 0xaf, 0xdf, 0xff, 0xdc, 0x62, 0xac, 0x32, 0x09, 0x09, 0xb7, 0xdb, 0xf9, 0x50, - 0x63, 0xe4, 0xd3, 0x93, 0xb0, 0x14, 0x46, 0xd2, 0xfa, 0xef, 0xa6, 0x6a, 0xe8, 0x2d, 0x35, 0xf8, - 0xe7, 0x05, 0x52, 0xc8, 0x07, 0x54, 0x63, 0xc8, 0x4a, 0x71, 0xa4, 0x27, 0x4b, 0xbf, 0x14, 0x83, - 0xdc, 0x0d, 0xc1, 0xdc, 0xc4, 0x1e, 0xba, 0x02, 0xe0, 0xdf, 0x49, 0x4c, 0x9b, 0x07, 0x96, 0x7b, - 0xef, 0xb5, 0xec, 0x63, 0xe4, 0x90, 0x3a, 0xba, 0x44, 0x03, 0xd1, 0xb6, 0x5c, 0xfe, 0x45, 0xd6, - 0x08, 0xa8, 0xaf, 0x8c, 0x9e, 0x06, 0x44, 0x33, 0x9c, 0x72, 0xd3, 0xf2, 0x74, 0xb3, 0xad, 0xd8, - 0xd6, 0x2d, 0xfe, 0x9d, 0x6b, 0x42, 0x96, 0x68, 0xcb, 0x0d, 0xda, 0xd0, 0x20, 0x72, 0x62, 0x74, - 0xc6, 0x67, 0x21, 0xc5, 0xba, 0xda, 0x6a, 0x39, 0xd8, 0x75, 0x79, 0x12, 0x13, 0x97, 0xe8, 0x0a, - 0x4c, 0xd9, 0xdd, 0x5d, 0x45, 0x64, 0x8c, 0xec, 0xf9, 0x07, 0x07, 0xcd, 0x7f, 0x11, 0x1f, 0x3c, - 0x03, 0xa4, 0xec, 0xee, 0x2e, 0x89, 0x96, 0x87, 0x21, 0x37, 0xc0, 0x98, 0xec, 0xcd, 0xc0, 0x0e, - 0xfa, 0x9f, 0x17, 0x78, 0x0f, 0x14, 0xdb, 0xd1, 0x2d, 0x47, 0xf7, 0x0e, 0xe9, 0xeb, 0x50, 0x09, - 0x59, 0x12, 0x0d, 0x0d, 0x2e, 0x2f, 0x1d, 0x40, 0xa1, 0x49, 0x8b, 0xb8, 0xc0, 0xf2, 0x0b, 0x81, - 0x7d, 0xb1, 0xd1, 0xf6, 0x0d, 0xb5, 0x2c, 0xde, 0x67, 0x59, 0xe5, 0x95, 0xa1, 0xd1, 0x79, 0xe9, - 0xf8, 0xd1, 0x19, 0x5d, 0xed, 0x7e, 0xef, 0x74, 0x64, 0x72, 0xb2, 0xe0, 0x0c, 0xa7, 0xaf, 0x71, - 0x03, 0x73, 0xd4, 0x1e, 0x6d, 0xfe, 0xe8, 0x45, 0x75, 0x7e, 0x44, 0x1a, 0x9d, 0x1f, 0x39, 0x85, - 0x4a, 0x97, 0x61, 0xba, 0xa1, 0x3a, 0x5e, 0x13, 0x7b, 0x2f, 0x63, 0xb5, 0x85, 0x9d, 0xe8, 0xaa, - 0x3b, 0x2d, 0x56, 0x5d, 0x04, 0x49, 0xba, 0xb4, 0xb2, 0x55, 0x87, 0xfe, 0x2e, 0xed, 0x43, 0x92, - 0xbe, 0x12, 0xe9, 0xaf, 0xc8, 0x1c, 0xc1, 0x56, 0x64, 0x92, 0x4b, 0x0f, 0x3d, 0xec, 0x8a, 0x63, - 0x04, 0x7a, 0x81, 0x5e, 0x10, 0xeb, 0x6a, 0xe2, 0xe8, 0x75, 0x95, 0x07, 0x22, 0x5f, 0x5d, 0x0d, - 0x98, 0xaa, 0x90, 0x54, 0xbc, 0x56, 0xf3, 0x0d, 0x89, 0x05, 0x86, 0xa0, 0x0d, 0x28, 0xd8, 0xaa, - 0xe3, 0xd1, 0xaf, 0x49, 0xf6, 0x69, 0x2f, 0x78, 0xac, 0x2f, 0xf6, 0xcf, 0xbc, 0x48, 0x67, 0xf9, - 0x5d, 0xa6, 0xed, 0xb0, 0xb0, 0xf4, 0x9f, 0x93, 0x90, 0xe2, 0xce, 0xf8, 0x08, 0x4c, 0x71, 0xb7, - 0xf2, 0xe8, 0x7c, 0x68, 0xb9, 0x7f, 0x61, 0x5a, 0xf6, 0x17, 0x10, 0xce, 0x27, 0x30, 0xe8, 0x71, - 0x48, 0x6b, 0xfb, 0xaa, 0x6e, 0x2a, 0x7a, 0x8b, 0x17, 0x84, 0xd9, 0xf7, 0xde, 0x5d, 0x9c, 0xaa, - 0x12, 0xd9, 0x5a, 0x4d, 0x9e, 0xa2, 0x8d, 0x6b, 0x2d, 0x52, 0x09, 0xec, 0x63, 0xbd, 0xbd, 0xef, - 0xf1, 0x19, 0xc6, 0xaf, 0xd0, 0x8b, 0x90, 0x24, 0x01, 0xc1, 0xbf, 0x35, 0x9c, 0xef, 0xab, 0xf0, - 0xfd, 0x2d, 0x74, 0x25, 0x4d, 0x6e, 0xfc, 0xc9, 0xff, 0xb8, 0x18, 0x93, 0x29, 0x02, 0x55, 0x61, - 0xda, 0x50, 0x5d, 0x4f, 0xa1, 0x2b, 0x18, 0xb9, 0xfd, 0x24, 0xa5, 0x38, 0xdd, 0xef, 0x10, 0xee, - 0x58, 0x6e, 0x7a, 0x96, 0xa0, 0x98, 0xa8, 0x85, 0xce, 0x82, 0x44, 0x49, 0x34, 0xab, 0xd3, 0xd1, - 0x3d, 0x56, 0x5b, 0xa5, 0xa8, 0xdf, 0xf3, 0x44, 0x5e, 0xa5, 0x62, 0x5a, 0x61, 0x3d, 0x00, 0x19, - 0xfa, 0x75, 0x13, 0x55, 0x61, 0xef, 0xe1, 0xa6, 0x89, 0x80, 0x36, 0x9e, 0x81, 0x42, 0x90, 0x1f, - 0x99, 0x4a, 0x9a, 0xb1, 0x04, 0x62, 0xaa, 0xf8, 0x2c, 0xcc, 0x99, 0xf8, 0x36, 0x7d, 0x33, 0x38, - 0xa2, 0x9d, 0xa1, 0xda, 0x88, 0xb4, 0xdd, 0x88, 0x22, 0x1e, 0x83, 0xbc, 0x26, 0x9c, 0xcf, 0x74, - 0x81, 0xea, 0x4e, 0xfb, 0x52, 0xaa, 0x76, 0x1a, 0xd2, 0xaa, 0x6d, 0x33, 0x85, 0x2c, 0xcf, 0x8f, - 0xb6, 0x4d, 0x9b, 0x9e, 0x84, 0x19, 0xda, 0x47, 0x07, 0xbb, 0x5d, 0xc3, 0xe3, 0x24, 0x39, 0xaa, - 0x53, 0x20, 0x0d, 0x32, 0x93, 0x53, 0xdd, 0x47, 0x60, 0x1a, 0xdf, 0xd4, 0x5b, 0xd8, 0xd4, 0x30, - 0xd3, 0x9b, 0xa6, 0x7a, 0x39, 0x21, 0xa4, 0x4a, 0x4f, 0x80, 0x9f, 0xf7, 0x14, 0x91, 0x93, 0xf3, - 0x8c, 0x4f, 0xc8, 0x57, 0x98, 0xb8, 0x54, 0x84, 0x64, 0x4d, 0xf5, 0x54, 0x52, 0x60, 0x78, 0xb7, - 0xd9, 0x42, 0x93, 0x93, 0xc9, 0xcf, 0xd2, 0xfb, 0x71, 0x48, 0xde, 0xb0, 0x3c, 0x8c, 0x9e, 0x0f, - 0x15, 0x80, 0xf9, 0x41, 0xf1, 0xdc, 0xd4, 0xdb, 0x26, 0x6e, 0x6d, 0xb8, 0xed, 0xd0, 0xbf, 0x22, - 0x08, 0xc2, 0x29, 0x1e, 0x09, 0xa7, 0x39, 0x98, 0x74, 0xac, 0xae, 0xd9, 0x12, 0xaf, 0xb0, 0xd2, - 0x0b, 0x54, 0x87, 0xb4, 0x1f, 0x25, 0xc9, 0x51, 0x51, 0x52, 0x20, 0x51, 0x42, 0x62, 0x98, 0x0b, - 0xe4, 0xa9, 0x5d, 0x1e, 0x2c, 0x15, 0xc8, 0xf8, 0xc9, 0x8b, 0x47, 0xdb, 0x78, 0x01, 0x1b, 0xc0, - 0xc8, 0x62, 0xe2, 0x8f, 0xbd, 0xef, 0x3c, 0x16, 0x71, 0x92, 0xdf, 0xc0, 0xbd, 0x17, 0x09, 0x2b, - 0xfe, 0x6f, 0x11, 0xa6, 0x68, 0xbf, 0x82, 0xb0, 0x62, 0xff, 0x1a, 0xe1, 0x41, 0xc8, 0xb8, 0x7a, - 0xdb, 0x54, 0xbd, 0xae, 0x83, 0x79, 0xe4, 0x05, 0x82, 0xd2, 0xd7, 0x62, 0x90, 0x62, 0x91, 0x1c, - 0xf2, 0x5b, 0x6c, 0xb0, 0xdf, 0xe2, 0xc3, 0xfc, 0x96, 0xb8, 0x77, 0xbf, 0xad, 0x00, 0xf8, 0xc6, - 0xb8, 0xfc, 0x6b, 0xf5, 0x01, 0x15, 0x03, 0x33, 0xb1, 0xa9, 0xb7, 0xf9, 0x44, 0x0d, 0x81, 0x4a, - 0xff, 0x21, 0x46, 0x8a, 0x58, 0xde, 0x8e, 0x56, 0x60, 0x5a, 0xd8, 0xa5, 0xec, 0x19, 0x6a, 0x9b, - 0xc7, 0xce, 0x43, 0x43, 0x8d, 0xbb, 0x6a, 0xa8, 0x6d, 0x39, 0xcb, 0xed, 0x21, 0x17, 0x83, 0xc7, - 0x21, 0x3e, 0x64, 0x1c, 0x22, 0x03, 0x9f, 0xb8, 0xb7, 0x81, 0x8f, 0x0c, 0x51, 0xb2, 0x77, 0x88, - 0xbe, 0x1c, 0xa7, 0x9b, 0x19, 0xdb, 0x72, 0x55, 0xe3, 0x07, 0x31, 0x23, 0x1e, 0x80, 0x8c, 0x6d, - 0x19, 0x0a, 0x6b, 0x61, 0xaf, 0x76, 0xa7, 0x6d, 0xcb, 0x90, 0xfb, 0x86, 0x7d, 0xf2, 0x3e, 0x4d, - 0x97, 0xd4, 0x7d, 0xf0, 0xda, 0x54, 0xaf, 0xd7, 0x1c, 0xc8, 0x31, 0x57, 0xf0, 0xb5, 0xec, 0x59, - 0xe2, 0x03, 0xba, 0x38, 0xc6, 0xfa, 0xd7, 0x5e, 0x66, 0x36, 0xd3, 0x94, 0xb9, 0x1e, 0x41, 0xb0, - 0xd4, 0x3f, 0x68, 0x17, 0x1c, 0x0e, 0x4b, 0x99, 0xeb, 0x95, 0xfe, 0x6a, 0x0c, 0x60, 0x9d, 0x78, - 0x96, 0xf6, 0x97, 0xac, 0x42, 0x2e, 0x35, 0x41, 0x89, 0xdc, 0x79, 0x61, 0xd8, 0xa0, 0xf1, 0xfb, - 0xe7, 0xdc, 0xb0, 0xdd, 0x55, 0x98, 0x0e, 0x82, 0xd1, 0xc5, 0xc2, 0x98, 0x85, 0x23, 0xaa, 0xea, - 0x26, 0xf6, 0xe4, 0xdc, 0xcd, 0xd0, 0x55, 0xe9, 0x9f, 0xc7, 0x20, 0x43, 0x6d, 0xda, 0xc0, 0x9e, - 0x1a, 0x19, 0xc3, 0xd8, 0xbd, 0x8f, 0xe1, 0x43, 0x00, 0x8c, 0xc6, 0xd5, 0xdf, 0xc2, 0x3c, 0xb2, - 0x32, 0x54, 0xd2, 0xd4, 0xdf, 0xc2, 0xe8, 0xa2, 0xef, 0xf0, 0xc4, 0xd1, 0x0e, 0x17, 0x55, 0x37, - 0x77, 0xfb, 0x29, 0x98, 0xa2, 0xff, 0xdd, 0xe9, 0xb6, 0xcb, 0x0b, 0xe9, 0x94, 0xd9, 0xed, 0x6c, - 0xdf, 0x76, 0x4b, 0x6f, 0xc2, 0xd4, 0xf6, 0x6d, 0x76, 0x36, 0xf2, 0x00, 0x64, 0x1c, 0xcb, 0xe2, - 0x6b, 0x32, 0xab, 0x85, 0xd2, 0x44, 0x40, 0x97, 0x20, 0x71, 0x1e, 0x10, 0x0f, 0xce, 0x03, 0x82, - 0x03, 0x8d, 0xc4, 0x58, 0x07, 0x1a, 0x4f, 0xfe, 0x46, 0x0c, 0xb2, 0xa1, 0xfc, 0x80, 0x9e, 0x83, - 0x13, 0x95, 0xf5, 0xad, 0xea, 0x75, 0x65, 0xad, 0xa6, 0x5c, 0x5d, 0x5f, 0x59, 0x0d, 0x3e, 0x5e, - 0x9a, 0x3f, 0x79, 0xe7, 0xee, 0x12, 0x0a, 0xe9, 0xee, 0x98, 0xf4, 0x9c, 0x1e, 0x9d, 0x83, 0xb9, - 0x28, 0x64, 0xa5, 0xd2, 0xac, 0x6f, 0x6e, 0x4b, 0xb1, 0xf9, 0x13, 0x77, 0xee, 0x2e, 0xcd, 0x84, - 0x10, 0x2b, 0xbb, 0x2e, 0x36, 0xbd, 0x7e, 0x40, 0x75, 0x6b, 0x63, 0x63, 0x6d, 0x5b, 0x8a, 0xf7, - 0x01, 0x78, 0xc2, 0x7e, 0x02, 0x66, 0xa2, 0x80, 0xcd, 0xb5, 0x75, 0x29, 0x31, 0x8f, 0xee, 0xdc, - 0x5d, 0xca, 0x87, 0xb4, 0x37, 0x75, 0x63, 0x3e, 0xfd, 0xf1, 0xcf, 0x2f, 0x4c, 0xfc, 0xc2, 0xcf, - 0x2f, 0xc4, 0x48, 0xcf, 0xa6, 0x23, 0x39, 0x02, 0x3d, 0x0d, 0xa7, 0x9a, 0x6b, 0xab, 0x9b, 0xf5, - 0x9a, 0xb2, 0xd1, 0x5c, 0x15, 0x27, 0xdd, 0xa2, 0x77, 0x85, 0x3b, 0x77, 0x97, 0xb2, 0xbc, 0x4b, - 0xc3, 0xb4, 0x1b, 0x72, 0xfd, 0xc6, 0xd6, 0x76, 0x5d, 0x8a, 0x31, 0xed, 0x86, 0x83, 0x6f, 0x5a, - 0x1e, 0xfb, 0xf7, 0x6f, 0xcf, 0xc2, 0xe9, 0x01, 0xda, 0x7e, 0xc7, 0x66, 0xee, 0xdc, 0x5d, 0x9a, - 0x6e, 0x38, 0x98, 0xcd, 0x1f, 0x8a, 0x58, 0x86, 0x62, 0x3f, 0x62, 0xab, 0xb1, 0xd5, 0x5c, 0x59, - 0x97, 0x96, 0xe6, 0xa5, 0x3b, 0x77, 0x97, 0x72, 0x22, 0x19, 0x12, 0xfd, 0xa0, 0x67, 0x1f, 0xe6, - 0x8e, 0xe7, 0xfd, 0xa7, 0xe0, 0x51, 0x7e, 0x06, 0xe8, 0x7a, 0xea, 0x81, 0x6e, 0xb6, 0xfd, 0xc3, - 0x5b, 0x7e, 0xcd, 0x77, 0x3e, 0x27, 0xf9, 0x39, 0xa3, 0x90, 0x8e, 0x38, 0xc2, 0x1d, 0xfa, 0xe4, - 0x72, 0x7e, 0xc4, 0x43, 0xbd, 0xd1, 0x5b, 0xa7, 0xe1, 0xc7, 0xc3, 0xf3, 0x23, 0x0e, 0xa1, 0xe7, - 0x8f, 0xdc, 0xdc, 0x95, 0x3e, 0x11, 0x83, 0xfc, 0xcb, 0xba, 0xeb, 0x59, 0x8e, 0xae, 0xa9, 0x06, - 0xfd, 0x64, 0xe9, 0xe2, 0xb8, 0xb9, 0xb5, 0x67, 0xaa, 0xbf, 0x04, 0xa9, 0x9b, 0xaa, 0xc1, 0x92, - 0x5a, 0xf8, 0x59, 0x40, 0xaf, 0xfb, 0x82, 0xd4, 0x26, 0x08, 0x18, 0xac, 0xf4, 0xa5, 0x38, 0x14, - 0xe8, 0x64, 0x70, 0xd9, 0x7f, 0xef, 0x22, 0x7b, 0xac, 0x06, 0x24, 0x1d, 0xd5, 0xe3, 0x87, 0x86, - 0x95, 0x1f, 0xe2, 0xe7, 0xc0, 0x8f, 0x8f, 0x3e, 0xcd, 0x5d, 0xee, 0x3f, 0x2a, 0xa6, 0x4c, 0xe8, - 0x55, 0x48, 0x77, 0xd4, 0xdb, 0x0a, 0x65, 0x8d, 0xdf, 0x07, 0xd6, 0xa9, 0x8e, 0x7a, 0x9b, 0xd8, - 0x8a, 0x5a, 0x50, 0x20, 0xc4, 0xda, 0xbe, 0x6a, 0xb6, 0x31, 0xe3, 0x4f, 0xdc, 0x07, 0xfe, 0xe9, - 0x8e, 0x7a, 0xbb, 0x4a, 0x39, 0xc9, 0x5d, 0xca, 0xe9, 0x4f, 0xbd, 0xb3, 0x38, 0x41, 0x8f, 0xd9, - 0x7f, 0x25, 0x06, 0x10, 0xb8, 0x0b, 0xfd, 0xff, 0x20, 0x69, 0xfe, 0x15, 0xbd, 0xbd, 0xcb, 0x07, - 0xf0, 0xcc, 0xb0, 0x81, 0xe8, 0x71, 0x36, 0x5b, 0x98, 0xbf, 0xf9, 0xee, 0x62, 0x4c, 0x2e, 0x68, - 0x3d, 0xe3, 0x50, 0x87, 0x6c, 0xd7, 0x6e, 0xa9, 0x1e, 0x56, 0xe8, 0x26, 0x2e, 0x7e, 0x8c, 0x45, - 0x1e, 0x18, 0x90, 0x34, 0x85, 0xac, 0xff, 0x52, 0x0c, 0xb2, 0xb5, 0xd0, 0x43, 0xbe, 0x22, 0x4c, - 0x75, 0x2c, 0x53, 0x3f, 0xe0, 0x61, 0x97, 0x91, 0xc5, 0x25, 0x9a, 0x87, 0x34, 0xfb, 0x58, 0xd3, - 0x3b, 0x14, 0x27, 0x9e, 0xe2, 0x9a, 0xa0, 0x6e, 0xe1, 0x5d, 0x57, 0x17, 0xbe, 0x96, 0xc5, 0x25, - 0xd9, 0xba, 0xb8, 0x58, 0xeb, 0x3a, 0xba, 0x77, 0xa8, 0x68, 0x96, 0xe9, 0xa9, 0x9a, 0xc7, 0x3f, - 0xfb, 0x2b, 0x08, 0x79, 0x95, 0x89, 0x09, 0x49, 0x0b, 0x7b, 0xaa, 0x6e, 0xb8, 0x45, 0xf6, 0x20, - 0x4c, 0x5c, 0x86, 0xcc, 0xfd, 0xd5, 0x54, 0xf8, 0x88, 0xaa, 0x0a, 0x92, 0x65, 0x63, 0x27, 0x52, - 0x52, 0xb2, 0x08, 0x2d, 0xfe, 0xfa, 0x57, 0x9e, 0x99, 0xe3, 0xee, 0xe6, 0x45, 0x25, 0x7b, 0xaf, - 0x55, 0x2e, 0x08, 0x84, 0xa8, 0x35, 0x5f, 0x27, 0x03, 0x26, 0xf6, 0x7b, 0x76, 0x77, 0x37, 0x38, - 0xd6, 0x9a, 0xeb, 0xf3, 0xeb, 0x8a, 0x79, 0x58, 0x29, 0x7e, 0x23, 0xa0, 0x0e, 0xce, 0x92, 0xae, - 0xe3, 0x43, 0x32, 0x5a, 0x9c, 0xa7, 0x41, 0x69, 0x48, 0x89, 0xf8, 0xa6, 0xaa, 0x1b, 0xe2, 0x1b, - 0x74, 0x99, 0x5f, 0xa1, 0x32, 0xa4, 0x5c, 0x4f, 0xf5, 0xba, 0x2e, 0xff, 0xdf, 0x72, 0xa5, 0x61, - 0x91, 0x51, 0xb1, 0xcc, 0x56, 0x93, 0x6a, 0xca, 0x1c, 0x81, 0xb6, 0x21, 0xe5, 0x59, 0x07, 0xd8, - 0xe4, 0x4e, 0x3a, 0x56, 0x54, 0x0f, 0x78, 0x16, 0xc5, 0xb8, 0x50, 0x1b, 0xa4, 0x16, 0x36, 0x70, - 0x9b, 0x15, 0x44, 0xfb, 0x2a, 0xd9, 0x37, 0xa4, 0xee, 0xc3, 0xac, 0x29, 0xf8, 0xac, 0x4d, 0x4a, - 0x8a, 0xae, 0x47, 0x1f, 0x33, 0xb3, 0x7f, 0xc4, 0xf8, 0xc8, 0xb0, 0xfe, 0x87, 0x22, 0x53, 0x1c, - 0x26, 0x84, 0x9f, 0x48, 0x3f, 0x01, 0x52, 0xd7, 0xdc, 0xb5, 0x4c, 0xfa, 0xa5, 0x28, 0x2f, 0xc6, - 0xd3, 0xb4, 0xbc, 0x29, 0xf8, 0xf2, 0x97, 0x59, 0x55, 0x7e, 0x1d, 0xf2, 0x81, 0x2a, 0x9d, 0x3b, - 0x99, 0x63, 0xcc, 0x9d, 0x69, 0x1f, 0x4b, 0x5a, 0xd1, 0xcb, 0x00, 0xc1, 0xc4, 0xa4, 0xc7, 0x03, - 0xd9, 0xe1, 0x63, 0x18, 0xcc, 0x6e, 0xb1, 0xcd, 0x0a, 0xb0, 0xc8, 0x80, 0xd9, 0x8e, 0x6e, 0x2a, - 0x2e, 0x36, 0xf6, 0x14, 0xee, 0x2a, 0x42, 0x99, 0xbd, 0x0f, 0x43, 0x3b, 0xd3, 0xd1, 0xcd, 0x26, - 0x36, 0xf6, 0x6a, 0x3e, 0x6d, 0x39, 0xf7, 0xf1, 0x77, 0x16, 0x27, 0xf8, 0x5c, 0x9a, 0x28, 0x35, - 0xe8, 0x11, 0x35, 0x9f, 0x06, 0xd8, 0x45, 0x17, 0x21, 0xa3, 0x8a, 0x0b, 0x7a, 0x70, 0x70, 0xd4, - 0x34, 0x0a, 0x54, 0xd9, 0xec, 0x7c, 0xfb, 0xdf, 0x2f, 0xc5, 0x4a, 0x3f, 0x1f, 0x83, 0x54, 0xed, - 0x46, 0x43, 0xd5, 0x1d, 0x54, 0x87, 0x99, 0x20, 0xa0, 0xc6, 0x9d, 0x9b, 0x41, 0x0c, 0x8a, 0xc9, - 0x59, 0x1f, 0xb6, 0x6b, 0x3c, 0x92, 0xa6, 0x77, 0x3f, 0xd9, 0xd3, 0xf1, 0x3a, 0x4c, 0x31, 0x2b, - 0x5d, 0x54, 0x86, 0x49, 0x9b, 0xfc, 0xe0, 0x27, 0xf2, 0x0b, 0x43, 0x03, 0x91, 0xea, 0xfb, 0x27, - 0x88, 0x04, 0x52, 0xfa, 0x7e, 0x0c, 0xa0, 0x76, 0xe3, 0xc6, 0xb6, 0xa3, 0xdb, 0x06, 0xf6, 0xee, - 0x57, 0x8f, 0xd7, 0xe1, 0x44, 0x68, 0x6b, 0xe2, 0x68, 0x63, 0xf7, 0x7a, 0x36, 0xd8, 0x9c, 0x38, - 0xda, 0x40, 0xb6, 0x96, 0xeb, 0xf9, 0x6c, 0x89, 0xb1, 0xd9, 0x6a, 0xae, 0x37, 0xd8, 0x8d, 0x4d, - 0xc8, 0x06, 0xdd, 0x77, 0x51, 0x0d, 0xd2, 0x1e, 0xff, 0xcd, 0xbd, 0x59, 0x1a, 0xee, 0x4d, 0x01, - 0xe3, 0x1e, 0xf5, 0x91, 0xa5, 0xff, 0x43, 0x9c, 0xea, 0x47, 0xec, 0x1f, 0xad, 0x30, 0x22, 0xb9, - 0x97, 0xe7, 0xc6, 0xfb, 0x51, 0x51, 0x70, 0xae, 0x1e, 0xaf, 0x7e, 0x2c, 0x0e, 0xb3, 0x3b, 0x22, - 0xdb, 0xfc, 0x91, 0xf5, 0x44, 0x03, 0xa6, 0xb0, 0xe9, 0x39, 0x3a, 0x75, 0x05, 0x19, 0xeb, 0x67, - 0x87, 0x8d, 0xf5, 0x80, 0xbe, 0xd0, 0x7f, 0x71, 0x24, 0xce, 0xb5, 0x39, 0x4d, 0x8f, 0x17, 0xfe, - 0x5d, 0x1c, 0x8a, 0xc3, 0x90, 0xe8, 0x0c, 0x14, 0x34, 0x07, 0x53, 0x81, 0x12, 0x39, 0x5c, 0xcb, - 0x0b, 0x31, 0x4f, 0xfa, 0x1b, 0x40, 0x0a, 0x28, 0x12, 0x58, 0x44, 0xf5, 0xd8, 0x15, 0x53, 0x3e, - 0x00, 0xd3, 0xb4, 0x8f, 0xa1, 0xa0, 0x9b, 0xba, 0xa7, 0xab, 0x86, 0xb2, 0xab, 0x1a, 0xaa, 0xa9, - 0xdd, 0x4b, 0x65, 0xd9, 0x9f, 0xa8, 0xf3, 0x9c, 0xb4, 0xc2, 0x38, 0xd1, 0x0d, 0x98, 0x12, 0xf4, - 0xc9, 0xfb, 0x40, 0x2f, 0xc8, 0x42, 0x55, 0xd4, 0x6f, 0xc5, 0x61, 0x46, 0xc6, 0xad, 0x3f, 0x5e, - 0x6e, 0xfd, 0x61, 0x00, 0x36, 0xe1, 0x48, 0x1e, 0xbc, 0x07, 0xcf, 0xf6, 0x4f, 0xe0, 0x0c, 0xe3, - 0xab, 0xb9, 0x5e, 0xc8, 0xb7, 0xdf, 0x88, 0x43, 0x2e, 0xec, 0xdb, 0x3f, 0x06, 0xeb, 0x02, 0x5a, - 0x0b, 0xb2, 0x41, 0x92, 0xff, 0x73, 0xd6, 0x21, 0xd9, 0xa0, 0x2f, 0xea, 0x8e, 0x4e, 0x03, 0xdf, - 0x8d, 0x43, 0xaa, 0xa1, 0x3a, 0x6a, 0xc7, 0x45, 0xd7, 0xfa, 0x0a, 0x38, 0x71, 0xca, 0xd6, 0xf7, - 0x2f, 0xb8, 0xf9, 0xa6, 0x9e, 0x85, 0xdc, 0xa7, 0x06, 0xd4, 0x6f, 0x8f, 0x41, 0x9e, 0x6c, 0x11, - 0x43, 0x0f, 0xe4, 0xe3, 0xf4, 0x31, 0x23, 0xd9, 0xe3, 0x05, 0x4f, 0x83, 0xd0, 0x22, 0x64, 0x89, - 0x5a, 0x90, 0xe8, 0x88, 0x0e, 0x74, 0xd4, 0xdb, 0x75, 0x26, 0x41, 0xcf, 0x00, 0xda, 0xf7, 0x37, - 0xed, 0x4a, 0xe0, 0x02, 0xa2, 0x37, 0x13, 0xb4, 0x08, 0xf5, 0x87, 0x00, 0x88, 0x15, 0x0a, 0x7b, - 0xc9, 0x8b, 0xed, 0x71, 0x32, 0x44, 0x52, 0xa3, 0x2f, 0x7a, 0xfd, 0x28, 0xab, 0x05, 0x7b, 0x76, - 0x8f, 0xbc, 0x0c, 0x5f, 0x3f, 0x5e, 0xa4, 0x7e, 0xf7, 0xdd, 0xc5, 0xf9, 0x43, 0xb5, 0x63, 0x94, - 0x4b, 0x03, 0x28, 0x4b, 0xb4, 0x36, 0x8c, 0xee, 0x3a, 0x43, 0x11, 0xfc, 0xf9, 0x18, 0xa0, 0x20, - 0xe5, 0xca, 0xd8, 0xb5, 0xc9, 0xb6, 0x86, 0x14, 0xbd, 0xa1, 0x0a, 0x35, 0x76, 0x74, 0xd1, 0x1b, - 0xe0, 0x45, 0xd1, 0x1b, 0x9a, 0x11, 0x97, 0x83, 0x04, 0x17, 0xe7, 0x63, 0x38, 0xe0, 0x0d, 0xbd, - 0xe5, 0xaa, 0xa5, 0x0b, 0x74, 0x5f, 0x0e, 0x9b, 0x28, 0xfd, 0x56, 0x0c, 0x4e, 0xf7, 0x45, 0x93, - 0x6f, 0xec, 0x9f, 0x04, 0xe4, 0x84, 0x1a, 0xf9, 0x7f, 0xd9, 0x63, 0x46, 0x1f, 0x3b, 0x38, 0x67, - 0x9c, 0xbe, 0x5c, 0xf9, 0x61, 0xe5, 0x68, 0xf6, 0xe6, 0xde, 0x3f, 0x8d, 0xc1, 0x5c, 0xd8, 0x18, - 0xbf, 0x5b, 0x9b, 0x90, 0x0b, 0xdb, 0xc2, 0x3b, 0xf4, 0xe8, 0x38, 0x1d, 0xe2, 0x7d, 0x89, 0xe0, - 0xd1, 0x2b, 0xc1, 0xc4, 0x65, 0x87, 0x45, 0xcf, 0x8d, 0xed, 0x1b, 0x61, 0x53, 0xef, 0x04, 0x4e, - 0x8a, 0x2a, 0x26, 0xd9, 0xb0, 0x2c, 0x03, 0xfd, 0x69, 0x98, 0x31, 0x2d, 0x4f, 0x21, 0x51, 0x8e, - 0x5b, 0x0a, 0xdf, 0xb9, 0xb2, 0xec, 0xf7, 0xca, 0xf1, 0x5c, 0xf6, 0x3b, 0xef, 0x2e, 0xf6, 0x53, - 0xf5, 0xf8, 0xb1, 0x60, 0x5a, 0x5e, 0x85, 0xb6, 0x6f, 0xb3, 0x7d, 0xad, 0x03, 0xd3, 0xd1, 0x5b, - 0xb3, 0x6c, 0xb9, 0x71, 0xec, 0x5b, 0x4f, 0x1f, 0x75, 0xdb, 0xdc, 0x6e, 0xe8, 0x9e, 0xec, 0x9d, - 0xa6, 0xdf, 0x7f, 0x67, 0x31, 0xf6, 0xe4, 0x57, 0x63, 0x00, 0xc1, 0x16, 0x1e, 0x3d, 0x0d, 0xa7, - 0x2a, 0x5b, 0x9b, 0x35, 0xa5, 0xb9, 0xbd, 0xb2, 0xbd, 0xd3, 0x8c, 0xbe, 0xf9, 0x2c, 0xce, 0x84, - 0x5d, 0x1b, 0x6b, 0xf4, 0x7f, 0x10, 0xa2, 0xc7, 0x61, 0x2e, 0xaa, 0x4d, 0xae, 0xea, 0x35, 0x29, - 0x36, 0x9f, 0xbb, 0x73, 0x77, 0x29, 0xcd, 0xaa, 0x23, 0xdc, 0x42, 0x67, 0xe1, 0x44, 0xbf, 0xde, - 0xda, 0xe6, 0xaa, 0x14, 0x9f, 0x9f, 0xbe, 0x73, 0x77, 0x29, 0xe3, 0x97, 0x51, 0xa8, 0x04, 0x28, - 0xac, 0xc9, 0xf9, 0x12, 0xf3, 0x70, 0xe7, 0xee, 0x52, 0x8a, 0xb9, 0x6d, 0x3e, 0xf9, 0xf1, 0xcf, - 0x2f, 0x4c, 0x54, 0xae, 0x0e, 0x3d, 0xf5, 0x7d, 0xfa, 0x48, 0x8f, 0xdd, 0xf6, 0x4f, 0x72, 0x23, - 0x47, 0xbd, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x6f, 0xff, 0x2d, 0x08, 0x37, 0x66, 0x00, 0x00, + // 10422 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x6b, 0x74, 0x1c, 0xd7, + 0x79, 0x18, 0xf6, 0xbd, 0xfb, 0xed, 0x62, 0x77, 0x70, 0x01, 0x91, 0xe0, 0x52, 0x02, 0xa0, 0x91, + 0x25, 0x91, 0x94, 0x04, 0x4a, 0x94, 0x48, 0x8a, 0xa0, 0x65, 0x79, 0xb1, 0x58, 0x92, 0x4b, 0xe2, + 0xa5, 0x59, 0x80, 0x7a, 0x24, 0xf6, 0x78, 0x30, 0x7b, 0x01, 0x8c, 0xb8, 0x3b, 0x33, 0x9e, 0x99, + 0x25, 0x01, 0x9d, 0xb4, 0x47, 0xa9, 0x9a, 0xd6, 0x66, 0xdb, 0xd4, 0x49, 0x7a, 0x1a, 0xc7, 0x31, + 0x5d, 0x3b, 0x4e, 0x6a, 0xc7, 0x75, 0x1f, 0x89, 0x5d, 0xd7, 0x49, 0xda, 0xd4, 0xed, 0xe9, 0xc3, + 0xf5, 0xe9, 0xe9, 0x71, 0x72, 0xda, 0x26, 0xed, 0x49, 0x95, 0x54, 0xf6, 0x69, 0x5d, 0xd7, 0x69, + 0x52, 0xc7, 0x3d, 0x6d, 0x8f, 0x8f, 0xdb, 0x9e, 0xfb, 0x9a, 0xc7, 0x3e, 0xb0, 0x0b, 0x5a, 0x52, + 0xd2, 0xe3, 0x5f, 0xd8, 0x7b, 0xef, 0xf7, 0x7d, 0x73, 0xef, 0x77, 0xbf, 0xfb, 0xbd, 0xee, 0x03, + 0xf0, 0x47, 0x17, 0x61, 0x6e, 0xc7, 0xb2, 0x76, 0x5a, 0xf8, 0xb4, 0xed, 0x58, 0x9e, 0xb5, 0xd5, + 0xd9, 0x3e, 0xdd, 0xc4, 0xae, 0xee, 0x18, 0xb6, 0x67, 0x39, 0xf3, 0xb4, 0x0e, 0x95, 0x18, 0xc4, + 0xbc, 0x80, 0x90, 0x57, 0x60, 0xe2, 0x92, 0xd1, 0xc2, 0x4b, 0x3e, 0x60, 0x03, 0x7b, 0xe8, 0x69, + 0x48, 0x6e, 0x1b, 0x2d, 0x3c, 0x1d, 0x9b, 0x4b, 0x9c, 0xc8, 0x9f, 0x79, 0xc7, 0x7c, 0x17, 0xd2, + 0x7c, 0x14, 0x63, 0x9d, 0x54, 0x2b, 0x14, 0x43, 0xfe, 0x7a, 0x12, 0x26, 0xfb, 0xb4, 0x22, 0x04, + 0x49, 0x53, 0x6b, 0x13, 0x8a, 0xb1, 0x13, 0x39, 0x85, 0xfe, 0x46, 0xd3, 0x90, 0xb1, 0x35, 0xfd, + 0x86, 0xb6, 0x83, 0xa7, 0xe3, 0xb4, 0x5a, 0x14, 0xd1, 0x0c, 0x40, 0x13, 0xdb, 0xd8, 0x6c, 0x62, + 0x53, 0xdf, 0x9f, 0x4e, 0xcc, 0x25, 0x4e, 0xe4, 0x94, 0x50, 0x0d, 0x7a, 0x04, 0x26, 0xec, 0xce, + 0x56, 0xcb, 0xd0, 0xd5, 0x10, 0x18, 0xcc, 0x25, 0x4e, 0xa4, 0x14, 0x89, 0x35, 0x2c, 0x05, 0xc0, + 0x0f, 0x43, 0xe9, 0x16, 0xd6, 0x6e, 0x84, 0x41, 0xf3, 0x14, 0xb4, 0x48, 0xaa, 0x43, 0x80, 0x55, + 0x28, 0xb4, 0xb1, 0xeb, 0x6a, 0x3b, 0x58, 0xf5, 0xf6, 0x6d, 0x3c, 0x9d, 0xa4, 0xa3, 0x9f, 0xeb, + 0x19, 0x7d, 0xf7, 0xc8, 0xf3, 0x1c, 0x6b, 0x63, 0xdf, 0xc6, 0xa8, 0x02, 0x39, 0x6c, 0x76, 0xda, + 0x8c, 0x42, 0x6a, 0x00, 0xff, 0x6a, 0x66, 0xa7, 0xdd, 0x4d, 0x25, 0x4b, 0xd0, 0x38, 0x89, 0x8c, + 0x8b, 0x9d, 0x9b, 0x86, 0x8e, 0xa7, 0xd3, 0x94, 0xc0, 0xc3, 0x3d, 0x04, 0x1a, 0xac, 0xbd, 0x9b, + 0x86, 0xc0, 0x43, 0x55, 0xc8, 0xe1, 0x3d, 0x0f, 0x9b, 0xae, 0x61, 0x99, 0xd3, 0x19, 0x4a, 0xe4, + 0xc1, 0x3e, 0xb3, 0x88, 0x5b, 0xcd, 0x6e, 0x12, 0x01, 0x1e, 0x3a, 0x07, 0x19, 0xcb, 0xf6, 0x0c, + 0xcb, 0x74, 0xa7, 0xb3, 0x73, 0xb1, 0x13, 0xf9, 0x33, 0xf7, 0xf6, 0x15, 0x84, 0x35, 0x06, 0xa3, + 0x08, 0x60, 0x54, 0x07, 0xc9, 0xb5, 0x3a, 0x8e, 0x8e, 0x55, 0xdd, 0x6a, 0x62, 0xd5, 0x30, 0xb7, + 0xad, 0xe9, 0x1c, 0x25, 0x30, 0xdb, 0x3b, 0x10, 0x0a, 0x58, 0xb5, 0x9a, 0xb8, 0x6e, 0x6e, 0x5b, + 0x4a, 0xd1, 0x8d, 0x94, 0xd1, 0x11, 0x48, 0xbb, 0xfb, 0xa6, 0xa7, 0xed, 0x4d, 0x17, 0xa8, 0x84, + 0xf0, 0x92, 0xfc, 0x2b, 0x69, 0x28, 0x8d, 0x22, 0x62, 0x17, 0x21, 0xb5, 0x4d, 0x46, 0x39, 0x1d, + 0x3f, 0x0c, 0x0f, 0x18, 0x4e, 0x94, 0x89, 0xe9, 0xbb, 0x64, 0x62, 0x05, 0xf2, 0x26, 0x76, 0x3d, + 0xdc, 0x64, 0x12, 0x91, 0x18, 0x51, 0xa6, 0x80, 0x21, 0xf5, 0x8a, 0x54, 0xf2, 0xae, 0x44, 0xea, + 0x05, 0x28, 0xf9, 0x5d, 0x52, 0x1d, 0xcd, 0xdc, 0x11, 0xb2, 0x79, 0x7a, 0x58, 0x4f, 0xe6, 0x6b, + 0x02, 0x4f, 0x21, 0x68, 0x4a, 0x11, 0x47, 0xca, 0x68, 0x09, 0xc0, 0x32, 0xb1, 0xb5, 0xad, 0x36, + 0xb1, 0xde, 0x9a, 0xce, 0x0e, 0xe0, 0xd2, 0x1a, 0x01, 0xe9, 0xe1, 0x92, 0xc5, 0x6a, 0xf5, 0x16, + 0xba, 0x10, 0x88, 0x5a, 0x66, 0x80, 0xa4, 0xac, 0xb0, 0x45, 0xd6, 0x23, 0x6d, 0x9b, 0x50, 0x74, + 0x30, 0x91, 0x7b, 0xdc, 0xe4, 0x23, 0xcb, 0xd1, 0x4e, 0xcc, 0x0f, 0x1d, 0x99, 0xc2, 0xd1, 0xd8, + 0xc0, 0xc6, 0x9d, 0x70, 0x11, 0x3d, 0x00, 0x7e, 0x85, 0x4a, 0xc5, 0x0a, 0xa8, 0x16, 0x2a, 0x88, + 0xca, 0x55, 0xad, 0x8d, 0xcb, 0xaf, 0x40, 0x31, 0xca, 0x1e, 0x34, 0x05, 0x29, 0xd7, 0xd3, 0x1c, + 0x8f, 0x4a, 0x61, 0x4a, 0x61, 0x05, 0x24, 0x41, 0x02, 0x9b, 0x4d, 0xaa, 0xe5, 0x52, 0x0a, 0xf9, + 0x89, 0xde, 0x1d, 0x0c, 0x38, 0x41, 0x07, 0xfc, 0x50, 0xef, 0x8c, 0x46, 0x28, 0x77, 0x8f, 0xbb, + 0x7c, 0x1e, 0xc6, 0x23, 0x03, 0x18, 0xf5, 0xd3, 0xf2, 0x8f, 0xc0, 0x3d, 0x7d, 0x49, 0xa3, 0x17, + 0x60, 0xaa, 0x63, 0x1a, 0xa6, 0x87, 0x1d, 0xdb, 0xc1, 0x44, 0x62, 0xd9, 0xa7, 0xa6, 0xff, 0x73, + 0x66, 0x80, 0xcc, 0x6d, 0x86, 0xa1, 0x19, 0x15, 0x65, 0xb2, 0xd3, 0x5b, 0x79, 0x2a, 0x97, 0xfd, + 0x46, 0x46, 0x7a, 0xf5, 0xd5, 0x57, 0x5f, 0x8d, 0xcb, 0xff, 0x28, 0x0d, 0x53, 0xfd, 0xd6, 0x4c, + 0xdf, 0xe5, 0x7b, 0x04, 0xd2, 0x66, 0xa7, 0xbd, 0x85, 0x1d, 0xca, 0xa4, 0x94, 0xc2, 0x4b, 0xa8, + 0x02, 0xa9, 0x96, 0xb6, 0x85, 0x5b, 0xd3, 0xc9, 0xb9, 0xd8, 0x89, 0xe2, 0x99, 0x47, 0x46, 0x5a, + 0x95, 0xf3, 0xcb, 0x04, 0x45, 0x61, 0x98, 0xe8, 0x5d, 0x90, 0xe4, 0x2a, 0x9a, 0x50, 0x38, 0x35, + 0x1a, 0x05, 0xb2, 0x96, 0x14, 0x8a, 0x87, 0x8e, 0x43, 0x8e, 0xfc, 0x65, 0xb2, 0x91, 0xa6, 0x7d, + 0xce, 0x92, 0x0a, 0x22, 0x17, 0xa8, 0x0c, 0x59, 0xba, 0x4c, 0x9a, 0x58, 0x98, 0x36, 0xbf, 0x4c, + 0x04, 0xab, 0x89, 0xb7, 0xb5, 0x4e, 0xcb, 0x53, 0x6f, 0x6a, 0xad, 0x0e, 0xa6, 0x02, 0x9f, 0x53, + 0x0a, 0xbc, 0xf2, 0x3a, 0xa9, 0x43, 0xb3, 0x90, 0x67, 0xab, 0xca, 0x30, 0x9b, 0x78, 0x8f, 0x6a, + 0xcf, 0x94, 0xc2, 0x16, 0x5a, 0x9d, 0xd4, 0x90, 0xcf, 0xbf, 0xec, 0x5a, 0xa6, 0x10, 0x4d, 0xfa, + 0x09, 0x52, 0x41, 0x3f, 0x7f, 0xbe, 0x5b, 0x71, 0xdf, 0xd7, 0x7f, 0x78, 0x3d, 0x6b, 0xe9, 0x61, + 0x28, 0x51, 0x88, 0x27, 0xf9, 0xd4, 0x6b, 0xad, 0xe9, 0x89, 0xb9, 0xd8, 0x89, 0xac, 0x52, 0x64, + 0xd5, 0x6b, 0xbc, 0x56, 0xfe, 0x42, 0x1c, 0x92, 0x54, 0xb1, 0x94, 0x20, 0xbf, 0xf1, 0xe2, 0x7a, + 0x4d, 0x5d, 0x5a, 0xdb, 0x5c, 0x5c, 0xae, 0x49, 0x31, 0x54, 0x04, 0xa0, 0x15, 0x97, 0x96, 0xd7, + 0x2a, 0x1b, 0x52, 0xdc, 0x2f, 0xd7, 0x57, 0x37, 0xce, 0x3d, 0x25, 0x25, 0x7c, 0x84, 0x4d, 0x56, + 0x91, 0x0c, 0x03, 0x3c, 0x79, 0x46, 0x4a, 0x21, 0x09, 0x0a, 0x8c, 0x40, 0xfd, 0x85, 0xda, 0xd2, + 0xb9, 0xa7, 0xa4, 0x74, 0xb4, 0xe6, 0xc9, 0x33, 0x52, 0x06, 0x8d, 0x43, 0x8e, 0xd6, 0x2c, 0xae, + 0xad, 0x2d, 0x4b, 0x59, 0x9f, 0x66, 0x63, 0x43, 0xa9, 0xaf, 0x5e, 0x96, 0x72, 0x3e, 0xcd, 0xcb, + 0xca, 0xda, 0xe6, 0xba, 0x04, 0x3e, 0x85, 0x95, 0x5a, 0xa3, 0x51, 0xb9, 0x5c, 0x93, 0xf2, 0x3e, + 0xc4, 0xe2, 0x8b, 0x1b, 0xb5, 0x86, 0x54, 0x88, 0x74, 0xeb, 0xc9, 0x33, 0xd2, 0xb8, 0xff, 0x89, + 0xda, 0xea, 0xe6, 0x8a, 0x54, 0x44, 0x13, 0x30, 0xce, 0x3e, 0x21, 0x3a, 0x51, 0xea, 0xaa, 0x3a, + 0xf7, 0x94, 0x24, 0x05, 0x1d, 0x61, 0x54, 0x26, 0x22, 0x15, 0xe7, 0x9e, 0x92, 0x90, 0x5c, 0x85, + 0x14, 0x15, 0x43, 0x84, 0xa0, 0xb8, 0x5c, 0x59, 0xac, 0x2d, 0xab, 0x6b, 0xeb, 0x1b, 0xf5, 0xb5, + 0xd5, 0xca, 0xb2, 0x14, 0x0b, 0xea, 0x94, 0xda, 0x73, 0x9b, 0x75, 0xa5, 0xb6, 0x24, 0xc5, 0xc3, + 0x75, 0xeb, 0xb5, 0xca, 0x46, 0x6d, 0x49, 0x4a, 0xc8, 0x3a, 0x4c, 0xf5, 0x53, 0xa8, 0x7d, 0x97, + 0x50, 0x48, 0x16, 0xe2, 0x03, 0x64, 0x81, 0xd2, 0xea, 0x96, 0x05, 0xf9, 0x6b, 0x71, 0x98, 0xec, + 0x63, 0x54, 0xfa, 0x7e, 0xe4, 0x59, 0x48, 0x31, 0x59, 0x66, 0x66, 0xf6, 0x64, 0x5f, 0xeb, 0x44, + 0x25, 0xbb, 0xc7, 0xd4, 0x52, 0xbc, 0xb0, 0xab, 0x91, 0x18, 0xe0, 0x6a, 0x10, 0x12, 0x3d, 0x02, + 0xfb, 0x9e, 0x1e, 0xe5, 0xcf, 0xec, 0xe3, 0xb9, 0x51, 0xec, 0x23, 0xad, 0x3b, 0x9c, 0x11, 0x48, + 0xf5, 0x31, 0x02, 0x17, 0x61, 0xa2, 0x87, 0xd0, 0xc8, 0xca, 0xf8, 0xb5, 0x18, 0x4c, 0x0f, 0x62, + 0xce, 0x10, 0x95, 0x18, 0x8f, 0xa8, 0xc4, 0x8b, 0xdd, 0x1c, 0xbc, 0x7f, 0xf0, 0x24, 0xf4, 0xcc, + 0xf5, 0xa7, 0x62, 0x70, 0xa4, 0xbf, 0x4b, 0xd9, 0xb7, 0x0f, 0xef, 0x82, 0x74, 0x1b, 0x7b, 0xbb, + 0x96, 0x70, 0xab, 0x1e, 0xea, 0x63, 0xac, 0x49, 0x73, 0xf7, 0x64, 0x73, 0xac, 0xb0, 0xb5, 0x4f, + 0x0c, 0xf2, 0x0b, 0x59, 0x6f, 0x7a, 0x7a, 0xfa, 0xc1, 0x38, 0xdc, 0xd3, 0x97, 0x78, 0xdf, 0x8e, + 0xde, 0x07, 0x60, 0x98, 0x76, 0xc7, 0x63, 0xae, 0x13, 0xd3, 0xc4, 0x39, 0x5a, 0x43, 0x95, 0x17, + 0xd1, 0xb2, 0x1d, 0xcf, 0x6f, 0x4f, 0xd0, 0x76, 0x60, 0x55, 0x14, 0xe0, 0xe9, 0xa0, 0xa3, 0x49, + 0xda, 0xd1, 0x99, 0x01, 0x23, 0xed, 0x11, 0xcc, 0xc7, 0x41, 0xd2, 0x5b, 0x06, 0x36, 0x3d, 0xd5, + 0xf5, 0x1c, 0xac, 0xb5, 0x0d, 0x73, 0x87, 0x9a, 0x9a, 0xec, 0x42, 0x6a, 0x5b, 0x6b, 0xb9, 0x58, + 0x29, 0xb1, 0xe6, 0x86, 0x68, 0x25, 0x18, 0x54, 0x80, 0x9c, 0x10, 0x46, 0x3a, 0x82, 0xc1, 0x9a, + 0x7d, 0x0c, 0xf9, 0x27, 0x72, 0x90, 0x0f, 0x39, 0xe0, 0xe8, 0x7e, 0x28, 0xbc, 0xac, 0xdd, 0xd4, + 0x54, 0x11, 0x54, 0x31, 0x4e, 0xe4, 0x49, 0xdd, 0x3a, 0x0f, 0xac, 0x1e, 0x87, 0x29, 0x0a, 0x62, + 0x75, 0x3c, 0xec, 0xa8, 0x7a, 0x4b, 0x73, 0x5d, 0xca, 0xb4, 0x2c, 0x05, 0x45, 0xa4, 0x6d, 0x8d, + 0x34, 0x55, 0x45, 0x0b, 0x3a, 0x0b, 0x93, 0x14, 0xa3, 0xdd, 0x69, 0x79, 0x86, 0xdd, 0xc2, 0x2a, + 0x09, 0xf3, 0x5c, 0x6a, 0x72, 0xfc, 0x9e, 0x4d, 0x10, 0x88, 0x15, 0x0e, 0x40, 0x7a, 0xe4, 0xa2, + 0x25, 0xb8, 0x8f, 0xa2, 0xed, 0x60, 0x13, 0x3b, 0x9a, 0x87, 0x55, 0xfc, 0xfe, 0x8e, 0xd6, 0x72, + 0x55, 0xcd, 0x6c, 0xaa, 0xbb, 0x9a, 0xbb, 0x3b, 0x3d, 0x45, 0x08, 0x2c, 0xc6, 0xa7, 0x63, 0xca, + 0x31, 0x02, 0x78, 0x99, 0xc3, 0xd5, 0x28, 0x58, 0xc5, 0x6c, 0x5e, 0xd1, 0xdc, 0x5d, 0xb4, 0x00, + 0x47, 0x28, 0x15, 0xd7, 0x73, 0x0c, 0x73, 0x47, 0xd5, 0x77, 0xb1, 0x7e, 0x43, 0xed, 0x78, 0xdb, + 0x4f, 0x4f, 0x1f, 0x0f, 0x7f, 0x9f, 0xf6, 0xb0, 0x41, 0x61, 0xaa, 0x04, 0x64, 0xd3, 0xdb, 0x7e, + 0x1a, 0x35, 0xa0, 0x40, 0x26, 0xa3, 0x6d, 0xbc, 0x82, 0xd5, 0x6d, 0xcb, 0xa1, 0x36, 0xb4, 0xd8, + 0x47, 0x35, 0x85, 0x38, 0x38, 0xbf, 0xc6, 0x11, 0x56, 0xac, 0x26, 0x5e, 0x48, 0x35, 0xd6, 0x6b, + 0xb5, 0x25, 0x25, 0x2f, 0xa8, 0x5c, 0xb2, 0x1c, 0x22, 0x50, 0x3b, 0x96, 0xcf, 0xe0, 0x3c, 0x13, + 0xa8, 0x1d, 0x4b, 0xb0, 0xf7, 0x2c, 0x4c, 0xea, 0x3a, 0x1b, 0xb3, 0xa1, 0xab, 0x3c, 0x18, 0x73, + 0xa7, 0xa5, 0x08, 0xb3, 0x74, 0xfd, 0x32, 0x03, 0xe0, 0x32, 0xee, 0xa2, 0x0b, 0x70, 0x4f, 0xc0, + 0xac, 0x30, 0xe2, 0x44, 0xcf, 0x28, 0xbb, 0x51, 0xcf, 0xc2, 0xa4, 0xbd, 0xdf, 0x8b, 0x88, 0x22, + 0x5f, 0xb4, 0xf7, 0xbb, 0xd1, 0xce, 0xc3, 0x94, 0xbd, 0x6b, 0xf7, 0xe2, 0x9d, 0x0a, 0xe3, 0x21, + 0x7b, 0xd7, 0xee, 0x46, 0x7c, 0x90, 0x46, 0xe6, 0x0e, 0xd6, 0x35, 0x0f, 0x37, 0xa7, 0x8f, 0x86, + 0xc1, 0x43, 0x0d, 0x68, 0x1e, 0x24, 0x5d, 0x57, 0xb1, 0xa9, 0x6d, 0xb5, 0xb0, 0xaa, 0x39, 0xd8, + 0xd4, 0xdc, 0xe9, 0x59, 0x0a, 0x9c, 0xf4, 0x9c, 0x0e, 0x56, 0x8a, 0xba, 0x5e, 0xa3, 0x8d, 0x15, + 0xda, 0x86, 0x4e, 0xc1, 0x84, 0xb5, 0xf5, 0xb2, 0xce, 0x24, 0x52, 0xb5, 0x1d, 0xbc, 0x6d, 0xec, + 0x4d, 0xbf, 0x83, 0xb2, 0xb7, 0x44, 0x1a, 0xa8, 0x3c, 0xae, 0xd3, 0x6a, 0x74, 0x12, 0x24, 0xdd, + 0xdd, 0xd5, 0x1c, 0x9b, 0xaa, 0x64, 0xd7, 0xd6, 0x74, 0x3c, 0xfd, 0x20, 0x03, 0x65, 0xf5, 0xab, + 0xa2, 0x9a, 0xac, 0x08, 0xf7, 0x96, 0xb1, 0xed, 0x09, 0x8a, 0x0f, 0xb3, 0x15, 0x41, 0xeb, 0x38, + 0xb5, 0x13, 0x20, 0x11, 0x4e, 0x44, 0x3e, 0x7c, 0x82, 0x82, 0x15, 0xed, 0x5d, 0x3b, 0xfc, 0xdd, + 0x07, 0x60, 0x9c, 0x40, 0x06, 0x1f, 0x3d, 0xc9, 0x1c, 0x37, 0x7b, 0x37, 0xf4, 0xc5, 0xa7, 0xe0, + 0x08, 0x01, 0x6a, 0x63, 0x4f, 0x6b, 0x6a, 0x9e, 0x16, 0x82, 0x7e, 0x94, 0x42, 0x13, 0xb6, 0xaf, + 0xf0, 0xc6, 0x48, 0x3f, 0x9d, 0xce, 0xd6, 0xbe, 0x2f, 0x58, 0x8f, 0xb1, 0x7e, 0x92, 0x3a, 0x21, + 0x5a, 0x6f, 0x99, 0x73, 0x2e, 0x2f, 0x40, 0x21, 0x2c, 0xf7, 0x28, 0x07, 0x4c, 0xf2, 0xa5, 0x18, + 0x71, 0x82, 0xaa, 0x6b, 0x4b, 0xc4, 0x7d, 0x79, 0xa9, 0x26, 0xc5, 0x89, 0x1b, 0xb5, 0x5c, 0xdf, + 0xa8, 0xa9, 0xca, 0xe6, 0xea, 0x46, 0x7d, 0xa5, 0x26, 0x25, 0x42, 0x8e, 0xfd, 0xd5, 0x64, 0xf6, + 0x21, 0xe9, 0x61, 0xe2, 0x35, 0x14, 0xa3, 0x91, 0x1a, 0x7a, 0x27, 0x1c, 0x15, 0x69, 0x15, 0x17, + 0x7b, 0xea, 0x2d, 0xc3, 0xa1, 0x0b, 0xb2, 0xad, 0x31, 0xe3, 0xe8, 0xcb, 0xcf, 0x14, 0x87, 0x6a, + 0x60, 0xef, 0x79, 0xc3, 0x21, 0xcb, 0xad, 0xad, 0x79, 0x68, 0x19, 0x66, 0x4d, 0x4b, 0x75, 0x3d, + 0xcd, 0x6c, 0x6a, 0x4e, 0x53, 0x0d, 0x12, 0x5a, 0xaa, 0xa6, 0xeb, 0xd8, 0x75, 0x2d, 0x66, 0x08, + 0x7d, 0x2a, 0xf7, 0x9a, 0x56, 0x83, 0x03, 0x07, 0x16, 0xa2, 0xc2, 0x41, 0xbb, 0xc4, 0x37, 0x31, + 0x48, 0x7c, 0x8f, 0x43, 0xae, 0xad, 0xd9, 0x2a, 0x36, 0x3d, 0x67, 0x9f, 0xfa, 0xe7, 0x59, 0x25, + 0xdb, 0xd6, 0xec, 0x1a, 0x29, 0xbf, 0x2d, 0x61, 0xd2, 0xd5, 0x64, 0x36, 0x29, 0xa5, 0xae, 0x26, + 0xb3, 0x29, 0x29, 0x7d, 0x35, 0x99, 0x4d, 0x4b, 0x99, 0xab, 0xc9, 0x6c, 0x56, 0xca, 0x5d, 0x4d, + 0x66, 0x73, 0x12, 0xc8, 0x3f, 0x99, 0x84, 0x42, 0xd8, 0x83, 0x27, 0x01, 0x91, 0x4e, 0x6d, 0x58, + 0x8c, 0x6a, 0xb9, 0x07, 0x0e, 0xf4, 0xf7, 0xe7, 0xab, 0xc4, 0xb8, 0x2d, 0xa4, 0x99, 0xbb, 0xac, + 0x30, 0x4c, 0xe2, 0x58, 0x10, 0xf1, 0xc3, 0xcc, 0x3d, 0xc9, 0x2a, 0xbc, 0x84, 0x2e, 0x43, 0xfa, + 0x65, 0x97, 0xd2, 0x4e, 0x53, 0xda, 0xef, 0x38, 0x98, 0xf6, 0xd5, 0x06, 0x25, 0x9e, 0xbb, 0xda, + 0x50, 0x57, 0xd7, 0x94, 0x95, 0xca, 0xb2, 0xc2, 0xd1, 0xd1, 0x31, 0x48, 0xb6, 0xb4, 0x57, 0xf6, + 0xa3, 0x66, 0x90, 0x56, 0xa1, 0x79, 0x28, 0x75, 0xcc, 0x9b, 0xd8, 0x31, 0xb6, 0x0d, 0xdc, 0x54, + 0x29, 0x54, 0x29, 0x0c, 0x55, 0x0c, 0x5a, 0x97, 0x09, 0xfc, 0x88, 0xd3, 0x78, 0x0c, 0x92, 0xb7, + 0xb0, 0x76, 0x23, 0x6a, 0xac, 0x68, 0xd5, 0x5b, 0xb8, 0x9c, 0x4e, 0x43, 0x8a, 0xf2, 0x17, 0x01, + 0x70, 0x0e, 0x4b, 0x63, 0x28, 0x0b, 0xc9, 0xea, 0x9a, 0x42, 0x96, 0x94, 0x04, 0x05, 0x56, 0xab, + 0xae, 0xd7, 0x6b, 0xd5, 0x9a, 0x14, 0x97, 0xcf, 0x42, 0x9a, 0x31, 0x8d, 0x2c, 0x37, 0x9f, 0x6d, + 0xd2, 0x18, 0x2f, 0x72, 0x1a, 0x31, 0xd1, 0xba, 0xb9, 0xb2, 0x58, 0x53, 0xa4, 0x78, 0x8f, 0xb0, + 0xc8, 0x2e, 0x14, 0xc2, 0x9e, 0xfc, 0xdb, 0x13, 0xce, 0x7f, 0x29, 0x06, 0xf9, 0x90, 0x67, 0x4e, + 0x5c, 0x2a, 0xad, 0xd5, 0xb2, 0x6e, 0xa9, 0x5a, 0xcb, 0xd0, 0x5c, 0x2e, 0x4a, 0x40, 0xab, 0x2a, + 0xa4, 0x66, 0xd4, 0xa9, 0x7b, 0x9b, 0x16, 0x59, 0x4a, 0x4a, 0xcb, 0x1f, 0x8b, 0x81, 0xd4, 0xed, + 0x1a, 0x77, 0x75, 0x33, 0xf6, 0xc7, 0xd9, 0x4d, 0xf9, 0xa3, 0x31, 0x28, 0x46, 0xfd, 0xe1, 0xae, + 0xee, 0xdd, 0xff, 0xc7, 0xda, 0xbd, 0xdf, 0x8b, 0xc3, 0x78, 0xc4, 0x0b, 0x1e, 0xb5, 0x77, 0xef, + 0x87, 0x09, 0xa3, 0x89, 0xdb, 0xb6, 0xe5, 0x61, 0x53, 0xdf, 0x57, 0x5b, 0xf8, 0x26, 0x6e, 0x4d, + 0xcb, 0x54, 0xc9, 0x9c, 0x3e, 0xd8, 0xcf, 0x9e, 0xaf, 0x07, 0x78, 0xcb, 0x04, 0x6d, 0x61, 0xb2, + 0xbe, 0x54, 0x5b, 0x59, 0x5f, 0xdb, 0xa8, 0xad, 0x56, 0x5f, 0x54, 0x37, 0x57, 0xaf, 0xad, 0xae, + 0x3d, 0xbf, 0xaa, 0x48, 0x46, 0x17, 0xd8, 0x5b, 0xb8, 0xec, 0xd7, 0x41, 0xea, 0xee, 0x14, 0x3a, + 0x0a, 0xfd, 0xba, 0x25, 0x8d, 0xa1, 0x49, 0x28, 0xad, 0xae, 0xa9, 0x8d, 0xfa, 0x52, 0x4d, 0xad, + 0x5d, 0xba, 0x54, 0xab, 0x6e, 0x34, 0x58, 0xe6, 0xc4, 0x87, 0xde, 0x88, 0x2c, 0x70, 0xf9, 0x23, + 0x09, 0x98, 0xec, 0xd3, 0x13, 0x54, 0xe1, 0x31, 0x0f, 0x0b, 0xc3, 0x1e, 0x1b, 0xa5, 0xf7, 0xf3, + 0xc4, 0xeb, 0x58, 0xd7, 0x1c, 0x8f, 0x87, 0x48, 0x27, 0x81, 0x70, 0xc9, 0xf4, 0x88, 0x72, 0x75, + 0x78, 0x46, 0x8a, 0x05, 0x42, 0xa5, 0xa0, 0x9e, 0x25, 0xa5, 0x1e, 0x05, 0x64, 0x5b, 0xae, 0xe1, + 0x19, 0x37, 0xb1, 0x6a, 0x98, 0x22, 0x7d, 0x45, 0x02, 0xa3, 0xa4, 0x22, 0x89, 0x96, 0xba, 0xe9, + 0xf9, 0xd0, 0x26, 0xde, 0xd1, 0xba, 0xa0, 0x89, 0xf2, 0x4f, 0x28, 0x92, 0x68, 0xf1, 0xa1, 0xef, + 0x87, 0x42, 0xd3, 0xea, 0x10, 0x6f, 0x91, 0xc1, 0x11, 0x5b, 0x13, 0x53, 0xf2, 0xac, 0xce, 0x07, + 0xe1, 0x71, 0x40, 0x90, 0x37, 0x2b, 0x28, 0x79, 0x56, 0xc7, 0x40, 0x1e, 0x86, 0x92, 0xb6, 0xb3, + 0xe3, 0x10, 0xe2, 0x82, 0x10, 0x8b, 0x6c, 0x8a, 0x7e, 0x35, 0x05, 0x2c, 0x5f, 0x85, 0xac, 0xe0, + 0x03, 0x31, 0xf6, 0x84, 0x13, 0xaa, 0xcd, 0xc2, 0xf5, 0xf8, 0x89, 0x9c, 0x92, 0x35, 0x45, 0xe3, + 0xfd, 0x50, 0x30, 0x5c, 0x35, 0xd8, 0x06, 0x88, 0xcf, 0xc5, 0x4f, 0x64, 0x95, 0xbc, 0xe1, 0xfa, + 0x29, 0x54, 0xf9, 0x53, 0x71, 0x28, 0x46, 0xb7, 0x31, 0xd0, 0x12, 0x64, 0x5b, 0x96, 0xae, 0x51, + 0xd1, 0x62, 0x7b, 0x68, 0x27, 0x86, 0xec, 0x7c, 0xcc, 0x2f, 0x73, 0x78, 0xc5, 0xc7, 0x2c, 0xff, + 0xab, 0x18, 0x64, 0x45, 0x35, 0x3a, 0x02, 0x49, 0x5b, 0xf3, 0x76, 0x29, 0xb9, 0xd4, 0x62, 0x5c, + 0x8a, 0x29, 0xb4, 0x4c, 0xea, 0x5d, 0x5b, 0x33, 0xa9, 0x08, 0xf0, 0x7a, 0x52, 0x26, 0xf3, 0xda, + 0xc2, 0x5a, 0x93, 0x86, 0x4d, 0x56, 0xbb, 0x8d, 0x4d, 0xcf, 0x15, 0xf3, 0xca, 0xeb, 0xab, 0xbc, + 0x1a, 0x3d, 0x02, 0x13, 0x9e, 0xa3, 0x19, 0xad, 0x08, 0x6c, 0x92, 0xc2, 0x4a, 0xa2, 0xc1, 0x07, + 0x5e, 0x80, 0x63, 0x82, 0x6e, 0x13, 0x7b, 0x9a, 0xbe, 0x8b, 0x9b, 0x01, 0x52, 0x9a, 0xa6, 0x47, + 0x8e, 0x72, 0x80, 0x25, 0xde, 0x2e, 0x70, 0xe5, 0xdf, 0x88, 0xc1, 0x84, 0x08, 0xf4, 0x9a, 0x3e, + 0xb3, 0x56, 0x00, 0x34, 0xd3, 0xb4, 0xbc, 0x30, 0xbb, 0x7a, 0x45, 0xb9, 0x07, 0x6f, 0xbe, 0xe2, + 0x23, 0x29, 0x21, 0x02, 0xe5, 0x36, 0x40, 0xd0, 0x32, 0x90, 0x6d, 0xb3, 0x90, 0xe7, 0x7b, 0x54, + 0x74, 0xa3, 0x93, 0xa5, 0x06, 0x80, 0x55, 0x91, 0x88, 0x10, 0x4d, 0x41, 0x6a, 0x0b, 0xef, 0x18, + 0x26, 0xcf, 0x3c, 0xb3, 0x82, 0x48, 0xe0, 0x24, 0xfd, 0x04, 0xce, 0xe2, 0x9f, 0x86, 0x49, 0xdd, + 0x6a, 0x77, 0x77, 0x77, 0x51, 0xea, 0x4a, 0x4f, 0xb8, 0x57, 0x62, 0x2f, 0x3d, 0xc6, 0x81, 0x76, + 0xac, 0x96, 0x66, 0xee, 0xcc, 0x5b, 0xce, 0x4e, 0xb0, 0x51, 0x4b, 0x3c, 0x24, 0x37, 0xb4, 0x5d, + 0x6b, 0x6f, 0xfd, 0xaf, 0x58, 0xec, 0xe7, 0xe2, 0x89, 0xcb, 0xeb, 0x8b, 0x9f, 0x89, 0x97, 0x2f, + 0x33, 0xc4, 0x75, 0xc1, 0x0c, 0x05, 0x6f, 0xb7, 0xb0, 0x4e, 0x06, 0x08, 0xbf, 0xff, 0x08, 0x4c, + 0xed, 0x58, 0x3b, 0x16, 0xa5, 0x74, 0x9a, 0xfc, 0xe2, 0x3b, 0xbd, 0x39, 0xbf, 0xb6, 0x3c, 0x74, + 0x5b, 0x78, 0x61, 0x15, 0x26, 0x39, 0xb0, 0x4a, 0xb7, 0x9a, 0x58, 0x20, 0x84, 0x0e, 0xcc, 0xc2, + 0x4d, 0xff, 0xd2, 0xd7, 0xa9, 0xf9, 0x56, 0x26, 0x38, 0x2a, 0x69, 0x63, 0xb1, 0xd2, 0x82, 0x02, + 0xf7, 0x44, 0xe8, 0xb1, 0x45, 0x8a, 0x9d, 0x21, 0x14, 0xff, 0x29, 0xa7, 0x38, 0x19, 0xa2, 0xd8, + 0xe0, 0xa8, 0x0b, 0x55, 0x18, 0x3f, 0x0c, 0xad, 0x7f, 0xc6, 0x69, 0x15, 0x70, 0x98, 0xc8, 0x65, + 0x28, 0x51, 0x22, 0x7a, 0xc7, 0xf5, 0xac, 0x36, 0xd5, 0x80, 0x07, 0x93, 0xf9, 0xe7, 0x5f, 0x67, + 0xab, 0xa6, 0x48, 0xd0, 0xaa, 0x3e, 0xd6, 0xc2, 0x02, 0xd0, 0xdd, 0xb5, 0x26, 0xd6, 0x5b, 0x43, + 0x28, 0x7c, 0x99, 0x77, 0xc4, 0x87, 0x5f, 0xb8, 0x0e, 0x53, 0xe4, 0x37, 0x55, 0x50, 0xe1, 0x9e, + 0x0c, 0x4f, 0xd9, 0x4d, 0xff, 0xc6, 0x6b, 0x6c, 0x61, 0x4e, 0xfa, 0x04, 0x42, 0x7d, 0x0a, 0xcd, + 0xe2, 0x0e, 0xf6, 0x3c, 0xec, 0xb8, 0xaa, 0xd6, 0xea, 0xd7, 0xbd, 0x50, 0xce, 0x63, 0xfa, 0x67, + 0xbe, 0x15, 0x9d, 0xc5, 0xcb, 0x0c, 0xb3, 0xd2, 0x6a, 0x2d, 0x6c, 0xc2, 0xd1, 0x3e, 0x52, 0x31, + 0x02, 0xcd, 0x8f, 0x70, 0x9a, 0x53, 0x3d, 0x92, 0x41, 0xc8, 0xae, 0x83, 0xa8, 0xf7, 0xe7, 0x72, + 0x04, 0x9a, 0x3f, 0xcb, 0x69, 0x22, 0x8e, 0x2b, 0xa6, 0x94, 0x50, 0xbc, 0x0a, 0x13, 0x37, 0xb1, + 0xb3, 0x65, 0xb9, 0x3c, 0xcf, 0x34, 0x02, 0xb9, 0x8f, 0x72, 0x72, 0x25, 0x8e, 0x48, 0x13, 0x4f, + 0x84, 0xd6, 0x05, 0xc8, 0x6e, 0x6b, 0x3a, 0x1e, 0x81, 0xc4, 0x1d, 0x4e, 0x22, 0x43, 0xe0, 0x09, + 0x6a, 0x05, 0x0a, 0x3b, 0x16, 0xb7, 0x51, 0xc3, 0xd1, 0x3f, 0xc6, 0xd1, 0xf3, 0x02, 0x87, 0x93, + 0xb0, 0x2d, 0xbb, 0xd3, 0x22, 0x06, 0x6c, 0x38, 0x89, 0xbf, 0x26, 0x48, 0x08, 0x1c, 0x4e, 0xe2, + 0x10, 0x6c, 0xfd, 0xb8, 0x20, 0xe1, 0x86, 0xf8, 0xf9, 0x2c, 0xe4, 0x2d, 0xb3, 0xb5, 0x6f, 0x99, + 0xa3, 0x74, 0xe2, 0x13, 0x9c, 0x02, 0x70, 0x14, 0x42, 0xe0, 0x22, 0xe4, 0x46, 0x9d, 0x88, 0x5f, + 0xf8, 0x96, 0x58, 0x1e, 0x62, 0x06, 0x2e, 0x43, 0x49, 0x28, 0x28, 0xc3, 0x32, 0x47, 0x20, 0xf1, + 0xd7, 0x39, 0x89, 0x62, 0x08, 0x8d, 0x0f, 0xc3, 0xc3, 0xae, 0xb7, 0x83, 0x47, 0x21, 0xf2, 0x29, + 0x31, 0x0c, 0x8e, 0xc2, 0x59, 0xb9, 0x85, 0x4d, 0x7d, 0x77, 0x34, 0x0a, 0x9f, 0x16, 0xac, 0x14, + 0x38, 0x84, 0x44, 0x15, 0xc6, 0xdb, 0x9a, 0xe3, 0xee, 0x6a, 0xad, 0x91, 0xa6, 0xe3, 0x17, 0x39, + 0x8d, 0x82, 0x8f, 0xc4, 0x39, 0xd2, 0x31, 0x0f, 0x43, 0xe6, 0x33, 0x82, 0x23, 0x21, 0x34, 0xbe, + 0xf4, 0x5c, 0x8f, 0x26, 0xe5, 0x0e, 0x43, 0xed, 0x6f, 0x88, 0xa5, 0xc7, 0x70, 0x57, 0xc2, 0x14, + 0x2f, 0x42, 0xce, 0x35, 0x5e, 0x19, 0x89, 0xcc, 0x67, 0xc5, 0x4c, 0x53, 0x04, 0x82, 0xfc, 0x22, + 0x1c, 0xeb, 0x6b, 0x26, 0x46, 0x20, 0xf6, 0x37, 0x39, 0xb1, 0x23, 0x7d, 0x4c, 0x05, 0x57, 0x09, + 0x87, 0x25, 0xf9, 0xb7, 0x84, 0x4a, 0xc0, 0x5d, 0xb4, 0xd6, 0x49, 0xd4, 0xe0, 0x6a, 0xdb, 0x87, + 0xe3, 0xda, 0xdf, 0x16, 0x5c, 0x63, 0xb8, 0x11, 0xae, 0x6d, 0xc0, 0x11, 0x4e, 0xf1, 0x70, 0xf3, + 0xfa, 0x77, 0x84, 0x62, 0x65, 0xd8, 0x9b, 0xd1, 0xd9, 0xfd, 0x21, 0x28, 0xfb, 0xec, 0x14, 0xee, + 0xa9, 0xab, 0xb6, 0x35, 0x7b, 0x04, 0xca, 0xbf, 0xc4, 0x29, 0x0b, 0x8d, 0xef, 0xfb, 0xb7, 0xee, + 0x8a, 0x66, 0x13, 0xe2, 0x2f, 0xc0, 0xb4, 0x20, 0xde, 0x31, 0x1d, 0xac, 0x5b, 0x3b, 0xa6, 0xf1, + 0x0a, 0x6e, 0x8e, 0x40, 0xfa, 0x97, 0xbb, 0xa6, 0x6a, 0x33, 0x84, 0x4e, 0x28, 0xd7, 0x41, 0xf2, + 0x7d, 0x15, 0xd5, 0x68, 0xdb, 0x96, 0xe3, 0x0d, 0xa1, 0xf8, 0x39, 0x31, 0x53, 0x3e, 0x5e, 0x9d, + 0xa2, 0x2d, 0xd4, 0x80, 0xed, 0x54, 0x8f, 0x2a, 0x92, 0x9f, 0xe7, 0x84, 0xc6, 0x03, 0x2c, 0xae, + 0x38, 0x74, 0xab, 0x6d, 0x6b, 0xce, 0x28, 0xfa, 0xef, 0xef, 0x0a, 0xc5, 0xc1, 0x51, 0xb8, 0xe2, + 0x20, 0x1e, 0x1d, 0xb1, 0xf6, 0x23, 0x50, 0xf8, 0x82, 0x50, 0x1c, 0x02, 0x87, 0x93, 0x10, 0x0e, + 0xc3, 0x08, 0x24, 0xfe, 0x9e, 0x20, 0x21, 0x70, 0x08, 0x89, 0xe7, 0x02, 0x43, 0xeb, 0xe0, 0x1d, + 0xc3, 0xf5, 0x1c, 0xe6, 0x14, 0x1f, 0x4c, 0xea, 0x8b, 0xdf, 0x8a, 0x3a, 0x61, 0x4a, 0x08, 0x95, + 0x68, 0x22, 0x9e, 0xa6, 0xa5, 0x31, 0xd3, 0xf0, 0x8e, 0xfd, 0x8a, 0xd0, 0x44, 0x21, 0x34, 0xd2, + 0xb7, 0x90, 0x87, 0x48, 0xd8, 0xae, 0x93, 0x48, 0x61, 0x04, 0x72, 0xbf, 0xda, 0xd5, 0xb9, 0x86, + 0xc0, 0x25, 0x34, 0x43, 0xfe, 0x4f, 0xc7, 0xbc, 0x81, 0xf7, 0x47, 0x92, 0xce, 0x5f, 0xeb, 0xf2, + 0x7f, 0x36, 0x19, 0x26, 0xd3, 0x21, 0xa5, 0x2e, 0x7f, 0x0a, 0x0d, 0x3b, 0x97, 0x34, 0xfd, 0xa3, + 0xdf, 0xe1, 0xe3, 0x8d, 0xba, 0x53, 0x0b, 0xcb, 0x44, 0xc8, 0xa3, 0x4e, 0xcf, 0x70, 0x62, 0xaf, + 0x7d, 0xc7, 0x97, 0xf3, 0x88, 0xcf, 0xb3, 0x70, 0x09, 0xc6, 0x23, 0x0e, 0xcf, 0x70, 0x52, 0x7f, + 0x96, 0x93, 0x2a, 0x84, 0xfd, 0x9d, 0x85, 0xb3, 0x90, 0x24, 0xce, 0xcb, 0x70, 0xf4, 0x1f, 0xe3, + 0xe8, 0x14, 0x7c, 0xe1, 0x19, 0xc8, 0x0a, 0xa7, 0x65, 0x38, 0xea, 0x9f, 0xe3, 0xa8, 0x3e, 0x0a, + 0x41, 0x17, 0x0e, 0xcb, 0x70, 0xf4, 0x3f, 0x2f, 0xd0, 0x05, 0x0a, 0x41, 0x1f, 0x9d, 0x85, 0x5f, + 0xfa, 0x0b, 0x49, 0x6e, 0x74, 0x04, 0xef, 0x2e, 0x42, 0x86, 0x7b, 0x2a, 0xc3, 0xb1, 0x3f, 0xc8, + 0x3f, 0x2e, 0x30, 0x16, 0xce, 0x43, 0x6a, 0x44, 0x86, 0xff, 0x25, 0x8e, 0xca, 0xe0, 0x17, 0xaa, + 0x90, 0x0f, 0x79, 0x27, 0xc3, 0xd1, 0x7f, 0x9c, 0xa3, 0x87, 0xb1, 0x48, 0xd7, 0xb9, 0x77, 0x32, + 0x9c, 0xc0, 0x5f, 0x16, 0x5d, 0xe7, 0x18, 0x84, 0x6d, 0xc2, 0x31, 0x19, 0x8e, 0xfd, 0x21, 0xc1, + 0x75, 0x81, 0xb2, 0xf0, 0x2c, 0xe4, 0x7c, 0x63, 0x33, 0x1c, 0xff, 0x27, 0x38, 0x7e, 0x80, 0x43, + 0x38, 0x10, 0x32, 0x76, 0xc3, 0x49, 0xfc, 0xa4, 0xe0, 0x40, 0x08, 0x8b, 0x2c, 0xa3, 0x6e, 0x07, + 0x66, 0x38, 0xa5, 0x9f, 0x12, 0xcb, 0xa8, 0xcb, 0x7f, 0x21, 0xb3, 0x49, 0x75, 0xfe, 0x70, 0x12, + 0x7f, 0x45, 0xcc, 0x26, 0x85, 0x27, 0xdd, 0xe8, 0xf6, 0x08, 0x86, 0xd3, 0xf8, 0x69, 0xd1, 0x8d, + 0x2e, 0x87, 0x60, 0x61, 0x1d, 0x50, 0xaf, 0x37, 0x30, 0x9c, 0xde, 0x87, 0x39, 0xbd, 0x89, 0x1e, + 0x67, 0x60, 0xe1, 0x79, 0x38, 0xd2, 0xdf, 0x13, 0x18, 0x4e, 0xf5, 0x67, 0xbe, 0xd3, 0x15, 0xbb, + 0x85, 0x1d, 0x81, 0x85, 0x8d, 0xc0, 0xa4, 0x84, 0xbd, 0x80, 0xe1, 0x64, 0x3f, 0xf2, 0x9d, 0xa8, + 0xe2, 0x0e, 0x3b, 0x01, 0x0b, 0x15, 0x80, 0xc0, 0x00, 0x0f, 0xa7, 0xf5, 0x51, 0x4e, 0x2b, 0x84, + 0x44, 0x96, 0x06, 0xb7, 0xbf, 0xc3, 0xf1, 0xef, 0x88, 0xa5, 0xc1, 0x31, 0xc8, 0xd2, 0x10, 0xa6, + 0x77, 0x38, 0xf6, 0xc7, 0xc4, 0xd2, 0x10, 0x28, 0x44, 0xb2, 0x43, 0xd6, 0x6d, 0x38, 0x85, 0x4f, + 0x08, 0xc9, 0x0e, 0x61, 0x2d, 0xac, 0xc2, 0x44, 0x8f, 0x41, 0x1c, 0x4e, 0xea, 0xe7, 0x38, 0x29, + 0xa9, 0xdb, 0x1e, 0x86, 0x8d, 0x17, 0x37, 0x86, 0xc3, 0xa9, 0x7d, 0xb2, 0xcb, 0x78, 0x71, 0x5b, + 0xb8, 0x70, 0x11, 0xb2, 0x66, 0xa7, 0xd5, 0x22, 0x8b, 0x07, 0x1d, 0x7c, 0x96, 0x70, 0xfa, 0xbf, + 0x7c, 0x97, 0x73, 0x47, 0x20, 0x2c, 0x9c, 0x85, 0x14, 0x6e, 0x6f, 0xe1, 0xe6, 0x30, 0xcc, 0x6f, + 0x7e, 0x57, 0x28, 0x4c, 0x02, 0xbd, 0xf0, 0x2c, 0x00, 0x4b, 0x8d, 0xd0, 0xcd, 0xc3, 0x21, 0xb8, + 0xff, 0xf5, 0xbb, 0xfc, 0xf0, 0x4e, 0x80, 0x12, 0x10, 0x60, 0x47, 0x81, 0x0e, 0x26, 0xf0, 0xad, + 0x28, 0x01, 0x3a, 0x23, 0x17, 0x20, 0xf3, 0xb2, 0x6b, 0x99, 0x9e, 0xb6, 0x33, 0x0c, 0xfb, 0xf7, + 0x39, 0xb6, 0x80, 0x27, 0x0c, 0x6b, 0x5b, 0x0e, 0xf6, 0xb4, 0x1d, 0x77, 0x18, 0xee, 0x7f, 0xe3, + 0xb8, 0x3e, 0x02, 0x41, 0xd6, 0x35, 0xd7, 0x1b, 0x65, 0xdc, 0x7f, 0x20, 0x90, 0x05, 0x02, 0xe9, + 0x34, 0xf9, 0x7d, 0x03, 0xef, 0x0f, 0xc3, 0xfd, 0x43, 0xd1, 0x69, 0x0e, 0xbf, 0xf0, 0x0c, 0xe4, + 0xc8, 0x4f, 0x76, 0x22, 0x6f, 0x08, 0xf2, 0x7f, 0xe7, 0xc8, 0x01, 0x06, 0xf9, 0xb2, 0xeb, 0x35, + 0x3d, 0x63, 0x38, 0xb3, 0xbf, 0xcd, 0x67, 0x5a, 0xc0, 0x2f, 0x54, 0x20, 0xef, 0x7a, 0xcd, 0x66, + 0x87, 0xfb, 0xa7, 0x43, 0xd0, 0xff, 0xe8, 0xbb, 0x7e, 0xca, 0xc2, 0xc7, 0x21, 0xb3, 0x7d, 0xeb, + 0x86, 0x67, 0x5b, 0x74, 0xc3, 0x63, 0x18, 0x85, 0xef, 0x70, 0x0a, 0x21, 0x94, 0x85, 0x2a, 0x14, + 0xc8, 0x58, 0x1c, 0x6c, 0x63, 0xba, 0x3b, 0x35, 0x84, 0xc4, 0xff, 0xe0, 0x0c, 0x88, 0x20, 0x2d, + 0xbe, 0xef, 0xcb, 0x6f, 0xcc, 0xc4, 0xbe, 0xfa, 0xc6, 0x4c, 0xec, 0xf7, 0xde, 0x98, 0x89, 0x7d, + 0xe8, 0x6b, 0x33, 0x63, 0x5f, 0xfd, 0xda, 0xcc, 0xd8, 0x6f, 0x7f, 0x6d, 0x66, 0xac, 0x7f, 0x96, + 0x18, 0x2e, 0x5b, 0x97, 0x2d, 0x96, 0x1f, 0x7e, 0xe9, 0xc1, 0x1d, 0xc3, 0xdb, 0xed, 0x6c, 0xcd, + 0xeb, 0x56, 0xfb, 0xb4, 0x6e, 0xb9, 0x6d, 0xcb, 0x3d, 0x1d, 0xcd, 0xeb, 0xd2, 0x5f, 0xf0, 0xbd, + 0x18, 0x89, 0x99, 0xa3, 0xe9, 0x5c, 0xcd, 0xdc, 0x1f, 0x74, 0xbd, 0xe7, 0x1c, 0x24, 0x2a, 0xe6, + 0x3e, 0x3a, 0xc6, 0x14, 0x9c, 0xda, 0x71, 0x5a, 0xfc, 0x58, 0x58, 0x86, 0x94, 0x37, 0x9d, 0x16, + 0x9a, 0x0a, 0xce, 0x6e, 0xc6, 0x4e, 0x14, 0xf8, 0x81, 0xcc, 0xc5, 0x1f, 0x8f, 0x1d, 0x6e, 0x24, + 0xd9, 0x8a, 0xb9, 0x4f, 0x07, 0xb2, 0x1e, 0x7b, 0xe9, 0xd1, 0xa1, 0x79, 0xee, 0x1b, 0xa6, 0x75, + 0xcb, 0x24, 0xdd, 0xb6, 0xb7, 0x44, 0x8e, 0x7b, 0xa6, 0x3b, 0xc7, 0xfd, 0x3c, 0x6e, 0xb5, 0xae, + 0x11, 0xb8, 0x0d, 0x82, 0xb2, 0x95, 0x66, 0x27, 0x90, 0xe1, 0xa7, 0xe2, 0x30, 0xd3, 0x93, 0xce, + 0xe6, 0x42, 0x30, 0x88, 0x09, 0x0b, 0x90, 0x5d, 0x12, 0xb2, 0x35, 0x0d, 0x19, 0x17, 0xeb, 0x96, + 0xd9, 0x74, 0x29, 0x23, 0x12, 0x8a, 0x28, 0x12, 0x46, 0x98, 0x9a, 0x69, 0xb9, 0xfc, 0x60, 0x25, + 0x2b, 0x2c, 0xfe, 0xec, 0x21, 0x19, 0x31, 0x2e, 0xbe, 0x24, 0xb8, 0xf1, 0xc4, 0x88, 0xdc, 0x10, + 0x83, 0x88, 0x64, 0xfe, 0x47, 0xe5, 0xca, 0x4f, 0xc7, 0x61, 0xb6, 0x9b, 0x2b, 0x64, 0x65, 0xb9, + 0x9e, 0xd6, 0xb6, 0x07, 0xb1, 0xe5, 0x22, 0xe4, 0x36, 0x04, 0xcc, 0xa1, 0xf9, 0x72, 0xe7, 0x90, + 0x7c, 0x29, 0xfa, 0x9f, 0x12, 0x8c, 0x39, 0x33, 0x22, 0x63, 0xfc, 0x71, 0xdc, 0x15, 0x67, 0xfe, + 0x77, 0x1a, 0x8e, 0xb1, 0xe5, 0xa4, 0xb2, 0xa5, 0xc4, 0x0a, 0x9c, 0x27, 0x85, 0x70, 0xd3, 0xf0, + 0x7d, 0x12, 0xf9, 0x1a, 0x4c, 0xd6, 0x89, 0xb6, 0x20, 0x51, 0x50, 0xb0, 0xc3, 0xd3, 0xf7, 0xec, + 0xe9, 0x5c, 0xc4, 0xe1, 0xe7, 0x3b, 0x4c, 0xe1, 0x2a, 0xf9, 0x47, 0x63, 0x20, 0x35, 0x74, 0xad, + 0xa5, 0x39, 0xdf, 0x2f, 0x29, 0x74, 0x1e, 0x80, 0xde, 0x59, 0x0a, 0x2e, 0x19, 0x15, 0xcf, 0x4c, + 0xcf, 0x87, 0x07, 0x37, 0xcf, 0xbe, 0x44, 0x6f, 0x30, 0xe4, 0x28, 0x2c, 0xf9, 0x79, 0xea, 0x05, + 0x80, 0xa0, 0x01, 0x1d, 0x87, 0xa3, 0x8d, 0x6a, 0x65, 0xb9, 0xa2, 0xa8, 0xec, 0x30, 0xfc, 0x6a, + 0x63, 0xbd, 0x56, 0xad, 0x5f, 0xaa, 0xd7, 0x96, 0xa4, 0x31, 0x74, 0x04, 0x50, 0xb8, 0xd1, 0x3f, + 0x97, 0x72, 0x0f, 0x4c, 0x84, 0xeb, 0xd9, 0x89, 0xfa, 0x38, 0xf1, 0x14, 0x8d, 0xb6, 0xdd, 0xc2, + 0x74, 0xeb, 0x4f, 0x35, 0x04, 0xd7, 0x86, 0x3b, 0x21, 0xff, 0xe2, 0xdf, 0xb2, 0x53, 0xd6, 0x93, + 0x01, 0xba, 0xcf, 0xf3, 0x85, 0x65, 0x98, 0xd0, 0x74, 0x1d, 0xdb, 0x11, 0x92, 0x43, 0x54, 0x35, + 0x21, 0x48, 0x37, 0x33, 0x39, 0x66, 0x40, 0xed, 0x3c, 0xa4, 0x5d, 0x3a, 0xfa, 0x61, 0x24, 0xbe, + 0xc2, 0x49, 0x70, 0xf0, 0x05, 0x13, 0x26, 0x88, 0xe7, 0xa7, 0x39, 0x38, 0xd4, 0x8d, 0x83, 0xf3, + 0x0c, 0xff, 0xe0, 0x73, 0x8f, 0xd3, 0xad, 0xcd, 0xfb, 0xa3, 0xd3, 0xd2, 0x47, 0x9c, 0x14, 0x89, + 0xd3, 0x0e, 0x3a, 0x8a, 0xa1, 0x28, 0xbe, 0xc7, 0x3b, 0x7c, 0xf0, 0xc7, 0x7e, 0x9d, 0x7f, 0x6c, + 0xa6, 0x9f, 0x0c, 0x84, 0xbe, 0x34, 0xce, 0xa9, 0xb2, 0x86, 0xc5, 0xda, 0xa0, 0x35, 0xfd, 0xd2, + 0x23, 0xbd, 0xd6, 0x89, 0xfd, 0x79, 0x8c, 0x52, 0xbe, 0x18, 0xfe, 0x8c, 0xbf, 0xf6, 0x7e, 0x2b, + 0x01, 0x33, 0x1c, 0x78, 0x4b, 0x73, 0xf1, 0xe9, 0x9b, 0x4f, 0x6c, 0x61, 0x4f, 0x7b, 0xe2, 0xb4, + 0x6e, 0x19, 0x42, 0x57, 0x4f, 0xf2, 0xe5, 0x48, 0xda, 0xe7, 0x79, 0x7b, 0xb9, 0xef, 0x86, 0x66, + 0x79, 0xf0, 0x32, 0x96, 0x37, 0x21, 0x59, 0xb5, 0x0c, 0x93, 0xa8, 0xaa, 0x26, 0x36, 0xad, 0x36, + 0x5f, 0x3d, 0xac, 0x80, 0x9e, 0x80, 0xb4, 0xd6, 0xb6, 0x3a, 0xa6, 0xc7, 0x56, 0xce, 0xe2, 0xb1, + 0x2f, 0xbf, 0x3e, 0x3b, 0xf6, 0xef, 0x5f, 0x9f, 0x4d, 0xd4, 0x4d, 0xef, 0x37, 0x3f, 0xff, 0x18, + 0x70, 0x52, 0x75, 0xd3, 0x53, 0x38, 0xe0, 0x42, 0xf2, 0x1b, 0x1f, 0x9f, 0x8d, 0xc9, 0x2f, 0x40, + 0x66, 0x09, 0xeb, 0x77, 0x43, 0x79, 0x09, 0xeb, 0x21, 0xca, 0x4b, 0x58, 0xef, 0xa2, 0x7c, 0x1e, + 0xb2, 0x75, 0xd3, 0x63, 0x07, 0xd7, 0x1f, 0x81, 0x84, 0x61, 0xb2, 0xb3, 0x90, 0x07, 0xf6, 0x8d, + 0x40, 0x11, 0xc4, 0x25, 0xac, 0xfb, 0x88, 0x4d, 0xac, 0x77, 0x23, 0xf6, 0x7e, 0x9a, 0x40, 0x2d, + 0x2e, 0xfd, 0xf6, 0x7f, 0x9c, 0x19, 0x7b, 0xf5, 0x8d, 0x99, 0xb1, 0x81, 0x53, 0x2c, 0x0f, 0x9c, + 0x62, 0xb7, 0x79, 0x83, 0x69, 0x64, 0x7f, 0x66, 0x3f, 0x93, 0x84, 0xfb, 0xe8, 0x7d, 0x26, 0xa7, + 0x6d, 0x98, 0xde, 0x69, 0xdd, 0xd9, 0xb7, 0x3d, 0x8b, 0xe8, 0x4d, 0x6b, 0x9b, 0x4f, 0xec, 0x44, + 0xd0, 0x3c, 0xcf, 0x9a, 0xfb, 0x4f, 0xab, 0xbc, 0x0d, 0xa9, 0x75, 0x82, 0x47, 0x58, 0xec, 0x59, + 0x9e, 0xd6, 0xe2, 0xf6, 0x87, 0x15, 0x48, 0x2d, 0xbb, 0x03, 0x15, 0x67, 0xb5, 0x86, 0xb8, 0xfe, + 0xd4, 0xc2, 0xda, 0x36, 0x3b, 0x4a, 0x9e, 0xa0, 0x8e, 0x4b, 0x96, 0x54, 0xd0, 0x53, 0xe3, 0x53, + 0x90, 0xd2, 0x3a, 0xec, 0x0c, 0x43, 0x82, 0x78, 0x34, 0xb4, 0x20, 0x5f, 0x83, 0x0c, 0xdf, 0x49, + 0x45, 0x12, 0x24, 0x6e, 0xe0, 0x7d, 0xfa, 0x9d, 0x82, 0x42, 0x7e, 0xa2, 0x79, 0x48, 0xd1, 0xce, + 0xf3, 0x3b, 0x32, 0xd3, 0xf3, 0x3d, 0xbd, 0x9f, 0xa7, 0x9d, 0x54, 0x18, 0x98, 0x7c, 0x15, 0xb2, + 0x4b, 0x56, 0xdb, 0x30, 0xad, 0x28, 0xb5, 0x1c, 0xa3, 0x46, 0xfb, 0x6c, 0x77, 0xb8, 0x54, 0x28, + 0xac, 0x80, 0x8e, 0x40, 0x9a, 0x5d, 0x2d, 0xe0, 0xe7, 0x30, 0x78, 0x49, 0xae, 0x42, 0x86, 0xd2, + 0x5e, 0xb3, 0x89, 0xf2, 0xf7, 0x4f, 0x71, 0xe6, 0xf8, 0x45, 0x33, 0x4e, 0x3e, 0x1e, 0x74, 0x16, + 0x41, 0xb2, 0xa9, 0x79, 0x1a, 0x1f, 0x37, 0xfd, 0x2d, 0xbf, 0x0b, 0xb2, 0x9c, 0x88, 0x8b, 0xce, + 0x40, 0xc2, 0xb2, 0x5d, 0x7e, 0x92, 0xa2, 0x3c, 0x68, 0x28, 0x6b, 0xf6, 0x62, 0x92, 0xc8, 0x8c, + 0x42, 0x80, 0x17, 0x95, 0x81, 0x62, 0xf1, 0x74, 0x48, 0x2c, 0x42, 0x53, 0x1e, 0xfa, 0xc9, 0xa6, + 0xb4, 0x47, 0x1c, 0x7c, 0x61, 0xf9, 0x44, 0x1c, 0x66, 0x42, 0xad, 0x37, 0xb1, 0xe3, 0x1a, 0x96, + 0xc9, 0x24, 0x8a, 0x4b, 0x0b, 0x0a, 0x75, 0x92, 0xb7, 0x0f, 0x10, 0x97, 0x67, 0x20, 0x51, 0xb1, + 0x6d, 0x54, 0x86, 0x2c, 0x2d, 0xeb, 0x16, 0x93, 0x97, 0xa4, 0xe2, 0x97, 0x49, 0x9b, 0x6b, 0x6d, + 0x7b, 0xb7, 0x34, 0xc7, 0xbf, 0x7d, 0x27, 0xca, 0xf2, 0x05, 0xc8, 0x55, 0x2d, 0xd3, 0xc5, 0xa6, + 0xdb, 0xa1, 0x9e, 0xcd, 0x56, 0xcb, 0xd2, 0x6f, 0x70, 0x0a, 0xac, 0x40, 0x18, 0xae, 0xd9, 0x36, + 0xc5, 0x4c, 0x2a, 0xe4, 0x27, 0x5b, 0xb3, 0x8b, 0x8d, 0x81, 0x2c, 0xba, 0x70, 0x78, 0x16, 0xf1, + 0x41, 0xfa, 0x3c, 0xfa, 0x5e, 0x0c, 0xee, 0xed, 0x5d, 0x50, 0x37, 0xf0, 0xbe, 0x7b, 0xd8, 0xf5, + 0xf4, 0x02, 0xe4, 0xd6, 0xe9, 0x15, 0xf8, 0x6b, 0x78, 0x1f, 0x95, 0x21, 0x83, 0x9b, 0x67, 0xce, + 0x9e, 0x7d, 0xe2, 0x02, 0x93, 0xf6, 0x2b, 0x63, 0x8a, 0xa8, 0x40, 0x33, 0x90, 0x73, 0xb1, 0x6e, + 0x9f, 0x39, 0x7b, 0xee, 0xc6, 0x13, 0x4c, 0xbc, 0xae, 0x8c, 0x29, 0x41, 0xd5, 0x42, 0x96, 0x8c, + 0xfa, 0x1b, 0x9f, 0x98, 0x8d, 0x2d, 0xa6, 0x20, 0xe1, 0x76, 0xda, 0x6f, 0xa9, 0x8c, 0x7c, 0x24, + 0x05, 0x73, 0x61, 0x4c, 0xea, 0xff, 0xdd, 0xd4, 0x5a, 0x46, 0x53, 0x0b, 0x1e, 0x2f, 0x90, 0x42, + 0x3c, 0xa0, 0x10, 0x03, 0x2c, 0xc5, 0x81, 0x9c, 0x94, 0x7f, 0x39, 0x06, 0x85, 0xeb, 0x82, 0x72, + 0x03, 0x7b, 0xe8, 0x22, 0x80, 0xff, 0x25, 0xb1, 0x6c, 0x8e, 0xcf, 0x77, 0x7f, 0x6b, 0xde, 0xc7, + 0x51, 0x42, 0xe0, 0xe8, 0x3c, 0x15, 0x44, 0xdb, 0x72, 0xf9, 0x8d, 0xac, 0x21, 0xa8, 0x3e, 0x30, + 0x7a, 0x14, 0x10, 0xd5, 0x70, 0xea, 0x4d, 0xcb, 0x33, 0xcc, 0x1d, 0xd5, 0xb6, 0x6e, 0xf1, 0x7b, + 0xae, 0x09, 0x45, 0xa2, 0x2d, 0xd7, 0x69, 0xc3, 0x3a, 0xa9, 0x27, 0x9d, 0xce, 0xf9, 0x54, 0x88, + 0xb3, 0xae, 0x35, 0x9b, 0x0e, 0x76, 0x5d, 0xae, 0xc4, 0x44, 0x11, 0x5d, 0x84, 0x8c, 0xdd, 0xd9, + 0x52, 0x85, 0xc6, 0xc8, 0x9f, 0xb9, 0xb7, 0xdf, 0xfa, 0x17, 0xf2, 0xc1, 0x35, 0x40, 0xda, 0xee, + 0x6c, 0x11, 0x69, 0xb9, 0x1f, 0x0a, 0x7d, 0x3a, 0x93, 0xbf, 0x19, 0xf4, 0x83, 0xbe, 0xbc, 0xc0, + 0x47, 0xa0, 0xda, 0x8e, 0x61, 0x39, 0x86, 0xb7, 0x4f, 0x8f, 0x43, 0x25, 0x14, 0x49, 0x34, 0xac, + 0xf3, 0x7a, 0xf9, 0x06, 0x94, 0x1a, 0xd4, 0x89, 0x0b, 0x7a, 0x7e, 0x36, 0xe8, 0x5f, 0x6c, 0x78, + 0xff, 0x06, 0xf6, 0x2c, 0xde, 0xd3, 0xb3, 0xc5, 0xe7, 0x06, 0x4a, 0xe7, 0xf9, 0xc3, 0x4b, 0x67, + 0xd4, 0xda, 0xfd, 0xc1, 0xb1, 0xc8, 0xe2, 0x64, 0xc2, 0x19, 0x56, 0x5f, 0xa3, 0x0a, 0xe6, 0xb0, + 0x18, 0xad, 0x7c, 0xb0, 0x51, 0x2d, 0x0f, 0x51, 0xa3, 0xe5, 0xa1, 0x4b, 0x48, 0xbe, 0x00, 0xe3, + 0xeb, 0x9a, 0xe3, 0x35, 0xb0, 0x77, 0x05, 0x6b, 0x4d, 0xec, 0x44, 0xad, 0xee, 0xb8, 0xb0, 0xba, + 0x08, 0x92, 0xd4, 0xb4, 0x32, 0xab, 0x43, 0x7f, 0xcb, 0xbb, 0x90, 0xa4, 0x47, 0x22, 0x7d, 0x8b, + 0xcc, 0x31, 0x98, 0x45, 0x26, 0xba, 0x74, 0xdf, 0xc3, 0xae, 0x48, 0x23, 0xd0, 0x02, 0x7a, 0x4a, + 0xd8, 0xd5, 0xc4, 0xc1, 0x76, 0x95, 0x0b, 0x22, 0xb7, 0xae, 0x2d, 0xc8, 0x2c, 0x12, 0x55, 0x5c, + 0x5f, 0xf2, 0x3b, 0x12, 0x0b, 0x3a, 0x82, 0x56, 0xa0, 0x64, 0x6b, 0x8e, 0x47, 0x6f, 0x93, 0xec, + 0xd2, 0x51, 0x70, 0x59, 0x9f, 0xed, 0x5d, 0x79, 0x91, 0xc1, 0xf2, 0xaf, 0x8c, 0xdb, 0xe1, 0x4a, + 0xf9, 0x3f, 0x25, 0x21, 0xcd, 0x99, 0xf1, 0x0c, 0x64, 0x38, 0x5b, 0xb9, 0x74, 0xde, 0x37, 0xdf, + 0x6b, 0x98, 0xe6, 0x7d, 0x03, 0xc2, 0xe9, 0x09, 0x1c, 0xf4, 0x10, 0x64, 0xf5, 0x5d, 0xcd, 0x30, + 0x55, 0xa3, 0xc9, 0x1d, 0xc2, 0xfc, 0x1b, 0xaf, 0xcf, 0x66, 0xaa, 0xa4, 0xae, 0xbe, 0xa4, 0x64, + 0x68, 0x63, 0xbd, 0x49, 0x3c, 0x81, 0x5d, 0x6c, 0xec, 0xec, 0x7a, 0x7c, 0x85, 0xf1, 0x12, 0x7a, + 0x1a, 0x92, 0x44, 0x20, 0xf8, 0x5d, 0xc3, 0x72, 0x8f, 0x87, 0xef, 0x87, 0xd0, 0x8b, 0x59, 0xf2, + 0xe1, 0x0f, 0xfd, 0xee, 0x6c, 0x4c, 0xa1, 0x18, 0xa8, 0x0a, 0xe3, 0x2d, 0xcd, 0xf5, 0x54, 0x6a, + 0xc1, 0xc8, 0xe7, 0x53, 0x94, 0xc4, 0xb1, 0x5e, 0x86, 0x70, 0xc6, 0xf2, 0xae, 0xe7, 0x09, 0x16, + 0xab, 0x6a, 0xa2, 0x13, 0x20, 0x51, 0x22, 0xba, 0xd5, 0x6e, 0x1b, 0x1e, 0xf3, 0xad, 0xd2, 0x94, + 0xef, 0x45, 0x52, 0x5f, 0xa5, 0xd5, 0xd4, 0xc3, 0x3a, 0x0e, 0x39, 0x7a, 0xbb, 0x89, 0x82, 0xb0, + 0x73, 0xb8, 0x59, 0x52, 0x41, 0x1b, 0x1f, 0x86, 0x52, 0xa0, 0x1f, 0x19, 0x48, 0x96, 0x51, 0x09, + 0xaa, 0x29, 0xe0, 0xe3, 0x30, 0x65, 0xe2, 0x3d, 0x7a, 0x32, 0x38, 0x02, 0x9d, 0xa3, 0xd0, 0x88, + 0xb4, 0x5d, 0x8f, 0x62, 0x3c, 0x08, 0x45, 0x5d, 0x30, 0x9f, 0xc1, 0x02, 0x85, 0x1d, 0xf7, 0x6b, + 0x29, 0xd8, 0x31, 0xc8, 0x6a, 0xb6, 0xcd, 0x00, 0xf2, 0x5c, 0x3f, 0xda, 0x36, 0x6d, 0x3a, 0x05, + 0x13, 0x74, 0x8c, 0x0e, 0x76, 0x3b, 0x2d, 0x8f, 0x13, 0x29, 0x50, 0x98, 0x12, 0x69, 0x50, 0x58, + 0x3d, 0x85, 0x7d, 0x00, 0xc6, 0xf1, 0x4d, 0xa3, 0x89, 0x4d, 0x1d, 0x33, 0xb8, 0x71, 0x0a, 0x57, + 0x10, 0x95, 0x14, 0xe8, 0x24, 0xf8, 0x7a, 0x4f, 0x15, 0x3a, 0xb9, 0xc8, 0xe8, 0x89, 0xfa, 0x0a, + 0xab, 0x96, 0xa7, 0x21, 0xb9, 0xa4, 0x79, 0x1a, 0x71, 0x30, 0xbc, 0x3d, 0x66, 0x68, 0x0a, 0x0a, + 0xf9, 0x29, 0x7f, 0x23, 0x0e, 0xc9, 0xeb, 0x96, 0x87, 0xd1, 0x93, 0x21, 0x07, 0xb0, 0xd8, 0x4f, + 0x9e, 0x1b, 0xc6, 0x8e, 0x89, 0x9b, 0x2b, 0xee, 0x4e, 0xe8, 0x29, 0x82, 0x40, 0x9c, 0xe2, 0x11, + 0x71, 0x9a, 0x82, 0x94, 0x63, 0x75, 0xcc, 0xa6, 0x38, 0xc2, 0x4a, 0x0b, 0xa8, 0x06, 0x59, 0x5f, + 0x4a, 0x92, 0xc3, 0xa4, 0xa4, 0x44, 0xa4, 0x84, 0xc8, 0x30, 0xaf, 0x50, 0x32, 0x5b, 0x5c, 0x58, + 0x16, 0x21, 0xe7, 0x2b, 0x2f, 0x2e, 0x6d, 0xa3, 0x09, 0x6c, 0x80, 0x46, 0x8c, 0x89, 0x3f, 0xf7, + 0x3e, 0xf3, 0x98, 0xc4, 0x49, 0x7e, 0x03, 0xe7, 0x5e, 0x44, 0xac, 0xf8, 0xb3, 0x08, 0x19, 0x3a, + 0xae, 0x40, 0xac, 0xd8, 0xd3, 0x08, 0xf7, 0x42, 0xce, 0x35, 0x76, 0x4c, 0xcd, 0xeb, 0x38, 0x98, + 0x4b, 0x5e, 0x50, 0x21, 0x7f, 0x29, 0x06, 0x69, 0x26, 0xc9, 0x21, 0xbe, 0xc5, 0xfa, 0xf3, 0x2d, + 0x3e, 0x88, 0x6f, 0x89, 0xbb, 0xe7, 0x5b, 0x05, 0xc0, 0xef, 0x8c, 0xcb, 0x6f, 0xab, 0xf7, 0xf1, + 0x18, 0x58, 0x17, 0x1b, 0xc6, 0x0e, 0x5f, 0xa8, 0x21, 0x24, 0xf9, 0x3f, 0xc4, 0x88, 0x13, 0xcb, + 0xdb, 0x51, 0x05, 0xc6, 0x45, 0xbf, 0xd4, 0xed, 0x96, 0xb6, 0xc3, 0x65, 0xe7, 0xbe, 0x81, 0x9d, + 0xbb, 0xd4, 0xd2, 0x76, 0x94, 0x3c, 0xef, 0x0f, 0x29, 0xf4, 0x9f, 0x87, 0xf8, 0x80, 0x79, 0x88, + 0x4c, 0x7c, 0xe2, 0xee, 0x26, 0x3e, 0x32, 0x45, 0xc9, 0xee, 0x29, 0xfa, 0x5c, 0x9c, 0x06, 0x33, + 0xb6, 0xe5, 0x6a, 0xad, 0xb7, 0x63, 0x45, 0x1c, 0x87, 0x9c, 0x6d, 0xb5, 0x54, 0xd6, 0xc2, 0x8e, + 0x76, 0x67, 0x6d, 0xab, 0xa5, 0xf4, 0x4c, 0x7b, 0xea, 0x4d, 0x5a, 0x2e, 0xe9, 0x37, 0x81, 0x6b, + 0x99, 0x6e, 0xae, 0x39, 0x50, 0x60, 0xac, 0xe0, 0xb6, 0xec, 0x71, 0xc2, 0x03, 0x6a, 0x1c, 0x63, + 0xbd, 0xb6, 0x97, 0x75, 0x9b, 0x41, 0x2a, 0x1c, 0x8e, 0x60, 0x30, 0xd5, 0xdf, 0x2f, 0x0a, 0x0e, + 0x8b, 0xa5, 0xc2, 0xe1, 0xe4, 0xbf, 0x1a, 0x03, 0x58, 0x26, 0x9c, 0xa5, 0xe3, 0x25, 0x56, 0xc8, + 0xa5, 0x5d, 0x50, 0x23, 0x5f, 0x9e, 0x19, 0x34, 0x69, 0xfc, 0xfb, 0x05, 0x37, 0xdc, 0xef, 0x2a, + 0x8c, 0x07, 0xc2, 0xe8, 0x62, 0xd1, 0x99, 0x99, 0x03, 0xbc, 0xea, 0x06, 0xf6, 0x94, 0xc2, 0xcd, + 0x50, 0x49, 0xfe, 0xc7, 0x31, 0xc8, 0xd1, 0x3e, 0xad, 0x60, 0x4f, 0x8b, 0xcc, 0x61, 0xec, 0xee, + 0xe7, 0xf0, 0x3e, 0x00, 0x46, 0xc6, 0x35, 0x5e, 0xc1, 0x5c, 0xb2, 0x72, 0xb4, 0xa6, 0x61, 0xbc, + 0x82, 0xd1, 0x39, 0x9f, 0xe1, 0x89, 0x83, 0x19, 0x2e, 0xbc, 0x6e, 0xce, 0xf6, 0xa3, 0x90, 0xa1, + 0xaf, 0x3b, 0xed, 0xb9, 0xdc, 0x91, 0x4e, 0x9b, 0x9d, 0xf6, 0xc6, 0x9e, 0x2b, 0xbf, 0x0c, 0x99, + 0x8d, 0x3d, 0x96, 0x1b, 0x39, 0x0e, 0x39, 0xc7, 0xb2, 0xb8, 0x4d, 0x66, 0xbe, 0x50, 0x96, 0x54, + 0x50, 0x13, 0x24, 0xf2, 0x01, 0xf1, 0x20, 0x1f, 0x10, 0x24, 0x34, 0x12, 0x23, 0x25, 0x34, 0x4e, + 0xfd, 0x56, 0x0c, 0xf2, 0x21, 0xfd, 0x80, 0x9e, 0x80, 0x7b, 0x16, 0x97, 0xd7, 0xaa, 0xd7, 0xd4, + 0xfa, 0x92, 0x7a, 0x69, 0xb9, 0x72, 0x39, 0xb8, 0xbc, 0x54, 0x3e, 0x72, 0xfb, 0xce, 0x1c, 0x0a, + 0xc1, 0x6e, 0x9a, 0x34, 0x4f, 0x8f, 0x4e, 0xc3, 0x54, 0x14, 0xa5, 0xb2, 0xd8, 0xa8, 0xad, 0x6e, + 0x48, 0xb1, 0xf2, 0x3d, 0xb7, 0xef, 0xcc, 0x4d, 0x84, 0x30, 0x2a, 0x5b, 0x2e, 0x36, 0xbd, 0x5e, + 0x84, 0xea, 0xda, 0xca, 0x4a, 0x7d, 0x43, 0x8a, 0xf7, 0x20, 0x70, 0x85, 0x7d, 0x12, 0x26, 0xa2, + 0x08, 0xab, 0xf5, 0x65, 0x29, 0x51, 0x46, 0xb7, 0xef, 0xcc, 0x15, 0x43, 0xd0, 0xab, 0x46, 0xab, + 0x9c, 0xfd, 0xc0, 0x27, 0x67, 0xc6, 0x3e, 0xfd, 0xf3, 0x33, 0x31, 0x32, 0xb2, 0xf1, 0x88, 0x8e, + 0x40, 0x8f, 0xc2, 0xd1, 0x46, 0xfd, 0xf2, 0x6a, 0x6d, 0x49, 0x5d, 0x69, 0x5c, 0x16, 0x99, 0x6e, + 0x31, 0xba, 0xd2, 0xed, 0x3b, 0x73, 0x79, 0x3e, 0xa4, 0x41, 0xd0, 0xeb, 0x4a, 0xed, 0xfa, 0xda, + 0x46, 0x4d, 0x8a, 0x31, 0xe8, 0x75, 0x07, 0xdf, 0xb4, 0x3c, 0xf6, 0xfc, 0xdb, 0xe3, 0x70, 0xac, + 0x0f, 0xb4, 0x3f, 0xb0, 0x89, 0xdb, 0x77, 0xe6, 0xc6, 0xd7, 0x1d, 0xcc, 0xd6, 0x0f, 0xc5, 0x98, + 0x87, 0xe9, 0x5e, 0x8c, 0xb5, 0xf5, 0xb5, 0x46, 0x65, 0x59, 0x9a, 0x2b, 0x4b, 0xb7, 0xef, 0xcc, + 0x15, 0x84, 0x32, 0x24, 0xf0, 0xc1, 0xc8, 0xde, 0xca, 0x88, 0xe7, 0x76, 0x26, 0x92, 0xdf, 0x63, + 0xb1, 0x84, 0xad, 0x39, 0x5a, 0xfb, 0xb0, 0x21, 0xcf, 0x90, 0xcd, 0x3a, 0xf9, 0xd5, 0x38, 0x94, + 0x7c, 0x87, 0x7a, 0x9d, 0x7e, 0x01, 0x3d, 0x19, 0xce, 0xcb, 0xe4, 0x07, 0x9a, 0x32, 0x06, 0x2d, + 0xd2, 0x36, 0xef, 0x84, 0xac, 0x70, 0xcc, 0xb8, 0xca, 0x98, 0xeb, 0xc5, 0xab, 0x71, 0x08, 0x8e, + 0xea, 0x63, 0xa0, 0x67, 0x21, 0xe7, 0x2b, 0x10, 0xff, 0x01, 0x95, 0xc1, 0x1a, 0x87, 0xe3, 0x07, + 0x38, 0xe8, 0x42, 0x10, 0x3a, 0x24, 0x07, 0x05, 0x23, 0xd7, 0x19, 0x00, 0x47, 0x16, 0xf0, 0x72, + 0x9d, 0x2f, 0x3d, 0x3e, 0x7a, 0x7a, 0xf9, 0x7c, 0x4f, 0x65, 0xd1, 0x14, 0xf3, 0x4c, 0xb2, 0x6d, + 0x6d, 0x6f, 0x91, 0x06, 0x54, 0x47, 0x21, 0x43, 0x1a, 0x77, 0xf8, 0xdd, 0xda, 0x84, 0x92, 0x6e, + 0x6b, 0x7b, 0x97, 0x35, 0xf7, 0x6a, 0x32, 0x9b, 0x90, 0x92, 0xf2, 0x2f, 0xc6, 0xa0, 0x18, 0x1d, + 0x23, 0x7a, 0x04, 0x10, 0xc1, 0xd0, 0x76, 0xb0, 0x4a, 0xd4, 0x0c, 0x65, 0x96, 0xa0, 0x5b, 0x6a, + 0x6b, 0x7b, 0x95, 0x1d, 0xbc, 0xda, 0x69, 0xd3, 0x0e, 0xb8, 0x68, 0x05, 0x24, 0x01, 0x2c, 0xe6, + 0x89, 0x33, 0xf3, 0x58, 0xef, 0x73, 0x6a, 0x1c, 0x80, 0x19, 0xab, 0x0f, 0x13, 0x63, 0x55, 0x64, + 0xf4, 0xfc, 0xcd, 0xd6, 0xc8, 0x50, 0x12, 0xd1, 0xa1, 0xc8, 0xcf, 0x42, 0xa9, 0x8b, 0x9f, 0x48, + 0x86, 0x71, 0x9e, 0x1d, 0xa0, 0x1b, 0x59, 0xcc, 0x47, 0xce, 0x29, 0x79, 0x96, 0x05, 0xa0, 0x1b, + 0x7b, 0x0b, 0xd9, 0x2f, 0x7e, 0x7c, 0x36, 0x46, 0x93, 0xe8, 0x8f, 0xc0, 0x78, 0x84, 0xa3, 0x22, + 0x73, 0x17, 0x0b, 0x32, 0x77, 0x01, 0xf0, 0x4b, 0x50, 0x20, 0xca, 0x12, 0x37, 0x39, 0xec, 0x43, + 0x50, 0x62, 0xca, 0xbc, 0x9b, 0xd7, 0xcc, 0x9b, 0x5a, 0x11, 0x0c, 0x97, 0x85, 0x7b, 0x15, 0x65, + 0x7b, 0x5e, 0x40, 0x5d, 0xd6, 0xdc, 0xc5, 0xcd, 0x4f, 0xbf, 0x31, 0x13, 0x7b, 0xeb, 0x16, 0xe3, + 0xbf, 0x79, 0x0e, 0x8e, 0x87, 0x1a, 0xb5, 0x2d, 0xdd, 0x88, 0x64, 0x1f, 0x4a, 0x21, 0x41, 0x23, + 0x8d, 0xc3, 0xb2, 0x08, 0x07, 0xe6, 0x32, 0x0e, 0x4e, 0x9e, 0x95, 0x0f, 0xd6, 0x0a, 0xc3, 0x13, + 0x1c, 0xfd, 0x73, 0x96, 0xff, 0x37, 0x0b, 0x19, 0x05, 0xbf, 0xbf, 0x83, 0x5d, 0x0f, 0x9d, 0x81, + 0x24, 0xd6, 0x77, 0xad, 0x7e, 0xe9, 0x21, 0x32, 0xb8, 0x79, 0x0e, 0x57, 0xd3, 0x77, 0xad, 0x2b, + 0x63, 0x0a, 0x85, 0x45, 0x67, 0x21, 0xb5, 0xdd, 0xea, 0xf0, 0x7c, 0x45, 0x97, 0xc2, 0x08, 0x23, + 0x5d, 0x22, 0x40, 0x57, 0xc6, 0x14, 0x06, 0x4d, 0x3e, 0x45, 0x1f, 0xa7, 0x4c, 0x1c, 0xfc, 0xa9, + 0xba, 0xb9, 0x4d, 0x3f, 0x45, 0x60, 0xd1, 0x22, 0x80, 0x61, 0x1a, 0x9e, 0x4a, 0x63, 0x79, 0xee, + 0x11, 0xde, 0x3f, 0x18, 0xd3, 0xf0, 0x68, 0xf4, 0x7f, 0x65, 0x4c, 0xc9, 0x19, 0xa2, 0x40, 0xba, + 0xfb, 0xfe, 0x0e, 0x76, 0xf6, 0xb9, 0x23, 0x38, 0xb0, 0xbb, 0xcf, 0x11, 0x20, 0xd2, 0x5d, 0x0a, + 0x8d, 0x6a, 0x90, 0xa7, 0xb7, 0x10, 0xd9, 0x1a, 0xe6, 0x0f, 0x25, 0xca, 0x83, 0x90, 0x17, 0x09, + 0x28, 0x5d, 0xd6, 0x57, 0xc6, 0x14, 0xd8, 0xf2, 0x4b, 0x44, 0x51, 0xb2, 0x87, 0x74, 0xbc, 0x3d, + 0xfe, 0x3c, 0xdc, 0xec, 0x20, 0x1a, 0xf4, 0x35, 0x9d, 0x8d, 0xbd, 0x2b, 0x63, 0x4a, 0x46, 0x67, + 0x3f, 0xc9, 0xf8, 0x9b, 0xb8, 0x65, 0xdc, 0xc4, 0x0e, 0xc1, 0xcf, 0x1d, 0x3c, 0xfe, 0x25, 0x06, + 0x49, 0x29, 0xe4, 0x9a, 0xa2, 0x40, 0x94, 0x2d, 0x36, 0x9b, 0x7c, 0x18, 0xd0, 0xab, 0xab, 0x23, + 0xf3, 0x6c, 0x36, 0xc5, 0x20, 0xb2, 0x98, 0xff, 0x46, 0x4f, 0xfb, 0x9e, 0x6a, 0xbe, 0xd7, 0x39, + 0x8c, 0x0c, 0x80, 0xe5, 0x2c, 0xc6, 0x84, 0xc7, 0x8a, 0x56, 0xa1, 0xd8, 0x32, 0x5c, 0x4f, 0x75, + 0x4d, 0xcd, 0x76, 0x77, 0x2d, 0xcf, 0xa5, 0xc1, 0x7f, 0xfe, 0xcc, 0x83, 0x83, 0x28, 0x2c, 0x1b, + 0xae, 0xd7, 0x10, 0xc0, 0x57, 0xc6, 0x94, 0xf1, 0x56, 0xb8, 0x82, 0xd0, 0xb3, 0xb6, 0xb7, 0xb1, + 0xe3, 0x13, 0xa4, 0x49, 0x82, 0x03, 0xe8, 0xad, 0x11, 0x68, 0x81, 0x4f, 0xe8, 0x59, 0xe1, 0x0a, + 0xf4, 0x43, 0x30, 0xd9, 0xb2, 0xb4, 0xa6, 0x4f, 0x4e, 0xd5, 0x77, 0x3b, 0xe6, 0x0d, 0x9a, 0x51, + 0xc8, 0x9f, 0x39, 0x39, 0xb0, 0x93, 0x96, 0xd6, 0x14, 0x24, 0xaa, 0x04, 0xe1, 0xca, 0x98, 0x32, + 0xd1, 0xea, 0xae, 0x44, 0xef, 0x85, 0x29, 0xcd, 0xb6, 0x5b, 0xfb, 0xdd, 0xd4, 0x4b, 0x94, 0xfa, + 0xa9, 0x41, 0xd4, 0x2b, 0x04, 0xa7, 0x9b, 0x3c, 0xd2, 0x7a, 0x6a, 0xd1, 0x06, 0x48, 0xb6, 0x83, + 0xe9, 0xb5, 0x09, 0x9b, 0xbb, 0x2c, 0xf4, 0xed, 0xa3, 0xfc, 0x99, 0x87, 0x07, 0xd1, 0x5e, 0x67, + 0xf0, 0xc2, 0xc3, 0xb9, 0x32, 0xa6, 0x94, 0xec, 0x68, 0x15, 0xa3, 0x6a, 0xe9, 0x98, 0xbe, 0xcf, + 0xc3, 0xa9, 0x4e, 0x0c, 0xa3, 0x4a, 0xe1, 0xa3, 0x54, 0x23, 0x55, 0x8b, 0x19, 0x7e, 0xec, 0x89, + 0x3f, 0x9e, 0xf1, 0x30, 0xe4, 0x43, 0x8a, 0x05, 0x4d, 0x43, 0x86, 0x9f, 0xcd, 0x14, 0xc7, 0xa5, + 0x78, 0x51, 0x2e, 0x42, 0x21, 0xac, 0x4c, 0xe4, 0x0f, 0xc5, 0x7c, 0x4c, 0x7a, 0x9b, 0x79, 0x3a, + 0x9a, 0x42, 0xcc, 0x05, 0xd9, 0xc1, 0x07, 0x84, 0x25, 0x11, 0xed, 0x6c, 0x87, 0xa9, 0x40, 0x2b, + 0xb9, 0x21, 0x43, 0xb3, 0x90, 0xb7, 0xcf, 0xd8, 0x3e, 0x48, 0x82, 0x82, 0x80, 0x7d, 0xc6, 0x16, + 0x00, 0xf7, 0x43, 0x81, 0x8c, 0x54, 0x0d, 0x3b, 0x1b, 0x39, 0x25, 0x4f, 0xea, 0x38, 0x88, 0xfc, + 0x2f, 0xe3, 0x20, 0x75, 0x2b, 0x20, 0x3f, 0xb7, 0x18, 0x3b, 0x74, 0x6e, 0xf1, 0x58, 0x77, 0x56, + 0x33, 0x48, 0x64, 0x2e, 0x83, 0x14, 0xe4, 0xe3, 0x98, 0x21, 0x18, 0xec, 0x3c, 0x75, 0x79, 0x79, + 0x4a, 0x49, 0xef, 0x72, 0xfb, 0x2e, 0x45, 0xf6, 0x61, 0xc4, 0xeb, 0xcb, 0xdd, 0x53, 0xec, 0xfb, + 0x0c, 0x9b, 0x76, 0x53, 0xf3, 0xb0, 0xc8, 0x8f, 0x84, 0xb6, 0x64, 0x1e, 0x82, 0x92, 0x66, 0xdb, + 0xaa, 0xeb, 0x69, 0x1e, 0xe6, 0xa6, 0x3d, 0xc5, 0xd2, 0x84, 0x9a, 0x6d, 0x37, 0x48, 0x2d, 0x33, + 0xed, 0x0f, 0x42, 0x91, 0xe8, 0x64, 0x43, 0x6b, 0xa9, 0x3c, 0x5b, 0x90, 0x66, 0x1e, 0x00, 0xaf, + 0xbd, 0x42, 0x2b, 0xe5, 0xa6, 0x3f, 0xe3, 0x54, 0x1f, 0xfb, 0xe1, 0x56, 0x2c, 0x14, 0x6e, 0x21, + 0x7e, 0xcd, 0x9c, 0xf1, 0x47, 0xdc, 0xcc, 0xef, 0x9f, 0xe5, 0x9d, 0xa2, 0xa1, 0xd9, 0x4d, 0x96, + 0xf8, 0xc8, 0x2a, 0xac, 0x20, 0xbf, 0x16, 0x87, 0x89, 0x1e, 0xcd, 0xdd, 0x37, 0xfd, 0x1d, 0xc4, + 0x99, 0xf1, 0x43, 0xc5, 0x99, 0xd7, 0xa2, 0xe9, 0xdd, 0x90, 0xe5, 0x3b, 0xde, 0xc3, 0x64, 0xa6, + 0x37, 0x89, 0x40, 0x73, 0x22, 0xa1, 0x0c, 0x30, 0x15, 0xf3, 0x4d, 0x98, 0xda, 0xda, 0x7f, 0x45, + 0x33, 0x3d, 0xc3, 0xc4, 0x6a, 0xcf, 0xac, 0xf5, 0x9a, 0xd2, 0x15, 0xc3, 0xdd, 0xc2, 0xbb, 0xda, + 0x4d, 0xc3, 0x12, 0xdd, 0x9a, 0xf4, 0xf1, 0x83, 0x24, 0xaf, 0xac, 0x40, 0x31, 0x6a, 0x7a, 0x50, + 0x11, 0xe2, 0xde, 0x1e, 0x1f, 0x7f, 0xdc, 0xdb, 0x43, 0x8f, 0xf3, 0x7c, 0x50, 0x9c, 0xe6, 0x83, + 0x7a, 0x3f, 0xc4, 0xf1, 0x82, 0x64, 0x90, 0x2c, 0xfb, 0xab, 0xc1, 0x37, 0x47, 0xdd, 0x54, 0xe5, + 0x93, 0x50, 0xea, 0xb2, 0x37, 0x83, 0xb2, 0x83, 0x72, 0x09, 0xc6, 0x23, 0xc6, 0x45, 0x3e, 0x02, + 0x53, 0xfd, 0x6c, 0x85, 0xbc, 0xeb, 0xd7, 0x47, 0x74, 0x3e, 0x3a, 0x0b, 0x59, 0xdf, 0x58, 0xf4, + 0xc9, 0x46, 0xd0, 0x51, 0x08, 0x60, 0xc5, 0x07, 0x8d, 0x24, 0xb5, 0xe3, 0x91, 0xa4, 0xb6, 0xfc, + 0x3e, 0x98, 0x1e, 0x64, 0x08, 0xba, 0x86, 0x91, 0xf4, 0xa5, 0xf0, 0x08, 0xa4, 0xf9, 0x23, 0x5c, + 0x71, 0xba, 0x8d, 0xc3, 0x4b, 0x44, 0x3a, 0x99, 0x51, 0x48, 0xb0, 0xdd, 0x1d, 0x5a, 0x90, 0x55, + 0x38, 0x36, 0xd0, 0x18, 0x0c, 0xde, 0x10, 0x62, 0x84, 0xf8, 0x86, 0x90, 0x2e, 0xba, 0xe3, 0xd2, + 0xb1, 0x8a, 0x43, 0x10, 0xac, 0x24, 0x7f, 0x38, 0x01, 0x47, 0xfa, 0x9b, 0x04, 0x34, 0x07, 0x05, + 0xe2, 0x7b, 0x7b, 0x51, 0x37, 0x1d, 0xda, 0xda, 0xde, 0x06, 0xf7, 0xd1, 0x79, 0x42, 0x3d, 0xee, + 0x27, 0xd4, 0xd1, 0x26, 0x4c, 0xb4, 0x2c, 0x5d, 0x6b, 0xa9, 0x21, 0x89, 0xe7, 0xc2, 0xfe, 0x40, + 0x0f, 0xb3, 0x6b, 0xec, 0x69, 0xde, 0x66, 0x8f, 0xd0, 0x97, 0x28, 0x8d, 0x65, 0x5f, 0xf2, 0xd1, + 0x12, 0xe4, 0xdb, 0x81, 0x20, 0x1f, 0x42, 0xd8, 0xc3, 0x68, 0xa1, 0x29, 0x49, 0xf5, 0xdd, 0xfe, + 0x49, 0x1f, 0x5a, 0x45, 0x0f, 0xda, 0x49, 0xc9, 0x0c, 0xdc, 0x49, 0xe9, 0xb7, 0x6d, 0x91, 0xed, + 0xbf, 0x6d, 0xf1, 0x81, 0xf0, 0xd4, 0x44, 0x8c, 0x68, 0xef, 0x4e, 0x06, 0x6a, 0xc0, 0x14, 0xc7, + 0x6f, 0x46, 0x78, 0x1f, 0x1f, 0x55, 0xd1, 0x20, 0x81, 0x3e, 0x98, 0xed, 0x89, 0xbb, 0x63, 0xbb, + 0xd0, 0xa5, 0xc9, 0x90, 0x2e, 0xfd, 0xff, 0x6c, 0x2a, 0xfe, 0x75, 0x0e, 0xb2, 0x0a, 0x76, 0x6d, + 0x62, 0x38, 0xd1, 0x22, 0xe4, 0xf0, 0x9e, 0x8e, 0x6d, 0x2f, 0xd8, 0xae, 0xec, 0x17, 0x0c, 0x30, + 0xe8, 0x9a, 0x80, 0x24, 0x9e, 0xb8, 0x8f, 0x86, 0x9e, 0xe4, 0xc1, 0xd6, 0xe0, 0xb8, 0x89, 0xa3, + 0x87, 0xa3, 0xad, 0x73, 0x22, 0xda, 0x4a, 0x0c, 0x74, 0xbe, 0x19, 0x56, 0x57, 0xb8, 0xf5, 0x24, + 0x0f, 0xb7, 0x92, 0x43, 0x3e, 0x16, 0x89, 0xb7, 0xaa, 0x91, 0x78, 0x2b, 0x3d, 0x64, 0x98, 0x03, + 0x02, 0xae, 0x73, 0x22, 0xe0, 0xca, 0x0c, 0xe9, 0x71, 0x57, 0xc4, 0x75, 0x29, 0x1a, 0x71, 0x65, + 0x07, 0x28, 0x10, 0x81, 0x3d, 0x30, 0xe4, 0x7a, 0x26, 0x14, 0x72, 0xe5, 0x06, 0xc6, 0x3b, 0x8c, + 0x48, 0x9f, 0x98, 0xab, 0x1a, 0x89, 0xb9, 0x60, 0x08, 0x0f, 0x06, 0x04, 0x5d, 0xef, 0x0e, 0x07, + 0x5d, 0xf9, 0x81, 0x71, 0x1b, 0x9f, 0xef, 0x7e, 0x51, 0xd7, 0x05, 0x3f, 0xea, 0x2a, 0x0c, 0x0c, + 0x1b, 0xf9, 0x18, 0xba, 0xc3, 0xae, 0xb5, 0x9e, 0xb0, 0x6b, 0x9c, 0xbf, 0x7a, 0x3f, 0x88, 0xc4, + 0x90, 0xb8, 0x6b, 0xad, 0x27, 0xee, 0x2a, 0x0e, 0x21, 0x38, 0x24, 0xf0, 0xfa, 0xe1, 0xfe, 0x81, + 0xd7, 0xe0, 0xd0, 0x88, 0x77, 0x73, 0xb4, 0xc8, 0x4b, 0x1d, 0x10, 0x79, 0xb1, 0xe8, 0xe8, 0x91, + 0x81, 0xe4, 0x47, 0x0e, 0xbd, 0x36, 0xfb, 0x84, 0x5e, 0x2c, 0x48, 0x3a, 0x31, 0x90, 0xf8, 0x08, + 0xb1, 0xd7, 0x66, 0x9f, 0xd8, 0x0b, 0x0d, 0x25, 0x7b, 0x98, 0xe0, 0x2b, 0x25, 0xa5, 0xe5, 0x93, + 0xc4, 0xf5, 0xed, 0xd2, 0x53, 0xc4, 0x7f, 0xc0, 0x8e, 0x63, 0x39, 0xe2, 0xc4, 0x2d, 0x2d, 0xc8, + 0x27, 0x88, 0x33, 0x1e, 0xe8, 0xa4, 0x03, 0x02, 0x35, 0xea, 0xa7, 0x85, 0xf4, 0x90, 0xfc, 0xc5, + 0x58, 0x80, 0x4b, 0x7d, 0xd8, 0xb0, 0x23, 0x9f, 0xe3, 0x8e, 0x7c, 0x28, 0x7c, 0x8b, 0x47, 0xc3, + 0xb7, 0x59, 0xc8, 0x13, 0xff, 0xab, 0x2b, 0x32, 0xd3, 0x6c, 0x3f, 0x32, 0x13, 0x47, 0x0b, 0x58, + 0x90, 0xc7, 0xcd, 0x0a, 0xdb, 0xd1, 0x29, 0xf9, 0xc7, 0x2c, 0x58, 0x4c, 0x81, 0x1e, 0x83, 0xc9, + 0x10, 0xac, 0xef, 0xd7, 0xb1, 0x30, 0x45, 0xf2, 0xa1, 0x2b, 0xdc, 0xc1, 0xfb, 0x27, 0xb1, 0x80, + 0x43, 0x41, 0x48, 0xd7, 0x2f, 0xfa, 0x8a, 0xbd, 0x49, 0xd1, 0x57, 0xfc, 0xae, 0xa3, 0xaf, 0xb0, + 0x9f, 0x9a, 0x88, 0xfa, 0xa9, 0xff, 0x33, 0x16, 0xcc, 0x89, 0x1f, 0x4b, 0xe9, 0x56, 0x13, 0x73, + 0xcf, 0x91, 0xfe, 0x26, 0x4e, 0x45, 0xcb, 0xda, 0xe1, 0xfe, 0x21, 0xf9, 0x49, 0xa0, 0x7c, 0xc3, + 0x91, 0xe3, 0x76, 0xc1, 0x77, 0x3a, 0x53, 0xe1, 0x73, 0xc1, 0xfc, 0xb0, 0x6c, 0x3a, 0x38, 0x2c, + 0xeb, 0x5f, 0x6f, 0xca, 0x84, 0xae, 0x37, 0xa1, 0xa7, 0x21, 0x47, 0x33, 0xa2, 0xaa, 0x65, 0x8b, + 0xff, 0x91, 0x70, 0x7c, 0xf0, 0x41, 0x59, 0x97, 0x1e, 0xdb, 0x63, 0x87, 0x6b, 0x03, 0x8f, 0x21, + 0x17, 0xf1, 0x18, 0xee, 0x85, 0x1c, 0xe9, 0x3d, 0x7b, 0xeb, 0x17, 0xf8, 0xdd, 0x38, 0x51, 0x21, + 0xbf, 0x17, 0x50, 0xaf, 0x91, 0x40, 0x57, 0x20, 0x8d, 0x6f, 0xd2, 0x87, 0xd3, 0xd8, 0xa1, 0xc3, + 0x23, 0xbd, 0xae, 0x29, 0x69, 0x5e, 0x9c, 0x26, 0x4c, 0xfe, 0xe6, 0xeb, 0xb3, 0x12, 0x83, 0x7e, + 0xd4, 0x6a, 0x1b, 0x1e, 0x6e, 0xdb, 0xde, 0xbe, 0xc2, 0xf1, 0xe5, 0xdf, 0x89, 0x93, 0x00, 0x26, + 0x62, 0x40, 0xfa, 0xf2, 0xb6, 0xdf, 0x56, 0xe1, 0x68, 0xfc, 0x9e, 0x01, 0xd8, 0xd1, 0x5c, 0xf5, + 0x96, 0x66, 0x7a, 0xb8, 0xc9, 0x99, 0x1e, 0xaa, 0x41, 0x65, 0xc8, 0x92, 0x52, 0xc7, 0xc5, 0x4d, + 0x1e, 0x46, 0xfb, 0xe5, 0xd0, 0x38, 0x33, 0xdf, 0xdf, 0x38, 0xa3, 0x5c, 0xce, 0x76, 0x71, 0x39, + 0x14, 0x5c, 0xe4, 0xc2, 0xc1, 0x05, 0x3b, 0x2c, 0xcc, 0xcf, 0x2a, 0x02, 0xeb, 0x9b, 0x28, 0xa3, + 0x07, 0x60, 0xbc, 0x8d, 0xdb, 0xb6, 0x65, 0xb5, 0x54, 0xa6, 0x6e, 0xd8, 0xa3, 0xde, 0x05, 0x5e, + 0x59, 0xa3, 0x5a, 0xe7, 0xc7, 0xe2, 0xc1, 0xfa, 0x0b, 0x82, 0xc8, 0x1f, 0x38, 0x06, 0xcb, 0x7f, + 0x91, 0x66, 0x96, 0xa2, 0x2e, 0x02, 0x6a, 0x84, 0x4f, 0x8f, 0x74, 0xa8, 0x5a, 0x10, 0x02, 0x3d, + 0xaa, 0xfe, 0x08, 0x4e, 0x99, 0xb0, 0x6a, 0x17, 0xbd, 0x08, 0x47, 0xbb, 0x74, 0x9b, 0x4f, 0x3a, + 0x3e, 0xaa, 0x8a, 0xbb, 0x27, 0xaa, 0xe2, 0x04, 0xe9, 0x80, 0x59, 0x89, 0xef, 0x73, 0xd5, 0xd5, + 0xa1, 0x18, 0xf5, 0x78, 0xfa, 0x4e, 0x3f, 0xfd, 0x27, 0x12, 0x9e, 0x66, 0x98, 0x6a, 0x24, 0x1d, + 0x54, 0x60, 0x95, 0x3c, 0xc9, 0xb4, 0x0e, 0xf7, 0xf4, 0xf5, 0x7c, 0xd0, 0x79, 0xc8, 0x05, 0x4e, + 0x13, 0xe3, 0xea, 0x01, 0xe9, 0x82, 0x00, 0x56, 0xfe, 0xf5, 0x58, 0x40, 0x32, 0x9a, 0x80, 0xa8, + 0x41, 0x9a, 0x1d, 0x7f, 0xe3, 0x87, 0x6a, 0x1e, 0x1b, 0xcd, 0x67, 0x9a, 0x67, 0x67, 0xe3, 0x14, + 0x8e, 0x2c, 0xbf, 0x17, 0xd2, 0xac, 0x06, 0xe5, 0x21, 0x13, 0xbc, 0x6d, 0x0a, 0x90, 0xae, 0x54, + 0xab, 0xb5, 0xf5, 0x0d, 0x29, 0x86, 0x72, 0x90, 0xaa, 0x2c, 0xae, 0x29, 0x1b, 0x52, 0x9c, 0x54, + 0x2b, 0xb5, 0xab, 0xb5, 0xea, 0x86, 0x94, 0x40, 0x13, 0x30, 0xce, 0x7e, 0xab, 0x97, 0xd6, 0x94, + 0x95, 0xca, 0x86, 0x94, 0x0c, 0x55, 0x35, 0x6a, 0xab, 0x4b, 0x35, 0x45, 0x4a, 0xc9, 0x4f, 0xc0, + 0xb1, 0x81, 0x5e, 0x56, 0x90, 0x5d, 0x88, 0x85, 0xb2, 0x0b, 0xf2, 0x87, 0xe3, 0x50, 0x1e, 0xec, + 0x3a, 0xa1, 0xab, 0x5d, 0x03, 0x3f, 0x73, 0x08, 0xbf, 0xab, 0x6b, 0xf4, 0xe8, 0x41, 0x28, 0x3a, + 0x78, 0x1b, 0x7b, 0xfa, 0x2e, 0x73, 0xe5, 0x98, 0xc9, 0x1c, 0x57, 0xc6, 0x79, 0x2d, 0x45, 0x72, + 0x19, 0xd8, 0xcb, 0x58, 0xf7, 0x54, 0xa6, 0x8b, 0x5c, 0xfe, 0xdf, 0xec, 0xc6, 0x59, 0x6d, 0x83, + 0x55, 0xca, 0xef, 0x3b, 0x14, 0x2f, 0x73, 0x90, 0x52, 0x6a, 0x1b, 0xca, 0x8b, 0x52, 0x02, 0x21, + 0x28, 0xd2, 0x9f, 0x6a, 0x63, 0xb5, 0xb2, 0xde, 0xb8, 0xb2, 0x46, 0x78, 0x39, 0x09, 0x25, 0xc1, + 0x4b, 0x51, 0x99, 0x92, 0x1f, 0x81, 0xa3, 0x03, 0xfc, 0xbe, 0x3e, 0xe7, 0x11, 0x3f, 0x11, 0x0b, + 0x43, 0x47, 0x63, 0xfe, 0x35, 0x48, 0xbb, 0x9e, 0xe6, 0x75, 0x5c, 0xce, 0xc4, 0xf3, 0xa3, 0x3a, + 0x82, 0xf3, 0xe2, 0x47, 0x83, 0xa2, 0x2b, 0x9c, 0x8c, 0x7c, 0x16, 0x8a, 0xd1, 0x96, 0xc1, 0x3c, + 0x08, 0x84, 0x28, 0x2e, 0xbf, 0x08, 0x10, 0xca, 0x47, 0xfa, 0x27, 0xbb, 0x62, 0xe1, 0x93, 0x5d, + 0x67, 0x21, 0x75, 0xd3, 0x62, 0x3a, 0xa3, 0xff, 0xc2, 0xb9, 0x6e, 0x79, 0x38, 0x94, 0x7c, 0x60, + 0xd0, 0xb2, 0x01, 0xa8, 0x37, 0x27, 0x34, 0xe0, 0x13, 0xcf, 0x44, 0x3f, 0x71, 0xff, 0xc0, 0xec, + 0x52, 0xff, 0x4f, 0xbd, 0x02, 0x29, 0xaa, 0x6d, 0xfa, 0x5e, 0xfd, 0x79, 0x0f, 0x80, 0xe6, 0x79, + 0x8e, 0xb1, 0xd5, 0x09, 0x3e, 0x30, 0xdb, 0x5f, 0x5b, 0x55, 0x04, 0xdc, 0xe2, 0xbd, 0x5c, 0x6d, + 0x4d, 0x05, 0xa8, 0x21, 0xd5, 0x15, 0x22, 0x28, 0xaf, 0x42, 0x31, 0x8a, 0xdb, 0xff, 0x2a, 0x53, + 0x70, 0x3b, 0x3c, 0x27, 0xdc, 0x27, 0xdf, 0xf9, 0xe2, 0x2f, 0x36, 0xd0, 0x82, 0x7c, 0x3b, 0x06, + 0xd9, 0x8d, 0x3d, 0x2e, 0xc7, 0x07, 0x1c, 0xae, 0x0c, 0xee, 0x73, 0xf9, 0xc9, 0x42, 0x96, 0x8f, + 0x4d, 0xf8, 0x59, 0xde, 0x77, 0xfb, 0x2b, 0x35, 0x39, 0x6a, 0xb4, 0x2b, 0xb2, 0xdd, 0x5c, 0x3b, + 0x5d, 0x1c, 0xed, 0xbe, 0xc4, 0x14, 0xa4, 0xc2, 0x77, 0x1d, 0x58, 0x41, 0x6e, 0x86, 0x8e, 0x26, + 0x30, 0xb3, 0x11, 0xbe, 0x58, 0x11, 0x3b, 0xf4, 0xc5, 0x0a, 0xff, 0x2b, 0xf1, 0xf0, 0x57, 0x6e, + 0x42, 0x56, 0x08, 0x05, 0x7a, 0x57, 0xf8, 0xfc, 0x89, 0xd8, 0xa3, 0x19, 0x68, 0x3c, 0x39, 0xf9, + 0xd0, 0xf1, 0x93, 0x53, 0x30, 0xc1, 0x8f, 0xde, 0x05, 0x71, 0x05, 0x7f, 0x7d, 0xbd, 0xc4, 0x1a, + 0x96, 0x45, 0x50, 0x21, 0xff, 0x42, 0x0c, 0xa4, 0x6e, 0xa9, 0x7c, 0x3b, 0x3b, 0x40, 0x94, 0x22, + 0x91, 0xfe, 0xd0, 0xb3, 0xca, 0x6c, 0xe6, 0xc7, 0x49, 0x6d, 0xf0, 0xb0, 0xf2, 0x6b, 0x71, 0xc8, + 0x87, 0x72, 0x7a, 0xe8, 0xa9, 0xc8, 0x51, 0xd0, 0xb9, 0x83, 0xf2, 0x7f, 0xa1, 0xb3, 0xa0, 0x91, + 0x81, 0xc5, 0x0f, 0x3f, 0xb0, 0x37, 0xff, 0xb0, 0x7e, 0xff, 0x9b, 0x3f, 0xa9, 0x01, 0x37, 0x7f, + 0xfe, 0x4c, 0x0c, 0xb2, 0xbe, 0xe9, 0x3e, 0x6c, 0x36, 0xff, 0x08, 0xa4, 0xb9, 0x75, 0x62, 0xe9, + 0x7c, 0x5e, 0xea, 0x9b, 0x0b, 0x2d, 0x43, 0x56, 0xfc, 0xdb, 0x12, 0x1e, 0x88, 0xfa, 0xe5, 0x53, + 0x17, 0x20, 0x1f, 0xda, 0x58, 0x21, 0x7a, 0x62, 0xb5, 0xf6, 0xbc, 0x34, 0x56, 0xce, 0xdc, 0xbe, + 0x33, 0x97, 0x58, 0xc5, 0xb7, 0xc8, 0x0a, 0x53, 0x6a, 0xd5, 0x2b, 0xb5, 0xea, 0x35, 0x29, 0x56, + 0xce, 0xdf, 0xbe, 0x33, 0x97, 0x51, 0x30, 0x4d, 0x5f, 0x9d, 0xba, 0x06, 0xa5, 0xae, 0x89, 0x89, + 0xea, 0x77, 0x04, 0xc5, 0xa5, 0xcd, 0xf5, 0xe5, 0x7a, 0xb5, 0xb2, 0x51, 0x53, 0xd9, 0xb1, 0x3a, + 0x74, 0x14, 0x26, 0x97, 0xeb, 0x97, 0xaf, 0x6c, 0xa8, 0xd5, 0xe5, 0x7a, 0x6d, 0x75, 0x43, 0xad, + 0x6c, 0x6c, 0x54, 0xaa, 0xd7, 0xa4, 0xf8, 0x99, 0xef, 0x02, 0x94, 0x2a, 0x8b, 0xd5, 0x3a, 0xb1, + 0xcf, 0x06, 0x7f, 0x19, 0xbb, 0x0a, 0x49, 0x9a, 0x0a, 0x38, 0xf0, 0xa8, 0x48, 0xf9, 0xe0, 0xdc, + 0x26, 0xba, 0x04, 0x29, 0x9a, 0x25, 0x40, 0x07, 0x9f, 0x1d, 0x29, 0x0f, 0x49, 0x76, 0x92, 0xce, + 0xd0, 0xe5, 0x74, 0xe0, 0x61, 0x92, 0xf2, 0xc1, 0xb9, 0x4f, 0xa4, 0x40, 0x2e, 0x88, 0x32, 0x86, + 0x1f, 0xae, 0x28, 0x8f, 0xa0, 0x1d, 0xd1, 0x32, 0x64, 0x44, 0x60, 0x38, 0xec, 0xb8, 0x47, 0x79, + 0x68, 0x72, 0x92, 0xb0, 0x8b, 0x05, 0xf0, 0x07, 0x9f, 0x5d, 0x29, 0x0f, 0xc9, 0xb4, 0xa2, 0xba, + 0x7f, 0x18, 0x7f, 0xc8, 0x11, 0x8e, 0xf2, 0xb0, 0x64, 0x23, 0x61, 0x5a, 0x90, 0x1a, 0x19, 0x7e, + 0x22, 0xa7, 0x3c, 0x42, 0x12, 0x19, 0x6d, 0x02, 0x84, 0xc2, 0xf5, 0x11, 0x8e, 0xda, 0x94, 0x47, + 0x49, 0x0e, 0xa3, 0x35, 0xc8, 0xfa, 0xd1, 0xd3, 0xd0, 0x83, 0x2f, 0xe5, 0xe1, 0x59, 0x5a, 0xf4, + 0x5e, 0x18, 0x8f, 0x46, 0x0d, 0xa3, 0x1d, 0x67, 0x29, 0x8f, 0x98, 0x7e, 0x25, 0xf4, 0xa3, 0x21, + 0xc4, 0x68, 0xc7, 0x5b, 0xca, 0x23, 0x66, 0x63, 0xd1, 0xcb, 0x30, 0xd1, 0xeb, 0xe2, 0x8f, 0x7e, + 0xda, 0xa5, 0x7c, 0x88, 0xfc, 0x2c, 0x6a, 0x03, 0xea, 0x13, 0x1a, 0x1c, 0xe2, 0xf0, 0x4b, 0xf9, + 0x30, 0xe9, 0x5a, 0xd4, 0x84, 0x52, 0xb7, 0xbf, 0x3d, 0xea, 0x61, 0x98, 0xf2, 0xc8, 0xa9, 0x5b, + 0xf6, 0x95, 0xa8, 0x9f, 0x3e, 0xea, 0xe1, 0x98, 0xf2, 0xc8, 0x99, 0xdc, 0x11, 0x9f, 0x87, 0xe8, + 0x7f, 0xc6, 0x31, 0x38, 0xb5, 0xe8, 0x9f, 0x6b, 0xfc, 0xdd, 0xd3, 0xf0, 0x0e, 0xfe, 0xd0, 0x80, + 0xeb, 0x69, 0x37, 0x0c, 0x73, 0xc7, 0x7f, 0x21, 0x82, 0x97, 0xf9, 0x01, 0xc7, 0x23, 0xfc, 0x31, + 0x03, 0x51, 0x3b, 0xe4, 0x9d, 0x88, 0x81, 0xcf, 0x23, 0x0d, 0x3b, 0x8c, 0x3c, 0xfc, 0xf8, 0xe2, + 0xe0, 0x37, 0x28, 0xca, 0x43, 0x5e, 0xba, 0x18, 0x72, 0xea, 0xf2, 0xa0, 0x03, 0x9e, 0xf2, 0x07, + 0x63, 0x50, 0xbc, 0x62, 0xb8, 0x9e, 0xe5, 0x18, 0xba, 0xd6, 0xa2, 0x26, 0xe2, 0xdc, 0xa8, 0xb7, + 0x3b, 0xba, 0x0e, 0x81, 0x3c, 0x0b, 0xe9, 0x9b, 0x5a, 0x8b, 0x5d, 0xab, 0x08, 0xbf, 0x46, 0xd2, + 0xcd, 0xdb, 0x1e, 0x8f, 0x88, 0xa3, 0xc9, 0x9f, 0xa5, 0xe7, 0xb5, 0xdb, 0x6d, 0xc3, 0x65, 0xff, + 0x3f, 0xd8, 0xc3, 0x2e, 0x5a, 0x87, 0xa4, 0xa3, 0x79, 0x3c, 0x76, 0x59, 0x7c, 0x27, 0x7f, 0x89, + 0xe2, 0xa1, 0xe1, 0xef, 0x49, 0xcc, 0xf7, 0x3e, 0x56, 0x41, 0x29, 0xa1, 0xe7, 0x21, 0xdb, 0xd6, + 0xf6, 0x54, 0x4a, 0x35, 0xfe, 0x26, 0x50, 0xcd, 0xb4, 0xb5, 0x3d, 0xd2, 0x57, 0xb2, 0x50, 0x08, + 0x61, 0x7d, 0x57, 0x33, 0x77, 0x30, 0xa3, 0x9f, 0x78, 0x13, 0xe8, 0x8f, 0xb7, 0xb5, 0xbd, 0x2a, + 0xa5, 0x49, 0xbe, 0xb2, 0x90, 0xfd, 0xf0, 0xc7, 0x67, 0xc7, 0xe8, 0xb1, 0xe3, 0x5f, 0x8b, 0xf1, + 0x30, 0x95, 0xb2, 0x0b, 0xfd, 0x30, 0x48, 0xba, 0x5f, 0xa2, 0x9f, 0x17, 0x29, 0xfb, 0x87, 0x07, + 0x4d, 0x44, 0x17, 0xb3, 0x99, 0x37, 0xf9, 0xd5, 0xd7, 0x67, 0x63, 0x4a, 0x49, 0xef, 0x9a, 0x87, + 0x1a, 0xe4, 0x59, 0x92, 0x4c, 0xa5, 0x9e, 0x69, 0xfc, 0x10, 0x9e, 0x29, 0x30, 0x44, 0xd2, 0x14, + 0xea, 0xfd, 0x67, 0x63, 0x90, 0x5f, 0x0a, 0x3d, 0x33, 0x34, 0x0d, 0x99, 0xb6, 0x65, 0x1a, 0x37, + 0xb0, 0xe3, 0xef, 0xb6, 0xb0, 0x22, 0x71, 0x1e, 0xd9, 0xbf, 0x8b, 0xf1, 0xf6, 0xc5, 0x9b, 0x0b, + 0xa2, 0x4c, 0xb0, 0x6e, 0xe1, 0x2d, 0xd7, 0x10, 0xbc, 0x56, 0x44, 0x11, 0x9d, 0x04, 0xc9, 0xc5, + 0x7a, 0xc7, 0x31, 0xbc, 0x7d, 0x55, 0xb7, 0x4c, 0x4f, 0xd3, 0x3d, 0x9e, 0x13, 0x2d, 0x89, 0xfa, + 0x2a, 0xab, 0x26, 0x44, 0x9a, 0xd8, 0xd3, 0x8c, 0x16, 0x3b, 0xcc, 0x95, 0x53, 0x44, 0x31, 0xdc, + 0xdd, 0x4c, 0x38, 0xe8, 0xab, 0x82, 0x64, 0xd9, 0xd8, 0x89, 0x5c, 0x6a, 0x63, 0x12, 0x3a, 0xfd, + 0x9b, 0x9f, 0x7f, 0x6c, 0x8a, 0xb3, 0x9b, 0x6f, 0xad, 0xb3, 0x97, 0x75, 0x95, 0x92, 0xc0, 0x10, + 0xb7, 0xdd, 0x5e, 0x8c, 0xec, 0xb1, 0x74, 0xb6, 0x82, 0x8b, 0xf5, 0x53, 0x3d, 0x7c, 0xad, 0x98, + 0xfb, 0x8b, 0xd3, 0x5f, 0x09, 0x48, 0x07, 0x41, 0xe1, 0x35, 0xbc, 0x1f, 0xde, 0x70, 0xa1, 0x64, + 0x88, 0x6f, 0xfe, 0xb2, 0x66, 0xb4, 0xc4, 0x7f, 0xc1, 0x52, 0x78, 0x09, 0x2d, 0xf8, 0x09, 0x16, + 0xf6, 0xdf, 0xad, 0xe5, 0x41, 0x92, 0xb1, 0x68, 0x99, 0xcd, 0x68, 0x2e, 0x05, 0x6d, 0x40, 0xda, + 0xb3, 0x6e, 0x60, 0x93, 0x33, 0xe9, 0x50, 0x52, 0xdd, 0xe7, 0x35, 0x1c, 0x46, 0x0b, 0xed, 0x80, + 0xd4, 0xc4, 0x2d, 0xbc, 0xc3, 0xae, 0x64, 0xed, 0x6a, 0x0e, 0x66, 0xd7, 0x34, 0xbf, 0xdf, 0x55, + 0x53, 0xf2, 0xa9, 0x36, 0x28, 0x51, 0x74, 0x2d, 0xfa, 0xd0, 0x55, 0x86, 0xef, 0xb7, 0x0f, 0x18, + 0x7f, 0x48, 0x32, 0xc5, 0x79, 0x8f, 0xf0, 0x9b, 0x58, 0x27, 0x41, 0xea, 0x98, 0x5b, 0x96, 0x49, + 0xff, 0x57, 0x0d, 0x8f, 0x9a, 0xb2, 0x6c, 0x3b, 0xce, 0xaf, 0xe7, 0xdb, 0x71, 0xd7, 0xa0, 0x18, + 0x80, 0xd2, 0xb5, 0x93, 0x3b, 0xc4, 0xda, 0x19, 0xf7, 0x71, 0x49, 0x2b, 0xba, 0x02, 0x10, 0x2c, + 0x4c, 0x7f, 0xb7, 0x7e, 0xe8, 0xea, 0x16, 0x5b, 0x69, 0x01, 0x2e, 0x6a, 0xc1, 0x64, 0xdb, 0x30, + 0x55, 0x17, 0xb7, 0xb6, 0x55, 0xce, 0x2a, 0x42, 0x32, 0xff, 0x26, 0x4c, 0xed, 0x44, 0xdb, 0x30, + 0x1b, 0xb8, 0xb5, 0xbd, 0xe4, 0x93, 0x45, 0xef, 0x84, 0xe3, 0x01, 0x13, 0x2c, 0x53, 0xdd, 0xb5, + 0x5a, 0x4d, 0xd5, 0xc1, 0xdb, 0xaa, 0x4e, 0x5f, 0x38, 0x2a, 0x50, 0xd6, 0x1d, 0xf5, 0x41, 0xd6, + 0xcc, 0x2b, 0x56, 0xab, 0xa9, 0xe0, 0xed, 0x2a, 0x69, 0x46, 0x0f, 0x40, 0xc0, 0x06, 0xd5, 0x68, + 0xba, 0xd3, 0xe3, 0x73, 0x89, 0x13, 0x49, 0xa5, 0xe0, 0x57, 0xd6, 0x9b, 0xee, 0x42, 0xe1, 0x03, + 0x1f, 0x9f, 0x1d, 0xe3, 0xcb, 0x75, 0x4c, 0x5e, 0xa7, 0xef, 0x70, 0xf0, 0x95, 0x86, 0x5d, 0x74, + 0x0e, 0x72, 0x9a, 0x28, 0xb0, 0x9b, 0x1f, 0x07, 0xac, 0xd4, 0x00, 0x94, 0x29, 0x80, 0x57, 0x7f, + 0x67, 0x2e, 0x26, 0xff, 0x7c, 0x0c, 0xd2, 0x4b, 0xd7, 0xd7, 0x35, 0xc3, 0x41, 0x35, 0x98, 0x08, + 0x64, 0x76, 0xd4, 0xe5, 0x1f, 0x88, 0xb9, 0x58, 0xff, 0xb5, 0x41, 0x57, 0x63, 0x0f, 0x24, 0xd3, + 0x7d, 0x69, 0xb6, 0x6b, 0xe0, 0x35, 0xc8, 0xb0, 0x5e, 0xba, 0x68, 0x01, 0x52, 0x36, 0xf9, 0xc1, + 0x53, 0xfb, 0x33, 0x03, 0x65, 0x9d, 0xc2, 0xfb, 0xcf, 0x24, 0x10, 0x14, 0xf9, 0x7b, 0x31, 0x80, + 0xa5, 0xeb, 0xd7, 0x37, 0x1c, 0xc3, 0x6e, 0x61, 0xef, 0xcd, 0x1a, 0xf1, 0x32, 0xdc, 0x13, 0xba, + 0x7f, 0xe9, 0xe8, 0x23, 0x8f, 0x7a, 0x32, 0xb8, 0x81, 0xe9, 0xe8, 0x7d, 0xa9, 0x35, 0x5d, 0xcf, + 0xa7, 0x96, 0x18, 0x99, 0xda, 0x92, 0xeb, 0xf5, 0x67, 0x63, 0x03, 0xf2, 0xc1, 0xf0, 0x5d, 0xb4, + 0x04, 0x59, 0x8f, 0xff, 0xe6, 0xdc, 0x94, 0x07, 0x73, 0x53, 0xa0, 0x71, 0x8e, 0xfa, 0x98, 0xf2, + 0xff, 0x21, 0x4c, 0x0d, 0x16, 0xc5, 0x9f, 0x28, 0x31, 0x22, 0xea, 0x9d, 0xab, 0xdf, 0x37, 0xc3, + 0x69, 0xe1, 0xb4, 0xba, 0xb8, 0xfa, 0x5a, 0x1c, 0x26, 0x37, 0xc5, 0xa2, 0xfd, 0x13, 0xcb, 0x89, + 0x75, 0xc8, 0x60, 0xd3, 0x73, 0x0c, 0x2c, 0x76, 0xf1, 0x1e, 0x1f, 0x34, 0xd7, 0x7d, 0xc6, 0x42, + 0xff, 0x8f, 0xab, 0x78, 0xbc, 0x83, 0x93, 0xe9, 0xe2, 0xc2, 0xdf, 0x4f, 0xc0, 0xf4, 0x20, 0x4c, + 0xf4, 0x30, 0x94, 0x74, 0x07, 0xd3, 0x0a, 0x35, 0x92, 0xe4, 0x2e, 0x8a, 0x6a, 0x6e, 0x57, 0x56, + 0x80, 0xf8, 0x68, 0x44, 0xb0, 0x08, 0xe8, 0xa1, 0x9d, 0xb2, 0x62, 0x80, 0x4c, 0x2d, 0x0b, 0x86, + 0x92, 0x38, 0xb0, 0xbe, 0xa5, 0xb5, 0x34, 0x53, 0xbf, 0x1b, 0xe7, 0xb5, 0xd7, 0x16, 0x88, 0x53, + 0xf0, 0x8b, 0x8c, 0x26, 0xba, 0x0e, 0x19, 0x41, 0x3e, 0xf9, 0x26, 0x90, 0x17, 0xc4, 0xd0, 0xfd, + 0x50, 0x08, 0x9b, 0x08, 0xea, 0xa2, 0x24, 0x95, 0x7c, 0xc8, 0x42, 0x0c, 0xb3, 0x41, 0xe9, 0x03, + 0x6d, 0x50, 0xc8, 0x13, 0xfc, 0xd5, 0x04, 0x4c, 0x28, 0xb8, 0xf9, 0x83, 0x35, 0x6f, 0x3f, 0x04, + 0xc0, 0x56, 0x34, 0x51, 0xb4, 0x77, 0x31, 0x75, 0xbd, 0x1a, 0x22, 0xc7, 0xe8, 0x2d, 0xb9, 0xde, + 0xdb, 0x39, 0x79, 0x5f, 0x89, 0x43, 0x21, 0x3c, 0x79, 0x3f, 0x00, 0x96, 0x0d, 0xd5, 0x03, 0x7d, + 0xc6, 0x4e, 0x95, 0x9f, 0x1c, 0xa4, 0xcf, 0x7a, 0xc4, 0xfa, 0x60, 0x45, 0xf6, 0xed, 0x38, 0xa4, + 0xf9, 0x09, 0xaf, 0xab, 0x3d, 0x5e, 0x6e, 0x6c, 0xf4, 0xab, 0xbd, 0x5d, 0x4e, 0xee, 0x83, 0x50, + 0x24, 0x71, 0x74, 0xe4, 0xc4, 0x58, 0xec, 0xc4, 0x38, 0x0d, 0x84, 0x83, 0xf3, 0xcd, 0x68, 0x16, + 0xf2, 0x04, 0x2c, 0x50, 0xd5, 0x04, 0x06, 0xda, 0xda, 0x5e, 0x8d, 0xd5, 0xa0, 0xc7, 0x00, 0xed, + 0xfa, 0x99, 0x0d, 0x35, 0x60, 0x01, 0x81, 0x9b, 0x08, 0x5a, 0x04, 0xf8, 0x7d, 0x00, 0xa4, 0x17, + 0x2a, 0x7b, 0x8b, 0x93, 0x05, 0x82, 0x39, 0x52, 0xb3, 0x44, 0xdf, 0xe3, 0xfc, 0x11, 0xe6, 0x30, + 0x77, 0x85, 0xd8, 0x3c, 0x56, 0x59, 0x3e, 0xdc, 0x52, 0xf8, 0xf6, 0xeb, 0xb3, 0xe5, 0x7d, 0xad, + 0xdd, 0x5a, 0x90, 0xfb, 0x90, 0x94, 0xa9, 0x03, 0x1d, 0x0d, 0xcd, 0x43, 0x12, 0xfc, 0xc9, 0x18, + 0xa0, 0xc0, 0x68, 0xf8, 0x27, 0xb6, 0xaf, 0xd0, 0x73, 0xbc, 0xc2, 0x8d, 0x8f, 0x1d, 0x1c, 0x19, + 0x04, 0xf8, 0x22, 0x32, 0x08, 0xad, 0x88, 0x0b, 0x81, 0x8a, 0x16, 0xd7, 0xb3, 0xfb, 0x3c, 0xa4, + 0x3a, 0x5f, 0xb5, 0x0c, 0x81, 0x2d, 0xe0, 0xfd, 0x5e, 0x8e, 0xc9, 0xff, 0x2e, 0x06, 0xc7, 0x7a, + 0xa4, 0xc9, 0xef, 0xec, 0x7b, 0x01, 0x39, 0xa1, 0x46, 0xfe, 0xcf, 0xd0, 0x63, 0xfc, 0x22, 0xe2, + 0x21, 0x85, 0x73, 0xc2, 0xe9, 0x51, 0xc6, 0x6f, 0x91, 0x95, 0xe1, 0x0f, 0xac, 0xfe, 0xc3, 0x18, + 0x4c, 0x85, 0x3b, 0xe3, 0x0f, 0x6b, 0x15, 0x0a, 0xe1, 0xbe, 0xf0, 0x01, 0xbd, 0x63, 0x94, 0x01, + 0xf1, 0xb1, 0x44, 0xf0, 0xd1, 0x73, 0xc1, 0xc2, 0x65, 0x19, 0xb5, 0x27, 0x46, 0xe6, 0x8d, 0xbf, + 0x33, 0xd0, 0xb5, 0x80, 0x93, 0xc2, 0x0f, 0x4b, 0xae, 0x5b, 0x56, 0x0b, 0xfd, 0x29, 0x98, 0x30, + 0x2d, 0x4f, 0x25, 0x52, 0x8e, 0x9b, 0x2a, 0x0f, 0xef, 0x99, 0xf6, 0x7b, 0xee, 0x70, 0x2c, 0xfb, + 0xe6, 0xeb, 0xb3, 0xbd, 0xa4, 0xba, 0xf8, 0x58, 0x32, 0x2d, 0x6f, 0x91, 0xb6, 0x6f, 0xb0, 0xe0, + 0xdf, 0x81, 0xf1, 0xe8, 0xa7, 0x99, 0xb6, 0x5c, 0x39, 0xf4, 0xa7, 0xc7, 0x0f, 0xfa, 0x6c, 0x61, + 0x2b, 0xf4, 0x4d, 0xf6, 0xf4, 0xe4, 0x1f, 0x92, 0x79, 0xdc, 0x00, 0xe9, 0x7a, 0xf7, 0xd9, 0xb0, + 0x77, 0x43, 0xe6, 0xee, 0x8e, 0x99, 0x09, 0xb4, 0x53, 0x5f, 0x88, 0x01, 0x04, 0xd9, 0x13, 0xf4, + 0x28, 0x1c, 0x5d, 0x5c, 0x5b, 0x5d, 0x52, 0x1b, 0x1b, 0x95, 0x8d, 0xcd, 0x46, 0xf4, 0xd9, 0x6b, + 0xf1, 0x20, 0x88, 0x6b, 0x63, 0x9d, 0xfe, 0x03, 0x7a, 0xf4, 0x10, 0x4c, 0x45, 0xa1, 0x49, 0xa9, + 0xb6, 0x24, 0xc5, 0xca, 0x85, 0xdb, 0x77, 0xe6, 0xb2, 0xcc, 0x6b, 0xc4, 0x4d, 0x74, 0x02, 0xee, + 0xe9, 0x85, 0xab, 0xaf, 0x5e, 0x96, 0xe2, 0xe5, 0xf1, 0xdb, 0x77, 0xe6, 0x72, 0xbe, 0x7b, 0x89, + 0x64, 0x40, 0x61, 0x48, 0x4e, 0x2f, 0x51, 0x86, 0xdb, 0x77, 0xe6, 0xd2, 0x6c, 0x32, 0xca, 0xc9, + 0x0f, 0x7c, 0x72, 0x66, 0xec, 0xd4, 0x7b, 0x00, 0xea, 0xe6, 0xb6, 0xa3, 0xd1, 0xff, 0xfd, 0x8a, + 0xca, 0x70, 0xa4, 0xbe, 0x7a, 0x49, 0xa9, 0x54, 0x37, 0xea, 0x6b, 0xab, 0x5d, 0xaf, 0x75, 0x47, + 0xdb, 0x96, 0xd6, 0x36, 0x17, 0x97, 0x6b, 0x6a, 0xa3, 0x7e, 0x79, 0x95, 0x6d, 0xaf, 0x46, 0xda, + 0x9e, 0x5f, 0xdd, 0xa8, 0xaf, 0xd4, 0xa4, 0xf8, 0xe2, 0xa5, 0x81, 0x09, 0xfe, 0x47, 0x0f, 0x9c, + 0xe6, 0x3d, 0x3f, 0x81, 0x1f, 0xc9, 0xf0, 0xff, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x60, 0x19, + 0x3a, 0xd0, 0x93, 0x94, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -1866,6 +2180,12 @@ func (this *UnbondingDelegationEntry) Equal(that interface{}) bool { if !this.Balance.Equal(that1.Balance) { return false } + if this.UnbondingId != that1.UnbondingId { + return false + } + if this.UnbondingOnHoldRefCount != that1.UnbondingOnHoldRefCount { + return false + } return true } func (this *RedelegationEntry) Equal(that interface{}) bool { @@ -1899,6 +2219,12 @@ func (this *RedelegationEntry) Equal(that interface{}) bool { if !this.SharesDst.Equal(that1.SharesDst) { return false } + if this.UnbondingId != that1.UnbondingId { + return false + } + if this.UnbondingOnHoldRefCount != that1.UnbondingOnHoldRefCount { + return false + } return true } func (this *Params) Equal(that interface{}) bool { @@ -2213,6 +2539,29 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.UnbondingIds) > 0 { + dAtA5 := make([]byte, len(m.UnbondingIds)*10) + var j4 int + for _, num := range m.UnbondingIds { + for num >= 1<<7 { + dAtA5[j4] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j4++ + } + dAtA5[j4] = uint8(num) + j4++ + } + i -= j4 + copy(dAtA[i:], dAtA5[:j4]) + i = encodeVarintStaking(dAtA, i, uint64(j4)) + i-- + dAtA[i] = 0x6a + } + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x60 + } { size := m.MinSelfDelegation.Size() i -= size @@ -2233,12 +2582,12 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x52 - n5, err5 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.UnbondingTime):]) - if err5 != nil { - return 0, err5 + n7, err7 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.UnbondingTime):]) + if err7 != nil { + return 0, err7 } - i -= n5 - i = encodeVarintStaking(dAtA, i, uint64(n5)) + i -= n7 + i = encodeVarintStaking(dAtA, i, uint64(n7)) i-- dAtA[i] = 0x4a if m.UnbondingHeight != 0 { @@ -2618,6 +2967,16 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if m.UnbondingId != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingId)) + i-- + dAtA[i] = 0x28 + } { size := m.Balance.Size() i -= size @@ -2638,12 +2997,12 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error } i-- dAtA[i] = 0x1a - n8, err8 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) - if err8 != nil { - return 0, err8 + n10, err10 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) + if err10 != nil { + return 0, err10 } - i -= n8 - i = encodeVarintStaking(dAtA, i, uint64(n8)) + i -= n10 + i = encodeVarintStaking(dAtA, i, uint64(n10)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2674,6 +3033,16 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if m.UnbondingId != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingId)) + i-- + dAtA[i] = 0x28 + } { size := m.SharesDst.Size() i -= size @@ -2694,12 +3063,12 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n9, err9 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) - if err9 != nil { - return 0, err9 + n11, err11 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) + if err11 != nil { + return 0, err11 } - i -= n9 - i = encodeVarintStaking(dAtA, i, uint64(n9)) + i -= n11 + i = encodeVarintStaking(dAtA, i, uint64(n11)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2820,12 +3189,12 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x10 } - n10, err10 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingTime):]) - if err10 != nil { - return 0, err10 + n12, err12 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingTime):]) + if err12 != nil { + return 0, err12 } - i -= n10 - i = encodeVarintStaking(dAtA, i, uint64(n10)) + i -= n12 + i = encodeVarintStaking(dAtA, i, uint64(n12)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -3007,6 +3376,43 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ValidatorUpdates) 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 *ValidatorUpdates) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatorUpdates) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Updates) > 0 { + for iNdEx := len(m.Updates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Updates[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 encodeVarintStaking(dAtA []byte, offset int, v uint64) int { offset -= sovStaking(v) base := offset @@ -3127,6 +3533,16 @@ func (m *Validator) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.MinSelfDelegation.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } + if len(m.UnbondingIds) > 0 { + l = 0 + for _, e := range m.UnbondingIds { + l += sovStaking(uint64(e)) + } + n += 1 + sovStaking(uint64(l)) + l + } return n } @@ -3270,6 +3686,12 @@ func (m *UnbondingDelegationEntry) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.Balance.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingId != 0 { + n += 1 + sovStaking(uint64(m.UnbondingId)) + } + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } return n } @@ -3288,6 +3710,12 @@ func (m *RedelegationEntry) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.SharesDst.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingId != 0 { + n += 1 + sovStaking(uint64(m.UnbondingId)) + } + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } return n } @@ -3400,6 +3828,21 @@ func (m *Pool) Size() (n int) { return n } +func (m *ValidatorUpdates) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Updates) > 0 { + for _, e := range m.Updates { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + func sovStaking(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4375,6 +4818,101 @@ func (m *Validator) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UnbondingIds = append(m.UnbondingIds, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.UnbondingIds) == 0 { + m.UnbondingIds = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UnbondingIds = append(m.UnbondingIds, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingIds", wireType) + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5351,6 +5889,44 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + m.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5521,6 +6097,44 @@ func (m *RedelegationEntry) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + m.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -6396,6 +7010,90 @@ func (m *Pool) Unmarshal(dAtA []byte) error { } return nil } +func (m *ValidatorUpdates) 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: ValidatorUpdates: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatorUpdates: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Updates", 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.Updates = append(m.Updates, types3.ValidatorUpdate{}) + if err := m.Updates[len(m.Updates)-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 skipStaking(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 434589554b91..933d3bf1b162 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -48,17 +48,18 @@ func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey, descriptio } return Validator{ - OperatorAddress: operator.String(), - ConsensusPubkey: pkAny, - Jailed: false, - Status: Unbonded, - Tokens: math.ZeroInt(), - DelegatorShares: math.LegacyZeroDec(), - Description: description, - UnbondingHeight: int64(0), - UnbondingTime: time.Unix(0, 0).UTC(), - Commission: NewCommission(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()), - MinSelfDelegation: math.OneInt(), + OperatorAddress: operator.String(), + ConsensusPubkey: pkAny, + Jailed: false, + Status: Unbonded, + Tokens: math.ZeroInt(), + DelegatorShares: math.LegacyZeroDec(), + Description: description, + UnbondingHeight: int64(0), + UnbondingTime: time.Unix(0, 0).UTC(), + Commission: NewCommission(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()), + MinSelfDelegation: math.OneInt(), + UnbondingOnHoldRefCount: 0, }, nil } From fa25727645651a30440f212528c3c22eabc9a88f Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 29 Sep 2022 12:08:32 +0200 Subject: [PATCH 02/12] clean up docs --- x/evidence/README.md | 115 +------------------------------------------ x/slashing/README.md | 22 ++++----- x/staking/README.md | 2 +- 3 files changed, 14 insertions(+), 125 deletions(-) diff --git a/x/evidence/README.md b/x/evidence/README.md index 4ed007016c53..ee1b2cd09840 100644 --- a/x/evidence/README.md +++ b/x/evidence/README.md @@ -229,15 +229,7 @@ The Cosmos SDK handles two types of evidence inside the ABCI `BeginBlock`: The evidence module handles these two evidence types the same way. First, the Cosmos SDK converts the Tendermint concrete evidence type to an SDK `Evidence` interface using `Equivocation` as the concrete type. -```proto -// Equivocation implements the Evidence interface. -message Equivocation { - int64 height = 1; - google.protobuf.Timestamp time = 2; - int64 power = 3; - string consensus_address = 4; -} -``` ++++ https://github.com/cosmos/cosmos-sdk/blob/v0.46.1/proto/cosmos/evidence/v1beta1/evidence.proto#L11-L22 For some `Equivocation` submitted in `block` to be valid, it must satisfy: @@ -259,110 +251,7 @@ validator to ever re-enter the validator set. The `Equivocation` evidence is handled as follows: -```go -func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equivocation) { - logger := k.Logger(ctx) - consAddr := evidence.GetConsensusAddress() - - // calculate the age of the evidence - infractionHeight := evidence.GetHeight() - infractionTime := evidence.GetTime() - ageDuration := ctx.BlockHeader().Time.Sub(infractionTime) - ageBlocks := ctx.BlockHeader().Height - infractionHeight - - // Reject evidence if the double-sign is too old. Evidence is considered stale - // if the difference in time and number of blocks is greater than the allowed - // parameters defined. - cp := ctx.ConsensusParams() - if cp != nil && cp.Evidence != nil { - if ageDuration > cp.Evidence.MaxAgeDuration && ageBlocks > cp.Evidence.MaxAgeNumBlocks { - logger.Info( - "ignored equivocation; evidence too old", - "validator", consAddr, - "infraction_height", infractionHeight, - "max_age_num_blocks", cp.Evidence.MaxAgeNumBlocks, - "infraction_time", infractionTime, - "max_age_duration", cp.Evidence.MaxAgeDuration, - ) - return - } - } - - validator := k.stakingKeeper.ValidatorByConsAddr(ctx, consAddr) - if validator == nil || validator.IsUnbonded() { - // Defensive: Simulation doesn't take unbonding periods into account, and - // Tendermint might break this assumption at some point. - return - } - - if !validator.GetOperator().Empty() { - if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { - // Ignore evidence that cannot be handled. - // - // NOTE: We used to panic with: - // `panic(fmt.Sprintf("Validator consensus-address %v not found", consAddr))`, - // but this couples the expectations of the app to both Tendermint and - // the simulator. Both are expected to provide the full range of - // allowable but none of the disallowed evidence types. Instead of - // getting this coordination right, it is easier to relax the - // constraints and ignore evidence that cannot be handled. - return - } - } - - - if ok := k.slashingKeeper.HasValidatorSigningInfo(ctx, consAddr); !ok { - panic(fmt.Sprintf("expected signing info for validator %s but not found", consAddr)) - } - - // ignore if the validator is already tombstoned - if k.slashingKeeper.IsTombstoned(ctx, consAddr) { - logger.Info( - "ignored equivocation; validator already tombstoned", - "validator", consAddr, - "infraction_height", infractionHeight, - "infraction_time", infractionTime, - ) - return - } - - logger.Info( - "confirmed equivocation", - "validator", consAddr, - "infraction_height", infractionHeight, - "infraction_time", infractionTime, - ) - - // We need to retrieve the stake distribution which signed the block, so we - // subtract ValidatorUpdateDelay from the evidence height. - // Note, that this *can* result in a negative "distributionHeight", up to - // -ValidatorUpdateDelay, i.e. at the end of the - // pre-genesis block (none) = at the beginning of the genesis block. - // That's fine since this is just used to filter unbonding delegations & redelegations. - distributionHeight := infractionHeight - sdk.ValidatorUpdateDelay - - // Slash validator. The `power` is the int64 power of the validator as provided - // to/by Tendermint. This value is validator.Tokens as sent to Tendermint via - // ABCI, and now received as evidence. The fraction is passed in to separately - // to slash unbonding and rebonding delegations. - k.slashingKeeper.Slash( - ctx, - consAddr, - k.slashingKeeper.SlashFractionDoubleSign(ctx), - evidence.GetValidatorPower(), distributionHeight, - stakingtypes.DoubleSign, - ) - - // Jail the validator if not already jailed. This will begin unbonding the - // validator if not already unbonding (tombstoned). - if !validator.IsJailed() { - k.slashingKeeper.Jail(ctx, consAddr) - } - - k.slashingKeeper.JailUntil(ctx, consAddr, types.DoubleSignJailEndTime) - k.slashingKeeper.Tombstone(ctx, consAddr) -} -``` ++++ https://github.com/cosmos/cosmos-sdk/blob/83260b0c2f9afcc7ec94a102f83906e8e56ef18e/x/evidence/keeper/infraction.go#L26-L140 **Note:** The slashing, jailing, and tombstoning calls are delegated through the `x/slashing` module that emits informative events and finally delegates calls to the `x/staking` module. See documentation diff --git a/x/slashing/README.md b/x/slashing/README.md index 985f4ad84029..9fe5d5fea0f8 100644 --- a/x/slashing/README.md +++ b/x/slashing/README.md @@ -25,25 +25,25 @@ This module will be used by the Cosmos Hub, the first hub in the Cosmos ecosyste ## Contents * [Concepts](#concepts) - * [States](#states) - * [Tombstone Caps](#tombstone-caps) - * [Infraction Timelines](#infraction-timelines) + * [States](#states) + * [Tombstone Caps](#tombstone-caps) + * [Infraction Timelines](#infraction-timelines) * [State](#state) - * [Signing Info (Liveness)](#signing-info-liveness) - * [Params](#params) + * [Signing Info (Liveness)](#signing-info-liveness) + * [Params](#params) * [Messages](#messages) - * [Unjail](#unjail) + * [Unjail](#unjail) * [BeginBlock](#beginblock) - * [Liveness Tracking](#liveness-tracking) + * [Liveness Tracking](#liveness-tracking) * [Hooks](#hooks) * [Events](#events) * [Staking Tombstone](#staking-tombstone) * [Parameters](#parameters) * [CLI](#cli) - * [Query](#query) - * [Transactions](#transactions) - * [gRPC](#grpc) - * [REST](#rest) + * [Query](#query) + * [Transactions](#transactions) + * [gRPC](#grpc) + * [REST](#rest) diff --git a/x/staking/README.md b/x/staking/README.md index 4d3352fb5103..827df42b7394 100644 --- a/x/staking/README.md +++ b/x/staking/README.md @@ -808,7 +808,7 @@ following hooks can registered with staking: * `BeforeDelegationRemoved(Context, AccAddress, ValAddress) error` * called when a delegation is removed * `AfterUnbondingInitiated(Context, UnbondingID)` - * called when an unbonding operation (validator unbonding, unbonding delegation, redelegation) was initiated + * called when an unbonding operation (validator unbonding, unbonding delegation, redelegation) was initiated From a6e5fe2346bbf312cd473e0839a855d390f21208 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 4 Oct 2022 22:08:46 +0200 Subject: [PATCH 03/12] fix: fix IS tests (#13420) --- tests/go.mod | 2 +- .../staking/keeper/unbonding_test.go | 404 ++++++++++ x/staking/README.md | 12 +- x/staking/keeper/delegation.go | 20 +- x/staking/keeper/params.go | 8 +- x/staking/keeper/unbonding.go | 119 ++- x/staking/keeper/unbonding_test.go | 694 ++++++++---------- x/staking/keeper/val_state_change.go | 10 +- x/staking/keeper/validator.go | 1 - x/staking/types/delegation.go | 12 +- x/staking/types/keys.go | 8 +- x/staking/types/params_test.go | 2 +- 12 files changed, 790 insertions(+), 502 deletions(-) create mode 100644 tests/integration/staking/keeper/unbonding_test.go diff --git a/tests/go.mod b/tests/go.mod index 1796abb2164a..8709c2b14932 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -8,6 +8,7 @@ require ( cosmossdk.io/simapp v0.0.0-20220908203654-84d4bf5accad github.com/cosmos/cosmos-sdk v0.0.0-00010101000000-000000000000 github.com/cosmos/gogoproto v1.4.2 + github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 github.com/spf13/cobra v1.5.0 github.com/stretchr/testify v1.8.0 @@ -67,7 +68,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.0.1 // indirect diff --git a/tests/integration/staking/keeper/unbonding_test.go b/tests/integration/staking/keeper/unbonding_test.go new file mode 100644 index 000000000000..93203cb4198e --- /dev/null +++ b/tests/integration/staking/keeper/unbonding_test.go @@ -0,0 +1,404 @@ +package keeper_test + +import ( + "testing" + "time" + + "cosmossdk.io/math" + "cosmossdk.io/simapp" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + sdk "github.com/cosmos/cosmos-sdk/types" + banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/testutil" + "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" +) + +func SetupUnbondingTests(t *testing.T, app *simapp.SimApp, ctx sdk.Context, hookCalled *bool, ubdeID *uint64) (bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress) { + // setup hooks + mockCtrl := gomock.NewController(t) + mockStackingHooks := testutil.NewMockStakingHooks(mockCtrl) + mockStackingHooks.EXPECT().AfterDelegationModified(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().AfterUnbondingInitiated(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx sdk.Context, id uint64) error { + *hookCalled = true + // save id + *ubdeID = id + // call back to stop unbonding + err := app.StakingKeeper.PutUnbondingOnHold(ctx, id) + require.NoError(t, err) + + return nil + }).AnyTimes() + mockStackingHooks.EXPECT().AfterValidatorBeginUnbonding(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().AfterValidatorBonded(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().AfterValidatorCreated(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().AfterValidatorRemoved(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeDelegationCreated(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeDelegationRemoved(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeDelegationSharesModified(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeValidatorModified(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeValidatorSlashed(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + app.StakingKeeper.SetHooks(types.NewMultiStakingHooks(mockStackingHooks)) + + addrDels = simtestutil.AddTestAddrsIncremental(app.BankKeeper, app.StakingKeeper, ctx, 2, math.NewInt(10000)) + addrVals = simtestutil.ConvertAddrsToValAddrs(addrDels) + + valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) + startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) + + bondDenom = app.StakingKeeper.BondDenom(ctx) + notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) + + require.NoError(t, banktestutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) + app.BankKeeper.SendCoinsFromModuleToModule(ctx, types.BondedPoolName, types.NotBondedPoolName, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, startTokens))) + app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) + + // Create a validator + validator1 := testutil.NewValidator(t, addrVals[0], PKs[0]) + validator1, issuedShares1 := validator1.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares1.RoundInt()) + + validator1 = stakingkeeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator1, true) + require.True(math.IntEq(t, valTokens, validator1.BondedTokens())) + require.True(t, validator1.IsBonded()) + + // Create a delegator + delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares1) + app.StakingKeeper.SetDelegation(ctx, delegation) + + // Create a validator to redelegate to + validator2 := testutil.NewValidator(t, addrVals[1], PKs[1]) + validator2, issuedShares2 := validator2.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares2.RoundInt()) + + validator2 = stakingkeeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) + require.Equal(t, types.Bonded, validator2.Status) + require.True(t, validator2.IsBonded()) + + return +} + +func doUnbondingDelegation( + t *testing.T, + stakingKeeper *stakingkeeper.Keeper, + bankKeeper types.BankKeeper, + ctx sdk.Context, + bondDenom string, + addrDels []sdk.AccAddress, + addrVals []sdk.ValAddress, + hookCalled *bool, +) (completionTime time.Time, bondedAmt math.Int, notBondedAmt math.Int) { + // UNDELEGATE + // Save original bonded and unbonded amounts + bondedAmt1 := bankKeeper.GetBalance(ctx, stakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt1 := bankKeeper.GetBalance(ctx, stakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + var err error + completionTime, err = stakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) + require.NoError(t, err) + + // check that the unbonding actually happened + bondedAmt2 := bankKeeper.GetBalance(ctx, stakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt2 := bankKeeper.GetBalance(ctx, stakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + // Bonded amount is less + require.True(math.IntEq(t, bondedAmt1.SubRaw(1), bondedAmt2)) + // Unbonded amount is more + require.True(math.IntEq(t, notBondedAmt1.AddRaw(1), notBondedAmt2)) + + // Check that the unbonding happened- we look up the entry and see that it has the correct number of shares + unbondingDelegations := stakingKeeper.GetUnbondingDelegationsFromValidator(ctx, addrVals[0]) + require.Equal(t, math.NewInt(1), unbondingDelegations[0].Entries[0].Balance) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime, bondedAmt2, notBondedAmt2 +} + +func doRedelegation( + t *testing.T, + stakingKeeper *stakingkeeper.Keeper, + ctx sdk.Context, + addrDels []sdk.AccAddress, + addrVals []sdk.ValAddress, + hookCalled *bool, +) (completionTime time.Time) { + var err error + completionTime, err = stakingKeeper.BeginRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1], sdk.NewDec(1)) + require.NoError(t, err) + + // Check that the redelegation happened- we look up the entry and see that it has the correct number of shares + redelegations := stakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + require.Equal(t, sdk.NewDec(1), redelegations[0].Entries[0].SharesDst) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime +} + +func doValidatorUnbonding( + t *testing.T, + stakingKeeper *stakingkeeper.Keeper, + ctx sdk.Context, + addrVal sdk.ValAddress, + hookCalled *bool, +) (validator types.Validator) { + validator, found := stakingKeeper.GetValidator(ctx, addrVal) + require.True(t, found) + // Check that status is bonded + require.Equal(t, types.BondStatus(3), validator.Status) + + validator, err := stakingKeeper.BeginUnbondingValidator(ctx, validator) + require.NoError(t, err) + + // Check that status is unbonding + require.Equal(t, types.BondStatus(2), validator.Status) + + // check that our hook was called + require.True(t, *hookCalled) + + return validator +} + +func TestValidatorUnbondingOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + + _, app, ctx := createTestInput(t) + _, _, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + + // Start unbonding first validator + validator := doValidatorUnbonding(t, app.StakingKeeper, ctx, addrVals[0], &hookCalled) + + completionTime := validator.UnbondingTime + completionHeight := validator.UnbondingHeight + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Try to unbond validator + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that validator unbonding is not complete (is not mature yet) + validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator.Status) + unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 1, len(unbondingVals)) + require.Equal(t, validator.OperatorAddress, unbondingVals[0]) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) + ctx = ctx.WithBlockHeight(completionHeight + 1) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that validator unbonding is complete + validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 0, len(unbondingVals)) +} + +func TestValidatorUnbondingOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + var ubdeIDs []uint64 + + _, app, ctx := createTestInput(t) + _, _, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + + // Start unbonding first validator + validator1 := doValidatorUnbonding(t, app.StakingKeeper, ctx, addrVals[0], &hookCalled) + ubdeIDs = append(ubdeIDs, ubdeID) + + // Reset hookCalled flag + hookCalled = false + + // Start unbonding second validator + validator2 := doValidatorUnbonding(t, app.StakingKeeper, ctx, addrVals[1], &hookCalled) + ubdeIDs = append(ubdeIDs, ubdeID) + + // Check that there are two unbonding operations + require.Equal(t, 2, len(ubdeIDs)) + + // Check that both validators have same unbonding time + require.Equal(t, validator1.UnbondingTime, validator2.UnbondingTime) + + completionTime := validator1.UnbondingTime + completionHeight := validator1.UnbondingHeight + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) + ctx = ctx.WithBlockHeight(completionHeight + 1) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is not complete for both validators + validator1, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator1.Status) + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator2.Status) + unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 2, len(unbondingVals)) + require.Equal(t, validator1.OperatorAddress, unbondingVals[0]) + require.Equal(t, validator2.OperatorAddress, unbondingVals[1]) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[0]) + require.NoError(t, err) + + // Try again to unbond validators + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is complete for validator1, but not for validator2 + validator1, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator1.Status) + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator2.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 1, len(unbondingVals)) + require.Equal(t, validator2.OperatorAddress, unbondingVals[0]) + + // Unbonding for validator2 can complete + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[1]) + require.NoError(t, err) + + // Try again to unbond validators + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is complete for validator2 + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator2.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 0, len(unbondingVals)) +} + +func TestRedelegationOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + + _, app, ctx := createTestInput(t) + _, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + completionTime := doRedelegation(t, app.StakingKeeper, ctx, addrDels, addrVals, &hookCalled) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Redelegation is not complete - still exists + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err = app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) + require.NoError(t, err) + + // Redelegation is complete and record is gone + redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 0, len(redelegations)) +} + +func TestRedelegationOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + + _, app, ctx := createTestInput(t) + _, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + completionTime := doRedelegation(t, app.StakingKeeper, ctx, addrDels, addrVals, &hookCalled) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err := app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) + require.NoError(t, err) + + // Redelegation is not complete - still exists + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Redelegation is complete and record is gone + redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 0, len(redelegations)) +} + +func TestUnbondingDelegationOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + + _, app, ctx := createTestInput(t) + bondDenom, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app.StakingKeeper, app.BankKeeper, ctx, bondDenom, addrDels, addrVals, &hookCalled) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the + // unbondingDelegation has not completed + require.True(math.IntEq(t, bondedAmt1, bondedAmt3)) + require.True(math.IntEq(t, notBondedAmt1, notBondedAmt3)) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err = app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) + require.NoError(t, err) + + // Check that the unbonding was finally completed + bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + require.True(math.IntEq(t, bondedAmt1, bondedAmt5)) + // Not bonded amount back to what it was originaly + require.True(math.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +} + +func TestUnbondingDelegationOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + + _, app, ctx := createTestInput(t) + bondDenom, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app.StakingKeeper, app.BankKeeper, ctx, bondDenom, addrDels, addrVals, &hookCalled) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err := app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) + require.NoError(t, err) + + bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the + // unbondingDelegation has not completed + require.True(math.IntEq(t, bondedAmt1, bondedAmt3)) + require.True(math.IntEq(t, notBondedAmt1, notBondedAmt3)) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Check that the unbonding was finally completed + bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + require.True(math.IntEq(t, bondedAmt1, bondedAmt5)) + // Not bonded amount back to what it was originaly + require.True(math.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +} diff --git a/x/staking/README.md b/x/staking/README.md index 827df42b7394..c6bf1ff79e7f 100644 --- a/x/staking/README.md +++ b/x/staking/README.md @@ -80,13 +80,13 @@ Store entries prefixed with "Last" must remain unchanged until EndBlock. ValidatorUpdates contains the validator updates returned to ABCI at the end of every block. The values are overwritten in every block. -* ValidatorUpdates `0x51 -> []abci.ValidatorUpdate` +* ValidatorUpdates `0x61 -> []abci.ValidatorUpdate` -## UnbondingId +## UnbondingID -UnbondingId stores the ID of the latest unbonding operation. It enables to create unique IDs for unbonding operation, i.e., UnbondingId is incremented every time a new unbonding operation (validator unbonding, unbonding delegation, redelegation) is initiated. +UnbondingID stores the ID of the latest unbonding operation. It enables to create unique IDs for unbonding operation, i.e., UnbondingID is incremented every time a new unbonding operation (validator unbonding, unbonding delegation, redelegation) is initiated. -* UnbondingId: `0x37 -> uint64` +* UnbondingID: `0x37 -> uint64` ## Params @@ -126,14 +126,14 @@ records within a block. * ValidatorsByConsAddr: `0x22 | ConsAddrLen (1 byte) | ConsAddr -> OperatorAddr` * ValidatorsByPower: `0x23 | BigEndian(ConsensusPower) | OperatorAddrLen (1 byte) | OperatorAddr -> OperatorAddr` * LastValidatorsPower: `0x11 | OperatorAddrLen (1 byte) | OperatorAddr -> ProtocolBuffer(ConsensusPower)` -* ValidatorsByUnbondingId: `0x38 | UnbondingId -> 0x21 | OperatorAddrLen (1 byte) | OperatorAddr` +* ValidatorsByUnbondingID: `0x38 | UnbondingID -> 0x21 | OperatorAddrLen (1 byte) | OperatorAddr` `Validators` is the primary index - it ensures that each operator can have only one associated validator, where the public key of that validator can change in the future. Delegators can refer to the immutable operator of the validator, without concern for the changing public key. -`ValidatorsByUnbondingId` is an additional index that enables lookups for +`ValidatorsByUnbondingID` is an additional index that enables lookups for validators by the unbonding IDs corresponding to their current unbonding. `ValidatorByConsAddr` is an additional index that enables lookups for slashing. diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index 2f0410265287..dfc0168bcfe5 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -271,17 +271,17 @@ func (k Keeper) HasMaxUnbondingDelegationEntries(ctx sdk.Context, delegatorAddr // SetUnbondingDelegation sets the unbonding delegation and associated index. func (k Keeper) SetUnbondingDelegation(ctx sdk.Context, ubd types.UnbondingDelegation) { - delegatorAddress := sdk.MustAccAddressFromBech32(ubd.DelegatorAddress) + delAddr := sdk.MustAccAddressFromBech32(ubd.DelegatorAddress) store := ctx.KVStore(k.storeKey) bz := types.MustMarshalUBD(k.cdc, ubd) - addr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) if err != nil { panic(err) } - key := types.GetUBDKey(delegatorAddress, addr) + key := types.GetUBDKey(delAddr, valAddr) store.Set(key, bz) - store.Set(types.GetUBDByValIndexKey(delegatorAddress, addr), []byte{}) // index, store empty bytes + store.Set(types.GetUBDByValIndexKey(delAddr, valAddr), []byte{}) // index, store empty bytes } // RemoveUnbondingDelegation removes the unbonding delegation object and associated index. @@ -305,7 +305,7 @@ func (k Keeper) SetUnbondingDelegationEntry( creationHeight int64, minTime time.Time, balance math.Int, ) types.UnbondingDelegation { ubd, found := k.GetUnbondingDelegation(ctx, delegatorAddr, validatorAddr) - id := k.IncrementUnbondingId(ctx) + id := k.IncrementUnbondingID(ctx) if found { ubd.AddEntry(creationHeight, minTime, balance, id) } else { @@ -315,10 +315,10 @@ func (k Keeper) SetUnbondingDelegationEntry( k.SetUnbondingDelegation(ctx, ubd) // Add to the UBDByUnbondingOp index to look up the UBD by the UBDE ID - k.SetUnbondingDelegationByUnbondingId(ctx, ubd, id) + k.SetUnbondingDelegationByUnbondingID(ctx, ubd, id) // Call hook - k.AfterUnbondingInitiated(ctx, id) + k.Hooks().AfterUnbondingInitiated(ctx, id) return ubd } @@ -495,7 +495,7 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, sharesSrc, sharesDst sdk.Dec, ) types.Redelegation { red, found := k.GetRedelegation(ctx, delegatorAddr, validatorSrcAddr, validatorDstAddr) - id := k.IncrementUnbondingId(ctx) + id := k.IncrementUnbondingID(ctx) if found { red.AddEntry(creationHeight, minTime, balance, sharesDst, id) } else { @@ -506,10 +506,10 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, k.SetRedelegation(ctx, red) // Add to the UBDByEntry index to look up the UBD by the UBDE ID - k.SetRedelegationByUnbondingId(ctx, red, id) + k.SetRedelegationByUnbondingID(ctx, red, id) // Call hook - k.AfterUnbondingInitiated(ctx, id) + k.Hooks().AfterUnbondingInitiated(ctx, id) return red } diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index 89b6b823d0c0..6ee30f927a73 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -27,12 +27,12 @@ func (k Keeper) MaxEntries(ctx sdk.Context) uint32 { // HistoricalEntries = number of historical info entries // to persist in store -func (k Keeper) HistoricalEntries(ctx sdk.Context) (res uint32) { +func (k Keeper) HistoricalEntries(ctx sdk.Context) uint32 { return k.GetParams(ctx).HistoricalEntries } // BondDenom - Bondable coin denomination -func (k Keeper) BondDenom(ctx sdk.Context) (res string) { +func (k Keeper) BondDenom(ctx sdk.Context) string { return k.GetParams(ctx).BondDenom } @@ -70,9 +70,9 @@ func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { store := ctx.KVStore(k.storeKey) bz := store.Get(types.ParamsKey) if bz == nil { - return params + return } k.cdc.MustUnmarshal(bz, ¶ms) - return params + return } diff --git a/x/staking/keeper/unbonding.go b/x/staking/keeper/unbonding.go index 81f95f2b4a62..7249a610d561 100644 --- a/x/staking/keeper/unbonding.go +++ b/x/staking/keeper/unbonding.go @@ -9,25 +9,25 @@ import ( ) // Increments and returns a unique ID for an unbonding operation -func (k Keeper) IncrementUnbondingId(ctx sdk.Context) (unbondingId uint64) { +func (k Keeper) IncrementUnbondingID(ctx sdk.Context) (unbondingID uint64) { store := ctx.KVStore(k.storeKey) - bz := store.Get(types.UnbondingIdKey) + bz := store.Get(types.UnbondingIDKey) if bz == nil { - unbondingId = 0 + unbondingID = 0 } else { - unbondingId = binary.BigEndian.Uint64(bz) + unbondingID = binary.BigEndian.Uint64(bz) } - unbondingId = unbondingId + 1 + unbondingID++ // Convert back into bytes for storage bz = make([]byte, 8) - binary.BigEndian.PutUint64(bz, unbondingId) + binary.BigEndian.PutUint64(bz, unbondingID) - store.Set(types.UnbondingIdKey, bz) + store.Set(types.UnbondingIDKey, bz) - return unbondingId + return unbondingID } // Remove a mapping from UnbondingId to unbonding operation @@ -57,18 +57,16 @@ func (k Keeper) SetUnbondingType(ctx sdk.Context, id uint64, unbondingType types store.Set(types.GetUnbondingTypeKey(id), bz) } -// return a unbonding delegation that has an unbonding delegation entry with a certain ID -func (k Keeper) GetUnbondingDelegationByUnbondingId( - ctx sdk.Context, id uint64, -) (ubd types.UnbondingDelegation, found bool) { +// GetUnbondingDelegationByUnbondingID returns a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetUnbondingDelegationByUnbondingID(ctx sdk.Context, id uint64) (ubd types.UnbondingDelegation, found bool) { store := ctx.KVStore(k.storeKey) - ubdeKey := store.Get(types.GetUnbondingIndexKey(id)) - if ubdeKey == nil { + ubdKey := store.Get(types.GetUnbondingIndexKey(id)) + if ubdKey == nil { return types.UnbondingDelegation{}, false } - value := store.Get(ubdeKey) + value := store.Get(ubdKey) if value == nil { return types.UnbondingDelegation{}, false } @@ -82,10 +80,8 @@ func (k Keeper) GetUnbondingDelegationByUnbondingId( return ubd, true } -// return a unbonding delegation that has an unbonding delegation entry with a certain ID -func (k Keeper) GetRedelegationByUnbondingId( - ctx sdk.Context, id uint64, -) (red types.Redelegation, found bool) { +// GetRedelegationByUnbondingID returns a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetRedelegationByUnbondingID(ctx sdk.Context, id uint64) (red types.Redelegation, found bool) { store := ctx.KVStore(k.storeKey) redKey := store.Get(types.GetUnbondingIndexKey(id)) @@ -107,10 +103,8 @@ func (k Keeper) GetRedelegationByUnbondingId( return red, true } -// return the validator that is unbonding with a certain unbonding op ID -func (k Keeper) GetValidatorByUnbondingId( - ctx sdk.Context, id uint64, -) (val types.Validator, found bool) { +// GetValidatorByUnbondingID returns the validator that is unbonding with a certain unbonding op ID +func (k Keeper) GetValidatorByUnbondingID(ctx sdk.Context, id uint64) (val types.Validator, found bool) { store := ctx.KVStore(k.storeKey) valKey := store.Get(types.GetUnbondingIndexKey(id)) @@ -132,17 +126,11 @@ func (k Keeper) GetValidatorByUnbondingId( return val, true } -// Set an index to look up an UnbondingDelegation by the unbondingId of an UnbondingDelegationEntry that it contains -func (k Keeper) SetUnbondingDelegationByUnbondingId( - ctx sdk.Context, ubd types.UnbondingDelegation, id uint64, -) { +// SetUnbondingDelegationByUnbondingID sets an index to look up an UnbondingDelegation by the unbondingID of an UnbondingDelegationEntry that it contains +// Note, it does not set the unbonding delegation itself, use SetUnbondingDelegation(ctx, ubd) for that +func (k Keeper) SetUnbondingDelegationByUnbondingID(ctx sdk.Context, ubd types.UnbondingDelegation, id uint64) { store := ctx.KVStore(k.storeKey) - - delAddr, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) - if err != nil { - panic(err) - } - + delAddr := sdk.MustAccAddressFromBech32(ubd.DelegatorAddress) valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) if err != nil { panic(err) @@ -155,14 +143,12 @@ func (k Keeper) SetUnbondingDelegationByUnbondingId( k.SetUnbondingType(ctx, id, types.UnbondingType_UnbondingDelegation) } -// Set an index to look up an Redelegation by the unbondingId of an RedelegationEntry that it contains -func (k Keeper) SetRedelegationByUnbondingId(ctx sdk.Context, red types.Redelegation, id uint64) { +// SetRedelegationByUnbondingID sets an index to look up an Redelegation by the unbondingID of an RedelegationEntry that it contains +// Note, it does not set the redelegation itself, use SetRedelegation(ctx, red) for that +func (k Keeper) SetRedelegationByUnbondingID(ctx sdk.Context, red types.Redelegation, id uint64) { store := ctx.KVStore(k.storeKey) - delAddr, err := sdk.AccAddressFromBech32(red.DelegatorAddress) - if err != nil { - panic(err) - } + delAddr := sdk.MustAccAddressFromBech32(red.DelegatorAddress) valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) if err != nil { @@ -181,8 +167,9 @@ func (k Keeper) SetRedelegationByUnbondingId(ctx sdk.Context, red types.Redelega k.SetUnbondingType(ctx, id, types.UnbondingType_Redelegation) } -// Set an index to look up a Validator by the unbondingId corresponding to its current unbonding -func (k Keeper) SetValidatorByUnbondingId(ctx sdk.Context, val types.Validator, id uint64) { +// SetValidatorByUnbondingID sets an index to look up a Validator by the unbondingID corresponding to its current unbonding +// Note, it does not set the validator itself, use SetValidator(ctx, val) for that +func (k Keeper) SetValidatorByUnbondingID(ctx sdk.Context, val types.Validator, id uint64) { store := ctx.KVStore(k.storeKey) valAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress) @@ -199,8 +186,6 @@ func (k Keeper) SetValidatorByUnbondingId(ctx sdk.Context, val types.Validator, // unbondingDelegationEntryArrayIndex and redelegationEntryArrayIndex are utilities to find // at which position in the Entries array the entry with a given id is -// ---------------------------------------------------------------------------------------- - func unbondingDelegationEntryArrayIndex(ubd types.UnbondingDelegation, id uint64) (index int, found bool) { for i, entry := range ubd.Entries { // we find the entry with the right ID @@ -227,8 +212,6 @@ func redelegationEntryArrayIndex(red types.Redelegation, id uint64) (index int, // unbonding delegation, a redelegation, or a validator unbonding to complete. // In order for the unbonding operation with `id` to eventually complete, every call // to PutUnbondingOnHold(id) must be matched by a call to UnbondingCanComplete(id). -// ---------------------------------------------------------------------------------------- - func (k Keeper) UnbondingCanComplete(ctx sdk.Context, id uint64) error { unbondingType, found := k.GetUnbondingType(ctx, id) if !found { @@ -237,34 +220,31 @@ func (k Keeper) UnbondingCanComplete(ctx sdk.Context, id uint64) error { switch unbondingType { case types.UnbondingType_UnbondingDelegation: - err := k.unbondingDelegationEntryCanComplete(ctx, id) - if err != nil { + if err := k.unbondingDelegationEntryCanComplete(ctx, id); err != nil { return err } case types.UnbondingType_Redelegation: - err := k.redelegationEntryCanComplete(ctx, id) - if err != nil { + if err := k.redelegationEntryCanComplete(ctx, id); err != nil { return err } case types.UnbondingType_ValidatorUnbonding: - err := k.validatorUnbondingCanComplete(ctx, id) - if err != nil { + if err := k.validatorUnbondingCanComplete(ctx, id); err != nil { return err } + default: + return types.ErrUnbondingNotFound } - // If an entry was not found - return types.ErrUnbondingNotFound + return nil } func (k Keeper) unbondingDelegationEntryCanComplete(ctx sdk.Context, id uint64) error { - ubd, found := k.GetUnbondingDelegationByUnbondingId(ctx, id) + ubd, found := k.GetUnbondingDelegationByUnbondingID(ctx, id) if !found { return types.ErrUnbondingNotFound } i, found := unbondingDelegationEntryArrayIndex(ubd, id) - if !found { return types.ErrUnbondingNotFound } @@ -273,7 +253,7 @@ func (k Keeper) unbondingDelegationEntryCanComplete(ctx sdk.Context, id uint64) if !ubd.Entries[i].OnHold() { return sdkerrors.Wrapf( types.ErrUnbondingOnHoldRefCountNegative, - "undelegation unbondingId(%d), expecting UnbondingOnHoldRefCount > 0, got %T", + "undelegation unbondingID(%d), expecting UnbondingOnHoldRefCount > 0, got %T", id, ubd.Entries[i].UnbondingOnHoldRefCount, ) } @@ -317,7 +297,7 @@ func (k Keeper) unbondingDelegationEntryCanComplete(ctx sdk.Context, id uint64) } func (k Keeper) redelegationEntryCanComplete(ctx sdk.Context, id uint64) error { - red, found := k.GetRedelegationByUnbondingId(ctx, id) + red, found := k.GetRedelegationByUnbondingID(ctx, id) if !found { return types.ErrUnbondingNotFound } @@ -331,7 +311,7 @@ func (k Keeper) redelegationEntryCanComplete(ctx sdk.Context, id uint64) error { if !red.Entries[i].OnHold() { return sdkerrors.Wrapf( types.ErrUnbondingOnHoldRefCountNegative, - "redelegation unbondingId(%d), expecting UnbondingOnHoldRefCount > 0, got %T", + "redelegation unbondingID(%d), expecting UnbondingOnHoldRefCount > 0, got %T", id, red.Entries[i].UnbondingOnHoldRefCount, ) } @@ -357,7 +337,7 @@ func (k Keeper) redelegationEntryCanComplete(ctx sdk.Context, id uint64) error { } func (k Keeper) validatorUnbondingCanComplete(ctx sdk.Context, id uint64) error { - val, found := k.GetValidatorByUnbondingId(ctx, id) + val, found := k.GetValidatorByUnbondingID(ctx, id) if !found { return types.ErrUnbondingNotFound } @@ -379,7 +359,6 @@ func (k Keeper) validatorUnbondingCanComplete(ctx sdk.Context, id uint64) error // such as an unbonding delegation, a redelegation, or a validator unbonding. // In order for the unbonding operation with `id` to eventually complete, every call // to PutUnbondingOnHold(id) must be matched by a call to UnbondingCanComplete(id). -// ---------------------------------------------------------------------------------------- func (k Keeper) PutUnbondingOnHold(ctx sdk.Context, id uint64) error { unbondingType, found := k.GetUnbondingType(ctx, id) if !found { @@ -387,28 +366,26 @@ func (k Keeper) PutUnbondingOnHold(ctx sdk.Context, id uint64) error { } switch unbondingType { case types.UnbondingType_UnbondingDelegation: - err := k.putUnbondingDelegationEntryOnHold(ctx, id) - if err != nil { + if err := k.putUnbondingDelegationEntryOnHold(ctx, id); err != nil { return err } case types.UnbondingType_Redelegation: - err := k.putRedelegationEntryOnHold(ctx, id) - if err != nil { + if err := k.putRedelegationEntryOnHold(ctx, id); err != nil { return err } case types.UnbondingType_ValidatorUnbonding: - err := k.putValidatorOnHold(ctx, id) - if err != nil { + if err := k.putValidatorOnHold(ctx, id); err != nil { return err } + default: + return types.ErrUnbondingNotFound } - // If an entry was not found - return types.ErrUnbondingNotFound + return nil } func (k Keeper) putUnbondingDelegationEntryOnHold(ctx sdk.Context, id uint64) error { - ubd, found := k.GetUnbondingDelegationByUnbondingId(ctx, id) + ubd, found := k.GetUnbondingDelegationByUnbondingID(ctx, id) if !found { return types.ErrUnbondingNotFound } @@ -425,7 +402,7 @@ func (k Keeper) putUnbondingDelegationEntryOnHold(ctx sdk.Context, id uint64) er } func (k Keeper) putRedelegationEntryOnHold(ctx sdk.Context, id uint64) error { - red, found := k.GetRedelegationByUnbondingId(ctx, id) + red, found := k.GetRedelegationByUnbondingID(ctx, id) if !found { return types.ErrUnbondingNotFound } @@ -442,7 +419,7 @@ func (k Keeper) putRedelegationEntryOnHold(ctx sdk.Context, id uint64) error { } func (k Keeper) putValidatorOnHold(ctx sdk.Context, id uint64) error { - val, found := k.GetValidatorByUnbondingId(ctx, id) + val, found := k.GetValidatorByUnbondingID(ctx, id) if !found { return types.ErrUnbondingNotFound } diff --git a/x/staking/keeper/unbonding_test.go b/x/staking/keeper/unbonding_test.go index f598904ea928..0f2b396a3ab3 100644 --- a/x/staking/keeper/unbonding_test.go +++ b/x/staking/keeper/unbonding_test.go @@ -1,424 +1,332 @@ package keeper_test import ( - "testing" "time" - simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - "github.com/cosmos/cosmos-sdk/x/staking/teststaking" + "github.com/cosmos/cosmos-sdk/x/staking/testutil" "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/stretchr/testify/require" ) -type StakingHooksTemplate struct{} - -var _ types.StakingHooks = StakingHooksTemplate{} - -func (h StakingHooksTemplate) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error { - return nil -} -func (h StakingHooksTemplate) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) error { - return nil -} -func (h StakingHooksTemplate) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { - return nil -} - -type MockStakingHooks struct { - StakingHooksTemplate - afterUnbondingInitiated func(uint64) -} - -func (h MockStakingHooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { - h.afterUnbondingInitiated(id) - return nil +func (s *KeeperTestSuite) TestIncrementUnbondingID() { + for i := 1; i < 10; i++ { + s.Require().Equal(uint64(i), s.stakingKeeper.IncrementUnbondingID(s.ctx)) + } } -func (s *KeeperTestSuite) SetupUnbondingTests(t *testing.T, hookCalled *bool, ubdeID *uint64) ( - ctx sdk.Context, bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, -) { - ctx, keeper := s.ctx, s.stakingKeeper - // _, app, ctx = createTestInput() - - // stakingKeeper := keeper.NewKeeper( - // app.AppCodec(), - // app.GetKey(types.StoreKey), - // app.AccountKeeper, - // app.BankKeeper, - // app.GetSubspace(types.ModuleName), - // ) - - myHooks := MockStakingHooks{ - afterUnbondingInitiated: func(id uint64) { - *hookCalled = true - // save id - *ubdeID = id - // call back to stop unbonding - err := keeper.PutUnbondingOnHold(ctx, id) - require.NoError(t, err) +func (s *KeeperTestSuite) TestUnbondingTypeAccessors() { + cases := []struct { + exists bool + name string + expected types.UnbondingType + }{ + { + name: "existing 1", + exists: true, + expected: types.UnbondingType_UnbondingDelegation, + }, + { + name: "existing 2", + exists: true, + expected: types.UnbondingType_Redelegation, + }, + { + name: "not existing", + exists: false, }, } - keeper.SetHooks( - types.NewMultiStakingHooks(myHooks), - ) - - addrDels = simtestutil.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(10000)) - addrVals = simtestutil.ConvertAddrsToValAddrs(addrDels) - - valTokens := keeper.TokensFromConsensusPower(ctx, 10) - startTokens := keeper.TokensFromConsensusPower(ctx, 20) - - bondDenom = keeper.BondDenom(ctx) - notBondedPool := keeper.GetNotBondedPool(ctx) - - // require.NoError(t, banktestutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) - s.bankKeeper.SendCoinsFromModuleToModule(ctx, types.NotBondedPoolName, types.BondedPoolName, startTokens) - app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) - - // Create a validator - validator1 := teststaking.NewValidator(t, addrVals[0], PKs[0]) - validator1, issuedShares1 := validator1.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares1.RoundInt()) - - validator1 = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator1, true) - require.True(sdk.IntEq(t, valTokens, validator1.BondedTokens())) - require.True(t, validator1.IsBonded()) - - // Create a delegator - delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares1) - keeper.SetDelegation(ctx, delegation) - - // Create a validator to redelegate to - validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) - validator2, issuedShares2 := validator2.AddTokensFromDel(valTokens) - require.Equal(t, valTokens, issuedShares2.RoundInt()) - - validator2 = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator2, true) - require.Equal(t, types.Bonded, validator2.Status) - require.True(t, validator2.IsBonded()) - - return -} - -func doUnbondingDelegation( - t *testing.T, app *simtestutil.SimApp, ctx sdk.Context, bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, -) (completionTime time.Time, bondedAmt sdk.Int, notBondedAmt sdk.Int) { - // UNDELEGATE - // Save original bonded and unbonded amounts - bondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount - notBondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - - var err error - completionTime, err = app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) - require.NoError(t, err) - - // check that the unbonding actually happened - bondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount - notBondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - // Bonded amount is less - require.True(sdk.IntEq(t, bondedAmt1.SubRaw(1), bondedAmt2)) - // Unbonded amount is more - require.True(sdk.IntEq(t, notBondedAmt1.AddRaw(1), notBondedAmt2)) - - // Check that the unbonding happened- we look up the entry and see that it has the correct number of shares - unbondingDelegations := app.StakingKeeper.GetUnbondingDelegationsFromValidator(ctx, addrVals[0]) - require.Equal(t, sdk.NewInt(1), unbondingDelegations[0].Entries[0].Balance) - - // check that our hook was called - require.True(t, *hookCalled) - - return completionTime, bondedAmt2, notBondedAmt2 + for i, tc := range cases { + s.Run(tc.name, func() { + if tc.exists { + s.stakingKeeper.SetUnbondingType(s.ctx, uint64(i), tc.expected) + } + + unbondingType, found := s.stakingKeeper.GetUnbondingType(s.ctx, uint64(i)) + if tc.exists { + s.Require().True(found) + s.Require().Equal(tc.expected, unbondingType) + } else { + s.Require().False(found) + } + }) + } } -func doRedelegation( - t *testing.T, app *simtestutil.SimApp, ctx sdk.Context, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, -) (completionTime time.Time) { - var err error - completionTime, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1], sdk.NewDec(1)) - require.NoError(t, err) +func (s *KeeperTestSuite) TestUnbondingDelegationByUnbondingIDAccessors() { + delAddrs, valAddrs := createValAddrs(2) - // Check that the redelegation happened- we look up the entry and see that it has the correct number of shares - redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) - require.Equal(t, 1, len(redelegations)) - require.Equal(t, sdk.NewDec(1), redelegations[0].Entries[0].SharesDst) + type exists struct { + setUnbondingDelegation bool + setUnbondingDelegationByUnbondingID bool + } - // check that our hook was called - require.True(t, *hookCalled) + cases := []struct { + exists exists + name string + expected types.UnbondingDelegation + }{ + { + name: "existing 1", + exists: exists{true, true}, + expected: types.NewUnbondingDelegation( + delAddrs[0], + valAddrs[0], + 0, + time.Unix(0, 0).UTC(), + sdk.NewInt(5), + 0, + ), + }, + { + name: "not existing 1", + exists: exists{false, true}, + expected: types.NewUnbondingDelegation( + delAddrs[1], + valAddrs[1], + 0, + time.Unix(0, 0).UTC(), + sdk.NewInt(5), + 0, + ), + }, + { + name: "not existing 2", + exists: exists{false, false}, + expected: types.NewUnbondingDelegation( + delAddrs[0], + valAddrs[0], + 0, + time.Unix(0, 0).UTC(), + sdk.NewInt(5), + 0, + ), + }, + } - return completionTime + for i, tc := range cases { + s.Run(tc.name, func() { + if tc.exists.setUnbondingDelegation { + s.stakingKeeper.SetUnbondingDelegation(s.ctx, tc.expected) + } + + if tc.exists.setUnbondingDelegationByUnbondingID { + s.stakingKeeper.SetUnbondingDelegationByUnbondingID(s.ctx, tc.expected, uint64(i)) + } + + ubd, found := s.stakingKeeper.GetUnbondingDelegationByUnbondingID(s.ctx, uint64(i)) + if tc.exists.setUnbondingDelegation && tc.exists.setUnbondingDelegationByUnbondingID { + s.Require().True(found) + s.Require().Equal(tc.expected, ubd) + } else { + s.Require().False(found) + } + }) + } } -func doValidatorUnbonding( - t *testing.T, app *simtestutil.SimApp, ctx sdk.Context, addrVal sdk.ValAddress, hookCalled *bool, -) (validator types.Validator) { - validator, found := app.StakingKeeper.GetValidator(ctx, addrVal) - require.True(t, found) - // Check that status is bonded - require.Equal(t, types.BondStatus(3), validator.Status) - - validator, err := app.StakingKeeper.BeginUnbondingValidator(ctx, validator) - require.NoError(t, err) +func (s *KeeperTestSuite) TestRedelegationByUnbondingIDAccessors() { + delAddrs, valAddrs := createValAddrs(2) - // Check that status is unbonding - require.Equal(t, types.BondStatus(2), validator.Status) + type exists struct { + setRedelegation bool + setRedelegationByUnbondingID bool + } - // check that our hook was called - require.True(t, *hookCalled) + cases := []struct { + exists exists + name string + expected types.Redelegation + }{ + { + name: "existing 1", + exists: exists{true, true}, + expected: types.NewRedelegation( + delAddrs[0], + valAddrs[0], + valAddrs[1], + 0, + time.Unix(5, 0).UTC(), + sdk.NewInt(10), + math.LegacyNewDec(10), + 0, + ), + }, + { + name: "not existing 1", + exists: exists{false, true}, + expected: types.NewRedelegation( + delAddrs[1], + valAddrs[0], + valAddrs[1], + 0, + time.Unix(5, 0).UTC(), + sdk.NewInt(10), + math.LegacyNewDec(10), + 0, + ), + }, + { + name: "not existing 2", + exists: exists{false, false}, + expected: types.NewRedelegation( + delAddrs[1], + valAddrs[1], + valAddrs[0], + 0, + time.Unix(5, 0).UTC(), + sdk.NewInt(10), + math.LegacyNewDec(10), + 0, + ), + }, + } - return validator + for i, tc := range cases { + s.Run(tc.name, func() { + if tc.exists.setRedelegation { + s.stakingKeeper.SetRedelegation(s.ctx, tc.expected) + } + + if tc.exists.setRedelegationByUnbondingID { + s.stakingKeeper.SetRedelegationByUnbondingID(s.ctx, tc.expected, uint64(i)) + } + + red, found := s.stakingKeeper.GetRedelegationByUnbondingID(s.ctx, uint64(i)) + if tc.exists.setRedelegation && tc.exists.setRedelegationByUnbondingID { + s.Require().True(found) + s.Require().Equal(tc.expected, red) + } else { + s.Require().False(found) + } + }) + } } -func (s *KeeperTestSuite) TestValidatorUnbondingOnHold1(t *testing.T) { - var hookCalled bool - var ubdeID uint64 - - app, ctx, _, _, addrVals := s.SetupUnbondingTests(t, &hookCalled, &ubdeID) - - // Start unbonding first validator - validator := doValidatorUnbonding(t, app, ctx, addrVals[0], &hookCalled) - - completionTime := validator.UnbondingTime - completionHeight := validator.UnbondingHeight +func (s *KeeperTestSuite) TestValidatorByUnbondingIDAccessors() { + _, valAddrs := createValAddrs(3) - // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE - err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) - require.NoError(t, err) - - // Try to unbond validator - app.StakingKeeper.UnbondAllMatureValidators(ctx) - - // Check that validator unbonding is not complete (is not mature yet) - validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, types.Unbonding, validator.Status) - unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) - require.Equal(t, 1, len(unbondingVals)) - require.Equal(t, validator.OperatorAddress, unbondingVals[0]) + type exists struct { + setValidator bool + setValidatorByUnbondingID bool + } - // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE - ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) - ctx = ctx.WithBlockHeight(completionHeight + 1) - app.StakingKeeper.UnbondAllMatureValidators(ctx) + cases := []struct { + exists exists + name string + validator types.Validator + }{ + { + name: "existing 1", + exists: exists{true, true}, + validator: testutil.NewValidator(s.T(), valAddrs[0], PKs[0]), + }, + { + name: "not existing 1", + exists: exists{false, true}, + validator: testutil.NewValidator(s.T(), valAddrs[1], PKs[1]), + }, + { + name: "not existing 2", + exists: exists{false, false}, + validator: testutil.NewValidator(s.T(), valAddrs[2], PKs[0]), + }, + } - // Check that validator unbonding is complete - validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) - require.True(t, found) - require.Equal(t, types.Unbonded, validator.Status) - unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) - require.Equal(t, 0, len(unbondingVals)) + for i, tc := range cases { + s.Run(tc.name, func() { + if tc.exists.setValidator { + s.stakingKeeper.SetValidator(s.ctx, tc.validator) + } + + if tc.exists.setValidatorByUnbondingID { + s.stakingKeeper.SetValidatorByUnbondingID(s.ctx, tc.validator, uint64(i)) + } + + val, found := s.stakingKeeper.GetValidatorByUnbondingID(s.ctx, uint64(i)) + if tc.exists.setValidator && tc.exists.setValidatorByUnbondingID { + s.Require().True(found) + s.Require().Equal(tc.validator, val) + } else { + s.Require().False(found) + } + }) + } } -// func TestValidatorUnbondingOnHold2(t *testing.T) { -// var hookCalled bool -// var ubdeID uint64 -// var ubdeIDs []uint64 -// app, ctx, _, _, addrVals := setup(t, &hookCalled, &ubdeID) - -// // Start unbonding first validator -// validator1 := doValidatorUnbonding(t, app, ctx, addrVals[0], &hookCalled) -// ubdeIDs = append(ubdeIDs, ubdeID) - -// // Reset hookCalled flag -// hookCalled = false - -// // Start unbonding second validator -// validator2 := doValidatorUnbonding(t, app, ctx, addrVals[1], &hookCalled) -// ubdeIDs = append(ubdeIDs, ubdeID) - -// // Check that there are two unbonding operations -// require.Equal(t, 2, len(ubdeIDs)) - -// // Check that both validators have same unbonding time -// require.Equal(t, validator1.UnbondingTime, validator2.UnbondingTime) - -// completionTime := validator1.UnbondingTime -// completionHeight := validator1.UnbondingHeight - -// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE -// ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) -// ctx = ctx.WithBlockHeight(completionHeight + 1) -// app.StakingKeeper.UnbondAllMatureValidators(ctx) - -// // Check that unbonding is not complete for both validators -// validator1, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) -// require.True(t, found) -// require.Equal(t, types.Unbonding, validator1.Status) -// validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) -// require.True(t, found) -// require.Equal(t, types.Unbonding, validator2.Status) -// unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) -// require.Equal(t, 2, len(unbondingVals)) -// require.Equal(t, validator1.OperatorAddress, unbondingVals[0]) -// require.Equal(t, validator2.OperatorAddress, unbondingVals[1]) - -// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE -// err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[0]) -// require.NoError(t, err) - -// // Try again to unbond validators -// app.StakingKeeper.UnbondAllMatureValidators(ctx) - -// // Check that unbonding is complete for validator1, but not for validator2 -// validator1, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) -// require.True(t, found) -// require.Equal(t, types.Unbonded, validator1.Status) -// validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) -// require.True(t, found) -// require.Equal(t, types.Unbonding, validator2.Status) -// unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) -// require.Equal(t, 1, len(unbondingVals)) -// require.Equal(t, validator2.OperatorAddress, unbondingVals[0]) - -// // Unbonding for validator2 can complete -// err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[1]) -// require.NoError(t, err) - -// // Try again to unbond validators -// app.StakingKeeper.UnbondAllMatureValidators(ctx) - -// // Check that unbonding is complete for validator2 -// validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) -// require.True(t, found) -// require.Equal(t, types.Unbonded, validator2.Status) -// unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) -// require.Equal(t, 0, len(unbondingVals)) -// } - -// func TestRedelegationOnHold1(t *testing.T) { -// var hookCalled bool -// var ubdeID uint64 -// app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) -// completionTime := doRedelegation(t, app, ctx, addrDels, addrVals, &hookCalled) - -// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE -// err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) -// require.NoError(t, err) - -// // Redelegation is not complete - still exists -// redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) -// require.Equal(t, 1, len(redelegations)) - -// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE -// ctx = ctx.WithBlockTime(completionTime) -// _, err = app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) -// require.NoError(t, err) - -// // Redelegation is complete and record is gone -// redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) -// require.Equal(t, 0, len(redelegations)) -// } - -// func TestRedelegationOnHold2(t *testing.T) { -// var hookCalled bool -// var ubdeID uint64 -// app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) -// completionTime := doRedelegation(t, app, ctx, addrDels, addrVals, &hookCalled) - -// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE -// ctx = ctx.WithBlockTime(completionTime) -// _, err := app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) -// require.NoError(t, err) - -// // Redelegation is not complete - still exists -// redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) -// require.Equal(t, 1, len(redelegations)) - -// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE -// err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) -// require.NoError(t, err) - -// // Redelegation is complete and record is gone -// redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) -// require.Equal(t, 0, len(redelegations)) -// } - -// func TestUnbondingDelegationOnHold1(t *testing.T) { -// var hookCalled bool -// var ubdeID uint64 -// app, ctx, bondDenom, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) -// completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app, ctx, bondDenom, addrDels, addrVals, &hookCalled) - -// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE -// err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) -// require.NoError(t, err) - -// bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount -// notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - -// // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the -// // unbondingDelegation has not completed -// require.True(sdk.IntEq(t, bondedAmt1, bondedAmt3)) -// require.True(sdk.IntEq(t, notBondedAmt1, notBondedAmt3)) - -// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE -// ctx = ctx.WithBlockTime(completionTime) -// _, err = app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) -// require.NoError(t, err) - -// // Check that the unbonding was finally completed -// bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount -// notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - -// require.True(sdk.IntEq(t, bondedAmt1, bondedAmt5)) -// // Not bonded amount back to what it was originaly -// require.True(sdk.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) -// } - -// func TestUnbondingDelegationOnHold2(t *testing.T) { -// var hookCalled bool -// var ubdeID uint64 -// app, ctx, bondDenom, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) -// completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app, ctx, bondDenom, addrDels, addrVals, &hookCalled) - -// // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE -// ctx = ctx.WithBlockTime(completionTime) -// _, err := app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) -// require.NoError(t, err) - -// bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount -// notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - -// // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the -// // unbondingDelegation has not completed -// require.True(sdk.IntEq(t, bondedAmt1, bondedAmt3)) -// require.True(sdk.IntEq(t, notBondedAmt1, notBondedAmt3)) - -// // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE -// err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) -// require.NoError(t, err) - -// // Check that the unbonding was finally completed -// bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount -// notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount - -// require.True(sdk.IntEq(t, bondedAmt1, bondedAmt5)) -// // Not bonded amount back to what it was originaly -// require.True(sdk.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) -// } +func (s *KeeperTestSuite) TestUnbondingCanComplete() { + delAddrs, valAddrs := createValAddrs(3) + unbondingID := uint64(1) + + // no unbondingID set + err := s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingNotFound) + + // unbonding delegation + s.stakingKeeper.SetUnbondingType(s.ctx, unbondingID, types.UnbondingType_UnbondingDelegation) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingNotFound) + + ubd := types.NewUnbondingDelegation( + delAddrs[0], + valAddrs[0], + 0, + time.Unix(0, 0).UTC(), + sdk.NewInt(5), + unbondingID, + ) + s.stakingKeeper.SetUnbondingDelegation(s.ctx, ubd) + s.stakingKeeper.SetUnbondingDelegationByUnbondingID(s.ctx, ubd, unbondingID) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingOnHoldRefCountNegative) + + err = s.stakingKeeper.PutUnbondingOnHold(s.ctx, unbondingID) + s.Require().NoError(err) + s.bankKeeper.EXPECT().UndelegateCoinsFromModuleToAccount(s.ctx, types.NotBondedPoolName, delAddrs[0], sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(5)))).Return(nil) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().NoError(err) + + // redelegation + unbondingID++ + s.stakingKeeper.SetUnbondingType(s.ctx, unbondingID, types.UnbondingType_Redelegation) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingNotFound) + + red := types.NewRedelegation( + delAddrs[0], + valAddrs[0], + valAddrs[1], + 0, + time.Unix(5, 0).UTC(), + sdk.NewInt(10), + math.LegacyNewDec(10), + unbondingID, + ) + s.stakingKeeper.SetRedelegation(s.ctx, red) + s.stakingKeeper.SetRedelegationByUnbondingID(s.ctx, red, unbondingID) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingOnHoldRefCountNegative) + + err = s.stakingKeeper.PutUnbondingOnHold(s.ctx, unbondingID) + s.Require().NoError(err) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().NoError(err) + + // validator unbonding + unbondingID++ + s.stakingKeeper.SetUnbondingType(s.ctx, unbondingID, types.UnbondingType_ValidatorUnbonding) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingNotFound) + + val := testutil.NewValidator(s.T(), valAddrs[0], PKs[0]) + s.stakingKeeper.SetValidator(s.ctx, val) + s.stakingKeeper.SetValidatorByUnbondingID(s.ctx, val, unbondingID) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingOnHoldRefCountNegative) + + err = s.stakingKeeper.PutUnbondingOnHold(s.ctx, unbondingID) + s.Require().NoError(err) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().NoError(err) +} diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index c805a0575783..d5f64cf343d3 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -232,7 +232,7 @@ func (k Keeper) bondedToUnbonding(ctx sdk.Context, validator types.Validator) (t panic(fmt.Sprintf("bad state transition bondedToUnbonding, validator: %v\n", validator)) } - return k.beginUnbondingValidator(ctx, validator) + return k.BeginUnbondingValidator(ctx, validator) } func (k Keeper) unbondingToBonded(ctx sdk.Context, validator types.Validator) (types.Validator, error) { @@ -310,7 +310,7 @@ func (k Keeper) bondValidator(ctx sdk.Context, validator types.Validator) (types } // perform all the store operations for when a validator begins unbonding -func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { +func (k Keeper) BeginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { params := k.GetParams(ctx) // delete the validator by power index, as the key will change @@ -321,7 +321,7 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat panic(fmt.Sprintf("should not already be unbonded or unbonding, validator: %v\n", validator)) } - id := k.IncrementUnbondingId(ctx) + id := k.IncrementUnbondingID(ctx) validator = validator.UpdateStatus(types.Unbonding) @@ -348,9 +348,9 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat return validator, err } - k.SetValidatorByUnbondingId(ctx, validator, id) + k.SetValidatorByUnbondingID(ctx, validator, id) - k.AfterUnbondingInitiated(ctx, id) + k.Hooks().AfterUnbondingInitiated(ctx, id) return validator, nil } diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index 79ccdd015b68..35a9f74aa240 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -417,7 +417,6 @@ func (k Keeper) ValidatorQueueIterator(ctx sdk.Context, endTime time.Time, endHe // UnbondAllMatureValidators unbonds all the mature unbonding validators that // have finished their unbonding period. func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { - blockTime := ctx.BlockTime() blockHeight := ctx.BlockHeight() diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index 7b577e875c06..d763ce2c7cd4 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -92,13 +92,13 @@ func (d Delegations) String() (out string) { return strings.TrimSpace(out) } -func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, id uint64) UnbondingDelegationEntry { +func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, unbondingID uint64) UnbondingDelegationEntry { return UnbondingDelegationEntry{ CreationHeight: creationHeight, CompletionTime: completionTime, InitialBalance: balance, Balance: balance, - UnbondingId: id, + UnbondingId: unbondingID, UnbondingOnHoldRefCount: 0, } } @@ -157,7 +157,7 @@ func NewUnbondingDelegation( } // AddEntry - append entry to the unbonding delegation -func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, id uint64) { +func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, unbondingID uint64) { // Check the entries exists with creation_height and complete_time entryIndex := -1 for index, ubdEntry := range ubd.Entries { @@ -176,7 +176,7 @@ func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time ubd.Entries[entryIndex] = ubdEntry } else { // append the new unbond delegation entry - entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance, id) + entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance, unbondingID) ubd.Entries = append(ubd.Entries, entry) } } @@ -406,10 +406,10 @@ func NewRedelegationResponse( // NewRedelegationEntryResponse creates a new RedelegationEntryResponse instance. func NewRedelegationEntryResponse( - creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance math.Int, id uint64, + creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance math.Int, unbondingID uint64, ) RedelegationEntryResponse { return RedelegationEntryResponse{ - RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst, id), + RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst, unbondingID), Balance: balance, } } diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index 3d3aba807529..387190628943 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -42,7 +42,7 @@ var ( 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 - UnbondingIdKey = []byte{0x37} // key for the counter for the incrementing id for UnbondingOperations + UnbondingIDKey = []byte{0x37} // key for the counter for the incrementing id for UnbondingOperations UnbondingIndexKey = []byte{0x38} // prefix for an index for looking up unbonding operations by their IDs UnbondingTypeKey = []byte{0x39} // prefix for an index containing the type of unbonding operations @@ -50,13 +50,13 @@ var ( 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 - ValidatorUpdatesKey = []byte{0x51} // prefix for the end block validator updates key + HistoricalInfoKey = []byte{0x60} // prefix for the historical info + ValidatorUpdatesKey = []byte{0x61} // prefix for the end block validator updates key ParamsKey = []byte{0x51} // prefix for parameters for module x/staking ) -// TODO: Cosmos-SDK team- Is this the way I should do an enum? Is this the right place to do it? +// UnbondingType defines the type of unbonding operation type UnbondingType int const ( diff --git a/x/staking/types/params_test.go b/x/staking/types/params_test.go index d76ac7902f9e..6f0b3a79d8c5 100644 --- a/x/staking/types/params_test.go +++ b/x/staking/types/params_test.go @@ -23,7 +23,7 @@ func TestParamsEqual(t *testing.T) { require.False(t, ok) } -func Test_validateParams(t *testing.T) { +func TestValidateParams(t *testing.T) { params := types.DefaultParams() // default params have no error From 944c3f6599d8f2e919e475647e70ef32d640b249 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 4 Oct 2022 22:13:27 +0200 Subject: [PATCH 04/12] revert key update --- x/staking/types/keys.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index 387190628943..7b76bc2d9173 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -50,7 +50,7 @@ var ( RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue - HistoricalInfoKey = []byte{0x60} // prefix for the historical info + HistoricalInfoKey = []byte{0x50} // prefix for the historical info ValidatorUpdatesKey = []byte{0x61} // prefix for the end block validator updates key ParamsKey = []byte{0x51} // prefix for parameters for module x/staking From eddaaf3c33165a192e71c7fae80b837825cc91e1 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 4 Oct 2022 23:14:54 +0200 Subject: [PATCH 05/12] add hook error handling --- x/staking/keeper/delegation.go | 8 ++++++-- x/staking/keeper/val_state_change.go | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index dfc0168bcfe5..704ec9b0ab78 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -318,7 +318,9 @@ func (k Keeper) SetUnbondingDelegationEntry( k.SetUnbondingDelegationByUnbondingID(ctx, ubd, id) // Call hook - k.Hooks().AfterUnbondingInitiated(ctx, id) + if err := k.Hooks().AfterUnbondingInitiated(ctx, id); err != nil { + k.Logger(ctx).Error("failed to call after unbonding initiated hook", "error", err) + } return ubd } @@ -509,7 +511,9 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, k.SetRedelegationByUnbondingID(ctx, red, id) // Call hook - k.Hooks().AfterUnbondingInitiated(ctx, id) + if err := k.Hooks().AfterUnbondingInitiated(ctx, id); err != nil { + k.Logger(ctx).Error("failed to call after unbonding initiated hook", "error", err) + } return red } diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index d5f64cf343d3..b45eb4ba8cbd 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -350,7 +350,9 @@ func (k Keeper) BeginUnbondingValidator(ctx sdk.Context, validator types.Validat k.SetValidatorByUnbondingID(ctx, validator, id) - k.Hooks().AfterUnbondingInitiated(ctx, id) + if err := k.Hooks().AfterUnbondingInitiated(ctx, id); err != nil { + return validator, err + } return validator, nil } From 3092a517a7828b02ffdcbf08cf64bef7cd7dc460 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 4 Oct 2022 23:28:23 +0200 Subject: [PATCH 06/12] impl feedback --- x/staking/keeper/unbonding.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/x/staking/keeper/unbonding.go b/x/staking/keeper/unbonding.go index 7249a610d561..275b4fda70b8 100644 --- a/x/staking/keeper/unbonding.go +++ b/x/staking/keeper/unbonding.go @@ -12,10 +12,7 @@ import ( func (k Keeper) IncrementUnbondingID(ctx sdk.Context) (unbondingID uint64) { store := ctx.KVStore(k.storeKey) bz := store.Get(types.UnbondingIDKey) - - if bz == nil { - unbondingID = 0 - } else { + if bz != nil { unbondingID = binary.BigEndian.Uint64(bz) } From ad41ab4c1e7e58e6fe68d223fc393fd630c4d87d Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Tue, 4 Oct 2022 23:33:59 +0200 Subject: [PATCH 07/12] add changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37d4f1654db0..7b1f25ac45cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Features +* (x/staking) [#13122](https://github.com/cosmos/cosmos-sdk/pull/13122) Add `UnbondingCanComplete` and `PutUnbondingOnHold` to `x/staking` module. * [#13437](https://github.com/cosmos/cosmos-sdk/pull/13437) Add new flag `--modules-to-export` in `simd export` command to export only selected modules. * [#13435](https://github.com/cosmos/cosmos-sdk/pull/13435) Extend error context when a simulation fails. * [#13298](https://github.com/cosmos/cosmos-sdk/pull/13298) Add `AddGenesisAccount` helper func in x/auth module which helps adding accounts to genesis state. @@ -98,6 +99,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### API Breaking Changes +* (x/slashing, x/staking) [#13122](https://github.com/cosmos/cosmos-sdk/pull/13122) Add the infraction a validator commited type as an argument to the `Slash` keeper method. * [#13437](https://github.com/cosmos/cosmos-sdk/pull/13437) Add a list of modules to export argument in `ExportAppStateAndValidators` and `ExportGenesis`. * (x/slashing) [#13427](https://github.com/cosmos/cosmos-sdk/pull/13427) Move `x/slashing/testslashing` to `x/slashing/testutil` for consistency with other modules. * (x/staking) [#13427](https://github.com/cosmos/cosmos-sdk/pull/13427) Move `x/staking/teststaking` to `x/staking/testutil` for consistency with other modules. From 4bef02659314c22c143bd4acb1459d63e48ad283 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 7 Oct 2022 16:11:31 +0200 Subject: [PATCH 08/12] implements style nits Co-authored-by: Aleksandr Bezobchuk --- .../staking/keeper/unbonding_test.go | 40 ++++++++++++------- x/slashing/types/expected_keepers.go | 2 +- x/staking/keeper/delegation.go | 2 - x/staking/keeper/keeper.go | 2 + x/staking/keeper/params.go | 4 +- x/staking/keeper/validator.go | 7 ++-- 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/tests/integration/staking/keeper/unbonding_test.go b/tests/integration/staking/keeper/unbonding_test.go index 93203cb4198e..f3601337222d 100644 --- a/tests/integration/staking/keeper/unbonding_test.go +++ b/tests/integration/staking/keeper/unbonding_test.go @@ -76,8 +76,6 @@ func SetupUnbondingTests(t *testing.T, app *simapp.SimApp, ctx sdk.Context, hook validator2 = stakingkeeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) require.Equal(t, types.Bonded, validator2.Status) require.True(t, validator2.IsBonded()) - - return } func doUnbondingDelegation( @@ -165,8 +163,10 @@ func doValidatorUnbonding( } func TestValidatorUnbondingOnHold1(t *testing.T) { - var hookCalled bool - var ubdeID uint64 + var ( + hookCalled bool + ubdeID uint64 + ) _, app, ctx := createTestInput(t) _, _, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) @@ -206,9 +206,11 @@ func TestValidatorUnbondingOnHold1(t *testing.T) { } func TestValidatorUnbondingOnHold2(t *testing.T) { - var hookCalled bool - var ubdeID uint64 - var ubdeIDs []uint64 + var ( + hookCalled bool + ubdeID uint64 + ubdeIDs []uint64 + ) _, app, ctx := createTestInput(t) _, _, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) @@ -284,8 +286,10 @@ func TestValidatorUnbondingOnHold2(t *testing.T) { } func TestRedelegationOnHold1(t *testing.T) { - var hookCalled bool - var ubdeID uint64 + var ( + hookCalled bool + ubdeID uint64 + ) _, app, ctx := createTestInput(t) _, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) @@ -310,8 +314,10 @@ func TestRedelegationOnHold1(t *testing.T) { } func TestRedelegationOnHold2(t *testing.T) { - var hookCalled bool - var ubdeID uint64 + var ( + hookCalled bool + ubdeID uint64 + ) _, app, ctx := createTestInput(t) _, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) @@ -336,8 +342,10 @@ func TestRedelegationOnHold2(t *testing.T) { } func TestUnbondingDelegationOnHold1(t *testing.T) { - var hookCalled bool - var ubdeID uint64 + var ( + hookCalled bool + ubdeID uint64 + ) _, app, ctx := createTestInput(t) bondDenom, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) @@ -370,8 +378,10 @@ func TestUnbondingDelegationOnHold1(t *testing.T) { } func TestUnbondingDelegationOnHold2(t *testing.T) { - var hookCalled bool - var ubdeID uint64 + var ( + hookCalled bool + ubdeID uint64 + ) _, app, ctx := createTestInput(t) bondDenom, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) diff --git a/x/slashing/types/expected_keepers.go b/x/slashing/types/expected_keepers.go index 1f00036f9e98..5698c08ae2f7 100644 --- a/x/slashing/types/expected_keepers.go +++ b/x/slashing/types/expected_keepers.go @@ -53,7 +53,7 @@ type StakingKeeper interface { // MaxValidators returns the maximum amount of bonded validators MaxValidators(sdk.Context) uint32 - // return if the validator is jailed + // IsValidatorJailed returns if the validator is jailed. IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool } diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index 704ec9b0ab78..23cb929099e8 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -317,7 +317,6 @@ func (k Keeper) SetUnbondingDelegationEntry( // Add to the UBDByUnbondingOp index to look up the UBD by the UBDE ID k.SetUnbondingDelegationByUnbondingID(ctx, ubd, id) - // Call hook if err := k.Hooks().AfterUnbondingInitiated(ctx, id); err != nil { k.Logger(ctx).Error("failed to call after unbonding initiated hook", "error", err) } @@ -510,7 +509,6 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, // Add to the UBDByEntry index to look up the UBD by the UBDE ID k.SetRedelegationByUnbondingID(ctx, red, id) - // Call hook if err := k.Hooks().AfterUnbondingInitiated(ctx, id); err != nil { k.Logger(ctx).Error("failed to call after unbonding initiated hook", "error", err) } diff --git a/x/staking/keeper/keeper.go b/x/staking/keeper/keeper.go index 97ca845e5712..fb61ea58b8af 100644 --- a/x/staking/keeper/keeper.go +++ b/x/staking/keeper/keeper.go @@ -124,7 +124,9 @@ func (k Keeper) SetValidatorUpdates(ctx sdk.Context, valUpdates []abci.Validator func (k Keeper) GetValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { store := ctx.KVStore(k.storeKey) bz := store.Get(types.ValidatorUpdatesKey) + var valUpdates types.ValidatorUpdates k.cdc.MustUnmarshal(bz, &valUpdates) + return valUpdates.Updates } diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index 6ee30f927a73..99e30d26ce7f 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -70,9 +70,9 @@ func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { store := ctx.KVStore(k.storeKey) bz := store.Get(types.ParamsKey) if bz == nil { - return + return params } k.cdc.MustUnmarshal(bz, ¶ms) - return + return params } diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index 35a9f74aa240..ce97aa10ed86 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -182,7 +182,6 @@ func (k Keeper) RemoveValidator(ctx sdk.Context, address sdk.ValAddress) { store.Delete(types.GetValidatorByConsAddrKey(valConsAddr)) store.Delete(types.GetValidatorsByPowerIndexKey(validator, k.PowerReduction(ctx))) - // call hooks if err := k.Hooks().AfterValidatorRemoved(ctx, valConsAddr, validator.GetOperator()); err != nil { k.Logger(ctx).Error("error in after validator removed hook", "error", err) } @@ -460,6 +459,7 @@ func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { for _, id := range val.UnbondingIds { k.DeleteUnbondingIndex(ctx, id) } + val = k.UnbondingToUnbonded(ctx, val) if val.GetDelegatorShares().IsZero() { k.RemoveValidator(ctx, val.GetOperator()) @@ -467,6 +467,7 @@ func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { // remove unbonding ids val.UnbondingIds = []uint64{} } + // remove validator from queue k.DeleteValidatorQueue(ctx, val) } @@ -476,8 +477,8 @@ func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { } func (k Keeper) IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool { - v, f := k.GetValidatorByConsAddr(ctx, addr) - if !f { + v, ok := k.GetValidatorByConsAddr(ctx, addr) + if !ok { return false } From e53aa43f434dacdfd65c19e5e782830c2d7e0392 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 7 Oct 2022 16:14:26 +0200 Subject: [PATCH 09/12] more nits --- x/staking/keeper/validator.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index ce97aa10ed86..d1315ed7793f 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -461,6 +461,7 @@ func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { } val = k.UnbondingToUnbonded(ctx, val) + if val.GetDelegatorShares().IsZero() { k.RemoveValidator(ctx, val.GetOperator()) } else { From ad791816bbc456dd3ebc72b62b8da745f1f78bdd Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 7 Oct 2022 16:54:56 +0200 Subject: [PATCH 10/12] fix tests Co-authored-by: Simon --- tests/integration/slashing/keeper/keeper_test.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/integration/slashing/keeper/keeper_test.go b/tests/integration/slashing/keeper/keeper_test.go index 28a49a647e8d..a17a521e8fb0 100644 --- a/tests/integration/slashing/keeper/keeper_test.go +++ b/tests/integration/slashing/keeper/keeper_test.go @@ -290,9 +290,11 @@ func (s *KeeperTestSuite) TestValidatorDippingInAndOut() { // shouldn't be jailed/kicked yet tstaking.CheckValidator(valAddr, stakingtypes.Bonded, false) - // validator misses an additional 500 more blocks, after the cooling off period of SignedBlockWindow (here 1000 blocks). + // validator misses an additional 500 more blocks within the SignedBlockWindow (here 1000 blocks). latest := s.slashingKeeper.SignedBlocksWindow(ctx) + height - for ; height < latest+s.slashingKeeper.MinSignedPerWindow(ctx); height++ { + // misses 500 blocks + within the signing windows i.e. 700-1700 + // validators misses all 1000 block of a SignedBlockWindows + for ; height < latest+1; height++ { ctx = ctx.WithBlockHeight(height) s.slashingKeeper.HandleValidatorSignature(ctx, val.Address(), newPower, false) } @@ -305,8 +307,8 @@ func (s *KeeperTestSuite) TestValidatorDippingInAndOut() { signInfo, found := s.slashingKeeper.GetValidatorSigningInfo(ctx, consAddr) s.Require().True(found) s.Require().Equal(int64(700), signInfo.StartHeight) - s.Require().Equal(int64(499), signInfo.MissedBlocksCounter) - s.Require().Equal(int64(499), signInfo.IndexOffset) + s.Require().Equal(int64(0), signInfo.MissedBlocksCounter) + s.Require().Equal(int64(0), signInfo.IndexOffset) // some blocks pass height = int64(5000) From caa6904e185d7de37c8605b59cfc37c185b4b1ba Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 7 Oct 2022 17:03:58 +0200 Subject: [PATCH 11/12] add godoc --- tests/integration/staking/keeper/unbonding_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/integration/staking/keeper/unbonding_test.go b/tests/integration/staking/keeper/unbonding_test.go index f3601337222d..56c4c530de63 100644 --- a/tests/integration/staking/keeper/unbonding_test.go +++ b/tests/integration/staking/keeper/unbonding_test.go @@ -16,6 +16,7 @@ import ( "github.com/stretchr/testify/require" ) +// SetupUnbondingTests creates two validators and setup mocked staking hooks for testing unbonding func SetupUnbondingTests(t *testing.T, app *simapp.SimApp, ctx sdk.Context, hookCalled *bool, ubdeID *uint64) (bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress) { // setup hooks mockCtrl := gomock.NewController(t) @@ -76,6 +77,8 @@ func SetupUnbondingTests(t *testing.T, app *simapp.SimApp, ctx sdk.Context, hook validator2 = stakingkeeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) require.Equal(t, types.Bonded, validator2.Status) require.True(t, validator2.IsBonded()) + + return bondDenom, addrDels, addrVals } func doUnbondingDelegation( From 8e86c27f52cae433f436388ac6f038f7b55fdf55 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Sat, 8 Oct 2022 01:55:01 +0200 Subject: [PATCH 12/12] add godoc --- x/staking/keeper/slash.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index 1089c26ad68a..156bb73aee08 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -30,6 +30,9 @@ import ( // // Infraction was committed at the current height or at a past height, // not at a height in the future +// --- +// +// Slash implementation doesn't require the infraction (types.Infraction) to work but the IS one does. It is here to have IS satisfy the Slash signature. func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeight int64, power int64, slashFactor sdk.Dec, _ types.Infraction) math.Int { logger := k.Logger(ctx)