Aligning ETH2.0 spec - Update Fork and Domain Helpers (#1501)

* updated proto state fields to unlock alignment

* updated domain and fork helpers

* fixed comments

* fixed comments
This commit is contained in:
terence tsao
2019-02-06 06:34:22 +01:00
committed by Raul Jordan
parent b9bbe60193
commit a4b5666059
9 changed files with 209 additions and 186 deletions

View File

@@ -7,7 +7,6 @@ import (
"bytes"
"encoding/binary"
"fmt"
"math"
"time"
"github.com/prysmaticlabs/prysm/beacon-chain/utils"
@@ -99,33 +98,6 @@ func ProcessBlockRoots(state *pb.BeaconState, prevBlockRoot [32]byte) *pb.Beacon
return state
}
// ForkVersion Spec:
// def get_fork_version(fork_data: Fork,
// slot: int) -> int:
// if slot < fork_data.fork_slot:
// return fork_data.pre_fork_version
// else:
// return fork_data.post_fork_version
func ForkVersion(data *pb.Fork, slot uint64) uint64 {
if slot < data.Slot {
return data.PreviousVersion
}
return data.CurrentVersion
}
// DomainVersion Spec:
// def get_domain(fork_data: Fork,
// slot: int,
// domain_type: int) -> int:
// return get_fork_version(
// fork_data,
// slot
// ) * 2**32 + domain_type
func DomainVersion(data *pb.Fork, slot uint64, domainType uint64) uint64 {
constant := uint64(math.Pow(2, 32))
return ForkVersion(data, slot)*constant + domainType
}
// EncodeDepositData converts a deposit input proto into an a byte slice
// of Simple Serialized deposit input followed by 8 bytes for a deposit value
// and 8 bytes for a unix timestamp, all in BigEndian format.

View File

@@ -2,7 +2,6 @@ package blocks
import (
"bytes"
"math"
"reflect"
"testing"
@@ -164,40 +163,6 @@ func TestProcessBlockRoots(t *testing.T) {
}
}
func TestForkVersion(t *testing.T) {
forkData := &pb.Fork{
Slot: 10,
PreviousVersion: 2,
CurrentVersion: 3,
}
if ForkVersion(forkData, 9) != 2 {
t.Errorf("fork Version not equal to 2 %d", ForkVersion(forkData, 9))
}
if ForkVersion(forkData, 11) != 3 {
t.Errorf("fork Version not equal to 3 %d", ForkVersion(forkData, 11))
}
}
func TestDomainVersion(t *testing.T) {
forkData := &pb.Fork{
Slot: 10,
PreviousVersion: 2,
CurrentVersion: 3,
}
constant := uint64(math.Pow(2, 32))
if DomainVersion(forkData, 9, 2) != 2*constant+2 {
t.Errorf("incorrect domain version %d", DomainVersion(forkData, 9, 2))
}
if DomainVersion(forkData, 11, 3) != 3*constant+3 {
t.Errorf("incorrect domain version %d", DomainVersion(forkData, 11, 3))
}
}
func TestDecodeDepositAmountAndTimeStamp(t *testing.T) {
tests := []struct {

View File

@@ -5,6 +5,7 @@ go_library(
srcs = [
"committee.go",
"randao.go",
"signature.go",
"slot_epoch.go",
"validators.go",
],
@@ -25,6 +26,7 @@ go_test(
srcs = [
"committee_test.go",
"randao_test.go",
"signature_test.go",
"slot_epoch_test.go",
"validators_test.go",
],

View File

@@ -0,0 +1,42 @@
package helpers
import (
"math"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
)
// ForkVersion returns the fork version of the given epoch number.
//
// Spec pseudocode definition:
// def get_fork_version(fork: Fork,
// epoch: EpochNumber) -> int:
// """
// Return the fork version of the given ``epoch``.
// """
// if epoch < fork.epoch:
// return fork.previous_version
// else:
// return fork.current_version
func ForkVersion(fork *pb.Fork, epoch uint64) uint64 {
if epoch < fork.Epoch {
return fork.PreviousVersion
}
return fork.CurrentVersion
}
// DomainVersion returns the domain version for BLS private key to sign and verify.
//
// Spec pseudocode definition:
// def get_domain(fork: Fork,
// epoch: EpochNumber,
// domain_type: int) -> int:
// """
// Get the domain number that represents the fork meta and signature domain.
// """
// fork_version = get_fork_version(fork, epoch)
// return fork_version * 2**32 + domain_type
func DomainVersion(fork *pb.Fork, epoch uint64, domainType uint64) uint64 {
offset := uint64(math.Pow(2, 32))
return ForkVersion(fork, epoch)*offset + domainType
}

View File

@@ -0,0 +1,42 @@
package helpers
import (
"math"
"testing"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
)
func TestForkVersion(t *testing.T) {
fork := &pb.Fork{
Epoch: 10,
PreviousVersion: 2,
CurrentVersion: 3,
}
if ForkVersion(fork, 9) != 2 {
t.Errorf("fork Version not equal to 2 %d", ForkVersion(fork, 9))
}
if ForkVersion(fork, 11) != 3 {
t.Errorf("fork Version not equal to 3 %d", ForkVersion(fork, 11))
}
}
func TestDomainVersion(t *testing.T) {
fork := &pb.Fork{
Epoch: 10,
PreviousVersion: 2,
CurrentVersion: 3,
}
constant := uint64(math.Pow(2, 32))
if DomainVersion(fork, 9, 2) != 2*constant+2 {
t.Errorf("incorrect domain version %d", DomainVersion(fork, 9, 2))
}
if DomainVersion(fork, 11, 3) != 3*constant+3 {
t.Errorf("incorrect domain version %d", DomainVersion(fork, 11, 3))
}
}

View File

@@ -89,7 +89,7 @@ func InitialBeaconState(
Fork: &pb.Fork{
PreviousVersion: config.GenesisForkVersion,
CurrentVersion: config.GenesisForkVersion,
Slot: config.GenesisSlot,
Epoch: config.GenesisEpoch,
},
// Validator registry fields.

View File

@@ -99,7 +99,7 @@ func TestInitialBeaconState_Ok(t *testing.T) {
if !reflect.DeepEqual(*state.Fork, pb.Fork{
PreviousVersion: initialForkVersion,
CurrentVersion: initialForkVersion,
Slot: initialEpochNumber,
Epoch: initialEpochNumber,
}) {
t.Error("Fork was not correctly initialized")
}

View File

@@ -44,7 +44,7 @@ func (x ValidatorRecord_StatusFlags) String() string {
return proto.EnumName(ValidatorRecord_StatusFlags_name, int32(x))
}
func (ValidatorRecord_StatusFlags) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{6, 0}
return fileDescriptor_types_e31a181b29d0e4de, []int{6, 0}
}
type ValidatorRegistryDeltaBlock_ValidatorRegistryDeltaFlags int32
@@ -67,7 +67,7 @@ func (x ValidatorRegistryDeltaBlock_ValidatorRegistryDeltaFlags) String() string
return proto.EnumName(ValidatorRegistryDeltaBlock_ValidatorRegistryDeltaFlags_name, int32(x))
}
func (ValidatorRegistryDeltaBlock_ValidatorRegistryDeltaFlags) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{19, 0}
return fileDescriptor_types_e31a181b29d0e4de, []int{19, 0}
}
type BeaconState struct {
@@ -105,7 +105,7 @@ func (m *BeaconState) Reset() { *m = BeaconState{} }
func (m *BeaconState) String() string { return proto.CompactTextString(m) }
func (*BeaconState) ProtoMessage() {}
func (*BeaconState) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{0}
return fileDescriptor_types_e31a181b29d0e4de, []int{0}
}
func (m *BeaconState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -312,7 +312,7 @@ func (m *BeaconState) GetSlot() uint64 {
type Fork struct {
PreviousVersion uint64 `protobuf:"varint,1,opt,name=previous_version,json=previousVersion,proto3" json:"previous_version,omitempty"`
CurrentVersion uint64 `protobuf:"varint,2,opt,name=current_version,json=currentVersion,proto3" json:"current_version,omitempty"`
Slot uint64 `protobuf:"varint,3,opt,name=slot,proto3" json:"slot,omitempty"`
Epoch uint64 `protobuf:"varint,3,opt,name=epoch,proto3" json:"epoch,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -322,7 +322,7 @@ func (m *Fork) Reset() { *m = Fork{} }
func (m *Fork) String() string { return proto.CompactTextString(m) }
func (*Fork) ProtoMessage() {}
func (*Fork) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{1}
return fileDescriptor_types_e31a181b29d0e4de, []int{1}
}
func (m *Fork) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -365,9 +365,9 @@ func (m *Fork) GetCurrentVersion() uint64 {
return 0
}
func (m *Fork) GetSlot() uint64 {
func (m *Fork) GetEpoch() uint64 {
if m != nil {
return m.Slot
return m.Epoch
}
return 0
}
@@ -386,7 +386,7 @@ func (m *PendingAttestationRecord) Reset() { *m = PendingAttestationReco
func (m *PendingAttestationRecord) String() string { return proto.CompactTextString(m) }
func (*PendingAttestationRecord) ProtoMessage() {}
func (*PendingAttestationRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{2}
return fileDescriptor_types_e31a181b29d0e4de, []int{2}
}
func (m *PendingAttestationRecord) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -457,7 +457,7 @@ func (m *Attestation) Reset() { *m = Attestation{} }
func (m *Attestation) String() string { return proto.CompactTextString(m) }
func (*Attestation) ProtoMessage() {}
func (*Attestation) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{3}
return fileDescriptor_types_e31a181b29d0e4de, []int{3}
}
func (m *Attestation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -532,7 +532,7 @@ func (m *AttestationData) Reset() { *m = AttestationData{} }
func (m *AttestationData) String() string { return proto.CompactTextString(m) }
func (*AttestationData) ProtoMessage() {}
func (*AttestationData) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{4}
return fileDescriptor_types_e31a181b29d0e4de, []int{4}
}
func (m *AttestationData) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -629,7 +629,7 @@ func (m *AttestationDataAndCustodyBit) Reset() { *m = AttestationDataAnd
func (m *AttestationDataAndCustodyBit) String() string { return proto.CompactTextString(m) }
func (*AttestationDataAndCustodyBit) ProtoMessage() {}
func (*AttestationDataAndCustodyBit) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{5}
return fileDescriptor_types_e31a181b29d0e4de, []int{5}
}
func (m *AttestationDataAndCustodyBit) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -691,7 +691,7 @@ func (m *ValidatorRecord) Reset() { *m = ValidatorRecord{} }
func (m *ValidatorRecord) String() string { return proto.CompactTextString(m) }
func (*ValidatorRecord) ProtoMessage() {}
func (*ValidatorRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{6}
return fileDescriptor_types_e31a181b29d0e4de, []int{6}
}
func (m *ValidatorRecord) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -796,7 +796,7 @@ func (m *ShardReassignmentRecord) Reset() { *m = ShardReassignmentRecord
func (m *ShardReassignmentRecord) String() string { return proto.CompactTextString(m) }
func (*ShardReassignmentRecord) ProtoMessage() {}
func (*ShardReassignmentRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{7}
return fileDescriptor_types_e31a181b29d0e4de, []int{7}
}
func (m *ShardReassignmentRecord) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -858,7 +858,7 @@ func (m *CrosslinkRecord) Reset() { *m = CrosslinkRecord{} }
func (m *CrosslinkRecord) String() string { return proto.CompactTextString(m) }
func (*CrosslinkRecord) ProtoMessage() {}
func (*CrosslinkRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{8}
return fileDescriptor_types_e31a181b29d0e4de, []int{8}
}
func (m *CrosslinkRecord) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -918,7 +918,7 @@ func (m *BeaconBlock) Reset() { *m = BeaconBlock{} }
func (m *BeaconBlock) String() string { return proto.CompactTextString(m) }
func (*BeaconBlock) ProtoMessage() {}
func (*BeaconBlock) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{9}
return fileDescriptor_types_e31a181b29d0e4de, []int{9}
}
func (m *BeaconBlock) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1011,7 +1011,7 @@ func (m *BeaconBlockBody) Reset() { *m = BeaconBlockBody{} }
func (m *BeaconBlockBody) String() string { return proto.CompactTextString(m) }
func (*BeaconBlockBody) ProtoMessage() {}
func (*BeaconBlockBody) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{10}
return fileDescriptor_types_e31a181b29d0e4de, []int{10}
}
func (m *BeaconBlockBody) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1090,7 +1090,7 @@ func (m *DepositInput) Reset() { *m = DepositInput{} }
func (m *DepositInput) String() string { return proto.CompactTextString(m) }
func (*DepositInput) ProtoMessage() {}
func (*DepositInput) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{11}
return fileDescriptor_types_e31a181b29d0e4de, []int{11}
}
func (m *DepositInput) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1167,7 +1167,7 @@ func (m *ProposalSignedData) Reset() { *m = ProposalSignedData{} }
func (m *ProposalSignedData) String() string { return proto.CompactTextString(m) }
func (*ProposalSignedData) ProtoMessage() {}
func (*ProposalSignedData) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{12}
return fileDescriptor_types_e31a181b29d0e4de, []int{12}
}
func (m *ProposalSignedData) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1231,7 +1231,7 @@ func (m *SlashableVote) Reset() { *m = SlashableVote{} }
func (m *SlashableVote) String() string { return proto.CompactTextString(m) }
func (*SlashableVote) ProtoMessage() {}
func (*SlashableVote) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{13}
return fileDescriptor_types_e31a181b29d0e4de, []int{13}
}
func (m *SlashableVote) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1301,7 +1301,7 @@ func (m *DepositData) Reset() { *m = DepositData{} }
func (m *DepositData) String() string { return proto.CompactTextString(m) }
func (*DepositData) ProtoMessage() {}
func (*DepositData) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{14}
return fileDescriptor_types_e31a181b29d0e4de, []int{14}
}
func (m *DepositData) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1366,7 +1366,7 @@ func (m *ProposerSlashing) Reset() { *m = ProposerSlashing{} }
func (m *ProposerSlashing) String() string { return proto.CompactTextString(m) }
func (*ProposerSlashing) ProtoMessage() {}
func (*ProposerSlashing) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{15}
return fileDescriptor_types_e31a181b29d0e4de, []int{15}
}
func (m *ProposerSlashing) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1442,7 +1442,7 @@ func (m *AttesterSlashing) Reset() { *m = AttesterSlashing{} }
func (m *AttesterSlashing) String() string { return proto.CompactTextString(m) }
func (*AttesterSlashing) ProtoMessage() {}
func (*AttesterSlashing) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{16}
return fileDescriptor_types_e31a181b29d0e4de, []int{16}
}
func (m *AttesterSlashing) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1498,7 +1498,7 @@ func (m *Deposit) Reset() { *m = Deposit{} }
func (m *Deposit) String() string { return proto.CompactTextString(m) }
func (*Deposit) ProtoMessage() {}
func (*Deposit) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{17}
return fileDescriptor_types_e31a181b29d0e4de, []int{17}
}
func (m *Deposit) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1561,7 +1561,7 @@ func (m *Exit) Reset() { *m = Exit{} }
func (m *Exit) String() string { return proto.CompactTextString(m) }
func (*Exit) ProtoMessage() {}
func (*Exit) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{18}
return fileDescriptor_types_e31a181b29d0e4de, []int{18}
}
func (m *Exit) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1626,7 +1626,7 @@ func (m *ValidatorRegistryDeltaBlock) Reset() { *m = ValidatorRegistryDe
func (m *ValidatorRegistryDeltaBlock) String() string { return proto.CompactTextString(m) }
func (*ValidatorRegistryDeltaBlock) ProtoMessage() {}
func (*ValidatorRegistryDeltaBlock) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{19}
return fileDescriptor_types_e31a181b29d0e4de, []int{19}
}
func (m *ValidatorRegistryDeltaBlock) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1702,7 +1702,7 @@ func (m *Eth1Data) Reset() { *m = Eth1Data{} }
func (m *Eth1Data) String() string { return proto.CompactTextString(m) }
func (*Eth1Data) ProtoMessage() {}
func (*Eth1Data) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{20}
return fileDescriptor_types_e31a181b29d0e4de, []int{20}
}
func (m *Eth1Data) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1757,7 +1757,7 @@ func (m *Eth1DataVote) Reset() { *m = Eth1DataVote{} }
func (m *Eth1DataVote) String() string { return proto.CompactTextString(m) }
func (*Eth1DataVote) ProtoMessage() {}
func (*Eth1DataVote) Descriptor() ([]byte, []int) {
return fileDescriptor_types_dace32783887a335, []int{21}
return fileDescriptor_types_e31a181b29d0e4de, []int{21}
}
func (m *Eth1DataVote) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2139,10 +2139,10 @@ func (m *Fork) MarshalTo(dAtA []byte) (int, error) {
i++
i = encodeVarintTypes(dAtA, i, uint64(m.CurrentVersion))
}
if m.Slot != 0 {
if m.Epoch != 0 {
dAtA[i] = 0x18
i++
i = encodeVarintTypes(dAtA, i, uint64(m.Slot))
i = encodeVarintTypes(dAtA, i, uint64(m.Epoch))
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
@@ -3270,8 +3270,8 @@ func (m *Fork) Size() (n int) {
if m.CurrentVersion != 0 {
n += 1 + sovTypes(uint64(m.CurrentVersion))
}
if m.Slot != 0 {
n += 1 + sovTypes(uint64(m.Slot))
if m.Epoch != 0 {
n += 1 + sovTypes(uint64(m.Epoch))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
@@ -4688,9 +4688,9 @@ func (m *Fork) Unmarshal(dAtA []byte) error {
}
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Slot", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field Epoch", wireType)
}
m.Slot = 0
m.Epoch = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
@@ -4700,7 +4700,7 @@ func (m *Fork) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
m.Slot |= (uint64(b) & 0x7F) << shift
m.Epoch |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
@@ -8091,11 +8091,11 @@ var (
)
func init() {
proto.RegisterFile("proto/beacon/p2p/v1/types.proto", fileDescriptor_types_dace32783887a335)
proto.RegisterFile("proto/beacon/p2p/v1/types.proto", fileDescriptor_types_e31a181b29d0e4de)
}
var fileDescriptor_types_dace32783887a335 = []byte{
// 2081 bytes of a gzipped FileDescriptorProto
var fileDescriptor_types_e31a181b29d0e4de = []byte{
// 2088 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcb, 0x73, 0x1b, 0x49,
0x19, 0xdf, 0x91, 0xe4, 0xc4, 0xf9, 0x24, 0x5b, 0x72, 0x3b, 0xb1, 0x66, 0x63, 0x27, 0x76, 0x26,
0xbb, 0xd8, 0x09, 0x60, 0xaf, 0x94, 0x5a, 0x42, 0x11, 0x02, 0x58, 0xb6, 0x97, 0x08, 0xb2, 0x9b,
@@ -8143,88 +8143,88 @@ var fileDescriptor_types_dace32783887a335 = []byte{
0x4f, 0xa8, 0x4b, 0x2d, 0xe6, 0x0e, 0x89, 0xfe, 0xcd, 0x75, 0x11, 0x6f, 0x55, 0x25, 0x3c, 0x70,
0x87, 0x04, 0xb5, 0xa0, 0x72, 0x14, 0x44, 0xc7, 0xfa, 0xb7, 0xd6, 0xc5, 0x99, 0x57, 0xa6, 0xed,
0xf3, 0x4e, 0x10, 0x1d, 0x9b, 0x02, 0x8a, 0x16, 0xa1, 0x22, 0xc2, 0xf7, 0xdb, 0xd2, 0x9c, 0x58,
0x18, 0x3e, 0x54, 0x38, 0x04, 0xdd, 0x82, 0x46, 0x92, 0x7e, 0x27, 0x24, 0xa2, 0x6e, 0xe0, 0xeb,
0x18, 0x21, 0x54, 0x38, 0x04, 0xdd, 0x82, 0x46, 0x92, 0x7e, 0x27, 0x24, 0xa2, 0x6e, 0xe0, 0xeb,
0x9a, 0xc0, 0xd5, 0x63, 0xf9, 0xa1, 0x14, 0xa3, 0x75, 0xa8, 0xc7, 0x59, 0x1e, 0x23, 0x65, 0xfd,
0x9e, 0x57, 0xe2, 0x18, 0x88, 0xd4, 0x86, 0xe5, 0xcc, 0x7e, 0x7f, 0xd1, 0x40, 0x9f, 0xf6, 0xc8,
0xe8, 0x1e, 0x54, 0xc4, 0x43, 0x68, 0xe2, 0x4e, 0x53, 0x93, 0x26, 0x43, 0x14, 0xcf, 0x21, 0x48,
0xe8, 0x6d, 0x58, 0x0a, 0x71, 0xc4, 0x5c, 0xdb, 0x0d, 0x0b, 0xf9, 0x5d, 0x12, 0x85, 0xe7, 0x4a,
0x4e, 0x9b, 0xa4, 0xf7, 0x2d, 0x68, 0xd8, 0x23, 0xca, 0x02, 0xe7, 0x34, 0x25, 0x94, 0x05, 0xa1,
0xae, 0xe4, 0x09, 0xf4, 0x26, 0xcc, 0xf1, 0x3b, 0x58, 0xae, 0x6f, 0x7b, 0x23, 0x87, 0x38, 0x7a,
0x45, 0x5c, 0xac, 0xc6, 0x85, 0x5d, 0x25, 0x33, 0xfe, 0xac, 0x41, 0x35, 0x73, 0xc0, 0xff, 0xf7,
0x3b, 0x6d, 0xc1, 0x22, 0xee, 0xf7, 0x23, 0xd2, 0xe7, 0xcd, 0x98, 0xba, 0x7d, 0x1f, 0xb3, 0x51,
0x44, 0xc4, 0xcd, 0x6a, 0x26, 0x4a, 0x54, 0xfb, 0xb1, 0xc6, 0xf8, 0x5e, 0x19, 0xea, 0x85, 0xc3,
0x26, 0x0f, 0xad, 0xa5, 0x0f, 0x8d, 0x2e, 0xc3, 0x8c, 0xec, 0x76, 0x32, 0x36, 0xe4, 0x02, 0xdd,
0x05, 0x5d, 0xde, 0x7b, 0xbc, 0x20, 0xa9, 0x13, 0x5e, 0x91, 0xfa, 0x42, 0x35, 0x42, 0xf7, 0xe0,
0xaa, 0x6c, 0x29, 0xbd, 0x60, 0xe4, 0x3b, 0x38, 0x3a, 0xcd, 0x51, 0xe5, 0x71, 0x9b, 0x02, 0xd1,
0x51, 0x80, 0x0c, 0xf9, 0x6d, 0x68, 0x8a, 0xed, 0x27, 0x6c, 0x3a, 0x23, 0x98, 0x97, 0x85, 0xba,
0xb8, 0xe7, 0x67, 0x61, 0xa5, 0x58, 0xd1, 0x73, 0xdc, 0x0b, 0x82, 0xfb, 0x7a, 0xa1, 0x64, 0x67,
0x0c, 0xbc, 0x39, 0xd6, 0x9a, 0x2e, 0x4e, 0xea, 0x4c, 0xf7, 0x61, 0x39, 0x85, 0x8d, 0x1f, 0x71,
0x56, 0x6c, 0xa3, 0x27, 0x90, 0xc2, 0x31, 0x8d, 0xaf, 0xc1, 0x4a, 0xe1, 0x41, 0xb6, 0x7d, 0x67,
0x27, 0x79, 0xe7, 0x57, 0x8b, 0xc0, 0x55, 0xa8, 0x66, 0x42, 0x49, 0x3c, 0xe6, 0xac, 0x09, 0x69,
0x14, 0x19, 0xdf, 0xa8, 0x40, 0xbd, 0x30, 0x04, 0xa2, 0x25, 0xb8, 0x10, 0x8e, 0x7a, 0xc7, 0xe4,
0x54, 0xec, 0x59, 0x33, 0xd5, 0x0a, 0x75, 0xe0, 0xda, 0x07, 0x2e, 0x1b, 0x38, 0x11, 0xfe, 0x00,
0x7b, 0x96, 0x1d, 0x11, 0x87, 0xf8, 0xcc, 0xc5, 0x5e, 0x3c, 0x96, 0xa9, 0xa8, 0x5e, 0x4e, 0x41,
0x3b, 0x29, 0x46, 0xf9, 0xf4, 0x93, 0xa0, 0xab, 0x81, 0x8e, 0x4f, 0xb5, 0x2e, 0x1b, 0xf2, 0x3a,
0x94, 0x8b, 0xa0, 0x25, 0xa9, 0xdf, 0x49, 0xd4, 0x8a, 0x79, 0x13, 0xe6, 0x14, 0xd3, 0xc3, 0xa7,
0x24, 0xa2, 0x71, 0xfa, 0x4a, 0xe1, 0x43, 0x21, 0xe3, 0xa9, 0x83, 0x6d, 0xe6, 0x9e, 0x64, 0x87,
0xa6, 0x19, 0x59, 0x07, 0x53, 0xb9, 0x9c, 0x95, 0xae, 0x01, 0x90, 0x67, 0xae, 0x1a, 0x75, 0x44,
0x30, 0x54, 0xcc, 0x4b, 0x5c, 0x22, 0xd5, 0xb7, 0xa0, 0x91, 0xb9, 0xac, 0x04, 0xc9, 0xe7, 0xaf,
0xa7, 0x72, 0x09, 0x5d, 0x87, 0x7a, 0xda, 0x62, 0x25, 0x72, 0x56, 0x56, 0xd4, 0x44, 0x2c, 0x81,
0x87, 0x50, 0xe3, 0x4f, 0x34, 0xa2, 0xd6, 0x91, 0x87, 0xfb, 0x54, 0x87, 0x35, 0x6d, 0x63, 0xbe,
0x7d, 0xe7, 0x9c, 0xc3, 0xf9, 0xe6, 0xbe, 0xe0, 0xbe, 0xc3, 0xa9, 0x66, 0x95, 0xa6, 0x0b, 0xe3,
0x73, 0x50, 0xcd, 0xe8, 0x50, 0x15, 0x2e, 0x76, 0xdf, 0xeb, 0x1e, 0x74, 0xb7, 0x1f, 0x36, 0x5e,
0x43, 0x08, 0xe6, 0xe5, 0xe2, 0x60, 0x6f, 0xd7, 0xda, 0xfb, 0x52, 0xf7, 0xa0, 0xa1, 0xa1, 0x06,
0xd4, 0x9e, 0x74, 0x0f, 0x1e, 0xec, 0x9a, 0xdb, 0x4f, 0xb6, 0x3b, 0x0f, 0xf7, 0x1a, 0x25, 0xc3,
0x83, 0xa6, 0x98, 0x5e, 0x4d, 0x82, 0x29, 0x2f, 0x23, 0xdc, 0xef, 0x2a, 0x1a, 0xd6, 0xa1, 0x9e,
0x0e, 0xee, 0xa2, 0x53, 0xab, 0x42, 0x31, 0x9f, 0x88, 0x45, 0x7b, 0x9e, 0x52, 0x32, 0x26, 0x75,
0x91, 0x2f, 0x43, 0xbd, 0x30, 0x39, 0x4d, 0xac, 0x41, 0x67, 0xe4, 0x7d, 0x69, 0x7a, 0xde, 0x1b,
0xbf, 0x2a, 0xc5, 0x7f, 0x8c, 0x84, 0x66, 0xa2, 0xe9, 0x8f, 0x01, 0x0a, 0xb1, 0xe8, 0x81, 0xe3,
0x56, 0x1b, 0x52, 0x93, 0x29, 0x04, 0xb7, 0x61, 0x81, 0xbb, 0x9b, 0x4c, 0xa8, 0x77, 0x75, 0xa1,
0xc8, 0x60, 0xdf, 0x82, 0xcb, 0x2a, 0x4c, 0x23, 0x72, 0x42, 0xb0, 0x97, 0xaf, 0x71, 0x48, 0xea,
0x4c, 0xa1, 0x52, 0x8c, 0xfb, 0x70, 0x29, 0x1d, 0x62, 0x66, 0xce, 0x39, 0xc3, 0xcc, 0xc6, 0x33,
0x07, 0x5a, 0x81, 0x4b, 0x69, 0xe1, 0xbf, 0x20, 0xa6, 0xa6, 0x54, 0xc0, 0xab, 0x47, 0x2f, 0x70,
0x4e, 0x45, 0xe8, 0x9e, 0x51, 0x3d, 0x32, 0xfe, 0xea, 0x04, 0xce, 0xa9, 0x29, 0x48, 0xc6, 0x7f,
0x4b, 0x50, 0x2f, 0x68, 0xd0, 0xe7, 0xa1, 0x96, 0x1b, 0x09, 0xe5, 0x1f, 0xcc, 0x9b, 0xe7, 0x28,
0x4b, 0x66, 0x8e, 0x88, 0x9e, 0x00, 0x0a, 0xa3, 0x20, 0x0c, 0x28, 0x89, 0x2c, 0xea, 0x61, 0x3a,
0x70, 0xfd, 0x3e, 0xd5, 0x4b, 0xc2, 0xdc, 0xc6, 0xd4, 0x01, 0x53, 0x31, 0xf6, 0x15, 0xc1, 0x5c,
0x08, 0x0b, 0x12, 0x61, 0x58, 0x6e, 0x94, 0x33, 0x5c, 0x3e, 0xdb, 0xf0, 0xb6, 0x62, 0xa4, 0x86,
0x71, 0x41, 0xc2, 0x27, 0xea, 0x59, 0x87, 0x84, 0x01, 0x75, 0x19, 0x2f, 0x3e, 0xdc, 0xdc, 0xea,
0x34, 0x73, 0xbb, 0x12, 0x67, 0x26, 0x04, 0xd4, 0x86, 0x19, 0x5e, 0x5c, 0xa8, 0x3e, 0x23, 0x98,
0x53, 0x27, 0xbe, 0xbd, 0x67, 0x2e, 0x33, 0x25, 0xd4, 0xf8, 0x7e, 0x09, 0x6a, 0xca, 0x52, 0xd7,
0x0f, 0x47, 0x6c, 0x6a, 0x65, 0xde, 0x84, 0xc5, 0x30, 0x0a, 0x82, 0x23, 0x2b, 0x38, 0xb2, 0xc2,
0x80, 0x52, 0x42, 0x93, 0xb9, 0xae, 0x26, 0x5c, 0x14, 0x1c, 0x3d, 0x3a, 0x7a, 0x9c, 0x28, 0x5e,
0x5c, 0xc9, 0xcb, 0xaf, 0x56, 0xc9, 0x2b, 0x67, 0x56, 0x72, 0xf1, 0x3f, 0x53, 0x36, 0xa5, 0x71,
0xaa, 0xec, 0xe8, 0x4d, 0x05, 0x28, 0x72, 0x8d, 0xa7, 0x80, 0x64, 0x0c, 0x60, 0x8f, 0x0f, 0x35,
0xc4, 0x79, 0xc9, 0x09, 0xe6, 0x36, 0x2c, 0x4c, 0x1b, 0x5d, 0xea, 0xbd, 0x42, 0x21, 0xf9, 0xa3,
0x06, 0x73, 0xe2, 0xf5, 0x71, 0xcf, 0x23, 0x7c, 0xb6, 0x47, 0x1f, 0x85, 0x85, 0x5c, 0x2d, 0x74,
0xf9, 0x7f, 0x29, 0x4d, 0xfc, 0x95, 0x6a, 0x64, 0xab, 0x21, 0x97, 0x4f, 0x1c, 0xe3, 0x4a, 0x93,
0xc7, 0xb8, 0xb8, 0xc7, 0x97, 0x3f, 0x4c, 0x8f, 0x7f, 0xe9, 0x19, 0xf0, 0xbb, 0x1a, 0x54, 0x55,
0x58, 0x09, 0xef, 0x75, 0x61, 0x4e, 0x85, 0xa9, 0xe5, 0xf2, 0x30, 0x53, 0xa3, 0xc6, 0x1b, 0x2f,
0x08, 0x6e, 0x11, 0x92, 0x66, 0xcd, 0x29, 0x04, 0x28, 0x1e, 0x06, 0x23, 0x9f, 0x29, 0xaf, 0xab,
0x15, 0x2f, 0x52, 0xfc, 0xbf, 0x10, 0x65, 0x78, 0x18, 0xaa, 0x56, 0x90, 0x0a, 0x8c, 0x5f, 0x96,
0xa0, 0x51, 0xcc, 0x6c, 0x3e, 0x7d, 0x25, 0xf5, 0x21, 0xdb, 0x76, 0xe6, 0x62, 0xa9, 0xec, 0x3a,
0x26, 0xd4, 0x43, 0x15, 0x10, 0xf2, 0x0f, 0x5c, 0x4b, 0x6c, 0x5d, 0x6d, 0xdf, 0x3e, 0xbb, 0x86,
0x64, 0xe3, 0x27, 0xb6, 0x89, 0x3d, 0xbe, 0x6a, 0xf1, 0x1a, 0x9e, 0xd8, 0x4c, 0x1c, 0x6a, 0xb5,
0x54, 0x9c, 0xa0, 0x30, 0x63, 0x40, 0xa8, 0x5a, 0xe3, 0xa7, 0x90, 0x39, 0xf0, 0x0a, 0xa7, 0x68,
0x4f, 0x39, 0x45, 0x9c, 0x21, 0xe3, 0xa7, 0x68, 0x1b, 0x3f, 0xd2, 0xa0, 0x51, 0x2c, 0x64, 0xe8,
0x11, 0x34, 0x68, 0x1c, 0xc4, 0xe2, 0xdf, 0xad, 0xd5, 0x52, 0x0f, 0xfc, 0xe6, 0xb4, 0xb3, 0xe5,
0x82, 0xde, 0x9c, 0xa7, 0xd9, 0x65, 0x6b, 0x82, 0xc1, 0xb6, 0x72, 0xf9, 0x87, 0x32, 0xd8, 0x36,
0xbe, 0xa3, 0xc1, 0x45, 0x15, 0x53, 0xa8, 0x0d, 0x57, 0x86, 0x24, 0x3a, 0xf6, 0x88, 0xd5, 0x8b,
0xb0, 0x6f, 0x0f, 0x92, 0x0f, 0x02, 0x9a, 0xe8, 0x6c, 0x8b, 0x52, 0xd9, 0x11, 0xba, 0xf8, 0x63,
0xc0, 0x6d, 0x58, 0x50, 0x1c, 0x16, 0x11, 0xa2, 0x82, 0x45, 0xc6, 0x5f, 0x5d, 0x2a, 0x0e, 0x22,
0x42, 0x64, 0xb8, 0xdc, 0x80, 0x38, 0x60, 0xad, 0x24, 0xe3, 0x6a, 0x66, 0xd5, 0x49, 0xd3, 0xc1,
0xc0, 0x50, 0xe1, 0x45, 0x78, 0x62, 0x51, 0x99, 0x30, 0x0c, 0x95, 0x26, 0x0e, 0x43, 0xb9, 0xae,
0x2c, 0x37, 0x49, 0x05, 0xc6, 0x9f, 0x4a, 0xb0, 0x7c, 0x58, 0xfc, 0x5a, 0xba, 0x4b, 0x3c, 0x86,
0xe5, 0xc8, 0xf2, 0x00, 0x6e, 0xc4, 0x5f, 0x3f, 0xe3, 0x0f, 0xae, 0x0e, 0xd7, 0xe6, 0xaa, 0x96,
0x6c, 0x01, 0xd7, 0xd4, 0x27, 0xd0, 0xac, 0x91, 0xcc, 0x38, 0x72, 0xee, 0x03, 0xa7, 0xad, 0xa5,
0x9c, 0x6b, 0x2d, 0xb1, 0x17, 0x2a, 0x19, 0x2f, 0xd8, 0x50, 0xe1, 0x03, 0xac, 0x88, 0xc4, 0xf9,
0xf6, 0xa3, 0x73, 0xcc, 0xaf, 0xc5, 0x1b, 0x4e, 0xd1, 0xc9, 0xd9, 0x56, 0x18, 0x37, 0xee, 0x4e,
0x73, 0x91, 0x1c, 0x72, 0xe7, 0x01, 0xb6, 0x77, 0x0e, 0xba, 0x87, 0xdb, 0x07, 0xdd, 0x47, 0xef,
0x35, 0x5e, 0x43, 0xb3, 0x50, 0x91, 0xd3, 0xad, 0xf1, 0x15, 0x98, 0x4d, 0x3e, 0xed, 0x6c, 0xc2,
0x62, 0xfc, 0xdc, 0xe3, 0xae, 0x5b, 0x50, 0xaa, 0x8c, 0xbb, 0x6e, 0x40, 0x4d, 0xb6, 0x87, 0xdc,
0x44, 0x58, 0x15, 0x32, 0xd5, 0x15, 0x3c, 0xa8, 0x65, 0xbf, 0xfe, 0xe4, 0xc7, 0x37, 0xed, 0xa5,
0xc7, 0xb7, 0x6b, 0x00, 0x22, 0x87, 0xec, 0x4c, 0xd5, 0xbc, 0xc4, 0x25, 0x3b, 0x5c, 0xd0, 0xa9,
0xfd, 0xfa, 0xf9, 0x75, 0xed, 0x37, 0xcf, 0xaf, 0x6b, 0x7f, 0x7d, 0x7e, 0x5d, 0xeb, 0x5d, 0x10,
0x9f, 0xfe, 0xef, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x9c, 0xed, 0xef, 0x7e, 0x52, 0x18, 0x00,
0x00,
0x9e, 0x57, 0xe2, 0x18, 0x78, 0x19, 0x66, 0x64, 0xd5, 0x29, 0x0b, 0xb5, 0x5c, 0x18, 0x7f, 0xd1,
0x40, 0x9f, 0xf6, 0xcc, 0xe8, 0x1e, 0x54, 0xc4, 0x53, 0x68, 0xe2, 0x56, 0x53, 0xd3, 0x26, 0x43,
0x14, 0x0f, 0x22, 0x48, 0xe8, 0x6d, 0x58, 0x0a, 0x71, 0xc4, 0x5c, 0xdb, 0x0d, 0x0b, 0x19, 0x5e,
0x12, 0xa5, 0xe7, 0x4a, 0x4e, 0x9b, 0x24, 0xf8, 0x2d, 0x68, 0xd8, 0x23, 0xca, 0x02, 0xe7, 0x34,
0x25, 0x94, 0x05, 0xa1, 0xae, 0xe4, 0x09, 0xf4, 0x26, 0xcc, 0x71, 0xaf, 0x59, 0xae, 0x6f, 0x7b,
0x23, 0x87, 0x38, 0x7a, 0x45, 0xdc, 0xac, 0xc6, 0x85, 0x5d, 0x25, 0x33, 0xfe, 0xac, 0x41, 0x35,
0x73, 0xc0, 0xff, 0xf7, 0x3b, 0x6d, 0xc1, 0x22, 0xee, 0xf7, 0x23, 0xd2, 0xe7, 0xed, 0x98, 0xba,
0x7d, 0x1f, 0xb3, 0x51, 0x44, 0xc4, 0xcd, 0x6a, 0x26, 0x4a, 0x54, 0xfb, 0xb1, 0xc6, 0xf8, 0x5e,
0x19, 0xea, 0x85, 0xc3, 0x22, 0xa4, 0x62, 0x4b, 0x4b, 0x43, 0x8b, 0x3f, 0xbf, 0xec, 0x77, 0x32,
0x3a, 0xe4, 0x02, 0xdd, 0x05, 0x5d, 0xde, 0x7b, 0xbc, 0x24, 0xa9, 0x13, 0x5e, 0x91, 0xfa, 0x42,
0x3d, 0x42, 0xf7, 0xe0, 0xaa, 0x6c, 0x2a, 0xbd, 0x60, 0xe4, 0x3b, 0x38, 0x3a, 0xcd, 0x51, 0xe5,
0x71, 0x9b, 0x02, 0xd1, 0x51, 0x80, 0x0c, 0xf9, 0x6d, 0x68, 0x8a, 0xed, 0x27, 0x6c, 0x3a, 0x23,
0x98, 0x97, 0x85, 0xba, 0xb8, 0xe7, 0x67, 0x61, 0xa5, 0x58, 0xd3, 0x73, 0xdc, 0x0b, 0x82, 0xfb,
0x7a, 0xa1, 0x68, 0x67, 0x0c, 0xbc, 0x39, 0xd6, 0x9c, 0x2e, 0x4e, 0xea, 0x4d, 0xf7, 0x61, 0x39,
0x85, 0x8d, 0x1f, 0x71, 0x56, 0x6c, 0xa3, 0x27, 0x90, 0xc2, 0x31, 0x8d, 0xaf, 0xc1, 0x4a, 0xe1,
0x41, 0xb6, 0x7d, 0x67, 0x27, 0x79, 0xe7, 0x57, 0x8b, 0xc0, 0x55, 0xa8, 0x66, 0x42, 0x49, 0x3c,
0xe6, 0xac, 0x09, 0x69, 0x14, 0x19, 0xdf, 0xa8, 0x40, 0xbd, 0x30, 0x06, 0xa2, 0x25, 0xb8, 0x10,
0x8e, 0x7a, 0xc7, 0xe4, 0x54, 0xec, 0x59, 0x33, 0xd5, 0x0a, 0x75, 0xe0, 0xda, 0x07, 0x2e, 0x1b,
0x38, 0x11, 0xfe, 0x00, 0x7b, 0x96, 0x1d, 0x11, 0x87, 0xf8, 0xcc, 0xc5, 0x5e, 0x3c, 0x98, 0xa9,
0xa8, 0x5e, 0x4e, 0x41, 0x3b, 0x29, 0x46, 0xf9, 0xf4, 0x93, 0xa0, 0xab, 0x91, 0x8e, 0xcf, 0xb5,
0x2e, 0x1b, 0xf2, 0x4a, 0x94, 0x8b, 0xa0, 0x25, 0xa9, 0xdf, 0x49, 0xd4, 0x8a, 0x79, 0x13, 0xe6,
0x14, 0xd3, 0xc3, 0xa7, 0x24, 0xa2, 0x71, 0xfa, 0x4a, 0xe1, 0x43, 0x21, 0xe3, 0xa9, 0x83, 0x6d,
0xe6, 0x9e, 0x64, 0xc7, 0xa6, 0x19, 0x59, 0x09, 0x53, 0xb9, 0x9c, 0x96, 0xae, 0x01, 0x90, 0x67,
0xae, 0x1a, 0x76, 0x44, 0x30, 0x54, 0xcc, 0x4b, 0x5c, 0x22, 0xd5, 0xb7, 0xa0, 0x91, 0xb9, 0xac,
0x04, 0xc9, 0xe7, 0xaf, 0xa7, 0x72, 0x09, 0x5d, 0x87, 0x7a, 0xda, 0x64, 0x25, 0x72, 0x56, 0xd6,
0xd4, 0x44, 0x2c, 0x81, 0x87, 0x50, 0xe3, 0x4f, 0x34, 0xa2, 0xd6, 0x91, 0x87, 0xfb, 0x54, 0x87,
0x35, 0x6d, 0x63, 0xbe, 0x7d, 0xe7, 0x9c, 0xe3, 0xf9, 0xe6, 0xbe, 0xe0, 0xbe, 0xc3, 0xa9, 0x66,
0x95, 0xa6, 0x0b, 0xe3, 0x73, 0x50, 0xcd, 0xe8, 0x50, 0x15, 0x2e, 0x76, 0xdf, 0xeb, 0x1e, 0x74,
0xb7, 0x1f, 0x36, 0x5e, 0x43, 0x08, 0xe6, 0xe5, 0xe2, 0x60, 0x6f, 0xd7, 0xda, 0xfb, 0x52, 0xf7,
0xa0, 0xa1, 0xa1, 0x06, 0xd4, 0x9e, 0x74, 0x0f, 0x1e, 0xec, 0x9a, 0xdb, 0x4f, 0xb6, 0x3b, 0x0f,
0xf7, 0x1a, 0x25, 0xc3, 0x83, 0xa6, 0x98, 0x5f, 0x4d, 0x82, 0x29, 0x2f, 0x23, 0xdc, 0xef, 0x2a,
0x1a, 0xd6, 0xa1, 0x9e, 0x8e, 0xee, 0xa2, 0x57, 0xab, 0x42, 0x31, 0x9f, 0x88, 0x45, 0x83, 0x9e,
0x52, 0x32, 0xe2, 0xe2, 0x52, 0xce, 0xf4, 0xad, 0x2f, 0x43, 0xbd, 0x30, 0x3b, 0x4d, 0xac, 0x41,
0x67, 0xe4, 0x7d, 0x69, 0x7a, 0xde, 0x1b, 0xbf, 0x2a, 0xc5, 0x7f, 0x8d, 0x84, 0x66, 0xa2, 0xe9,
0x8f, 0x01, 0x0a, 0xb1, 0xe8, 0x82, 0xe3, 0x56, 0x1b, 0x52, 0x93, 0x29, 0x04, 0xb7, 0x61, 0x81,
0xbb, 0x9b, 0x4c, 0xa8, 0x77, 0x75, 0xa1, 0xc8, 0x60, 0xdf, 0x82, 0xcb, 0x2a, 0x4c, 0x23, 0x72,
0x42, 0xb0, 0x97, 0xaf, 0x71, 0x48, 0xea, 0x4c, 0xa1, 0x52, 0x8c, 0xfb, 0x70, 0x29, 0x1d, 0x63,
0x66, 0xce, 0x39, 0xc5, 0xcc, 0xc6, 0x53, 0x07, 0x5a, 0x81, 0x4b, 0x69, 0xe1, 0xbf, 0x20, 0xe6,
0xa6, 0x54, 0xc0, 0xab, 0x47, 0x2f, 0x70, 0x4e, 0x45, 0xe8, 0x9e, 0x51, 0x3d, 0x32, 0xfe, 0xea,
0x04, 0xce, 0xa9, 0x29, 0x48, 0xc6, 0x7f, 0x4b, 0x50, 0x2f, 0x68, 0xd0, 0xe7, 0xa1, 0x96, 0x1b,
0x0a, 0xe5, 0x5f, 0xcc, 0x9b, 0xe7, 0x28, 0x4b, 0x66, 0x8e, 0x88, 0x9e, 0x00, 0x0a, 0xa3, 0x20,
0x0c, 0x28, 0x89, 0x2c, 0xea, 0x61, 0x3a, 0x70, 0xfd, 0x3e, 0xd5, 0x4b, 0xc2, 0xdc, 0xc6, 0xd4,
0x11, 0x53, 0x31, 0xf6, 0x15, 0xc1, 0x5c, 0x08, 0x0b, 0x12, 0x61, 0x58, 0x6e, 0x94, 0x33, 0x5c,
0x3e, 0xdb, 0xf0, 0xb6, 0x62, 0xa4, 0x86, 0x71, 0x41, 0xc2, 0x67, 0xea, 0x59, 0x87, 0x84, 0x01,
0x75, 0x19, 0x2f, 0x3e, 0xdc, 0xdc, 0xea, 0x34, 0x73, 0xbb, 0x12, 0x67, 0x26, 0x04, 0xd4, 0x86,
0x19, 0x5e, 0x5c, 0xa8, 0x3e, 0x23, 0x98, 0x53, 0x67, 0xbe, 0xbd, 0x67, 0x2e, 0x33, 0x25, 0xd4,
0xf8, 0x7e, 0x09, 0x6a, 0xca, 0x52, 0xd7, 0x0f, 0x47, 0x6c, 0x6a, 0x65, 0xde, 0x84, 0xc5, 0x30,
0x0a, 0x82, 0x23, 0x2b, 0x38, 0xb2, 0xc2, 0x80, 0x52, 0x42, 0x93, 0xc9, 0xae, 0x26, 0x5c, 0x14,
0x1c, 0x3d, 0x3a, 0x7a, 0x9c, 0x28, 0x5e, 0x5c, 0xc9, 0xcb, 0xaf, 0x56, 0xc9, 0x2b, 0x67, 0x56,
0x72, 0xf1, 0x4f, 0x53, 0x36, 0xa5, 0x71, 0xaa, 0xec, 0xe8, 0x4d, 0x05, 0x28, 0x72, 0x8d, 0xa7,
0x80, 0x64, 0x0c, 0x60, 0x8f, 0x0f, 0x35, 0xc4, 0x79, 0xc9, 0x09, 0xe6, 0x36, 0x2c, 0x4c, 0x1b,
0x5d, 0xea, 0xbd, 0x42, 0x21, 0xf9, 0xa3, 0x06, 0x73, 0xe2, 0xf5, 0x71, 0xcf, 0x23, 0x7c, 0xba,
0x47, 0x1f, 0x85, 0x85, 0x5c, 0x2d, 0x74, 0xf9, 0xbf, 0x29, 0x4d, 0xfc, 0x99, 0x6a, 0x64, 0xab,
0x21, 0x97, 0x4f, 0x1c, 0xe3, 0x4a, 0x93, 0xc7, 0xb8, 0xb8, 0xc7, 0x97, 0x3f, 0x4c, 0x8f, 0x7f,
0xe9, 0x19, 0xf0, 0xbb, 0x1a, 0x54, 0x55, 0x58, 0x09, 0xef, 0x75, 0x61, 0x4e, 0x85, 0xa9, 0xe5,
0xf2, 0x30, 0x53, 0xa3, 0xc6, 0x1b, 0x2f, 0x08, 0x6e, 0x11, 0x92, 0x66, 0xcd, 0x29, 0x04, 0x28,
0x1e, 0x06, 0x23, 0x9f, 0x29, 0xaf, 0xab, 0x15, 0x2f, 0x52, 0xfc, 0xdf, 0x10, 0x65, 0x78, 0x18,
0xaa, 0x56, 0x90, 0x0a, 0x8c, 0x5f, 0x96, 0xa0, 0x51, 0xcc, 0x6c, 0x3e, 0x7d, 0x25, 0xf5, 0x21,
0xdb, 0x76, 0xe6, 0x62, 0xa9, 0xec, 0x3a, 0x26, 0xd4, 0x43, 0x15, 0x10, 0xf2, 0x2f, 0x5c, 0x4b,
0x6c, 0x5d, 0x6d, 0xdf, 0x3e, 0xbb, 0x86, 0x64, 0xe3, 0x27, 0xb6, 0x89, 0x3d, 0xbe, 0x6a, 0xf1,
0x1a, 0x9e, 0xd8, 0x4c, 0x1c, 0x6a, 0xb5, 0x54, 0x9c, 0xa0, 0x30, 0x63, 0x40, 0xa8, 0x5a, 0xe3,
0xa7, 0x90, 0x39, 0xf0, 0x0a, 0xa7, 0x68, 0x4f, 0x39, 0x45, 0x9c, 0x21, 0xe3, 0xa7, 0x68, 0x1b,
0x3f, 0xd2, 0xa0, 0x51, 0x2c, 0x64, 0xe8, 0x11, 0x34, 0x68, 0x1c, 0xc4, 0xe2, 0xff, 0xad, 0xd5,
0x52, 0x0f, 0xfc, 0xe6, 0xb4, 0xb3, 0xe5, 0x82, 0xde, 0x9c, 0xa7, 0xd9, 0x65, 0x6b, 0x82, 0xc1,
0xb6, 0x72, 0xf9, 0x87, 0x32, 0xd8, 0x36, 0xbe, 0xa3, 0xc1, 0x45, 0x15, 0x53, 0xa8, 0x0d, 0x57,
0x86, 0x24, 0x3a, 0xf6, 0x88, 0xd5, 0x8b, 0xb0, 0x6f, 0x0f, 0x92, 0x4f, 0x02, 0x9a, 0xe8, 0x6c,
0x8b, 0x52, 0xd9, 0x11, 0xba, 0xf8, 0x73, 0xc0, 0x6d, 0x58, 0x50, 0x1c, 0x16, 0x11, 0xa2, 0x82,
0x45, 0xc6, 0x5f, 0x5d, 0x2a, 0x0e, 0x22, 0x42, 0x64, 0xb8, 0xdc, 0x80, 0x38, 0x60, 0xad, 0x24,
0xe3, 0x6a, 0x66, 0xd5, 0x49, 0xd3, 0xc1, 0xc0, 0x50, 0xe1, 0x45, 0x78, 0x62, 0x51, 0x99, 0x30,
0x0c, 0x95, 0x26, 0x0e, 0x43, 0xb9, 0xae, 0x2c, 0x37, 0x49, 0x05, 0xc6, 0x9f, 0x4a, 0xb0, 0x7c,
0x58, 0xfc, 0x5e, 0xba, 0x4b, 0x3c, 0x86, 0xe5, 0xc8, 0xf2, 0x00, 0x6e, 0xc4, 0xdf, 0x3f, 0xe3,
0x4f, 0xae, 0x0e, 0xd7, 0xe6, 0xaa, 0x96, 0x6c, 0x01, 0xd7, 0xd4, 0x47, 0xd0, 0xac, 0x91, 0xcc,
0x38, 0x72, 0xee, 0x03, 0xa7, 0xad, 0xa5, 0x9c, 0x6b, 0x2d, 0xb1, 0x17, 0x2a, 0x19, 0x2f, 0xd8,
0x50, 0xe1, 0x03, 0xac, 0x88, 0xc4, 0xf9, 0xf6, 0xa3, 0x73, 0xcc, 0xaf, 0xc5, 0x1b, 0x4e, 0xd1,
0xc9, 0xd9, 0x56, 0x18, 0x37, 0xee, 0x4e, 0x73, 0x91, 0x1c, 0x72, 0xe7, 0x01, 0xb6, 0x77, 0x0e,
0xba, 0x87, 0xdb, 0x07, 0xdd, 0x47, 0xef, 0x35, 0x5e, 0x43, 0xb3, 0x50, 0x91, 0xd3, 0xad, 0xf1,
0x15, 0x98, 0x4d, 0x3e, 0xee, 0x6c, 0xc2, 0x62, 0xfc, 0xdc, 0xe3, 0xae, 0x5b, 0x50, 0xaa, 0x8c,
0xbb, 0x6e, 0x40, 0x4d, 0xb6, 0x87, 0xdc, 0x44, 0x58, 0x15, 0x32, 0xd5, 0x15, 0x3c, 0xa8, 0x65,
0xbf, 0xff, 0xe4, 0xc7, 0x37, 0xed, 0xa5, 0xc7, 0xb7, 0x6b, 0x00, 0x22, 0x87, 0xec, 0x4c, 0xd5,
0xbc, 0xc4, 0x25, 0x3b, 0x5c, 0xd0, 0xa9, 0xfd, 0xfa, 0xf9, 0x75, 0xed, 0x37, 0xcf, 0xaf, 0x6b,
0x7f, 0x7d, 0x7e, 0x5d, 0xeb, 0x5d, 0x10, 0x1f, 0xff, 0xef, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff,
0x5b, 0xcd, 0xa2, 0x6e, 0x54, 0x18, 0x00, 0x00,
}

View File

@@ -46,7 +46,7 @@ message BeaconState {
message Fork {
uint64 previous_version = 1;
uint64 current_version = 2;
uint64 slot = 3;
uint64 epoch = 3;
}
message PendingAttestationRecord {