Fix ListValidatorBalances RPC API (#3846)

* begin by adding pagination

* utilize pagination properly for balances

* db addition

* latest balances test

* completed tests

* fix pagination tests

* all tests passing

* ethapis compatibility

* proper handling if no filters specified
This commit is contained in:
Raul Jordan 2019-11-02 17:03:35 -05:00 committed by GitHub
parent 8977e5088e
commit be1b90d511
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 541 additions and 172 deletions

View File

@ -1202,7 +1202,7 @@ go_repository(
go_repository(
name = "com_github_prysmaticlabs_ethereumapis",
commit = "b4ca5785e074dd8fed39f18a61aae0318b57b4b0",
commit = "cb09854edc557d3f5752def5316a595e2f07ba27",
importpath = "github.com/prysmaticlabs/ethereumapis",
)

View File

@ -242,9 +242,15 @@ func (bs *BeaconChainServer) ListValidatorBalances(
ctx context.Context,
req *ethpb.GetValidatorBalancesRequest) (*ethpb.ValidatorBalances, error) {
res := make([]*ethpb.ValidatorBalances_Balance, 0, len(req.PublicKeys)+len(req.Indices))
if int(req.PageSize) > params.BeaconConfig().MaxPageSize {
return nil, status.Errorf(codes.InvalidArgument, "requested page size %d can not be greater than max size %d",
req.PageSize, params.BeaconConfig().MaxPageSize)
}
res := make([]*ethpb.ValidatorBalances_Balance, 0)
filtered := map[uint64]bool{} // track filtered validators to prevent duplication in the response.
headState := bs.headFetcher.HeadState()
var requestingGenesis bool
var epoch uint64
switch q := req.QueryFilter.(type) {
@ -253,11 +259,11 @@ func (bs *BeaconChainServer) ListValidatorBalances(
case *ethpb.GetValidatorBalancesRequest_Genesis:
requestingGenesis = q.Genesis
default:
epoch = helpers.CurrentEpoch(headState)
}
var balances []uint64
var err error
headState := bs.headFetcher.HeadState()
validators := headState.Validators
if requestingGenesis {
balances, err = bs.beaconDB.ArchivedBalances(ctx, 0 /* genesis epoch */)
@ -319,7 +325,29 @@ func (bs *BeaconChainServer) ListValidatorBalances(
})
}
}
return &ethpb.ValidatorBalances{Balances: res}, nil
if len(req.Indices) == 0 && len(req.PublicKeys) == 0 {
// return everything.
for i := 0; i < len(headState.Balances); i++ {
res = append(res, &ethpb.ValidatorBalances_Balance{
PublicKey: headState.Validators[i].PublicKey,
Index: uint64(i),
Balance: balances[i],
})
}
}
balancesCount := len(res)
start, end, nextPageToken, err := pagination.StartAndEndPage(req.PageToken, int(req.PageSize), balancesCount)
if err != nil {
return nil, err
}
return &ethpb.ValidatorBalances{
Epoch: epoch,
Balances: res[start:end],
TotalSize: int32(balancesCount),
NextPageToken: nextPageToken,
}, nil
}
// GetValidators retrieves the current list of active validators with an optional historical epoch flag to

View File

@ -479,7 +479,46 @@ func TestBeaconChainServer_AttestationPool(t *testing.T) {
}
}
func TestBeaconChainServer_ListValidatorBalances(t *testing.T) {
func TestBeaconChainServer_ListValidatorBalances_PaginationOutOfRange(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
setupValidators(t, db, 3)
headState, err := db.HeadState(context.Background())
if err != nil {
t.Fatal(err)
}
bs := &BeaconChainServer{
headFetcher: &mock.ChainService{
State: headState,
},
}
req := &ethpb.GetValidatorBalancesRequest{PageToken: strconv.Itoa(1), PageSize: 100}
wanted := fmt.Sprintf("page start %d >= list %d", req.PageSize, len(headState.Balances))
if _, err := bs.ListValidatorBalances(context.Background(), req); err != nil && !strings.Contains(err.Error(), wanted) {
t.Errorf("Expected error %v, received %v", wanted, err)
}
}
func TestBeaconChainServer_ListValidatorBalances_ExceedsMaxPageSize(t *testing.T) {
bs := &BeaconChainServer{}
exceedsMax := int32(params.BeaconConfig().MaxPageSize + 1)
wanted := fmt.Sprintf(
"requested page size %d can not be greater than max size %d",
exceedsMax,
params.BeaconConfig().MaxPageSize,
)
req := &ethpb.GetValidatorBalancesRequest{PageToken: strconv.Itoa(0), PageSize: exceedsMax}
if _, err := bs.ListValidatorBalances(context.Background(), req); err != nil && !strings.Contains(err.Error(), wanted) {
t.Errorf("Expected error %v, received %v", wanted, err)
}
}
func TestBeaconChainServer_ListValidatorBalances_NoPagination(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
@ -500,46 +539,135 @@ func TestBeaconChainServer_ListValidatorBalances(t *testing.T) {
res *ethpb.ValidatorBalances
}{
{req: &ethpb.GetValidatorBalancesRequest{PublicKeys: [][]byte{{99}}},
res: &ethpb.ValidatorBalances{Balances: []*ethpb.ValidatorBalances_Balance{{
Index: 99, PublicKey: []byte{99}, Balance: 99}},
}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 99, PublicKey: []byte{99}, Balance: 99},
},
NextPageToken: strconv.Itoa(1),
TotalSize: 1,
},
},
{req: &ethpb.GetValidatorBalancesRequest{Indices: []uint64{1, 2, 3}},
res: &ethpb.ValidatorBalances{Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 1, PublicKey: []byte{1}, Balance: 1},
{Index: 2, PublicKey: []byte{2}, Balance: 2},
{Index: 3, PublicKey: []byte{3}, Balance: 3}},
}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 1, PublicKey: []byte{1}, Balance: 1},
{Index: 2, PublicKey: []byte{2}, Balance: 2},
{Index: 3, PublicKey: []byte{3}, Balance: 3},
},
NextPageToken: strconv.Itoa(1),
TotalSize: 3,
},
},
{req: &ethpb.GetValidatorBalancesRequest{PublicKeys: [][]byte{{10}, {11}, {12}}},
res: &ethpb.ValidatorBalances{Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 10, PublicKey: []byte{10}, Balance: 10},
{Index: 11, PublicKey: []byte{11}, Balance: 11},
{Index: 12, PublicKey: []byte{12}, Balance: 12}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 10, PublicKey: []byte{10}, Balance: 10},
{Index: 11, PublicKey: []byte{11}, Balance: 11},
{Index: 12, PublicKey: []byte{12}, Balance: 12},
},
NextPageToken: strconv.Itoa(1),
TotalSize: 3,
}},
{req: &ethpb.GetValidatorBalancesRequest{PublicKeys: [][]byte{{2}, {3}}, Indices: []uint64{3, 4}}, // Duplication
res: &ethpb.ValidatorBalances{Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 2, PublicKey: []byte{2}, Balance: 2},
{Index: 3, PublicKey: []byte{3}, Balance: 3},
{Index: 4, PublicKey: []byte{4}, Balance: 4}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 2, PublicKey: []byte{2}, Balance: 2},
{Index: 3, PublicKey: []byte{3}, Balance: 3},
{Index: 4, PublicKey: []byte{4}, Balance: 4},
},
NextPageToken: strconv.Itoa(1),
TotalSize: 3,
}},
{req: &ethpb.GetValidatorBalancesRequest{PublicKeys: [][]byte{{}}, Indices: []uint64{3, 4}}, // Public key has a blank value
res: &ethpb.ValidatorBalances{Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 3, PublicKey: []byte{3}, Balance: 3},
{Index: 4, PublicKey: []byte{4}, Balance: 4}},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{Index: 3, PublicKey: []byte{3}, Balance: 3},
{Index: 4, PublicKey: []byte{4}, Balance: 4},
},
NextPageToken: strconv.Itoa(1),
TotalSize: 2,
}},
}
for _, test := range tests {
res, err := bs.ListValidatorBalances(context.Background(), test.req)
if err != nil {
t.Fatal(err)
}
if !proto.Equal(res, test.res) {
t.Error("Incorrect respond of validator balances")
t.Errorf("Expected %v, received %v", test.res, res)
}
}
}
func TestBeaconChainServer_ListValidatorBalancesOutOfRange(t *testing.T) {
func TestBeaconChainServer_ListValidatorBalances_Pagination(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
count := 1000
setupValidators(t, db, count)
headState, err := db.HeadState(context.Background())
if err != nil {
t.Fatal(err)
}
bs := &BeaconChainServer{
headFetcher: &mock.ChainService{
State: headState,
},
}
tests := []struct {
req *ethpb.GetValidatorBalancesRequest
res *ethpb.ValidatorBalances
}{
{req: &ethpb.GetValidatorBalancesRequest{PageToken: strconv.Itoa(1), PageSize: 3},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{PublicKey: []byte{3}, Index: 3, Balance: uint64(3)},
{PublicKey: []byte{4}, Index: 4, Balance: uint64(4)},
{PublicKey: []byte{5}, Index: 5, Balance: uint64(5)}},
NextPageToken: strconv.Itoa(2),
TotalSize: int32(count)}},
{req: &ethpb.GetValidatorBalancesRequest{PageToken: strconv.Itoa(10), PageSize: 5},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{PublicKey: []byte{50}, Index: 50, Balance: uint64(50)},
{PublicKey: []byte{51}, Index: 51, Balance: uint64(51)},
{PublicKey: []byte{52}, Index: 52, Balance: uint64(52)},
{PublicKey: []byte{53}, Index: 53, Balance: uint64(53)},
{PublicKey: []byte{54}, Index: 54, Balance: uint64(54)}},
NextPageToken: strconv.Itoa(11),
TotalSize: int32(count)}},
{req: &ethpb.GetValidatorBalancesRequest{PageToken: strconv.Itoa(33), PageSize: 3},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{PublicKey: []byte{99}, Index: 99, Balance: uint64(99)},
{PublicKey: []byte{100}, Index: 100, Balance: uint64(100)},
{PublicKey: []byte{101}, Index: 101, Balance: uint64(101)},
},
NextPageToken: strconv.Itoa(34),
TotalSize: int32(count)}},
{req: &ethpb.GetValidatorBalancesRequest{PageSize: 2},
res: &ethpb.ValidatorBalances{
Balances: []*ethpb.ValidatorBalances_Balance{
{PublicKey: []byte{0}, Index: 0, Balance: uint64(0)},
{PublicKey: []byte{1}, Index: 1, Balance: uint64(1)}},
NextPageToken: strconv.Itoa(1),
TotalSize: int32(count)}},
}
for _, test := range tests {
res, err := bs.ListValidatorBalances(context.Background(), test.req)
if err != nil {
t.Fatal(err)
}
if !proto.Equal(res, test.res) {
t.Errorf("Expected %v, received %v", test.res, res)
}
}
}
func TestBeaconChainServer_ListValidatorBalances_OutOfRange(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
setupValidators(t, db, 1)
@ -561,7 +689,7 @@ func TestBeaconChainServer_ListValidatorBalancesOutOfRange(t *testing.T) {
}
}
func TestBeaconChainServer_ListValidatorBalancesFromArchive(t *testing.T) {
func TestBeaconChainServer_ListValidatorBalances_FromArchive(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
ctx := context.Background()
@ -609,7 +737,7 @@ func TestBeaconChainServer_ListValidatorBalancesFromArchive(t *testing.T) {
}
}
func TestBeaconChainServer_ListValidatorBalancesFromArchive_NewValidatorNotFound(t *testing.T) {
func TestBeaconChainServer_ListValidatorBalances_FromArchive_NewValidatorNotFound(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
ctx := context.Background()
@ -1896,7 +2024,9 @@ func setupValidators(t *testing.T, db db.Database, count int) ([]*ethpb.Validato
t.Fatal(err)
}
balances[i] = uint64(i)
validators = append(validators, &ethpb.Validator{PublicKey: []byte{byte(i)}})
validators = append(validators, &ethpb.Validator{
PublicKey: []byte{byte(i)},
})
}
blk := &ethpb.BeaconBlock{
Slot: 0,

View File

@ -5,13 +5,12 @@ package db
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
github_com_prysmaticlabs_go_bitfield "github.com/prysmaticlabs/go-bitfield"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -5,11 +5,10 @@ package ethereum_beacon_p2p_v1
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -5,13 +5,12 @@ package ethereum_beacon_p2p_v1
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
github_com_prysmaticlabs_go_bitfield "github.com/prysmaticlabs/go-bitfield"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -7,14 +7,13 @@ import (
context "context"
encoding_binary "encoding/binary"
fmt "fmt"
io "io"
math "math"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -6,13 +6,12 @@ package ethereum_beacon_rpc_v1
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
empty "github.com/golang/protobuf/ptypes/empty"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -5,11 +5,10 @@ package eth
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -5,12 +5,11 @@ package eth
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
github_com_prysmaticlabs_go_bitfield "github.com/prysmaticlabs/go-bitfield"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -5,11 +5,10 @@ package eth
import (
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -6,14 +6,13 @@ package eth
import (
context "context"
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
@ -699,6 +698,8 @@ type GetValidatorBalancesRequest struct {
QueryFilter isGetValidatorBalancesRequest_QueryFilter `protobuf_oneof:"query_filter"`
PublicKeys [][]byte `protobuf:"bytes,3,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" ssz-size:"?,48"`
Indices []uint64 `protobuf:"varint,4,rep,packed,name=indices,proto3" json:"indices,omitempty"`
PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
PageToken string `protobuf:"bytes,6,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -788,6 +789,20 @@ func (m *GetValidatorBalancesRequest) GetIndices() []uint64 {
return nil
}
func (m *GetValidatorBalancesRequest) GetPageSize() int32 {
if m != nil {
return m.PageSize
}
return 0
}
func (m *GetValidatorBalancesRequest) GetPageToken() string {
if m != nil {
return m.PageToken
}
return ""
}
// XXX_OneofFuncs is for the internal use of the proto package.
func (*GetValidatorBalancesRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
return _GetValidatorBalancesRequest_OneofMarshaler, _GetValidatorBalancesRequest_OneofUnmarshaler, _GetValidatorBalancesRequest_OneofSizer, []interface{}{
@ -857,7 +872,10 @@ func _GetValidatorBalancesRequest_OneofSizer(msg proto.Message) (n int) {
}
type ValidatorBalances struct {
Balances []*ValidatorBalances_Balance `protobuf:"bytes,1,rep,name=balances,proto3" json:"balances,omitempty"`
Epoch uint64 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"`
Balances []*ValidatorBalances_Balance `protobuf:"bytes,2,rep,name=balances,proto3" json:"balances,omitempty"`
NextPageToken string `protobuf:"bytes,3,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
TotalSize int32 `protobuf:"varint,4,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -896,6 +914,13 @@ func (m *ValidatorBalances) XXX_DiscardUnknown() {
var xxx_messageInfo_ValidatorBalances proto.InternalMessageInfo
func (m *ValidatorBalances) GetEpoch() uint64 {
if m != nil {
return m.Epoch
}
return 0
}
func (m *ValidatorBalances) GetBalances() []*ValidatorBalances_Balance {
if m != nil {
return m.Balances
@ -903,6 +928,20 @@ func (m *ValidatorBalances) GetBalances() []*ValidatorBalances_Balance {
return nil
}
func (m *ValidatorBalances) GetNextPageToken() string {
if m != nil {
return m.NextPageToken
}
return ""
}
func (m *ValidatorBalances) GetTotalSize() int32 {
if m != nil {
return m.TotalSize
}
return 0
}
type ValidatorBalances_Balance struct {
PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" ssz-size:"48"`
Index uint64 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"`
@ -2110,108 +2149,108 @@ func init() {
}
var fileDescriptor_678c88b69c3c78d4 = []byte{
// 1606 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4b, 0x6f, 0x1b, 0x47,
0x12, 0xf6, 0x88, 0xa4, 0x1e, 0x45, 0x3d, 0xac, 0x96, 0x64, 0x73, 0x47, 0x96, 0x44, 0x8f, 0x2c,
0x2d, 0x0d, 0xdb, 0xa4, 0x25, 0x3f, 0x76, 0xe1, 0xc5, 0xc2, 0x6b, 0x09, 0x5e, 0x6b, 0x77, 0x8d,
0x85, 0x32, 0x32, 0x72, 0xc8, 0x85, 0x68, 0x0e, 0x5b, 0x64, 0x5b, 0xc3, 0xe9, 0xf1, 0x74, 0x53,
0xb0, 0x74, 0x4b, 0x0e, 0x01, 0x72, 0x0e, 0x90, 0x20, 0x97, 0x24, 0x57, 0x23, 0xc8, 0x21, 0x97,
0x5c, 0x0c, 0x04, 0x41, 0x4e, 0x39, 0x05, 0x01, 0x02, 0xe4, 0x68, 0x04, 0x46, 0xfe, 0x40, 0xfc,
0x07, 0x12, 0x4c, 0x4f, 0xcf, 0x83, 0x14, 0x87, 0xa4, 0x61, 0x1d, 0x72, 0x9b, 0xae, 0xae, 0xfe,
0xea, 0xeb, 0xaa, 0xea, 0xea, 0xea, 0x81, 0x35, 0xd7, 0x63, 0x82, 0x55, 0x88, 0x68, 0x56, 0x0e,
0x37, 0xb0, 0xed, 0x36, 0xf1, 0x46, 0xa5, 0x46, 0xb0, 0xc5, 0x9c, 0xaa, 0xd5, 0xc4, 0xd4, 0x29,
0xcb, 0x79, 0xb4, 0x40, 0x44, 0x93, 0x78, 0xa4, 0xdd, 0x2a, 0x13, 0xd1, 0x2c, 0x87, 0x9a, 0xfa,
0xb5, 0x06, 0x15, 0xcd, 0x76, 0xad, 0x6c, 0xb1, 0x56, 0xa5, 0xc1, 0x1a, 0xac, 0x22, 0xb5, 0x6b,
0xed, 0x7d, 0x39, 0x0a, 0xa0, 0xfd, 0xaf, 0x00, 0x45, 0xbf, 0xd0, 0x60, 0xac, 0x61, 0x93, 0x0a,
0x76, 0x69, 0x05, 0x3b, 0x0e, 0x13, 0x58, 0x50, 0xe6, 0x70, 0x35, 0xbb, 0xa8, 0x66, 0x23, 0x0c,
0xd2, 0x72, 0xc5, 0x91, 0x9a, 0xbc, 0xd4, 0x83, 0x27, 0x16, 0x82, 0xf0, 0x00, 0x43, 0x69, 0xf5,
0xd9, 0x4d, 0xcd, 0x66, 0xd6, 0x81, 0x52, 0x33, 0x7a, 0xa8, 0x1d, 0x62, 0x9b, 0xd6, 0xb1, 0x60,
0x5e, 0xa0, 0x63, 0x7c, 0x36, 0x02, 0xe7, 0x1f, 0x52, 0x2e, 0xee, 0xc5, 0x46, 0xb8, 0x49, 0x9e,
0xb4, 0x09, 0x17, 0xa8, 0x04, 0x33, 0x4d, 0x82, 0xeb, 0x01, 0x66, 0xd5, 0x63, 0x4c, 0x14, 0xb4,
0xa2, 0x56, 0x9a, 0xdc, 0x39, 0x63, 0x4e, 0xf9, 0x13, 0x5b, 0xbe, 0xdc, 0x64, 0x4c, 0xa0, 0x55,
0x98, 0xe4, 0xac, 0xed, 0x59, 0xa4, 0x4a, 0x5c, 0x66, 0x35, 0x0b, 0x23, 0x45, 0xad, 0x94, 0xdd,
0x39, 0x63, 0xe6, 0x03, 0xe9, 0x7d, 0x5f, 0x88, 0x2e, 0x82, 0x1a, 0x06, 0x50, 0x19, 0x05, 0x05,
0x81, 0x30, 0xc4, 0x11, 0xd8, 0x6b, 0x10, 0xa1, 0x70, 0xb2, 0x21, 0x4e, 0x20, 0x8d, 0x70, 0x94,
0x92, 0xc4, 0xc9, 0x85, 0x38, 0x81, 0x50, 0xe2, 0x2c, 0xc2, 0x84, 0x8b, 0x1b, 0xa4, 0xca, 0xe9,
0x31, 0x29, 0x8c, 0x16, 0xb5, 0x52, 0xce, 0x1c, 0xf7, 0x05, 0x7b, 0xf4, 0x98, 0xa0, 0x25, 0x00,
0x39, 0x29, 0xd8, 0x01, 0x71, 0x0a, 0x63, 0x45, 0xad, 0x34, 0x61, 0x4a, 0xf5, 0x47, 0xbe, 0x60,
0x6b, 0x1a, 0x26, 0x9f, 0xb4, 0x89, 0x77, 0x54, 0xdd, 0xa7, 0xb6, 0x20, 0x9e, 0xf1, 0x4c, 0x83,
0xc2, 0x49, 0x0f, 0x71, 0x97, 0x39, 0x9c, 0xa0, 0x7f, 0xc3, 0x64, 0x22, 0x3c, 0xbc, 0xa0, 0x15,
0x33, 0xa5, 0xfc, 0xa6, 0x51, 0xee, 0x99, 0x47, 0xe5, 0x04, 0x84, 0xd9, 0xb1, 0x0e, 0xad, 0xc3,
0x8c, 0x43, 0x9e, 0x8a, 0x6a, 0x82, 0xd8, 0x88, 0x24, 0x36, 0xe5, 0x8b, 0x77, 0x43, 0x72, 0x3e,
0x77, 0xc1, 0x04, 0xb6, 0x83, 0x9d, 0x65, 0xe4, 0xce, 0x26, 0xa4, 0xc4, 0xdf, 0x9a, 0xf1, 0xb3,
0x06, 0xb3, 0x3e, 0x57, 0x19, 0x99, 0x28, 0x8e, 0xf3, 0x90, 0xed, 0x08, 0x9e, 0x1c, 0xf9, 0x52,
0x6e, 0x33, 0x11, 0xc5, 0x4a, 0x8e, 0xd0, 0x39, 0xc8, 0x05, 0xae, 0xcf, 0x28, 0x71, 0x30, 0x44,
0x1b, 0x30, 0x4f, 0x1d, 0xcb, 0x6e, 0xd7, 0x49, 0xd5, 0x61, 0x8e, 0x85, 0x1d, 0xe6, 0x50, 0x0b,
0xdb, 0x32, 0x42, 0xe3, 0xe6, 0x9c, 0x9a, 0xfb, 0x7f, 0x62, 0xaa, 0x33, 0x08, 0xb9, 0xbe, 0x41,
0x18, 0x1d, 0x14, 0x84, 0x8f, 0x35, 0x40, 0xc9, 0x8d, 0x29, 0xf7, 0xdf, 0x81, 0x51, 0x99, 0x9c,
0x83, 0x1c, 0xbf, 0x25, 0x0f, 0x47, 0x90, 0xaf, 0x6a, 0xc5, 0x69, 0xb9, 0xfc, 0xbb, 0x0c, 0x4c,
0x6c, 0xfb, 0x25, 0x64, 0x87, 0xe0, 0x3a, 0xba, 0x0e, 0xd0, 0x7d, 0x5a, 0xb6, 0x66, 0x5f, 0xbd,
0x58, 0x99, 0xe2, 0xfc, 0xf8, 0x9a, 0x0f, 0x70, 0xc7, 0xb8, 0xb1, 0x69, 0x98, 0x13, 0xb5, 0xe8,
0xe8, 0x2c, 0x85, 0x2b, 0xe2, 0x60, 0xa8, 0xe9, 0x3d, 0x3f, 0x1e, 0x6b, 0x30, 0xbd, 0x4f, 0x1d,
0x6c, 0xd3, 0x63, 0x52, 0x0f, 0x54, 0x64, 0x60, 0xcc, 0xa9, 0x48, 0x2a, 0xd5, 0xb6, 0x61, 0x3e,
0x56, 0x4b, 0x30, 0xc8, 0xa6, 0x31, 0x40, 0x91, 0x7a, 0x7c, 0x8a, 0xd7, 0x60, 0xfa, 0x71, 0x9b,
0x0b, 0xba, 0x4f, 0x43, 0x5b, 0xb9, 0xc0, 0x56, 0x24, 0x0d, 0x6d, 0xc5, 0x6a, 0x09, 0x5b, 0xa3,
0xa9, 0xb6, 0x22, 0xf5, 0xd8, 0xd6, 0x6d, 0x38, 0xef, 0x7a, 0xe4, 0x90, 0xb2, 0x36, 0xaf, 0x76,
0x19, 0x1d, 0x93, 0x46, 0x17, 0xc2, 0xe9, 0xff, 0x76, 0x18, 0x7f, 0x04, 0x4b, 0x3d, 0xd6, 0x25,
0x58, 0x8c, 0xa7, 0xb1, 0xd0, 0x4f, 0x00, 0x46, 0x6c, 0x8c, 0xaf, 0x34, 0x58, 0x7c, 0x40, 0xc4,
0xdb, 0x61, 0x71, 0xdc, 0xc2, 0x36, 0x76, 0x2c, 0x12, 0x9d, 0xa0, 0xe8, 0x54, 0x68, 0x9d, 0xa7,
0x42, 0x87, 0xb1, 0x06, 0x71, 0x08, 0xa7, 0x5c, 0x46, 0x6e, 0x7c, 0xe7, 0x8c, 0x19, 0x0a, 0xd0,
0x4d, 0xc8, 0xbb, 0xed, 0x9a, 0x4d, 0xad, 0xea, 0x01, 0x39, 0xe2, 0x85, 0x4c, 0x31, 0x53, 0x9a,
0xdc, 0x9a, 0x7b, 0xf5, 0x62, 0x65, 0x26, 0xe6, 0x75, 0xf7, 0xea, 0xcd, 0xbf, 0x1b, 0x26, 0x04,
0x7a, 0xff, 0x23, 0x47, 0x1c, 0x15, 0x60, 0x8c, 0x3a, 0x75, 0x6a, 0x11, 0x5e, 0xc8, 0x16, 0x33,
0xa5, 0xac, 0x19, 0x0e, 0x4f, 0x1c, 0x89, 0x1f, 0x34, 0x98, 0x3d, 0x41, 0x18, 0x3d, 0x84, 0xf1,
0x9a, 0xfa, 0x56, 0x67, 0xe2, 0x7a, 0xca, 0x99, 0x38, 0xb1, 0xb6, 0xac, 0x3e, 0xcc, 0x08, 0x41,
0x3f, 0x80, 0x31, 0x25, 0xf4, 0x33, 0x3b, 0xde, 0x4e, 0xef, 0xcc, 0xf6, 0xf7, 0x32, 0x11, 0xed,
0x05, 0xcd, 0x43, 0x8e, 0x3a, 0x75, 0xf2, 0x54, 0x25, 0x75, 0x30, 0xf0, 0x37, 0xa8, 0xe0, 0x55,
0x26, 0x87, 0x43, 0xe3, 0x23, 0x0d, 0xe6, 0x93, 0x41, 0x78, 0x23, 0xef, 0x77, 0x14, 0x9f, 0x4c,
0xdf, 0xe2, 0x93, 0x1d, 0x54, 0x7c, 0xbe, 0xd0, 0x00, 0x62, 0x56, 0xfe, 0xbe, 0x12, 0x74, 0x42,
0x32, 0xff, 0x02, 0x88, 0xee, 0x56, 0x9f, 0x8f, 0xef, 0xfa, 0xe2, 0x20, 0xd7, 0x9b, 0x89, 0x35,
0xbd, 0x0a, 0x52, 0x66, 0x70, 0x41, 0xca, 0x76, 0x17, 0x24, 0x0a, 0xab, 0x49, 0x2f, 0xde, 0xb3,
0x04, 0x3d, 0x24, 0x7b, 0x44, 0x6c, 0x37, 0xb1, 0xd3, 0x78, 0xa3, 0x94, 0x3e, 0xe1, 0x98, 0x6f,
0x46, 0xe0, 0x6c, 0x37, 0x7e, 0x8a, 0x7b, 0x1e, 0xc0, 0x02, 0xf6, 0x35, 0xb1, 0x20, 0xf5, 0x6a,
0xf2, 0x5c, 0x8c, 0xa4, 0x9f, 0x8b, 0xb9, 0x68, 0xc5, 0x6e, 0x7c, 0x40, 0xee, 0x01, 0x22, 0x4f,
0x69, 0x37, 0x4a, 0x9f, 0xd3, 0x75, 0x36, 0x50, 0x4f, 0x40, 0x6c, 0xc3, 0x1c, 0xb7, 0x31, 0x6f,
0x76, 0x61, 0x64, 0xd3, 0x31, 0x66, 0x95, 0x7e, 0x27, 0x08, 0x79, 0x4c, 0xac, 0x6e, 0x22, 0xb9,
0x3e, 0x20, 0x4a, 0x3f, 0x06, 0x31, 0x9e, 0x6b, 0x30, 0x1d, 0x45, 0xea, 0xad, 0x36, 0x69, 0x13,
0xb4, 0x02, 0x79, 0xab, 0xd9, 0xf6, 0x9c, 0xaa, 0x4d, 0x5b, 0x54, 0x28, 0x27, 0x82, 0x14, 0x3d,
0xf4, 0x25, 0xe8, 0x3f, 0x70, 0x4e, 0xf9, 0x85, 0x32, 0x67, 0x58, 0x57, 0xce, 0xc7, 0x4b, 0x12,
0x7b, 0xf8, 0x27, 0x48, 0xe7, 0x0c, 0xeb, 0xc9, 0x69, 0x5f, 0x39, 0xc1, 0xfe, 0x37, 0x0d, 0x56,
0xfc, 0x4b, 0x39, 0xce, 0x35, 0xce, 0x69, 0xc3, 0x69, 0x11, 0x47, 0xfc, 0x99, 0x2a, 0xe7, 0xa9,
0x36, 0x22, 0x9f, 0x64, 0x60, 0xbe, 0xd7, 0x7e, 0x53, 0xd2, 0x1e, 0x43, 0x1e, 0xc7, 0x4a, 0xaa,
0x2c, 0xdc, 0x1d, 0x54, 0x16, 0x12, 0xb8, 0xe5, 0x6d, 0xd6, 0x6a, 0x51, 0x21, 0x08, 0x89, 0x85,
0x66, 0x12, 0xf3, 0x94, 0xca, 0x86, 0xfe, 0xad, 0x06, 0x73, 0x3d, 0x6c, 0xf9, 0x8d, 0x9f, 0xe5,
0x31, 0xce, 0x6d, 0xea, 0x1c, 0x54, 0xad, 0x50, 0x21, 0xb8, 0x5c, 0xb2, 0xe6, 0x5c, 0x34, 0x17,
0xad, 0x95, 0xae, 0xe0, 0x4d, 0xec, 0xd5, 0xc3, 0xc2, 0x2f, 0x07, 0x08, 0xa9, 0x7e, 0x33, 0xa8,
0xfa, 0x41, 0xb7, 0xa9, 0xc3, 0xb8, 0xeb, 0x31, 0x97, 0x71, 0xe2, 0xa9, 0x4e, 0x32, 0x1a, 0x77,
0x5d, 0x38, 0xb9, 0xc1, 0x17, 0x8e, 0xb1, 0x0f, 0xc5, 0x64, 0xe5, 0xdb, 0xc5, 0x9e, 0xa0, 0x16,
0x75, 0x83, 0x7e, 0xfb, 0x14, 0xcb, 0xde, 0x33, 0x0d, 0x96, 0xd3, 0xac, 0xa8, 0xc6, 0xb4, 0x77,
0x36, 0x5c, 0x80, 0x89, 0xa8, 0xed, 0x0a, 0xcc, 0x98, 0xb1, 0x00, 0xed, 0xc1, 0x94, 0x9b, 0x04,
0x93, 0x9e, 0xca, 0x6f, 0x5e, 0x1b, 0x94, 0x2d, 0x9d, 0x0c, 0x3a, 0x31, 0x0c, 0x0c, 0xe7, 0x13,
0xaf, 0x8e, 0x5d, 0xc6, 0xec, 0xd3, 0x7e, 0xbb, 0x6c, 0xfe, 0x9e, 0x87, 0x7c, 0xd0, 0x60, 0xcb,
0x3e, 0x18, 0x7d, 0xaa, 0xc1, 0xd9, 0xee, 0x07, 0x13, 0x2a, 0xa7, 0xc0, 0xa6, 0xbc, 0x3d, 0xf5,
0xca, 0xd0, 0xfa, 0xc1, 0x6e, 0x8c, 0xcb, 0xef, 0xfd, 0xf4, 0xeb, 0x87, 0x23, 0xab, 0xe8, 0x62,
0xaf, 0x67, 0x71, 0xa5, 0xe3, 0xb1, 0xf5, 0x81, 0x06, 0x33, 0x5d, 0x4e, 0x41, 0xe7, 0xca, 0xc1,
0xb3, 0xbc, 0x1c, 0x3e, 0xcb, 0xcb, 0xf7, 0xfd, 0x67, 0xb9, 0x5e, 0x1e, 0xec, 0x8e, 0xa4, 0x53,
0x8d, 0xb2, 0xa4, 0x51, 0x42, 0xeb, 0x03, 0x69, 0x54, 0x5c, 0xdf, 0xee, 0xfb, 0x1a, 0x40, 0xfc,
0xb0, 0x41, 0xa5, 0x3e, 0xdb, 0xee, 0x78, 0xd4, 0xe9, 0x97, 0x87, 0xd0, 0x54, 0x9c, 0x56, 0x25,
0xa7, 0x25, 0xb4, 0xd8, 0x93, 0x93, 0x7a, 0x0e, 0xb9, 0x30, 0xf9, 0x40, 0x5e, 0xe2, 0xea, 0x25,
0x93, 0xe6, 0x90, 0xb4, 0x9e, 0x26, 0x5a, 0x69, 0xac, 0x4b, 0x73, 0x45, 0xb4, 0xdc, 0xd3, 0x9c,
0xfc, 0xdd, 0xd2, 0xf4, 0x2d, 0x7c, 0xae, 0xc1, 0x42, 0xc7, 0xf5, 0x11, 0x35, 0xb1, 0x9b, 0x29,
0x36, 0xfa, 0xb4, 0xe8, 0x7a, 0x69, 0xd8, 0x36, 0x37, 0x2d, 0x53, 0xe2, 0x4e, 0xac, 0x12, 0xf6,
0xbf, 0xe8, 0x5d, 0x0d, 0xa6, 0x3a, 0x5a, 0x52, 0x74, 0x65, 0x08, 0x6a, 0x11, 0xa7, 0x8b, 0x83,
0x38, 0x71, 0xa3, 0x28, 0xc9, 0xe8, 0xa8, 0x90, 0x46, 0x06, 0x7d, 0xad, 0xc1, 0x85, 0x7e, 0x0d,
0x1d, 0xba, 0x33, 0x04, 0xa5, 0x94, 0x2e, 0x50, 0xff, 0x6b, 0x5a, 0x7a, 0x77, 0xe9, 0x1b, 0x1b,
0x92, 0xe7, 0x15, 0x74, 0x39, 0xd5, 0x69, 0xb2, 0xc3, 0x20, 0x9c, 0x08, 0x4b, 0xf1, 0x3a, 0x86,
0xd9, 0x24, 0x85, 0xa0, 0xbd, 0x49, 0x4b, 0xab, 0xb5, 0x41, 0xae, 0x92, 0xcb, 0xd3, 0x72, 0x2b,
0x41, 0xe3, 0x89, 0x34, 0xf3, 0xa5, 0xfa, 0x69, 0xd3, 0xf3, 0xaa, 0xbe, 0xdd, 0xe7, 0xe8, 0xf4,
0xe9, 0x65, 0xf4, 0x2b, 0xaf, 0x71, 0x6f, 0x1b, 0x57, 0x25, 0xd3, 0x75, 0x74, 0x29, 0xdd, 0x61,
0x09, 0x4a, 0xcf, 0x35, 0xf8, 0x4b, 0xea, 0xdd, 0x85, 0xfe, 0x36, 0x44, 0x84, 0x7b, 0xdd, 0x76,
0xfa, 0xad, 0xd7, 0xbb, 0x3b, 0x06, 0x14, 0xb1, 0x04, 0xf7, 0x8e, 0x4b, 0x66, 0x6b, 0xfb, 0xfb,
0x97, 0xcb, 0xda, 0x8f, 0x2f, 0x97, 0xb5, 0x5f, 0x5e, 0x2e, 0x6b, 0xef, 0xdc, 0x4a, 0xfc, 0x2d,
0x75, 0xbd, 0x23, 0xde, 0xc2, 0x82, 0x5a, 0x36, 0xae, 0xf1, 0x60, 0x54, 0x39, 0xf9, 0x57, 0xf2,
0x1f, 0x44, 0x34, 0x6b, 0xa3, 0x52, 0x7e, 0xe3, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0x64,
0x78, 0xb7, 0xab, 0x15, 0x00, 0x00,
// 1601 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xbd, 0x6f, 0x1b, 0x47,
0x16, 0xf7, 0x92, 0xd4, 0xd7, 0xa3, 0x3e, 0xac, 0x91, 0x64, 0xf3, 0x28, 0x4b, 0xa2, 0x57, 0x96,
0x8e, 0x86, 0x6d, 0xd2, 0x92, 0x3f, 0xee, 0xe0, 0xc3, 0xc1, 0x67, 0x09, 0x3e, 0xeb, 0x2e, 0x46,
0xa0, 0xac, 0x8c, 0x14, 0x69, 0x88, 0xe1, 0x72, 0x44, 0x8e, 0xb5, 0xdc, 0x59, 0xef, 0x0c, 0x05,
0x4b, 0x5d, 0x52, 0x04, 0x48, 0x1d, 0x20, 0x41, 0x9a, 0x24, 0xad, 0x11, 0xa4, 0x4d, 0x63, 0x20,
0x08, 0x52, 0xa5, 0x0c, 0x10, 0x20, 0xa5, 0x11, 0x18, 0x69, 0x53, 0xc4, 0xff, 0x40, 0x82, 0x9d,
0x9d, 0xfd, 0xa2, 0xb8, 0x24, 0x0d, 0xab, 0x4a, 0xb7, 0xf3, 0xe6, 0xcd, 0xef, 0xfd, 0xe6, 0x7d,
0xcc, 0xbc, 0x59, 0x58, 0x73, 0x5c, 0x26, 0x58, 0x95, 0x88, 0x56, 0xf5, 0x70, 0x03, 0x5b, 0x4e,
0x0b, 0x6f, 0x54, 0xeb, 0x04, 0x9b, 0xcc, 0xae, 0x99, 0x2d, 0x4c, 0xed, 0x8a, 0x9c, 0x47, 0x0b,
0x44, 0xb4, 0x88, 0x4b, 0x3a, 0xed, 0x0a, 0x11, 0xad, 0x4a, 0xa0, 0x59, 0xbc, 0xd6, 0xa4, 0xa2,
0xd5, 0xa9, 0x57, 0x4c, 0xd6, 0xae, 0x36, 0x59, 0x93, 0x55, 0xa5, 0x76, 0xbd, 0xb3, 0x2f, 0x47,
0x3e, 0xb4, 0xf7, 0xe5, 0xa3, 0x14, 0x2f, 0x34, 0x19, 0x6b, 0x5a, 0xa4, 0x8a, 0x1d, 0x5a, 0xc5,
0xb6, 0xcd, 0x04, 0x16, 0x94, 0xd9, 0x5c, 0xcd, 0x2e, 0xaa, 0xd9, 0x10, 0x83, 0xb4, 0x1d, 0x71,
0xa4, 0x26, 0x2f, 0xf5, 0xe0, 0x89, 0x85, 0x20, 0xdc, 0xc7, 0x50, 0x5a, 0x7d, 0x76, 0x53, 0xb7,
0x98, 0x79, 0xa0, 0xd4, 0xf4, 0x1e, 0x6a, 0x87, 0xd8, 0xa2, 0x0d, 0x2c, 0x98, 0xeb, 0xeb, 0xe8,
0x5f, 0x64, 0xe0, 0xfc, 0x43, 0xca, 0xc5, 0xbd, 0xc8, 0x08, 0x37, 0xc8, 0x93, 0x0e, 0xe1, 0x02,
0x95, 0x61, 0xa6, 0x45, 0x70, 0xc3, 0xc7, 0xac, 0xb9, 0x8c, 0x89, 0x82, 0x56, 0xd2, 0xca, 0x93,
0x3b, 0x67, 0x8c, 0x29, 0x6f, 0x62, 0xcb, 0x93, 0x1b, 0x8c, 0x09, 0xb4, 0x0a, 0x93, 0x9c, 0x75,
0x5c, 0x93, 0xd4, 0x88, 0xc3, 0xcc, 0x56, 0x21, 0x53, 0xd2, 0xca, 0xb9, 0x9d, 0x33, 0x46, 0xde,
0x97, 0xde, 0xf7, 0x84, 0xe8, 0x22, 0xa8, 0xa1, 0x0f, 0x95, 0x55, 0x50, 0xe0, 0x0b, 0x03, 0x1c,
0x81, 0xdd, 0x26, 0x11, 0x0a, 0x27, 0x17, 0xe0, 0xf8, 0xd2, 0x10, 0x47, 0x29, 0x49, 0x9c, 0x91,
0x00, 0xc7, 0x17, 0x4a, 0x9c, 0x45, 0x98, 0x70, 0x70, 0x93, 0xd4, 0x38, 0x3d, 0x26, 0x85, 0xd1,
0x92, 0x56, 0x1e, 0x31, 0xc6, 0x3d, 0xc1, 0x1e, 0x3d, 0x26, 0x68, 0x09, 0x40, 0x4e, 0x0a, 0x76,
0x40, 0xec, 0xc2, 0x58, 0x49, 0x2b, 0x4f, 0x18, 0x52, 0xfd, 0x91, 0x27, 0xd8, 0x9a, 0x86, 0xc9,
0x27, 0x1d, 0xe2, 0x1e, 0xd5, 0xf6, 0xa9, 0x25, 0x88, 0xab, 0x3f, 0xd3, 0xa0, 0x70, 0xd2, 0x43,
0xdc, 0x61, 0x36, 0x27, 0xe8, 0xbf, 0x30, 0x19, 0x0b, 0x0f, 0x2f, 0x68, 0xa5, 0x6c, 0x39, 0xbf,
0xa9, 0x57, 0x7a, 0xe6, 0x51, 0x25, 0x06, 0x61, 0x24, 0xd6, 0xa1, 0x75, 0x98, 0xb1, 0xc9, 0x53,
0x51, 0x8b, 0x11, 0xcb, 0x48, 0x62, 0x53, 0x9e, 0x78, 0x37, 0x20, 0xe7, 0x71, 0x17, 0x4c, 0x60,
0xcb, 0xdf, 0x59, 0x56, 0xee, 0x6c, 0x42, 0x4a, 0xbc, 0xad, 0xe9, 0x3f, 0x6b, 0x30, 0xeb, 0x71,
0x95, 0x91, 0x09, 0xe3, 0x38, 0x0f, 0xb9, 0x44, 0xf0, 0xe4, 0xc8, 0x93, 0x72, 0x8b, 0x89, 0x30,
0x56, 0x72, 0x84, 0xce, 0xc1, 0x88, 0xef, 0xfa, 0xac, 0x12, 0xfb, 0x43, 0xb4, 0x01, 0xf3, 0xd4,
0x36, 0xad, 0x4e, 0x83, 0xd4, 0x6c, 0x66, 0x9b, 0xd8, 0x66, 0x36, 0x35, 0xb1, 0x25, 0x23, 0x34,
0x6e, 0xcc, 0xa9, 0xb9, 0xb7, 0x63, 0x53, 0xc9, 0x20, 0x8c, 0xf4, 0x0d, 0xc2, 0xe8, 0xa0, 0x20,
0x7c, 0xaa, 0x01, 0x8a, 0x6f, 0x4c, 0xb9, 0xff, 0x0e, 0x8c, 0xca, 0xe4, 0x1c, 0xe4, 0xf8, 0x2d,
0x59, 0x1c, 0x7e, 0xbe, 0xaa, 0x15, 0xa7, 0xe5, 0xf2, 0xef, 0xb3, 0x30, 0xb1, 0xed, 0x1d, 0x21,
0x3b, 0x04, 0x37, 0xd0, 0x75, 0x80, 0xee, 0x6a, 0xd9, 0x9a, 0x7d, 0xf5, 0x62, 0x65, 0x8a, 0xf3,
0xe3, 0x6b, 0x1e, 0xc0, 0x1d, 0xfd, 0xc6, 0xa6, 0x6e, 0x4c, 0xd4, 0xc3, 0xd2, 0x59, 0x0a, 0x56,
0x44, 0xc1, 0x50, 0xd3, 0x7b, 0x5e, 0x3c, 0xd6, 0x60, 0x7a, 0x9f, 0xda, 0xd8, 0xa2, 0xc7, 0xa4,
0xe1, 0xab, 0xc8, 0xc0, 0x18, 0x53, 0xa1, 0x54, 0xaa, 0x6d, 0xc3, 0x7c, 0xa4, 0x16, 0x63, 0x90,
0x4b, 0x63, 0x80, 0x42, 0xf5, 0xa8, 0x8a, 0xd7, 0x60, 0xfa, 0x71, 0x87, 0x0b, 0xba, 0x4f, 0x03,
0x5b, 0x23, 0xbe, 0xad, 0x50, 0x1a, 0xd8, 0x8a, 0xd4, 0x62, 0xb6, 0x46, 0x53, 0x6d, 0x85, 0xea,
0x91, 0xad, 0xdb, 0x70, 0xde, 0x71, 0xc9, 0x21, 0x65, 0x1d, 0x5e, 0xeb, 0x32, 0x3a, 0x26, 0x8d,
0x2e, 0x04, 0xd3, 0xff, 0x4f, 0x18, 0x7f, 0x04, 0x4b, 0x3d, 0xd6, 0xc5, 0x58, 0x8c, 0xa7, 0xb1,
0x28, 0x9e, 0x00, 0x0c, 0xd9, 0xe8, 0xbf, 0x69, 0xb0, 0xf8, 0x80, 0x88, 0x77, 0x83, 0xc3, 0x71,
0x0b, 0x5b, 0xd8, 0x36, 0x49, 0x58, 0x41, 0x61, 0x55, 0x68, 0xc9, 0xaa, 0x28, 0xc2, 0x58, 0x93,
0xd8, 0x84, 0x53, 0x2e, 0x23, 0x37, 0xbe, 0x73, 0xc6, 0x08, 0x04, 0xe8, 0x26, 0xe4, 0x9d, 0x4e,
0xdd, 0xa2, 0x66, 0xed, 0x80, 0x1c, 0xf1, 0x42, 0xb6, 0x94, 0x2d, 0x4f, 0x6e, 0xcd, 0xbd, 0x7a,
0xb1, 0x32, 0x13, 0xf1, 0xba, 0x7b, 0xf5, 0xe6, 0x3f, 0x75, 0x03, 0x7c, 0xbd, 0xb7, 0xc8, 0x11,
0x47, 0x05, 0x18, 0xa3, 0x76, 0x83, 0x9a, 0x84, 0x17, 0x72, 0xa5, 0x6c, 0x39, 0x67, 0x04, 0xc3,
0x53, 0x2d, 0xa7, 0xaf, 0x32, 0x30, 0x7b, 0x62, 0xb3, 0x68, 0x3e, 0xb1, 0xcb, 0x60, 0x8f, 0x0f,
0x61, 0xbc, 0xae, 0x34, 0x0a, 0x19, 0x59, 0x65, 0xd7, 0x53, 0xaa, 0xec, 0x04, 0x62, 0x45, 0x7d,
0x18, 0x21, 0x42, 0xaf, 0xaa, 0xcb, 0x0e, 0xae, 0xba, 0x5c, 0x57, 0xd5, 0x15, 0x0f, 0x60, 0x4c,
0x61, 0x7b, 0x25, 0x17, 0xf9, 0xb9, 0x77, 0xc9, 0x79, 0x4e, 0x9e, 0x08, 0x9d, 0xec, 0xed, 0x93,
0xda, 0x0d, 0xf2, 0x54, 0x55, 0x9b, 0x3f, 0xf0, 0x3c, 0xaf, 0x58, 0xaa, 0x12, 0x0b, 0x86, 0xfa,
0x27, 0x1a, 0xcc, 0xc7, 0xb3, 0xe3, 0x8d, 0xd2, 0x22, 0x11, 0xc6, 0x6c, 0xdf, 0x30, 0xe6, 0x06,
0x86, 0x51, 0x03, 0x88, 0x58, 0xa5, 0xc4, 0xef, 0x3f, 0x00, 0xe1, 0xa5, 0x1f, 0x44, 0xb0, 0x34,
0x28, 0x82, 0x46, 0x6c, 0xcd, 0x29, 0xc5, 0x4c, 0xa7, 0xb0, 0x1a, 0xf7, 0xe2, 0x3d, 0x53, 0xd0,
0x43, 0xb2, 0x47, 0xc4, 0x76, 0x0b, 0xdb, 0xcd, 0x37, 0xaa, 0xb5, 0x13, 0x8e, 0xf9, 0x36, 0x03,
0x67, 0xbb, 0xf1, 0x53, 0xdc, 0xf3, 0x00, 0x16, 0xb0, 0xa7, 0x89, 0x05, 0x69, 0xd4, 0xe2, 0x05,
0x9b, 0x49, 0x2f, 0xd8, 0xb9, 0x70, 0xc5, 0x6e, 0x54, 0xb9, 0xf7, 0x00, 0x91, 0xa7, 0xb4, 0x1b,
0xa5, 0x4f, 0xd9, 0x9f, 0xf5, 0xd5, 0x63, 0x10, 0xdb, 0x30, 0xc7, 0x2d, 0xcc, 0x5b, 0x5d, 0x18,
0xb9, 0x74, 0x8c, 0x59, 0xa5, 0x9f, 0x04, 0x21, 0x8f, 0x89, 0xd9, 0x4d, 0x64, 0xa4, 0x0f, 0x88,
0xd2, 0x8f, 0x40, 0xf4, 0xe7, 0x1a, 0x4c, 0x87, 0x91, 0x7a, 0xa7, 0x43, 0x3a, 0x04, 0xad, 0x40,
0xde, 0x6c, 0x75, 0x5c, 0xbb, 0x66, 0xd1, 0x36, 0x15, 0xca, 0x89, 0x20, 0x45, 0x0f, 0x3d, 0x09,
0xfa, 0x1f, 0x9c, 0x53, 0x7e, 0xa1, 0xcc, 0x1e, 0xd6, 0x95, 0xf3, 0xd1, 0x92, 0xd8, 0x1e, 0xfe,
0x0d, 0xd2, 0x39, 0xc3, 0x7a, 0x72, 0xda, 0x53, 0x8e, 0xb1, 0xff, 0x5d, 0x83, 0x15, 0xaf, 0x5b,
0x88, 0x72, 0x8d, 0x73, 0xda, 0xb4, 0xdb, 0xc4, 0x16, 0x7f, 0xd9, 0x23, 0xfd, 0xb3, 0x2c, 0xcc,
0xf7, 0xda, 0x6f, 0x4a, 0xda, 0x63, 0xc8, 0xe3, 0x48, 0x49, 0x1d, 0x0b, 0x77, 0x07, 0x1d, 0x0b,
0x31, 0xdc, 0xca, 0x36, 0x6b, 0xb7, 0xa9, 0x10, 0x84, 0x44, 0x42, 0x23, 0x8e, 0x79, 0x5a, 0x47,
0xfd, 0x77, 0x1a, 0xcc, 0xf5, 0xb0, 0xe5, 0x75, 0xa4, 0xa6, 0xcb, 0x38, 0xb7, 0xa8, 0x7d, 0x50,
0x33, 0x03, 0x05, 0xbf, 0x13, 0xcc, 0x19, 0x73, 0xe1, 0x5c, 0xb8, 0x56, 0xba, 0x82, 0xb7, 0xb0,
0xdb, 0x08, 0x0e, 0x7e, 0x39, 0x40, 0x48, 0x35, 0xc2, 0xfe, 0xa9, 0xef, 0xb7, 0xc1, 0x45, 0x18,
0x77, 0x5c, 0xe6, 0x30, 0x4e, 0x5c, 0xd5, 0xe2, 0x86, 0xe3, 0xae, 0x0b, 0x67, 0x64, 0xf0, 0x85,
0xa3, 0xef, 0x43, 0x29, 0x7e, 0xf2, 0xed, 0x62, 0x57, 0x50, 0x93, 0x3a, 0xfe, 0x43, 0xe0, 0x14,
0x8f, 0xbd, 0x67, 0x1a, 0x2c, 0xa7, 0x59, 0x51, 0x1d, 0x73, 0xef, 0x6c, 0xb8, 0x00, 0x13, 0x61,
0x3f, 0xe8, 0x9b, 0x31, 0x22, 0x01, 0xda, 0x83, 0x29, 0x27, 0x0e, 0x26, 0x3d, 0x95, 0xdf, 0xbc,
0x36, 0x28, 0x5b, 0x92, 0x0c, 0x92, 0x18, 0x3a, 0x86, 0xf3, 0xb1, 0xe7, 0xd0, 0x2e, 0x63, 0xd6,
0x69, 0x3f, 0xaa, 0x36, 0xff, 0xc8, 0x43, 0xde, 0xef, 0xfc, 0x65, 0x83, 0x8e, 0x3e, 0xd7, 0xe0,
0x6c, 0xf7, 0x4b, 0x0e, 0x55, 0x52, 0x60, 0x53, 0x1e, 0xc5, 0xc5, 0xea, 0xd0, 0xfa, 0xfe, 0x6e,
0xf4, 0xcb, 0x1f, 0xfc, 0xf4, 0xeb, 0xc7, 0x99, 0x55, 0x74, 0xb1, 0xd7, 0x7b, 0xbd, 0x9a, 0x78,
0x05, 0x7e, 0xa4, 0xc1, 0x4c, 0x97, 0x53, 0xd0, 0xb9, 0x8a, 0xff, 0xbf, 0xa0, 0x12, 0xfc, 0x2f,
0xa8, 0xdc, 0x6f, 0x3b, 0xe2, 0xa8, 0x58, 0x19, 0xec, 0x8e, 0xb8, 0x53, 0xf5, 0x8a, 0xa4, 0x51,
0x46, 0xeb, 0x03, 0x69, 0x54, 0x1d, 0xcf, 0xee, 0x87, 0x1a, 0x40, 0xf4, 0xe2, 0x42, 0xe5, 0x3e,
0xdb, 0x4e, 0xbc, 0x36, 0x8b, 0x97, 0x87, 0xd0, 0x54, 0x9c, 0x56, 0x25, 0xa7, 0x25, 0xb4, 0xd8,
0x93, 0x93, 0x7a, 0xa7, 0x39, 0x30, 0xf9, 0x40, 0x5e, 0xe2, 0xea, 0x89, 0x95, 0xe6, 0x90, 0xb4,
0x9e, 0x26, 0x5c, 0xa9, 0xaf, 0x4b, 0x73, 0x25, 0xb4, 0xdc, 0xd3, 0x9c, 0xfc, 0x0f, 0xd4, 0xf2,
0x2c, 0x7c, 0xa9, 0xc1, 0x42, 0xe2, 0xfa, 0x08, 0x3b, 0xe4, 0xcd, 0x14, 0x1b, 0x7d, 0xde, 0x0e,
0xc5, 0xf2, 0xb0, 0xdd, 0x72, 0x5a, 0xa6, 0x44, 0x9d, 0x58, 0x35, 0x6c, 0xa3, 0xdf, 0xd7, 0x60,
0x2a, 0xd1, 0x92, 0xa2, 0x2b, 0x43, 0x50, 0x0b, 0x39, 0x5d, 0x1c, 0xc4, 0x89, 0xeb, 0x25, 0x49,
0xa6, 0x88, 0x0a, 0x69, 0x64, 0xd0, 0x37, 0x1a, 0x5c, 0xe8, 0xd7, 0xd0, 0xa1, 0x3b, 0x43, 0x50,
0x4a, 0xe9, 0x02, 0x8b, 0x7f, 0x4f, 0x4b, 0xef, 0x2e, 0x7d, 0x7d, 0x43, 0xf2, 0xbc, 0x82, 0x2e,
0xa7, 0x3a, 0x4d, 0x76, 0x18, 0x84, 0x13, 0x61, 0x2a, 0x5e, 0xc7, 0x30, 0x1b, 0xa7, 0xe0, 0xb7,
0x37, 0x69, 0x69, 0xb5, 0x36, 0xc8, 0x55, 0x72, 0x79, 0x5a, 0x6e, 0xc5, 0x68, 0x3c, 0x91, 0x66,
0xbe, 0x56, 0x7f, 0x93, 0x7a, 0x5e, 0xd5, 0xb7, 0xfb, 0x94, 0x4e, 0x9f, 0x5e, 0xa6, 0x78, 0xe5,
0x35, 0xee, 0x6d, 0xfd, 0xaa, 0x64, 0xba, 0x8e, 0x2e, 0xa5, 0x3b, 0x2c, 0x46, 0xe9, 0xb9, 0x06,
0x7f, 0x4b, 0xbd, 0xbb, 0xd0, 0x3f, 0x86, 0x88, 0x70, 0xaf, 0xdb, 0xae, 0x78, 0xeb, 0xf5, 0xee,
0x8e, 0x01, 0x87, 0x58, 0x8c, 0x7b, 0xe2, 0x92, 0xd9, 0xda, 0xfe, 0xe1, 0xe5, 0xb2, 0xf6, 0xe3,
0xcb, 0x65, 0xed, 0x97, 0x97, 0xcb, 0xda, 0x7b, 0xb7, 0x62, 0xbf, 0x71, 0x1d, 0xf7, 0x88, 0xb7,
0xb1, 0xa0, 0xa6, 0x85, 0xeb, 0xdc, 0x1f, 0x55, 0x4f, 0xfe, 0x2e, 0xfd, 0x17, 0x11, 0xad, 0xfa,
0xa8, 0x94, 0xdf, 0xf8, 0x33, 0x00, 0x00, 0xff, 0xff, 0xea, 0x59, 0x36, 0xfb, 0x44, 0x16, 0x00,
0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -2939,6 +2978,17 @@ func (m *GetValidatorBalancesRequest) MarshalTo(dAtA []byte) (int, error) {
i = encodeVarintBeaconChain(dAtA, i, uint64(j4))
i += copy(dAtA[i:], dAtA5[:j4])
}
if m.PageSize != 0 {
dAtA[i] = 0x28
i++
i = encodeVarintBeaconChain(dAtA, i, uint64(m.PageSize))
}
if len(m.PageToken) > 0 {
dAtA[i] = 0x32
i++
i = encodeVarintBeaconChain(dAtA, i, uint64(len(m.PageToken)))
i += copy(dAtA[i:], m.PageToken)
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
@ -2979,9 +3029,14 @@ func (m *ValidatorBalances) MarshalTo(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.Epoch != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintBeaconChain(dAtA, i, uint64(m.Epoch))
}
if len(m.Balances) > 0 {
for _, msg := range m.Balances {
dAtA[i] = 0xa
dAtA[i] = 0x12
i++
i = encodeVarintBeaconChain(dAtA, i, uint64(msg.Size()))
n, err := msg.MarshalTo(dAtA[i:])
@ -2991,6 +3046,17 @@ func (m *ValidatorBalances) MarshalTo(dAtA []byte) (int, error) {
i += n
}
}
if len(m.NextPageToken) > 0 {
dAtA[i] = 0x1a
i++
i = encodeVarintBeaconChain(dAtA, i, uint64(len(m.NextPageToken)))
i += copy(dAtA[i:], m.NextPageToken)
}
if m.TotalSize != 0 {
dAtA[i] = 0x20
i++
i = encodeVarintBeaconChain(dAtA, i, uint64(m.TotalSize))
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
@ -3862,6 +3928,13 @@ func (m *GetValidatorBalancesRequest) Size() (n int) {
}
n += 1 + sovBeaconChain(uint64(l)) + l
}
if m.PageSize != 0 {
n += 1 + sovBeaconChain(uint64(m.PageSize))
}
l = len(m.PageToken)
if l > 0 {
n += 1 + l + sovBeaconChain(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@ -3892,12 +3965,22 @@ func (m *ValidatorBalances) Size() (n int) {
}
var l int
_ = l
if m.Epoch != 0 {
n += 1 + sovBeaconChain(uint64(m.Epoch))
}
if len(m.Balances) > 0 {
for _, e := range m.Balances {
l = e.Size()
n += 1 + l + sovBeaconChain(uint64(l))
}
}
l = len(m.NextPageToken)
if l > 0 {
n += 1 + l + sovBeaconChain(uint64(l))
}
if m.TotalSize != 0 {
n += 1 + sovBeaconChain(uint64(m.TotalSize))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@ -5456,6 +5539,57 @@ func (m *GetValidatorBalancesRequest) Unmarshal(dAtA []byte) error {
} else {
return fmt.Errorf("proto: wrong wireType = %d for field Indices", wireType)
}
case 5:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field PageSize", wireType)
}
m.PageSize = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBeaconChain
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.PageSize |= int32(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field PageToken", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBeaconChain
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthBeaconChain
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthBeaconChain
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.PageToken = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipBeaconChain(dAtA[iNdEx:])
@ -5511,6 +5645,25 @@ func (m *ValidatorBalances) Unmarshal(dAtA []byte) error {
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Epoch", wireType)
}
m.Epoch = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBeaconChain
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Epoch |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Balances", wireType)
}
@ -5544,6 +5697,57 @@ func (m *ValidatorBalances) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field NextPageToken", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBeaconChain
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthBeaconChain
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthBeaconChain
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.NextPageToken = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field TotalSize", wireType)
}
m.TotalSize = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowBeaconChain
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.TotalSize |= int32(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipBeaconChain(dAtA[iNdEx:])

View File

@ -251,9 +251,21 @@ message GetValidatorBalancesRequest {
// Validator indices to filter validators for the given epoch.
repeated uint64 indices = 4;
// The maximum number of Validators to return in the response.
// This field is optional.
int32 page_size = 5;
// A pagination token returned from a previous call to `GetValidators`
// that indicates where this listing should continue from.
// This field is optional.
string page_token = 6;
}
message ValidatorBalances {
// Epoch which the state was considered to determine the validator balances.
uint64 epoch = 1;
message Balance {
// Validator's 48 byte BLS public key.
bytes public_key = 1 [(gogoproto.moretags) = "ssz-size:\"48\""];
@ -265,7 +277,14 @@ message ValidatorBalances {
uint64 balance = 3;
}
repeated Balance balances = 1;
repeated Balance balances = 2;
// A pagination token returned from a previous call to `GetListValidatorBalances`
// that indicates from where listing should continue.
string next_page_token = 3;
// Total count of Validators matching the request filter.
int32 total_size = 4;
}
message GetValidatorsRequest {

View File

@ -6,13 +6,12 @@ package eth
import (
context "context"
fmt "fmt"
io "io"
math "math"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -6,12 +6,11 @@ package eth
import (
context "context"
fmt "fmt"
io "io"
math "math"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -7,14 +7,13 @@ import (
context "context"
encoding_binary "encoding/binary"
fmt "fmt"
io "io"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
io "io"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -5,10 +5,9 @@ package ethereum_sharding_p2p_v1
import (
fmt "fmt"
proto "github.com/gogo/protobuf/proto"
io "io"
math "math"
proto "github.com/gogo/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.