diff --git a/p2p/discover/portal_protocol.go b/p2p/discover/portal_protocol.go index f8066eab3b45..d8f3673057cc 100644 --- a/p2p/discover/portal_protocol.go +++ b/p2p/discover/portal_protocol.go @@ -1373,7 +1373,7 @@ func (p *PortalProtocol) contentLookupWorker(n *enode.Node, contentKey []byte, r return nil, err } switch flag { - case portalwire.ContentRawSelector: + case portalwire.ContentRawSelector, portalwire.ContentConnIdSelector: content, ok := content.([]byte) if !ok { return wrapedNode, fmt.Errorf("failed to assert to raw content, value is: %v", content) diff --git a/p2p/discover/portal_protocol_test.go b/p2p/discover/portal_protocol_test.go index 741e777562b6..69197dfddd68 100644 --- a/p2p/discover/portal_protocol_test.go +++ b/p2p/discover/portal_protocol_test.go @@ -318,24 +318,6 @@ func TestCancel(t *testing.T) { time.Sleep(time.Second * 3) } -// func TestInsertWithDistance(t *testing.T) { -// targetId := uint256.NewInt(0).Bytes32() -// nodes := make([]*node, 0, 10) -// for i := 0; i < 10; i++ { -// enode := &node{ -// Node: enode.Node{ -// id: enode.ID(uint256.NewInt(uint64(i)).Bytes32()), -// }, -// } -// nodes = append(nodes, enode) -// } -// newNode := &node{ -// Node: &enode.Node{ -// id: uint256.NewInt(20).Bytes32(), -// }, -// } -// } - func TestContentLookup(t *testing.T) { node1, err := setupLocalPortalNode(":17777", nil) assert.NoError(t, err) diff --git a/portalnetwork/history/history_network.go b/portalnetwork/history/history_network.go index 159fab951bca..d28bb2e9a1c9 100644 --- a/portalnetwork/history/history_network.go +++ b/portalnetwork/history/history_network.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/portalnetwork/storage" "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) type ContentType byte @@ -123,10 +124,299 @@ func (h *HistoryNetwork) GetBlockHeader(blockHash []byte) (*types.Header, error) return nil, storage.ErrContentNotFound } +func (h *HistoryNetwork) GetBlockBody(blockHash []byte) (*types.Body, error) { + header, err := h.GetBlockHeader(blockHash) + if err != nil { + return nil, err + } + contentKey := newContentKey(BlockBodyType, blockHash).encode() + contentId := h.portalProtocol.ToContentId(contentKey) + + if !h.portalProtocol.InRange(contentId) { + return nil, ErrContentOutOfRange + } + + res, err := h.portalProtocol.Get(contentId) + // other error + // TODO maybe use nil res to replace the ErrContentNotFound + if err != nil && err != storage.ErrContentNotFound { + return nil, err + } + // no error + if err == nil { + body, err := DecodePortalBlockBodyBytes(res) + return body, err + } + // no content in local storage + + for retries := 0; retries < requestRetries; retries++ { + content, err := h.portalProtocol.ContentLookup(contentKey) + if err != nil { + continue + } + body, err := DecodePortalBlockBodyBytes(content) + if err != nil { + continue + } + + err = validateBlockBody(body, header) + if err != nil { + continue + } + // TODO handle the error + _ = h.portalProtocol.Put(contentId, content) + return body, nil + } + return nil, storage.ErrContentNotFound +} + +func (h *HistoryNetwork) GetReceipts(blockHash []byte) ([]*types.Receipt, error) { + header, err := h.GetBlockHeader(blockHash) + if err != nil { + return nil, err + } + contentKey := newContentKey(ReceiptsType, blockHash).encode() + contentId := h.portalProtocol.ToContentId(contentKey) + + if !h.portalProtocol.InRange(contentId) { + return nil, ErrContentOutOfRange + } + + res, err := h.portalProtocol.Get(contentId) + // other error + if err != nil && err != storage.ErrContentNotFound { + return nil, err + } + // no error + if err == nil { + portalReceipte := new(PortalReceipts) + err := portalReceipte.UnmarshalSSZ(res) + if err != nil { + return nil, err + } + receipts, err := FromPortalReceipts(portalReceipte) + return receipts, err + } + // no content in local storage + + for retries := 0; retries < requestRetries; retries++ { + content, err := h.portalProtocol.ContentLookup(contentKey) + if err != nil { + continue + } + receipts, err := ValidatePortalReceiptsBytes(content, header.ReceiptHash.Bytes()) + if err != nil { + continue + } + // TODO handle the error + _ = h.portalProtocol.Put(contentId, content) + return receipts, nil + } + return nil, storage.ErrContentNotFound +} + func (h *HistoryNetwork) verifyHeader(header *types.Header, proof BlockHeaderProof) (bool, error) { return h.masterAccumulator.VerifyHeader(*header, proof) } +func ValidateBlockBodyBytes(bodyBytes []byte, header *types.Header) (*types.Body, error) { + // TODO check shanghai, pos and legacy block + body, err := DecodePortalBlockBodyBytes(bodyBytes) + if err != nil { + return nil, err + } + err = validateBlockBody(body, header) + return body, err +} + +func DecodePortalBlockBodyBytes(bodyBytes []byte) (*types.Body, error) { + blockBodyShanghai := new(PortalBlockBodyShanghai) + err := blockBodyShanghai.UnmarshalSSZ(bodyBytes) + if err == nil { + return FromPortalBlockBodyShanghai(blockBodyShanghai) + } + + blockBodyLegacy := new(BlockBodyLegacy) + err = blockBodyLegacy.UnmarshalSSZ(bodyBytes) + if err == nil { + return FromBlockBodyLegacy(blockBodyLegacy) + } + return nil, errors.New("all portal block body decodings failed") +} + +func validateBlockBody(body *types.Body, header *types.Header) error { + if hash := types.CalcUncleHash(body.Uncles); !bytes.Equal(hash[:], header.UncleHash.Bytes()) { + return ErrUnclesHashIsNotEqual + } + + if hash := types.DeriveSha(types.Transactions(body.Transactions), trie.NewStackTrie(nil)); !bytes.Equal(hash[:], header.TxHash.Bytes()) { + return ErrTxHashIsNotEqual + } + if body.Withdrawals == nil { + return nil + } + if hash := types.DeriveSha(types.Withdrawals(body.Withdrawals), trie.NewStackTrie(nil)); !bytes.Equal(hash[:], header.WithdrawalsHash.Bytes()) { + return ErrWithdrawalHashIsNotEqual + } + return nil +} + +// EncodeBlockBody encode types.Body to ssz bytes +func EncodeBlockBody(body *types.Body) ([]byte, error) { + if body.Withdrawals != nil && len(body.Withdrawals) > 0 { + blockShanghai, err := toPortalBlockBodyShanghai(body) + if err != nil { + return nil, err + } + return blockShanghai.MarshalSSZ() + } else { + legacyBlock, err := toBlockBodyLegacy(body) + if err != nil { + return nil, err + } + return legacyBlock.MarshalSSZ() + } +} + +// toPortalBlockBodyShanghai convert types.Body to PortalBlockBodyShanghai +func toPortalBlockBodyShanghai(b *types.Body) (*PortalBlockBodyShanghai, error) { + legacy, err := toBlockBodyLegacy(b) + if err != nil { + return nil, err + } + withdrawals := make([][]byte, 0, len(b.Withdrawals)) + for _, w := range b.Withdrawals { + b, err := rlp.EncodeToBytes(w) + if err != nil { + return nil, err + } + withdrawals = append(withdrawals, b) + } + return &PortalBlockBodyShanghai{Transactions: legacy.Transactions, Uncles: legacy.Uncles, Withdrawals: withdrawals}, nil +} + +// toBlockBodyLegacy convert types.Body to BlockBodyLegacy +func toBlockBodyLegacy(b *types.Body) (*BlockBodyLegacy, error) { + txs := make([][]byte, 0, len(b.Transactions)) + + for _, tx := range b.Transactions { + txBytes, err := rlp.EncodeToBytes(tx) + if err != nil { + return nil, err + } + txs = append(txs, txBytes) + } + + uncleBytes, err := rlp.EncodeToBytes(b.Uncles) + if err != nil { + return nil, err + } + return &BlockBodyLegacy{Uncles: uncleBytes, Transactions: txs}, err +} + +// FromPortalBlockBodyShanghai convert PortalBlockBodyShanghai to types.Body +func FromPortalBlockBodyShanghai(b *PortalBlockBodyShanghai) (*types.Body, error) { + transactions := make([]*types.Transaction, 0, len(b.Transactions)) + for _, t := range b.Transactions { + tran := new(types.Transaction) + err := tran.UnmarshalBinary(t) + if err != nil { + return nil, err + } + transactions = append(transactions, tran) + } + uncles := make([]*types.Header, 0, len(b.Uncles)) + err := rlp.DecodeBytes(b.Uncles, &uncles) + withdrawals := make([]*types.Withdrawal, 0, len(b.Withdrawals)) + for _, w := range b.Withdrawals { + withdrawal := new(types.Withdrawal) + err := rlp.DecodeBytes(w, withdrawal) + if err != nil { + return nil, err + } + withdrawals = append(withdrawals, withdrawal) + } + return &types.Body{ + Uncles: uncles, + Transactions: transactions, + Withdrawals: withdrawals, + }, err +} + +// FromBlockBodyLegacy convert BlockBodyLegacy to types.Body +func FromBlockBodyLegacy(b *BlockBodyLegacy) (*types.Body, error) { + transactions := make([]*types.Transaction, 0, len(b.Transactions)) + for _, t := range b.Transactions { + tran := new(types.Transaction) + err := tran.UnmarshalBinary(t) + if err != nil { + return nil, err + } + transactions = append(transactions, tran) + } + uncles := make([]*types.Header, 0, len(b.Uncles)) + err := rlp.DecodeBytes(b.Uncles, &uncles) + return &types.Body{ + Uncles: uncles, + Transactions: transactions, + }, err +} + +// FromPortalReceipts convert PortalReceipts to types.Receipt +func FromPortalReceipts(r *PortalReceipts) ([]*types.Receipt, error) { + res := make([]*types.Receipt, 0, len(r.Receipts)) + for _, reci := range r.Receipts { + recipt := new(types.Receipt) + err := recipt.UnmarshalBinary(reci) + if err != nil { + return nil, err + } + res = append(res, recipt) + } + return res, nil +} + +func ValidatePortalReceiptsBytes(receiptBytes, receiptsRoot []byte) ([]*types.Receipt, error) { + portalReceipts := new(PortalReceipts) + err := portalReceipts.UnmarshalSSZ(receiptBytes) + if err != nil { + return nil, err + } + + receipts, err := FromPortalReceipts(portalReceipts) + if err != nil { + return nil, err + } + + root := types.DeriveSha(types.Receipts(receipts), trie.NewStackTrie(nil)) + + if !bytes.Equal(root[:], receiptsRoot) { + return nil, errors.New("receipt root is not equal to the header.ReceiptHash") + } + return receipts, nil +} + +func EncodeReceipts(receipts []*types.Receipt) ([]byte, error) { + portalReceipts, err := ToPortalReceipts(receipts) + if err != nil { + return nil, err + } + return portalReceipts.MarshalSSZ() +} + +// ToPortalReceipts convert types.Receipt to PortalReceipts +func ToPortalReceipts(receipts []*types.Receipt) (*PortalReceipts, error) { + res := make([][]byte, 0, len(receipts)) + for _, r := range receipts { + b, err := r.MarshalBinary() + if err != nil { + return nil, err + } + res = append(res, b) + } + return &PortalReceipts{Receipts: res}, nil +} + func (h *HistoryNetwork) processContentLoop() { contentChan := h.portalProtocol.GetContent() for contentElement := range contentChan { @@ -158,9 +448,19 @@ func (h *HistoryNetwork) validateContent(contentKey []byte, content []byte) erro } return err case BlockBodyType: - // TODO + header, err := h.GetBlockHeader(contentKey[1:]) + if err != nil { + return err + } + _, err = ValidateBlockBodyBytes(content, header) + return err case ReceiptsType: - // TODO + header, err := h.GetBlockHeader(contentKey[1:]) + if err != nil { + return err + } + _, err = ValidatePortalReceiptsBytes(content, header.ReceiptHash.Bytes()) + return err case EpochAccumulatorType: // TODO } diff --git a/portalnetwork/history/history_network_test.go b/portalnetwork/history/history_network_test.go index c5ca09669d28..a6374ba49261 100644 --- a/portalnetwork/history/history_network_test.go +++ b/portalnetwork/history/history_network_test.go @@ -1,6 +1,7 @@ package history import ( + "bytes" "crypto/sha256" "encoding/hex" "encoding/json" @@ -113,6 +114,42 @@ func TestValidateHeader(t *testing.T) { } } +func TestReceiptsAndBody(t *testing.T) { + entryMap, err := parseDataForBlock14764013() + require.NoError(t, err) + + historyNetwork, err := genHistoryNetwork(":7893", nil) + require.NoError(t, err) + + headerEntry := entryMap["header"] + // validateContents will store the content + err = historyNetwork.validateContents([][]byte{headerEntry.key}, [][]byte{headerEntry.value}) + require.NoError(t, err) + + bodyEntry := entryMap["body"] + err = historyNetwork.validateContent(bodyEntry.key, bodyEntry.value) + require.NoError(t, err) + + receiptsEntry := entryMap["receipts"] + err = historyNetwork.validateContent(receiptsEntry.key, receiptsEntry.value) + require.NoError(t, err) + // test for portalReceipts encode and decode + portalReceipts := new(PortalReceipts) + err = portalReceipts.UnmarshalSSZ(receiptsEntry.value) + require.NoError(t, err) + portalBytes, err := portalReceipts.MarshalSSZ() + require.NoError(t, err) + require.True(t, bytes.Equal(portalBytes, receiptsEntry.value)) +} + +func TestPortalBlockShanghai(t *testing.T) { + bodyBytes, err := hexutil.Decode(bodyData) + require.NoError(t, err) + body, err := DecodePortalBlockBodyBytes(bodyBytes) + require.NoError(t, err) + require.True(t, len(body.Withdrawals) > 0) +} + func TestGetContentByKey(t *testing.T) { historyNetwork1, err := genHistoryNetwork(":7895", nil) require.NoError(t, err) @@ -143,6 +180,44 @@ func TestGetContentByKey(t *testing.T) { header, err = historyNetwork2.GetBlockHeader(headerEntry.key[1:]) require.NoError(t, err) require.NotNil(t, header) + + // test GetBlockBody + // no content + bodyEntry := entryMap["body"] + body, err := historyNetwork2.GetBlockBody(bodyEntry.key[1:]) + require.Error(t, err) + require.Nil(t, body) + + contentId = historyNetwork1.portalProtocol.ToContentId(bodyEntry.key) + err = historyNetwork1.portalProtocol.Put(contentId, bodyEntry.value) + require.NoError(t, err) + // get content from historyNetwork1 + body, err = historyNetwork2.GetBlockBody(bodyEntry.key[1:]) + require.NoError(t, err) + require.NotNil(t, body) + // get content from local + body, err = historyNetwork2.GetBlockBody(bodyEntry.key[1:]) + require.NoError(t, err) + require.NotNil(t, body) + + // test GetBlockReceipts + // no content + receiptsEntry := entryMap["receipts"] + receipts, err := historyNetwork2.GetReceipts(receiptsEntry.key[1:]) + require.Error(t, err) + require.Nil(t, receipts) + + contentId = historyNetwork1.portalProtocol.ToContentId(receiptsEntry.key) + err = historyNetwork1.portalProtocol.Put(contentId, receiptsEntry.value) + require.NoError(t, err) + // get content from historyNetwork1 + receipts, err = historyNetwork2.GetReceipts(receiptsEntry.key[1:]) + require.NoError(t, err) + require.NotNil(t, receipts) + // get content from local + receipts, err = historyNetwork2.GetReceipts(receiptsEntry.key[1:]) + require.NoError(t, err) + require.NotNil(t, receipts) } type contentEntry struct { @@ -255,3 +330,5 @@ func parseDataForBlock14764013() (map[string]contentEntry, error) { } return res, nil } + +const bodyData = "0x0c00000063cf000064cf0000d40100002b030000c30700001b090000520b0000b20c0000680d000064140000621700007f1900007c1c00000223000045260000732c0000652f0000dc32000054340000023500008d3500003b360000e93600009737000045380000f03800005e390000cb3900003b3a0000ef3a0000663b0000de3b0000923c0000f13d00004d3f0000a9400000214100008f4100008342000039430000b2430000684600001d470000d047000085480000234b0000d94b0000f95f0000b060000067610000e06100005a6200000d6300000566000006690000256b0000dc6b00001a740000f0740000a475000058760000d076000045770000ba77000070780000247900009179000056810000248200009c8300009b860000148700009087000006880000488900003f8a00003c8d0000b28d0000668e00003e90000016920000b293000027940000dc9400009095000047970000bf97000053980000509b0000069c0000b99c00004b9d0000499e000061ac000015ad0000caad00007eae0000b5af00006ab00000e0b2000056b30000cbb3000046b40000bab40000bab7000055b8000009b900007eb900003cbb0000efbb0000edbe000062bf000029c6000029c90000dec900005aca00000ecb00000cce0000e2ce000002f9015301822ffd845a00c580850fc0c55fda830493e094000000d40b595b94918a28b27d1e2c66f43a51d380b8e44ded60db000000000000000000000000af06e7c7170eb22d52eb09b5ec5d1373c34164e90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b69753c06bb5c366be51e73bfc0cc2e3dc07e371000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000002ae5ac4114d6f875dcf9f9f5a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa9f9caa4534202c080a06e371cca1788f871e5bbcfdd3f44155eb23b267a77d6329e3e9f74b6aa20629ba005b32687c43cf12901e7335caa8063207d62e01553c1d631c0a80fca398a9bc702f90494018201558404a7541085097195914b83038c5494ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b80b904243593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba5300000000000000000000000000000000000000000000000000000000000000030a090c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000b69753c06bb5c366be51e73bfc0cc2e3dc07e371000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000647240440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b00000000000000000000000000000000000000000000000000000000644aba4c00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004150ab270c9edbc9ea6f467cfc1074558e681673a130e5147ce28145f62cec3a7e36677086050dc916b3db5048c44f55171460ef23c709f69402dd6c5f8eb352cf1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000c7d713b49da0000000000000000000000000000000000000000003576d03773053f3c6a43b53c6e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b69753c06bb5c366be51e73bfc0cc2e3dc07e371000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000c7d713b49da0000c001a0fb8838d1e34155f3e48fb210e3ebd6d4f0f09bf4f03c2913a0edf864a02c9b11a0469428661c33d1dc15505bc539779c0905c07499e7b01ec24fd93e4bed93252202f901540182315a85d87ea17ae285e7e566153c830493e094000000d40b595b94918a28b27d1e2c66f43a51d380b8e44ded60db000000000000000000000000af06e7c7170eb22d52eb09b5ec5d1373c34164e90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000b69753c06bb5c366be51e73bfc0cc2e3dc07e3710000000000000000000000000000000000000000000000000a636e6a290f4f65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000269b816dc5f4ac6a13adc75d17c080a0702ad981fc700c8da8a546be5a3332ad108d10a7c0773b3450b7d3b701b7900ea013c56711516a87d40476fb4dfe226b23e60109226fdd29d2fc92b6db68ba6f4702f90233018302095880850bc829cc8a830dc7ac94a69babef1ca67a37ffaf7a485dfff3382056e78c82f000b901c478e111f6000000000000000000000000008b4d7cd96587e0209b79642e793345324530fe00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000144d6da0ef40000000000000000000000009409280dc1e6d33ab7a8c6ec03e5763fb61772b5000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005a98fcbea516cf06857215779fd812ca3bef1b3200000000000000000000000000000000000000000000000078d15e16ec930963000000000000000000000000000000000000000b2e203bd595c1cc083b5916000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000644ab3980000000000000000000000000000000000000000000001a3f1c5ace6c1b4aad50000000000000000000000000000000000000000000000000000000000000000bf0001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a0fa6dc1fc3fdfce74fc2b2fa8bbf4d967cd7b78459642ed9a5849162fac5db0fda00a6fbf2cc56208846ec9aa9064acdb25a3640d8751b8a6f8c4ca890949fc754502f9015c01820563850836da14008517b459508083039144947a250d5630b4cf539739df2c5dacb4c659f2488d8802c68af0bb140000b8e4b6f9de9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000d700b06fc6cc0693495fe32e06c34b14a07fa55000000000000000000000000000000000000000000000000000000000644ab5ae0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e5364e90abb511fb3ef45617dafd242e2ed6aa8cc080a0066e9ac448cbaa8c1ede8b43428d0494c048be80ab698ef1ee1a056a0642d0b9a03031fc69cedcab335aeb425055812ad732cfe64f2b9f3a849db54388c115faad02f8b301820564850836da14008517b459508082dd8994e5364e90abb511fb3ef45617dafd242e2ed6aa8c80b844095ea7b30000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001a0d3db2c371fd7db2280c78ee92182efbf434559fa971e920cfcb45010168da76aa062272e437b2b2699cde90020e2ecc7b4d803080669f80e36242a1eea5c5b203c02f906f80182e587808507b3624d2e8304f10a9493ffb15d1fa91e0c320d058f00ee97f9e3c500968401de6e96b83b6f343adcbc177b8c4aec41d0c7fe2b8758567ea2e11ed4027385be391a04a9432cc3840e329d3dd035c820d62f012a66832b9eb78a00051957622df9064cf8dd94be330bda7f32e391b9370822710806b886135acaf8c6a0d1c04f4cb8beeb7e801bb4cd74f118fab9c4e0294d2dda604550f6ce96e51c54a0cc8e5d49df56c821d72941211679ad183ab543e8edf8e341dfb5965fe4215560a0944e186234f1d8e0aa46e82a61a5daaa2b52c97dd3d004cac5ff45aef0dfdedea00000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000006a06b12567b6d3c7646571a3ad6a75acb84bae1a10cad73174394a709bb98c1e3d2f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a095d4521a8b63a008515947850694caf748b2502749e68624362914609a19bd74a04ff174ba35f292f0a1feff0ca5279f53a2d2e75e03c1327a01e23991ade7c330a050b33f4a7d347da311700b4842924c4cdd0605345450418ff94717293442b8bcf8dd94dcbc177b8c4aec41d0c7fe2b8758567ea2e11ed4f8c6a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000000af9033094e3bef8ccf033085ef02fc4ae56f4748228ce818cf90318a00855a06d0eedecb88b1ac5ac2c2e9b6bcf3d1ebab3ac89584f28d95ffec84fb2a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000010a071620fda669adc5bb0ac5f3e9f4934217d367418221584f5ea356b87a697a8d9a00000000000000000000000000000000000000000000000000000000000000007a0d7070a412d3a5c28bddbc416401f08ea92e11aa7d3910e118f75c136619ae875a00000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000000ba06afa2903cc34d29b03073354617c80a0081080e051b9c334351ec3f6ef8871b1a00000000000000000000000000000000000000000000000000000000000000012a00000000000000000000000000000000000000000000000000000000000000017a00000000000000000000000000000000000000000000000000000000000000003a0953d00492a44540af7810209580a02a25bc950b6ef41194f54ac1a6e3403b5cea00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000004a00fc4c30761366bb3b8a76104fc803147edd636707fd15385531d9c2b4dcef48fa0892e53fe9d0642f2ea4f6d7fd38636159d078b90f51189f92abe0d70d2f949c7a00000000000000000000000000000000000000000000000000000000000000016f8dd9404a9432cc3840e329d3dd035c820d62f012a6683f8c6a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000000a80a0761bd5faaac9cdf166b950309345e2444c38d591a14589524c8b1ae4327c5ca2a07b834dff5b0f6e81753f1d91fa83cb1a721c6a2181d1781d500b34290ca202ce02f902fa01028411e1a300850d5043fbe383045f1c94ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b8803311fc80a570000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba5300000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000003311fc80a5700000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000003311fc80a5700000000000000000000000000000000000000000000000003bd81ef0b72f40fe62a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e3bef8ccf033085ef02fc4ae56f4748228ce818cc080a03460c25021d4a9226a822831df0caa02235baf887baa0469666fbb9c36cdbbbda0044448d4a239ebb369354897bf981e1aa8b68bf6702eed331e22b73c27b3960b02f9021901098405f5e100850a5d155a188302befa9468b3465833fb72a70ecdf485e0e4c7bd8665fc45872386f26fc10000b901a45ae401dc00000000000000000000000000000000000000000000000000000000644aba5300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e4472b43f3000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000001169a1e7a0508e204b20000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c4100a68646c11fa2e7c170b4d3da4c43552b9da0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000be330bda7f32e391b9370822710806b886135aca00000000000000000000000000000000000000000000000000000000c080a03ce37c955a2ef9d5ac11a77461075ec0bc2b6fd4b20bce1e6eef06febd5d60daa048e168455ebc56906f66c652824348763f157bb2b342235e1db8468df76f114602f902f901018405f5e100850a5d155a188303446294ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b878e1bc9bf040000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba4700000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000008e1bc9bf040000000000000000000000000000000000000000000000000452bc0dc467adf4fcd700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000be330bda7f32e391b9370822710806b886135acac080a0828dc51553f3cfffa0ca39001c7af993b29ccb602792bb7f9467061db0ed1b2aa0475c95b3535e617a5e02607d29ed2e02e69540d0f0ca246d01e5df400282c42c02f906820182e588850ec4506652850ec4506652830415cc9493ffb15d1fa91e0c320d058f00ee97f9e3c500968402107b72b8656f753adcbc177b8c4aec41d0c7fe2b8758567ea2e11ed4e3bef8ccf033085ef02fc4ae56f4748228ce818c026d3f47407a3a04a9432cc3840e329d3dd035c820d62f012a6683be330bda7f32e391b9370822710806b886135aca2b9eb78a00052cb618602df905a7f89b9404a9432cc3840e329d3dd035c820d62f012a6683f884a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007f9030f94e3bef8ccf033085ef02fc4ae56f4748228ce818cf902f7a00000000000000000000000000000000000000000000000000000000000000005a00855a06d0eedecb88b1ac5ac2c2e9b6bcf3d1ebab3ac89584f28d95ffec84fb2a0000000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000003a0d7070a412d3a5c28bddbc416401f08ea92e11aa7d3910e118f75c136619ae875a00000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000000fa07b10de8e5ebcce2a3e9a3635f5b8fe77b74d630ae74b44f2c217ab308a14e277a0892e53fe9d0642f2ea4f6d7fd38636159d078b90f51189f92abe0d70d2f949c7a00000000000000000000000000000000000000000000000000000000000000000a071620fda669adc5bb0ac5f3e9f4934217d367418221584f5ea356b87a697a8d9a0b4e9dea708bfec2969e894f9f91d015fd58927b9255477c7b0e6f04208b22b79a00b380aec129d5045ad03f9900fca207276a348460ee3db36b23165c306dc8a83a00000000000000000000000000000000000000000000000000000000000000016a00000000000000000000000000000000000000000000000000000000000000017a00000000000000000000000000000000000000000000000000000000000000002a0953d00492a44540af7810209580a02a25bc950b6ef41194f54ac1a6e3403b5cea0000000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000012a00000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000009f89b94dcbc177b8c4aec41d0c7fe2b8758567ea2e11ed4f884a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a050b33f4a7d347da311700b4842924c4cdd0605345450418ff94717293442b8bca04ff174ba35f292f0a1feff0ca5279f53a2d2e75e03c1327a01e23991ade7c330a095d4521a8b63a008515947850694caf748b2502749e68624362914609a19bd74f8dd94be330bda7f32e391b9370822710806b886135acaf8c6a0cc8e5d49df56c821d72941211679ad183ab543e8edf8e341dfb5965fe4215560a00000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000006a0d1c04f4cb8beeb7e801bb4cd74f118fab9c4e0294d2dda604550f6ce96e51c54a06b12567b6d3c7646571a3ad6a75acb84bae1a10cad73174394a709bb98c1e3d2a0944e186234f1d8e0aa46e82a61a5daaa2b52c97dd3d004cac5ff45aef0dfdede80a0cb357e7d89cd7c9ed2ea41be0dfbd5c9686e42872769b11f31a2960a57d4ddd5a077562ea33377bcdbe34cab0dd6127798b7e8c373ac438b3bf23b33e1a40c71e902f9033f01830435df808507b3624d2e83024d9a946b75d8af000000e20b7a7ddf000ba900b4009a808407e6fe2eaf6f6b37d7452bbc6d5acdbd53d544ab4bf84a8dc5aa1b8ea589d8868607b8d79ee4288ce192796051263b6401dce029f9029ff85994c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0d542975d97109d00b2b82a129abd6390d1844466f945758227b7ee9a14c95a69a012231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8f9016294a589d8868607b8d79ee4288ce192796051263b64f9014aa00000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000000aa0b39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470aa07c1461f41e416f0937f89e6d53a1d0044e7675a76cc717cf88a4cee73eb60650a00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000002a06af1dd4d1ad6b87fa6cb710c1a201c4e7358f41a9aa22a1505cb8a2edad09105f8dd94d7452bbc6d5acdbd53d544ab4bf84a8dc5aa1b8ef8c6a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000000ca0000000000000000000000000000000000000000000000000000000000000000880a065dd35dfb8f2a1e9acb86d06f72c6f272278b5ac1db78a23d7df98564239e743a047478ecd1279ba1d3829cbfdf53bdaf0eebab8c3d2bdf48e379210d77d8955d2f9062b0a8509c76524008306d7c194b45a2dda996c32e93b8c47098e90ed0e7ab18e3980b905c4c10bea5c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a589d8868607b8d79ee4288ce192796051263b640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7a2f863299c17dfa11cd8a14e7c7dca92f315b90000000000000000000000002504a85a8d8ba94af1fa20af378300fa409974f70000000000000000000000000000000000000002866440a4419faf5b5ab000000000000000000000000000000000000000000000000000000a7cb2bd12f2b94900000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000377656200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a589d8868607b8d79ee4288ce192796051263b6400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002504a85a8d8ba94af1fa20af378300fa409974f700000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010418cbafe500000000000000000000000000000000000000028473d2e1341d69f77f060000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002504a85a8d8ba94af1fa20af378300fa409974f700000000000000000000000000000000000000000000000000000000644aba5a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a589d8868607b8d79ee4288ce192796051263b64000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000026a0837205bd766c47779a113749db1c11dc0af074af712ef6cc7d3ce1b482fa21dda04524a42d858fb41c68be3aadba2b5d77fb292fbf868c57c539fa2ffc0be7c78702f902ee01830435e0850b8d215704850b8d2157048302156d946b75d8af000000e20b7a7ddf000ba900b4009a808407c9385c9b6f2f17d7452bbc6d5acdbd53d544ab4bf84a8dc5aa1b8e01dce4a4f9025df85994c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a012231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8a0d542975d97109d00b2b82a129abd6390d1844466f945758227b7ee9a14c95a69f89b94d7452bbc6d5acdbd53d544ab4bf84a8dc5aa1b8ef884a0000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000007f9016294a589d8868607b8d79ee4288ce192796051263b64f9014aa00000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000000ba0b39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470aa07c1461f41e416f0937f89e6d53a1d0044e7675a76cc717cf88a4cee73eb60650a06af1dd4d1ad6b87fa6cb710c1a201c4e7358f41a9aa22a1505cb8a2edad09105a00000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000000a80a02ed0bd9df746c4ae1f788075485d8d508d81311d25334b119c5aa832e11d027ba0156820482ea6b867b71bd23d4b31b06cea5b6103a48e969db1459f11df3d0bb602f9037301388405fced988509483786168304e0e294881d40237659c251811cec9c364ef91dc08d300c80b903055f575529000000000000000000000000000000000000000000000000000000000000008000000000000000000000000079195af3587b242f23044a29ae2ca54a3223bfc20000000000000000000000000000000000000000ded5ab02282c4a55b2156c9b00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000136f6e65496e6368563546656544796e616d696300000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000079195af3587b242f23044a29ae2ca54a3223bfc2000000000000000000000000aada04204e9e1099daf67cf3d5d137e84e41cf410000000000000000000000000000000000000000ded5ab02282c4a55b2156c9b000000000000000000000000000000000000000026fc065733789a1b10a11e18000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002acf35c9a3f4c5c3f4c78ef5fb64c3ee82f07c45000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e80502b1c500000000000000000000000079195af3587b242f23044a29ae2ca54a3223bfc20000000000000000000000000000000000000000ded5ab02282c4a55b2156c9b000000000000000000000000000000000000000026fc065733789a1b10a11e180000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000003b6d0340b08e5584ede94c455e6a9e708c478b52bc812e4480000000000000003b6d0340251ce6231c8f892d41c0472121959c8ba577a415ab4991fe00000000000000000000000000000000000000000000000089c001a08c986431e912da2f45e124237011c309866255209f517dc40c648bd9563c34b1a01e6628c3f16f8ef6546cf6d46f34223fc0a5b06a3066c18e80ef759c8d279bb702f90174018235b08408861d54850a6271ffca83016ed194fa103c21ea2df71dfb92b0652f8b1d795e51cdef80b901041cff79cd000000000000000000000000813ffae25b9b8c909ecc9e2f9747006e0b43d16d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008452de3cbd000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a69babef1ca67a37ffaf7a485dfff3382056e78c0000000000000000000000003a3bbaf78361a8510cc2a4c1776d501011f677d90000000000000000000000000000000000000000000000000000009279ffea4000000000000000000000000000000000000000000000000000000000c080a04ecbce6802c710b6c912202d43b1afb6e46b8ae8e6ef6f61fe012e6352d4ebcca06355a7dcf41752dfd295279a316159ab3f9eded1751c033e0bde42f3a9613861f8ac820138850ba43b7400830203a094a0ed3c520dc0632657ad2eaaf19e26c4fd431a8480b844a9059cbb0000000000000000000000006d3b04b7987b7362efb4377c0b9d7d4f8283706c0000000000000000000000000000000000000000000147b363d25bbf4a2c00001ca0651c09e56a91b76c4f2f45338ff5b549c1659060233c481220bbdf14aef02f4ca01ff5a0378f669d9fec19eb35df16b711eb130743dea0fcff966020df1f363590f88902850ba43b74008316e36094b98774aed1fd25d89d9801710bff5cad34c81f8680a48b6b14ab00000000000000000000000040c57923924b5c5c5455c48d93317139addac8fb26a03809b3d200f05191223bb51dd35a68e0a8b1de8cea8d5b42b9ccd4a69f4f5b57a00a1286e553f8972ca47ad96f2bb310ed30f4b05f150c08ba75a3db771770bc64f8ac820139850ba43b7400830203a094a0ed3c520dc0632657ad2eaaf19e26c4fd431a8480b844a9059cbb0000000000000000000000006b12c47e56679639d8cc3db66fd2fe69530146a900000000000000000000000000000000000000000001ea3d7168cb98003400001ba0ee6edf4defbbbac80ae684c39d5c44014473481636ab0b9741356d3565e9ea2ba0027b137fa290f17a81d7d6eb7f949c8cf8ca1738c4c175579e6801d008685fb4f8ac82013a850ba43b7400830203a094a0ed3c520dc0632657ad2eaaf19e26c4fd431a8480b844a9059cbb000000000000000000000000f4ae32245525caa068d53f72e735ab24aaf431ee00000000000000000000000000000000000000000001ae97eb48bf1b94b000001ba014a7ebf918835488aee2862e6419664438861616e2028ba5e51b9aec9b69e817a0058587cd90487973f62170107249339ce5d1adabd541ecf03001f1e00aa348e7f8ac82013b850ba43b7400830203a094a0ed3c520dc0632657ad2eaaf19e26c4fd431a8480b844a9059cbb0000000000000000000000004e89bb4c375612ebcb100188dd6cc86d5055568200000000000000000000000000000000000000000001c5d0c320e7a1e2cc00001ba09a854587a3edc95fdaf9b86fef487b94ce34f97ca071c18d86ce30b19ab121d5a06e0b4374aa9b3ff7a9ad368bf2b503bfabefca3b9f71c78d2cd9a59f70d62a45f8ac82013c850ba43b7400830203a094a0ed3c520dc0632657ad2eaaf19e26c4fd431a8480b844a9059cbb0000000000000000000000009ee34f382b255ce801bac45db4b296fde67c2b10000000000000000000000000000000000000000000022a83acb594a0167000001ca02e5a8d7c3788ab3d461436aacb60b7d7db5f5fdb32b852a2810874e83e544da9a01ce0badc090ebf95304c70b5e8ed9288e2029aee8afaa01fe00382d52d5c9099f8a9808509d24d7fc082c35094dac17f958d2ee523a2206206994597c13d831ec780b844095ea7b30000000000000000000000006dfc34609a05bc22319fa4cce1d1e2929548c0d700000000000000000000000000000000000000000000005562504d33a85cc34026a02b736f6ed611cb9ec52f9b5c6875cfac0da894d0b6eca73276d7ea51c7785784a07b9f8cfd0d3a9142bf25b2f971aa4be5de9b7cc8d9cb458e9f009e514f27cc83f86c80850998e74900825208946dfc34609a05bc22319fa4cce1d1e2929548c0d78801158b30bd54e4008026a0ec90ab0ee359c26faf6e153a93411f4ce55174f90f8ab1f2c095306139d62143a0799c99763e20e57532dbd86ce8f877bd122cfbd316ee0a982de054f3bbebc7b2f86b4185096dfcf50082f6d094602451e6ebc992a444472af0f02a7efc47a898a9872386f26fc100008025a08d787462cb13c6d4e0476b630daf00da888596c1c01b9b5748d78e7700a88f55a00381aa0c5a0a5542f425564ffc9fde23c13efe73e7c04848ee41d0c02e43561bf86e82077985094eb7cb7782520894440cd2f5e7dfed50706cde0e8255e0f1e14e577c88016345785d8a00008025a0f5df606c8dfb2697c954cede1bd4957c1f35a01742ae6e4a1abed9710d6dfc3aa04e355571176ec5477f90eb387d1733d867eb0b2dcc9d937332d58f0eaf3da07102f8b1013785019254d38085112823067882f2e6946b175474e89094c44da98b954eedeac495271d0f80b844a9059cbb0000000000000000000000004549b3f45839ae28b6640d56d8b5e526a42fc6120000000000000000000000000000000000000000000000d8d726b7177a800000c080a032e26f3aafad5cccda61417e4510a9bcd6a89ed61e2ef34d1523addf27ac35baa01045cae21f724e058061b16eaff23f1eee15d6c924b96aa0688a3546ac30d75a02f8740181db850935a6dc25850935a6dc25825208946d1d40e504b5232b5c08a532500fa906addf7dc18714502c20c6b10d80c001a008e5a6f5e3832ca28dc4d54c50071a79ea2f236fc4a16166bf1d5ecb45df7e67a02ead910719ffb6c19a3a92edd864f9d69eae01664985be2888251eb1d50e15b102f8750183054ce084dc3d39c0850e8518bc7182520894e33ef0ac5e625f405d238b264babbb3d154d00de874a9b638448800080c001a0c456d78afc8b2fcf19419b9b548fd462bfd9cc24607be4767d7bea1c52b0ef2da026b8c87fd0adf4c42e2ac6c04eb258d62fc4a5f89f39482f87266135e3d1576702f8b1017e84d30739f385089d5f32008301117094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000b6fcbcd9480456147420a58773f824a7e2fb1225000000000000000000000000000000000000000000000000000000000bcd3d80c080a092354b709824b5a74065c4dddfdf51bb248f134f37209255f22414cb0200c76fa01ec82db724df2a98f0e0750b3d8c71abac820c340873ae1825d6327ff03e617102f9015b018202dc84b2d05e00850c7afa2a8a83041577947a250d5630b4cf539739df2c5dacb4c659f2488d88016345785d8a0000b8e4b6f9de950000000000000000000000000000000000000000000000000d2095221e3adc520000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e0be3112f71fee89cc14ef59f1f6c8840bc0b79900000000000000000000000000000000000000000000000000000000644ab3d40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000016d2990481267423b9058b4d6cd7651512d5be94c001a0b0e90b365eb906fa72ffbc7da508389f7e8c4811fca615447590882b1f3e1b64a05bcdfd8e716890cc25f2b4bd3415407188b985125bec5cf63ab8b654c4ed912b02f90158010584b2d05e00850c7afa2a8a830433e8947a250d5630b4cf539739df2c5dacb4c659f2488d879fdf42f6e48000b8e4b6f9de950000000000000000000000000000000000000000000000a8cc0dcffe0a426da300000000000000000000000000000000000000000000000000000000000000800000000000000000000000007b12698b86b8b162b32199634d8f9808f8880a8800000000000000000000000000000000000000000000000000000000644ab3d40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e214b95d916fc7aa278a53f407b9bf08bd9336c9c001a0e8643c7872290c4ec404a1565a5b0aa06765b1357990d8c4a30ebdf008cec885a0519cf08a931173ec7aef89d4c6c263f5e1de868e2a3174a136ebbd7bb862f91a02f90158018084b2d05e00850c7afa2a8a830433e8947a250d5630b4cf539739df2c5dacb4c659f2488d879fdf42f6e48000b8e4b6f9de950000000000000000000000000000000000000000000000a8cc0dcffe0a426da3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000077562b29aa7b204b35483d599a6b10cdb42c0e2700000000000000000000000000000000000000000000000000000000644ab3d40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e214b95d916fc7aa278a53f407b9bf08bd9336c9c001a08150af08c24caadb50a7c21c40cfc4e131a234022be21af32be0fa131736ca04a04185565e255ea0f2d865b500084edba47a932acc5e337fb8e47eb151f1f0e6de02f8750183138cfc84b2d05e00851087ee060082520894829c28e9131390e6be08fbb6770d0261e57a3180871e44e5157c800080c001a0e881b75b83e4f48081a49e3e61d73426d378a04559a940fc77215a02c824f52ca067a418f8dddf77153db6a17f26abb169a0d5a8cc48012b017d205292133b7e3ef86c80850861c46800825208941689a089aa12d6cbbd88bc2755e4c192f87020008893181442c3b0c0008025a03942db50dd66a2f2f8a88279122fdc6b71050bdb79f9614aabbbb3a786d3ef10a0178ba5250e4e919c7a985c2ae818d4bebf13081f4d3963db74e0e133b6030ab702f8f10125849502f90085104a9009b88303d11c942e9e1a10b90fbeb0f95cec6835034c42c9a9b3d080b8845d913c8800000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f0cf064dd59200000c001a0e81a6a6287640292c46d3f53a5ff8e26a8599e07efe0f7cc52863bfba4fa281aa0492059209e41e43f5281c9ce38b1c417b8bae57c70c246fc54dd54b549ee8d0d02f8b3018208348477359400850f5af88aee83030d4094d26114cd6ee289accf82350c8d8487fedb8a0c0780b844a9059cbb00000000000000000000000032701d73011fea2d5e91eb61e770ea0ac90eb963000000000000000000000000000000000000000000000078f84893019c2e0000c080a0c863c9409b82fb4340d97601d9e98c012c43d3e7f5e0195e763c0cba6b47c52fa04f5f67e2bf19cd4ec0d4281a70040270fa7f83513decf751eebdab925c42d55c02f876018302f8738477359400850ee6b28000830186a0943dfbd4cf0d5d6c5f0478e68206a31634c14d793a878e1bc9bf04000080c001a0cbe651537a63c70f4dccde7a554f7fdda429b7385448016b1c3154c7c7c8d8bda02fa96f516794ecb3e13528db7a947094c63c1555c2e272ee5decf9aad55260e102f902b201058477359400850a7a3582008304d8df94e66b31678d6c16e9ebf358268a790b763c13375080b902445cf5402600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000005b7533812759b45c2b44c19e320ba2cd2681b5420000000000000000000000005b7533812759b45c2b44c19e320ba2cd2681b5420000000000000000000000000000000000000000000000000000000d8dd86acb0000000000000000000000006b0b3a982b4634ac68dd83a4dbf02311ce324181000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001486af479b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000d8dd86acb00000000000000000000000000000000000000000000016a4a288c7cca5b6880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425b7533812759b45c2b44c19e320ba2cd2681b542002710c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20027106b0b3a982b4634ac68dd83a4dbf02311ce324181000000000000000000000000000000000000000000000000000000000000869584cd000000000000000000000000382ffce2287252f930e1c8dc9328dac5bf282ba1000000000000000000000000000000000000000000000075ae541383644ab34f000000000000000000000000000000000000000000000000c001a05072f47d2cb7c330753087dd50ac0f06a5bcb7df296b732c4537a335cd716c8aa00ef9924fdbe4841e932246009d0daad7cf9b7b2f713f5ab8e2429548a39c223702f8b20181e08477359400850fd51da80083014c08947d33b7863c4157b65f6e1c734a0bc7e1dc24df2680b844a22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000001c080a06a6a4d18d99bd12aa9a1c40d9c69002b6ccacb87a1bb8b6f1022b03fccfcbc28a05dddcf054186100a637808688ae79b36ed12d76976ab9592628d822a9ab7d7f502f8b0012f8477359400850c3f5f608a82da7694619b50421cac2b01bb8072c09a1dea0b7d450c7980b844095ea7b30000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001a0e2980fc81fe8d13352224a52f28956b3b0aa5f111ad47d130f3e5dd4a96b75cfa04abdf91229bed01dde01beda78318c396309096a79b5c6e1665995c097d7894702f8b2018205d3847735940085091494c60082d3d894b43c4875f2b0bf464f9d747a0caae9fd8e75425280b844095ea7b3000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001a0c42ec14faf83c0751c054102a7ee162d343dcddb0b91ef278aa6bc85b9175e40a02dbd9c18e88a094f95833b034d8e60f203286c530d4119e9af1c62f6e268869802f9029a013c8477359400850ab5d04c008302823c94e66b31678d6c16e9ebf358268a790b763c13375088017489dd04103b10b902245cf5402600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000017489dd04103b1000000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000128d9627aa40000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000017489dd04103b1000000000000000000000000000000000000000000018d12b14a34291bda6e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb8869584cd000000000000000000000000382ffce2287252f930e1c8dc9328dac5bf282ba100000000000000000000000000000000000000000000008d948ffc97644ab355000000000000000000000000000000000000000000000000c001a0e3d844f3633439924d8b34db2a9853b1ff212f32a065c4f9a5a89c293f5e0b46a03d91fb026a8f00799b01377fc3b4a1b3724a6ce28e72c8201c335b86ac77d92902f8b30182057c8477359400850a1eb60cf28301117094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000071aaeadaefde85a12f7df390dbcfd6aa37ee4a3d0000000000000000000000000000000000000000000000000000000005f5e100c001a0e4197d85cff8c07cecbebbff0401e08dd9a4144f2939a8e2c5da318c290fa55ba02118cfef158cd7f19d098dca170aad22d8e3c566a02217d5496949bc8ccd6a7902f9141c018201638477359400850ab5d04c0083050a689400000000000001ad428e4906ae43d8f9852d0dd680b913acf2d12b1200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000e2eef1af27a684f1ea995d1f88d8061d2de040d90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000580000000000000000000000000dfe290cb7a886f116df92fe36ef4cbcbf73c2d10000000000000000000000000004c00500000ad104d7dbd00e3ae0a5c00560c0000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644ab23600000000000000000000000000000000000000000000000000000000644ab5ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cdaacf151d6c0534a032a64cec948b25f9e60000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121e6c485ac00000000000000000000000000000000000000000000000000000121e6c485ac0000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000064b6b4142d4d78e49d53430c1d3939f2317f90859a549451a1062191dc4d922f5e0088271b4d4d8a4b88f693293310cab48d276e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000dfe290cb7a886f116df92fe36ef4cbcbf73c2d100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073f5e8357800000000000000000000000000000000000000000000000000000073f5e83578000000000000000000000000000000a26b00c1f0df003000390027140000faa7190000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017312e711800000000000000000000000000000000000000000000000000000017312e711800000000000000000000000000ae2645912288fa9c2d3cbdaf711f7cbf039237890000000000000000000000000000000000000000000000000000000000000040a8ea6c1dd26d4d49508aeee141ad15670179c2406cdbea81cbb0326066aaa6ec4f83146141dad6b3acb3ae9098f6b73cf4572229eeb5f9e5298ffdb68a3bee67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000480000000000000000000000000e2eef1af27a684f1ea995d1f88d8061d2de040d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644ab23600000000000000000000000000000000000000000000000000000000644ab5ba0000000000000000000000000000000000000000000000000000000000000000360c6ebe00000000000000000000000000000000000000008f6171de953113f80000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000064b6b4142d4d78e49d53430c1d3939f2317f9085000000000000000000000000000000000000000000000000000000000000136f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0baa1f9d8000000000000000000000000000000000000000000000000000000d0baa1f9d800000000000000000000000000ae2645912288fa9c2d3cbdaf711f7cbf039237890000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c28a8fba58000000000000000000000000000000000000000000000000000010c28a8fba5800000000000000000000000000e2eef1af27a684f1ea995d1f88d8061d2de040d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000e6dcbe6dc1c3d2ff5f3c414f904a21155c47b02aff66184df34d3d14dd95bb02b0933cab24696d2d8403aa940c3d896c47af70261c272f453cf2a3e112734b454ef2555df37481339a2fb6f659cd1a4dde061007825c2c018f34c83a88278837a61363062ff0873d4d47303780591a2cd521b1e407b285e82217e6a25f61bea5fb9ec331ddd2403dd9309d3c785db9004e5df1f5222b64ed2205a82afd48e707a130a244373a9efedec2902c8a1c7793760828cc6a2c67420999062315a4fcbe55730f05f92cf754490a7fc8e82c71265a431ee6b0ea55dda3fa2a71ee7d8fca5f292a15330bca9e75f68c25b7dbd172fbec1c91230633fced6026c2504ff9b485de2c5ed624ea3331a7883e575087a0d19c442765097ff49373773daa3608cdc3bf8ea14ffe1c23cd0858aedda06ca05c37e9b9a7272ae44973ecd88f6a8b103f0f696e5093a4abde2996a2e1ee426c974c0005d95e245cd3b5bd60e8dca0641eb3fcf837afaf755500edfa3233ffd1ca814cfeead57f0b3f723d395f0fe202b468db35dd0dd3e8a50977e7bd01aed16267da2563a32723b73cf5e77a26d799701ee36c19d99e94786874d84339f77d7ae3f29424c529807fe9506f9b365a7ba000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000360c6ebec001a0ece1a26403dd45a19684522dc061a9d9d59a059518bd5109d8096b34523d129ea012e2f423b907d1013c7a08efd6240a6399876aa5f86cf7b8ed37ca8f64771fa302f8b401834839c584773594008517bfac7c008303291894dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000036ffd4c95e4bde2cdaa5eb2d9e0ee93f9da97248000000000000000000000000000000000000000000000000000000006422c400c001a07e0f86e9636d5cf846551d766952821e74f5aa7979dbd981914328b4685cd99ba0533a4c6695ffc18ecd80dc1f8fdfc9b2a6e1cf42e4aa4e1bc6796247141de42802f8b401835b720184773594008517bfac7c008303291894dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000064a55b0d5aaa077e0ccc0d4f1a199c08746d69300000000000000000000000000000000000000000000000000000000047868c0c080a0c5d2a2821cfc0ef22417e4b0f21edb83784c8eae7ee961b491975b95e79adc9fa002f421a70ea4898dce538669039514e1583c95c66df402e380f54bf354d1fa7102f876018342f7a384773594008517bfac7c0083032918945de80314ddb070e44f8b806db6f6b789ea283095877455c48f07300080c080a096f41b624058a6ccb21d085bc57175eb6d91a15a2e20addaa8a790c1e468b8e9a011a23235190655a4bdde5eb2fa61b5ebb2cf22ead6a8ea4e17fa633aa7094a0902f87701836019d584773594008517bfac7c008303291894449954c7512f6e89757da57e5f4f1c1b7d3765fc880143a8ad5bc5300080c080a0e829dae19f097821d5e972b1829387961c7973e3fc9d45d065991fa86f8ee856a029f5acddbc70e79840b01bf23cb8ecdd38f7fcd5e043dc2a27f757375ae5eb9002f8b001118477359400850ab5d04c0082b3c494b72c18bd85c814d07d5dbf9eea4e7b3a62fed28680b844a22cb4650000000000000000000000004e3f914246f55fc4f55ee2882bf70c72a8f427cf0000000000000000000000000000000000000000000000000000000000000001c080a06d7189397270117a75da5be53ceb47a7114c059d2d4e92d1323d4e8bd03e886ea0742aa1b2e3e31b8686bb7c444027996e704d14c83fa61bffc5ae9b9b78e194ecf902f58212e0850826299e008303246894ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b884563918244f40000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba4700000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000004563918244f40000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000002370ce75c00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f4a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000025a0e6133e6462ad3a1142670156e1a454dbf7345af98e4a0ebdfbd007c2ac64391aa04e09b9728fcce63859b3dbb7ba2ee936ec8c765351dcedaa7ba51025c6cfa50a02f902fd018202068501004ccb00850826299e008304850494ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b8803311fc80a570000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644ab3c300000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000003311fc80a5700000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000003311fc80a57000000000000000000000000000000000000000000000587b1accf8338b57e6731b800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933c001a0ea7a2661d40ce14e7160b47f2c88a244d947798374d7e46a65e535257925b0a4a0295884a5c53c6016a1781a6a7f33b818fbd7f24bd59a3fa78c2071a56a26543202f9021b010185081bd9d8c085081bd9d8c08301362394cec8f07014d889442d7cf3b477b8f72f8179ea098801e32b4789740000b901a40b66f3f5000000000000000000000000000000000000000000000000000000000000beef000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000bfe1f7d27040565fbe9854d245e06e2d43e4bbff000000000000000000000000d91d7ae9ae775e5f8f1dc47d114fb327cff0d37e000000000000000000000000e5144f4ebfa4a0a0dca47e6b4528157be23a1ee00000000000000000000000002a72a99b2c46a4f4af5c89e8c8390251eda87591000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000470de4df820000c080a0d5d85d118384ce801a81ab7cdbe3c6ff5d21e7d44e3985dafeddc098a95668b6a0692998a661cd77c5949b77f266aeb0a18a40c70a6b752b037e7f8e8ee3709a9902f8b4018301b660846137944d850cf09bb6fa830249f094c77ad0a71008d7094a62cfbd250a2eb2afdf277680b844f3fef3a3000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000000007466ac001a072d39339ae939b328b89f8f854f509ecfb167f8a5bd278fbd3987dee0fe3c3e0a053f092978e2e0b9d68e4d472534b940074b6f3f87debb1ea1df2356206112a0102f9083a013e8459682f00850c5134e8308307470694000000000000ad05ccc4f10045630fb830b951278808251670c2ad4000b907c49a1fc3a70000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001bdbf15e7b47f70924360cc684cf70b27ac4a0cd5dd4a40e2892b4a2d3eb1a895c5a933e46b80ce05d8110e60da2036cc9f04dd7a1af206fff10289c113c51418300000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000105856c00000000000000000000000066e4fd1e403833f8275245258365453e261b2d7100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000dab4a563819e8fd93dba3b25bc349500000000000000000000000080336ad7a747236ef41f47ed2c7641828a480baa00000000000000000000000000000000000000000000000000000000000011500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008251670c2ad40000000000000000000000000000000000000000000000000000000000064424d44000000000000000000000000000000000000000000000000000000006469da4400000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000035ecb40a24df3637ca33959d86cb173c000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000032000000000000000000000000988a19f06b6a800ba8b5e350e1c127535edb10010000000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001b6af23442563a5242dea31ced023db5dfa97d335d93878854848a995528331c5e4a18e78354fbd2ba24522f291db7a6051da2db11438aaca35c258551789a75930000000000000000000000000000000000000000000000000000000000000002794571eb1b80c519d02624420dfcac0ae438aaaf4e2fafdc3eea06300b817e4db5e1d93313f23e13d91737eeef86900533464b61b95f1827f2ef2a3f3d17003700000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105856c0000000000000000000000001398678864b787a37e609e1883370884fc8d30e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dab4a563819e8fd93dba3b25bc349500000000000000000000000080336ad7a747236ef41f47ed2c7641828a480baa00000000000000000000000000000000000000000000000000000000000011500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008251670c2ad40000000000000000000000000000000000000000000000000000000000064424d4500000000000000000000000000000000000000000000000000000000644ac16400000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000476fd6014e6c1785e913740573a479a500000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001b58635fbaac150fcfe7a3b34a403d24aad594da26744d1356f80f6e87830b2d7023339c7bdbad78d50db5b59c6c13923534b94974f89418983027d9d821f5f571c080a06883d163f6d5122d4d5df615012aaf0e0534151afb56af126295004ed8f6c8a6a078319e3bd3fb454119c12e83be96e11dea82bf304acbde43f522ac582ebe31d902f8d3018216298440421e108509450e986c830493e094d4315668aa1d88b4c581ec6fa902e131286dd0ab80b864a1fe036200000000000000000000000000000000000000285b20531144def70cf0c140090000000000000000000000000000000000000000000000000b2f662a94e6f234000000000000000000000000b69753c06bb5c366be51e73bfc0cc2e3dc07e371c001a036fc8f4882c2309101482e62067702aac989fea790838492b1bcf74d3e1b3375a013bcc2d81bdc8ed965117f2e6e84a24ef0f2e4449c667eb2be081c8218930c6802f8b10101843b9aca0085100185aef683015f9094a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4880b844a9059cbb0000000000000000000000008add240359aca0160e018d796f534ed9fd7fac8800000000000000000000000000000000000000000000000000000000135f1b40c001a0952a5c539c43d1cb828a91b2403ecbab0d50362f5b5ba5c963f0cad7678ed91aa0691cafd40ce570aa7469ff74347fea65aa5b544b92e046a3299ffe47d8d4982a02f8b10104843b9aca00850df9d92aa68301482094a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4880b844a9059cbb00000000000000000000000086bc4655bf0dd2433e32055d00a9c96dadb0e22f000000000000000000000000000000000000000000000000000000007260830bc080a061818cfeb9038e49da363c08df47f61154866d6af055088d29e2327d3301873ba072aa939807b5d37a75332b40a8b6e099ed3d9de87224471641ee85acd665c64702f875018302e52b843b9aca0085091494c60082a021947987be320bb3587cd1823ea6f39562a612bd2b22870621416be8186f80c080a0c2be68b741020f522d52be9c28bc72a77038ae0dd6ea55c3e1ab3402c95622a3a03a622e82471a02e5698bfbd4cb1b16bbe987907a18a89477998e1e55763a112a02f8720101843b9aca0085091494c60082a0219427fd43babfbe83a81d14665b1a6fb8030a60c9b487b3c991378332a480c001a0adee4606f54964d1c24fdcf76a4dac52ab789d16a10e2a71d0135ea85b6326e7a06ef8772d7d29afe00a4f7b227c38daf62632a37069d9c2c97017254ea0acc9b502f8720116843b9aca008508d8f9fc00825208947fc823e1ff46cf8a3eb8a05c49efa4c7e5e0e4a4874e5b1d6596ec0080c001a07b1fce305c2aa95808b327410aadf180e0d717bafa0510190797e26483152b44a072c6950c8d628e9cb602ba693a302c0db7d8fa7f235afa1d185cc730ab5bf17702f8b3018221fc843b9aca00850a2d7413db83036ae7947fc66500c84a76ad7e9c93437bfc5ac33e2ddae980b844a9059cbb00000000000000000000000025e19cf4c64a79ff35bddd221c95593d4d801c5f000000000000000000000000000000000000000000000000e11fdea69d7d7c00c001a0a2af8f829b2c21eef52435c2100ce45dfc971a82f810513201f906e88f167ed2a06e58f55e0c1a27ec13e7dec521517aa8f67e36e6bfd1272db03285e0d0bd669a02f8b1010c84caa7e2008507ea8ed40083017b1a94a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4880b844a9059cbb0000000000000000000000003eb290b1341afe36092916b794b8be88c7a21a56000000000000000000000000000000000000000000000000000000011547e300c080a0842a22d141abcfcf781d0c89b37a34617ce83a09a7faca2d90774cf284bc8d24a02a8e33ee80d15f253b8031cff4d53c51ae3004f095de39ac24e1a113cec89d2cf86b808507ea8ed4008255f094077d360f11d220e4d5d831430c81c26c9be7c4a4873abfdbf05408008025a0f349370ff528be072a1bbbe5bd74a7ec9e945dad91dca2f3272017845d435d32a0239898f10b24f4252fe76a6666ec8c458fd269eadb6929746a8fd522fd37e0ba02f907c10105841dcd6500850858a5cfc0830613a194000000000000ad05ccc4f10045630fb830b95127873c0a75e0b44000b9074c9a1fc3a7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001b2c3a65171e58ed4687dab4b9f0c5251c9fca90199a6df2f87b3cef6141d5a8f84326d64cd7d6164c49f0ca9f0587d83f0c9b75a542faaf143a699075fe668fc000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105856d0000000000000000000000008118547d2f70f36e86c92aeba3c3fac4518d313c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000dab4a563819e8fd93dba3b25bc34950000000000000000000000007d33b7863c4157b65f6e1c734a0bc7e1dc24df2600000000000000000000000000000000000000000000000000000000000018e300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c0a75e0b4400000000000000000000000000000000000000000000000000000000000644ab30600000000000000000000000000000000000000000000000000000000644c048500000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000065bd22b50fa5d08adfd41a76ced7608000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000258000000000000000000000000daa9a638c07929d33b19c968af9878ff4584350e000000000000000000000000000000000000000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001c3ea47353f64a9a9f6ede12b4aca2c86c1c377ebe5ec2cf899011ec18f90bc1155a843b5ef9cdcb973eb6507a8650664566d1a509073c597b5ef8cbfe79f8d79900000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105856d0000000000000000000000003a760c8d3be1d2686e2a831d162152211806002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dab4a563819e8fd93dba3b25bc34950000000000000000000000007d33b7863c4157b65f6e1c734a0bc7e1dc24df2600000000000000000000000000000000000000000000000000000000000018e300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c0a75e0b4400000000000000000000000000000000000000000000000000000000000644ab30700000000000000000000000000000000000000000000000000000000644ac16500000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000003cf95191910aa0309d268c13202eb67b00000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001ceb1c11f7e6203d23551b6ac5de1aef86eec8acfa4d725d7d577ff4e917d752cc35d58840192c0acf4ddd1db890029f1a9898b2ec1a34c674a35924c06877604c1d4da48b547220dbc080a096a2c9e167d23309d438dde064be2b8d4c7e02e6a2f1f8b9c45ce779d6e079bfa01b317acaeaafab987131da41133b8b1f4880e31f3e2fe20cfedab06cd4df93d9f8cc8201498507ceff4c1d83012fc694e31ce23859ed4681f4f6e440eda398a7fa25c0ce80b86442842e0e000000000000000000000000d80700b680be2ddf3a824699607ab3fcbb2b558e0000000000000000000000008fbb3d193bd96a2729abb31f89a7cdfe5559bd7e00000000000000000000000000000000000000000000000000000000000007d125a062c44ef11b9f6c2508057d8631041684bc11f2fbec8b192a0397434490b800b8a078cd818f6accd53865054c68af048ba91ad1412d8c8772191f32192b69d44e0702f90174018206eb8416f2a240850aa8b35d008304df40947a250d5630b4cf539739df2c5dacb4c659f2488d80b90104791ac947000000000000000000000000000000000000000000084fada3a9320f6278706f0000000000000000000000000000000000000000000000000108f1756c664b9d00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000882fb59c07b7bfa56d4e2ddc3d81f3ab5cbd209200000000000000000000000000000000000000000000000000000000644aba530000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f4e25d09e51535982a5de0bc0a63e598fa2b94db000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2c080a05fe727612d3a27e87b9240f96c791fb3686d85b7d8a3f1a56e1edc2c37b1541ba07c3c880ea8aeed1646a91ee08ed52dfa5775601b62d153404ada7e281f16333402f902fb018203fa8411e1a300850d6557782d8304494194ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b87d529ae9e860000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba2f00000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000d529ae9e8600000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000d529ae9e8600000000000000000000000000000000000000000000000000e5edb1d7ff6925821d00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e214b95d916fc7aa278a53f407b9bf08bd9336c9c080a0d93ef98d8b02bbbdec5cf986da93b95cc1870ded3a081d0ed05fa718a2db03f2a0544e26f27378aab5081776f55c1638b305506f7ee3407f3520e71abc0d62971c02f87601808411e1a300850d6557782d82c18694c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2874e28e2290f000084d0e30db0c001a0b0ae36f7022217e87a7fa61785031f60c6601d1d125ba180c85c118526793b36a04f62f308eb74e88d3f23803588dcf78e66bbf1fa6bf8745742c98b9682c6f79b02f879018209d78411e1a300850d89b2be4e82780c94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2880bcbce7f1b15000084d0e30db0c080a0801216a222de2f25f95357563e60ea3dc36823f8d89cb898de4dadb45775eb98a017b1608471cb073223849430a17fcaf3db9e0e07783ef44dd8aa5a3b1165da1802f8730101840d1cef008508deb270c7825208940202960ae7d13b24c6985e3855776fee8209dba288016345785d8a000080c001a0bad3d10db4dd9f42020358bfda31507d18f555975ec4e9e81c28fb526bb8095fa01f51700b522e28473be7575600a469f7e95abf17bb19bb85b518236b6e9f39d402f9013e018201c7841744a4508507c01995b783026132941111111254eeb25477b68fb85ed929f73a9605828737916818ee9000b8c80502b1c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037916818ee90000000000000000000000000000000000000000000451c2d13462c6293b9d010790000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000180000000000000003b6d03401bef919295285ab5a5fe550dba06f5f7c1509fdbe26b9977c001a0b20761ef0db6fba3571a63da39c40b519a5b78230477eef101b47a0551b5273ca03152b4923ff32d1b8a58553551a3358c3819835f525e79cdb3ad295099d20c3002f8f40183052fdd840c84588085101b7998388307a12094b8901acb165ed027e32754e0ffe830802919727f80b88423c452cd000000000000000000000000784948a664bc0817b50fdbc26d582bef5aefde66000000000000000000000000000000000000000000000000011bf3d1b24245a1460dac08b51b27e2ac1f44a1437accbb8be51863e45c5ec590184ecedf7b4134000000000000000000000000000000000000000000000000001224202bcf2cd5c001a040901db69f09d9ecfca0576d1bce452b9f2e3f462f1d21e8e2a9e4ad1676c591a02ad67f97b25c6abaa78a5b97eb5294600b7f90154090356431a9f9e3ffff025d02f902f9010b840afbd48085174876e80083031cad94ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b87470de4df820000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba5f00000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000071b2d3be9c9f28ffbe00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000619b50421cac2b01bb8072c09a1dea0b7d450c79c080a0f889128a3ef897937ec2ac6a9331ce6ade95a6090a09c82df877d7fb5b2efdbea04609730351610b4d1c9f4fa8d446cb3b4fb348887fff3a7043ad3ad858a2160202f873013c8408f0d180850a8d48520082520894e12951638260cf6687180a62febaaf023007cbe4880749ebc8fadac00080c001a0cadbdc80b62ba608e6d0c8561485f9f303efb7f35cd076455aecbb495f8f79d3a038e36d1407c3e13ffa21a1874a5d6415fc3946c17194b120850fdcd537f8bf9302f8b10181b08408f0d180850a9df8c80082cc2b944a220e6096b25eadb88358cb44068a324825467580b844a9059cbb000000000000000000000000d70a7450e077687eca54b12319c41cb5df1901b20000000000000000000000000000000000000000000000000de0b6b3a7640000c080a08efe98879834e99c3e7731e089fdb82f999c70872b06528991b8005511f6cef4a01ad065fdf87c651c081f422a01c06d985f312274e04fa053c5d9906186c6d22c02f901d40182a1458406dac2c0850f5884a58e8302a91f9448ec5560bfd59b95859965cce48cc244cfdf6b0c80b90164391252150000000000000000000000001ba0e60eb9d22a085df57c2d7568ee3bae8c778300000000000000000000000000000000000000000000000003ad5db87ac7b00000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000006453edd200000000000000000000000000000000000000000000000000000000000096af00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041448c36e3369a07f5e4c7c0b40766d8c06122b4941065879dc8795112f9a100fa6b85f68cbb7453a5877b38380fbfb7744ebe1e7ad4836e06ee67fa00fb5f28351c00000000000000000000000000000000000000000000000000000000000000c080a0270e499e1ae80ffb93d83f2d00a5fc17bec9b2f85067b36474fb4762782315eda07b2afd4f7a95d6bc502e70f3b3bac223f6cfb4d36291ca7e7083d43a30bba02a02f901d40182a1468406dac2c0850f5884a58e8302a9379448ec5560bfd59b95859965cce48cc244cfdf6b0c80b9016439125215000000000000000000000000ca39ed3f4c5b6235c61d6165e9479d214f3eb0710000000000000000000000000000000000000000000000000738c8c16a5cc40000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000006453edd400000000000000000000000000000000000000000000000000000000000096b000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004114b22f3793071cfaa0b8a72edd4e8d89d130d397c22f702b4370692e4715156644ed7860e9c8f2f2ea5514cd5492845791ad2e47203b5f76935b4e214b5ce0b51b00000000000000000000000000000000000000000000000000000000000000c080a028d215d9575925ebf49a5688f549919903cb23f238b945b1e8eea883018abc6ca0406e2bb0aea5fc544fbd0c6d8f680b60903e7e9b9fca5965cf7eada5947cc42b02f9019801820667840660b0c0850a625dfe008303cf9694def1c0ded9bec7f1a1670819833240f027b25eff80b90128d9627aa4000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000fd71e86b63467d48b0000000000000000000000000000000000000000000000000194a596456917c700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d291e7a03283640fdc51b121ac401383a46cc623000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee869584cd00000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000000000b36ebf21ba644ab35ec001a0c79fbc3d070ce7154b319f4fa71f67c0f667800f0992cf8eeb6dd6981a2b9da7a078401ccc4817da528460878cabd17610b472a011fd09684b006627f3ec344c8402f87201598405f5e100850a8a530978825208946d1c93b04788ef9a9ccd41657b6db426f870402a871c6bf52634000080c080a01a7d0eb20249199a93bbef8974ac24eca938fac1d04a312cb894386ddd79f3e2a020beefab30b4a922da02df84436aca442e2cf01b4af69e4fa18cd6694c127f1902f8b2018206898405f5e100850a8a53097882707c94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc280b844095ea7b30000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000000c080a0fbdcb5b822a22e07c49b039c0a6dcdfb414e13327ea2d1316e02bf1b49fc2fdda0735fc6141adc45a5fcbf6e1d7c7483a502dd89ccfe90a21118828905af0223db02f8b101318405f5e100850a9b0fafef830269a994dbc2ff66a085f49224755883aded02bde0e560fc80b844a9059cbb000000000000000000000000000000000000000000000000000000000000daee0000000000000000000000000000000000000000000000010e3d64f1cc5ae1b2c080a0ae8632f3df13b0b29739176db4207a8216e7427881afc4a9d0686ba77d7bba81a039fef6cbfb48c00f7a38d109041359bd75ca4d41aa83834534c9c5430361062702f901b3018205468405f5e100850a9b0fafef82edd194231b0ee14048e9dccd1d247744d114a4eb5e8e6380b90144ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a48b95dd71d4d574103fa46dbe38b8cf33463bafceb5515cf89cd6db5aec396bc9546e11ab000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014778980c7719fc59f3cef91628cc541d15a82f13b00000000000000000000000000000000000000000000000000000000000000000000000000000000c001a0d93142981f1be62aca57cb43cc1abd57ef1eac62cde54ec53d5e0ee6fa9de9cba00a77b94bc7c8bd6b36e666a61e4eaf4de12fc91ab63e5333fe0215061342cfb802f875018203368405f5e100850a8a530978825208945c543c580288237bcb771d1677b8adab36d4138a8802a80e2e3176c36580c001a062cda01e37c4483bd395b34bd168fd915ec1dfdc7f71ca076755cb2dbcb0b43da07a4b52d4b878be8b13f4e51826c422d643a358bc110fe6ad22d7e1cb0efda87602f8910181a98405f5e100850a9b0fafef8303f3549493dede06ae3b5590af1d4c111bc54c3f717e4b3580a4a694fc3a0000000000000000000000000000000000000000000000057721ae5f1de816e8c001a07b05eb2c8813894d347007d5e1368646e10ab6de08a8402dd89c9c7f2187399ba0160f8836915f14c26d5386d821f0924e62d8c6fa898e873648076ee20549658502f902f901158405f5e100850dc8a37d3a83032fe394ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b87470de4df820000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000064499ef700000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000009e18f7255700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000009c71467dae5e12b0b35fd93648c55ba7f3b6070c080a03006b831c90e2ef5b10544712b08dfb444ad83dc9e3fcf190e778a14d3d8e8b3a0763d1f87e54724df85433708e7ec0895cf7f1c2629e8259d56e70fcfe59c8f2002f8b3018281308405f5e100850f579fc3ce830186a094cc06579a4cd31b79d5277ed637edbfeb7bb2686a80b844a9059cbb000000000000000000000000cd33ea0091eb8c927ee5fa3f22fdc4971a27cc5a0000000000000000000000000000000000000000000000000167e3d033bf4000c001a00530206dcf2b0fb49999732d588bcaa102985ac4b082abba837ed5c766db5504a05863196d953e85b50f5e291e9badf35533dcdd478affe62c269941435e6a80ad02f8b001558405f5e100850ace95a29b8271b4943819f64f282bf135d62168c1e513280daf905e0680b844095ea7b3000000000000000000000000de032d65369e88553718d7bc3d0a85c13b0086490000000000000000000000000000000000000000000000000000000000000000c080a02b7d80c6eb6ef784d891b5d5e96b9257099223827ea539c554a80bc3cba20645a025828b21dbff7471a66ed8139421f3b2af5a229d724b092a2aa34744d6c4c3d702f88f01528405f5e100850a9b0fafef828ca394c02aaa39b223fe8d0a0e5c4f27ead9083c756cc280a42e1a7d4d00000000000000000000000000000000000000000000000000bfd8b6c1df0000c001a057e65860f49bc29e7edf02d12e0b5b525f2c967c90df145a601524352f9eaee0a04ababe1e8aadaa7d142766eb5163dd986c2429a8847e6c4df4193f223dda88c902f8fb018206b78405f5e100850a8a530978830205a8946d7c44773c52d396f43c2d511b81aa168e9a7a428822977e7e5f238000b884b56785880000000000000000000000008842c56b410215932e81848e376151cea9ce2a59000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002195912da4720000c080a05268809053ade8a62585624a6649d03e7b6805627d98cefeabd2d0d1070ac634a05bbc1ee05bdfc559da0c38c46b3f654c9e8b3a0453a189f3a300d6589660bc7302f90e14018206a58405f5e100850a8a530978830d797a94def171fe48cf0115b1d80b88dc8eab59176fee5780b90da446c67b6d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000005f98805a4e8be255a32880fdec7f6728c6568ba0000000000000000000000000000000000000000000000b61d6a1e18db8afeeb50000000000000000000000000000000000000000000000018994494de0dfa2580000000000000000000000000000000000000000000000018b8e996e6e3985920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000008a3c2a819e3de7aca384c798269b3ce1cd0e43701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000644b079e3715e8ecd84c40eab907112591f288e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000009be264469ef954c139da4a45cf76cbcc5e3a6a73000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000006453edbe000000000000000000000000000000000000000000000000000000000000002b5f98805a4e8be255a32880fdec7f6728c6568ba0000bb8c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024b80000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000500000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002800000000000000000000000009be264469ef954c139da4a45cf76cbcc5e3a6a730000000000000000000000000000000000000000000000000000000000001f9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000006453edbe000000000000000000000000000000000000000000000000000000000000002b5f98805a4e8be255a32880fdec7f6728c6568ba00001f4a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000000021ab8aeb35bfc0b3fd84ca810b0aa85938357be2000000000000000000000000000000000000000000000000000000000000077b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000004a585e0f7c18e2c414221d6402652d5e0990e5f8000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000023f6b8a4093d740a5f39d20a1f543e4b26b7791a000000000000000000000000000000000000000000000000000000006453edbe000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000009be264469ef954c139da4a45cf76cbcc5e3a6a73000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000006453edbe000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a0d136f412c883a88ff2defc5b257dc82216d1a5e39c08db4312115f75a8d227b0a03d246e65a8c7a56cb75669fcdd1e9c98383b3d8223eed783af416adadd3401e702f8b101048405f5e100850a8a53097883012f969406450dee7fd2fb8e39061434babcfc05599a6fb880b844a9059cbb00000000000000000000000006f598fc2af314d09946b61f17a322331ce2c23c00000000000000000000000000000000000000000006aaf2afce571489480000c001a0c778cd6b22bd9ab3984f644185e7a030b976a494309f9a1c19076720a83a2912a05a6057e97b5aa57dc99d1f694986f08f50bb81e602748652f48f45f4393223e802f8b20181c58405f5e100850a9b0fafef830168d7943819f64f282bf135d62168c1e513280daf905e0680b8440fa7609e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087ecaf71c53a7b468d81d8cec3d1ad9d347c5d84c001a0fc4411c4fd02ba611102e66fd4aaaa0be901ba3fc1efa13ac7b8e98f44ee5060a0567aaa62f3624fa34ceebbf00833cae1cef54b8dbae12a0a3d29a69f4a40aeda02f8b10181ed8405f5e100850a8a5309788270d094c02aaa39b223fe8d0a0e5c4f27ead9083c756cc280b844095ea7b3000000000000000000000000e5c783ee536cf5e63e792988335c4255169be4e10000000000000000000000000000000000000000000000000000000000000000c080a04d68f4c193475ec4242d0dceb6054274148e322be2c460822cb6b8f980d996e5a023ce242cd272a37ee90945659756d8eb68d9f90a8a12936a5e1436b5d4a002d402f90133018201d38405f5e100850a8a5309788301c1b894e195ddbb48bf2ccee049cff277e8344643f54b2180b8c4db7fd40800000000000000000000000000000000000000000000000000000000000005e6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000418d248a934e06fe0038a3486c326f9f32366d940b2f4a0865e53e9fd963edcdc227b598278758bba5e3af9818693b7658b6967534250ed849bb5124ed91a0e3c81c00000000000000000000000000000000000000000000000000000000000000c001a029a0c050dafc4cccf7b8222e45e3d33924eeea93da0b9cc3b5f29099de8f0042a02ff2beaf44454535b3b9038b578ab3906fe7a89c62d983cb8bd4cd86f3c9d26902f8b2018202cf8405f5e100850a8a53097882ecb4947d33b7863c4157b65f6e1c734a0bc7e1dc24df2680b844a22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000001c080a0e8413eacef84f0dbd44b28e01ee8d756424fc01005724041d81434e0e26c4829a01ed765b9e257a1a77afa758279a6319322e2bc533028dd6955bf62c512e79b1002f90272017c8405f5e100850a8a5309788302d494941988fc75050feb61935ef95e8b4df9b68ce3589580b90204e6d37b88000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c959367752bafb4d0d5cc01b90b506b16b81e1f9f51613cb13e2f8f794ebe15d0624f8e66b53195c554ce2bde36f2d3a71c82ef1f9eac0715dc1f5812c566f70fc09218f74fe4df48cdafa4b487def629f1dbaf20aa6e837523f9ad3a5d20f89310c2ecf010c1fd4c153b41893dc16cc918de439ec3da0454651ba5e6c6fdc0f9cb574637689f14319ece546e3a921be4a0cbd3132000cd667a1cfda448f4113b81ef2ea679c80714d8d7d96ae1180d1f664a9f6ffe29bae04f487eb4cdbac2af8e4a5443655116f6710303abf1d42cdbac7eb6a907a896bedeba4c424a13917ed4dd524d25bc95ecc992459dc1bcf81c8542dbe25e6955866d83c3ee121f73743784fd60c007e66234b1150747fa6746fc6ba41a05f9b48791e6928758bd92ccae1e001cd354f7e1a7f233df0cb76d3f418c1687e9d4823bd954ed50ff965b77d9deb9a26c55e5960c820577a543eee53db0cf9367d58e8167c113a45a66c2bf3a02adb85ceb9d7526a709769803333329fc681f1474da5f5489a1f804e27faec080a0f0012bc817713397388481d7b8ad6130aa20602d18f7971a3fed2af0c990771da0158ed1a4cfa80837755a888765220105af484f9183d3f64a975ca6fe512d92f802f87301048405f5e100850a8a53097882520894e63329af1fce16e0d02cb954081930fa81eb288b8807ba3ad8a3b2324880c001a0e9d4a52fec27e9b6e23a7df24e4c2e20e2817b5516f2802e03ee568272abc8d4a00e6d5ae6d030722c71970cb4ac657878432210af99461edb20996d47693f2f6302f87201028405f5e100850a8a53097882520894d8db4fcbe96d3c2ff3f69ea4ad9558526f957a89872ca8091090c52080c080a090ca19de497f56174113ab43e09eac67783937bb143c345be0dde093c7de0f55a02a63970bd5822f51f845df5274b04d97ca6565beb4fb13851b6f317422cd7b0c02f87801808405f5e100850a8a5309788301683b944dbd4fc535ac27206064b68ffcf827b0a60bab3f8806ac2d7b407f9eb484439370b1c001a0814fca60f7ea314c9a40aaf4d603774341d6da9774dcd728aa9abc842209c5a9a05fa478e20e26ee16df96792d526e865cef855532cf56b57a38b7d5fbbaa036eb02f87101808405f5e100850a8a53097882520894d397ba16f7fbec7232234980c8fd5fec402a34c9872b8db35994228880c001a0f24915a195320888db21968d9e9e49318cf306c3375da59e0495a80b2bf8de799fc76bcfd9ed616a2007a34449bbc67a7e1689db3ef4a856849bee228afa1a3b02f902fc0182071b8405f5e100850a8a53097883031de094ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b880d2f13f7789f0000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba4700000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000d2f13f7789f0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000d2f13f7789f0000000000000000000000000000000000000000000016d1d1cd325fd1e2a07f0fde00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933c001a02c7b59d5fd4f92a4ef98ce5f8e816140ec9831b1504eb2cf8a699405c3986469a009efce3c62d396f83c8ca5a594634da2b292267b469dbfc8b39d02acff0861db02f89801819d8405f5e100850a9b0fafef8303f3199449bd7fad523049f6286c2df301c8364c28157c128758d15e17628000a46ecd23060000000000000000000000000000000000000000000000000000000000000001c080a092b6c707d4fbd624982bb3d698ee54701a917c33613c364e57c12cdecba25238a07ace00661a4bb9ccfbe99af9548c73a992b2f9e30ab5a74966d2dc8c0fe3ca9a02f8b10181948405f5e100850ab7eec1fa82ed1c94a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4880b844095ea7b3000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc080a04ff881e33376034fb73112b1458b301f41d19a5780230266cc98aaee232bd0a9a06cfa0e0a04fcc5e3a1ad29f3d7c0051386a2f4c676282d20a9cb00b60436a71302f872013c8405f5e100850a8a530978825208943f04fc509f239ca981dcd16b7ac35a99737ccf2f873097e2fa4f100080c001a0ae75635d8f6abacd22451d3a2136a5fb2ea2fea890fc19ae8a8dc66a45910c33a05037a85b7c41aa9962ddd011fb68dc739b11ad690a4f665666eb00c9e7cc320302f901ba01808405f5e100850a8a5309788303975594d834ce144a57988178e07406b0e0bd6856ff5981880144141b50694000b901449aa8eef9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000644add7c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004151fedbf8aa0bbaa2f55a2e67231122145856bf66a625311013adb8fb347004c529968b07dfe722f4a4fe90eb04fa92327e3ccbafc19cff50e10de90dd7c3e1351b00000000000000000000000000000000000000000000000000000000000000c001a08c3080e64e37a1e7ae1537bef7d8c2a779d8addbd2c77137eda0d7292de65fe6a03358c46547a8e8a3c6b018910ca867110995110f195288ed4a7909786c7239e702f8b001078405f5e100850a5d155a1882b5c794b69753c06bb5c366be51e73bfc0cc2e3dc07e37180b844095ea7b3000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001a0323fcb1e356de88b8fc10062812a6901e47164ebafe45335270f97a270935d31a00415c2c8b13b085c002e8439cd1e78116047eb3c7cab6e31c4b2f18b771a794a02f902fa01268405f5e100850a8a5309788302f31694ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b8802c68af0bb140000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba5300000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000002c68af0bb1400000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000002c68af0bb1400000000000000000000000000000000000000000000f7f5fac929cb0f1fe433f9a700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000001ce270557c1f68cfb577b856766310bf8b47fd9cc080a034e200edcfa672cb6e622fb707f2d375f06124a4b318e08c28df06efb7b21c32a014774a1af2743d3e8b4fe5f108da0ed654e1ecc09de7deb10d3b62eb308fcd9802f87201808405f5e100850a8a53097882520894e4edb277e41dc89ab076a1f049f4a3efa700bce887138a388a43e33880c080a0d3e762384932bcd09d5d39d5d87988a3e673b81f9164c569841aa0f8387c9e46a053472849d586c4a5567e8a8933ccf1a827cfc9b9e007f89eebde5ea575dcb80402f906c3018206498405f5e100850a8a5309788303c3ea9400000000000001ad428e4906ae43d8f9852d0dd6873438a9a18db000b9064ce7acab24000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006200000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000000000000000000000000000d340035d759010ddefa3839bee22d324be3fcea100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000357baa03e1bc72eb48b0a5bd09649b20d3481bc000000000000000000000000004c00500000ad104d7dbd00e3ae0a5c00560c0000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644aa1f70000000000000000000000000000000000000000000000000000000064722ef70000000000000000000000000000000000000000000000000000000000000000360c6ebe000000000000000000000000000000000000000001e89fc6c5273a450000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e1b81cd6a494cbca06a8e2055a62c2cf0fa5a8ac00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e374434184600000000000000000000000000000000000000000000000000002e3744341846000000000000000000000000000357baa03e1bc72eb48b0a5bd09649b20d3481bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014e3770d6be0000000000000000000000000000000000000000000000000000014e3770d6be000000000000000000000000000000a26b00c1f0df003000390027140000faa7190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b32dfc9eac000000000000000000000000000000000000000000000000000004b32dfc9eac00000000000000000000000000ceefbbbee6c0b6b06b681d791ea18eef140b20a2000000000000000000000000000000000000000000000000000000000000004039fd0b3ad610f9587878a967d9082bfc28ae21fb63a8a3b5289bd1d08279998ce37c2fa28864b524caf5c66f3fa4b551438d7d6379837781a097fbe0029302900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000360c6ebec080a0e0565bc1bc3dcea43b9055a198a167332f51f727a04713a8ce1f34f75a395ae6a058821420fc8a0f1e887f47bf347452d4389996a6f837d74c767ffa03431a7bbd02f902fc018201ac8405f5e100850ab7eec1fa83035c5494ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b88016345785d8a0000b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba4700000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000002675b4e84747d98f200000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000bb84d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000000000000000000000c001a0d6e2bfc1a522f86005f95298be72bb15088109c2dc6d839dd1007b2c0181f360a01f5b9aaee1bfec8d18bce7b3895c7246cdf5074716041395fb08e64add27720d02f8b20182013d8405f5e100850ab7eec1fa82d3e39448e359e6917f9c2060c612e60b2951b86233bfd780b844095ea7b3000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000000000000000000000000000000000342052ce17c001a0d5096b225b5a9900405ef25cd498eb3319ef10e3371841348fc7a0205b348de3a06ce0b860ce407635ec6e40d237409bee7052f9086501ac41ee616c0b0a22d98302f8790181a28405f5e100850a8a5309788301683b944dbd4fc535ac27206064b68ffcf827b0a60bab3f882d1a51c7e005000084439370b1c080a0c1037377a8eaca1df3a1a3bd43fecc68e42087822651c61c53a9935c6583e8eca02df4d1a6706cf048d0aafd5201d1253093d32d97c0db0da3d1ff9061abb9b2b302f8b10181f58405f5e100850a8a53097882b3c494b72c18bd85c814d07d5dbf9eea4e7b3a62fed28680b844a22cb4650000000000000000000000004e3f914246f55fc4f55ee2882bf70c72a8f427cf0000000000000000000000000000000000000000000000000000000000000001c080a0ab4b2c0ddd2a83bda217671ca0bb1109988c76308297d69ea5ab72f62b22524aa04799a0c6dd6345f498c99e163393ff606148baf43bbe8148ecddc28ffa855aa402f902fa01428405f5e100850a5d155a18830375a394ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b880233264b61f5ca00b902843593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000644aba4700000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000233264b61f5ca00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000233264b61f5ca000000000000000000000000000000000000000000000000000000021f527174ad00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006592783924f8e9ff06999d7e841656d1fd03e019c080a0bb66f1d952991084d662f3af0452151e183293022a380bd468cc9cfca299ce8ea055162125cbe20d3d58dbb1745d9ff920383d6579c0be82e7e0474d2eb2b8c89602f8d3018203a38405f5e100850a8a53097883018b3894e8c81c1de6c1e2896df2607ca89a266e4756e65280b86469b28c5000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003414e310000000000000000000000000000000000000000000000000000000000c080a0fad1df15149a8100d931edadc8828f0b0ef12d6d4f7aed1ea8551b4dec5dcee3a018e4f222a7989fbb8c0d3b07260e96aafa732b3ea7bf736e0bb1a07a00e4ebea02f8720183033ba7808507b3624d2e827530944675c7e5baafbffbca748158becba61ef3b0a2638801c37f166236af9a80c001a06673cc5653e10ced5217ba1919498efb8fc9d104645b913a2f1cfa48dfbdd36da078b41916ae916199e4b78cfd21100c5c8d85e7840244c11ff2f038738c9d1a95c0400000006200000084000000a6000000c8000000ea0000000c0100002e010000500100007201000094010000b6010000d8010000fa0100001c0200003e020000e183196f2d830771aa942c885c22321746ab958980a5d060be90cd3fa79b83bc501ee183196f2e830771ab94a578c8a6fbddbdff3646ea05a7998bb251c2e97283bcc397e183196f2f830771ac94a578c8a6fbddbdff3646ea05a7998bb251c2e97283bd2f54e183196f30830771ad94a578c8a6fbddbdff3646ea05a7998bb251c2e97283bc2316e183196f31830771ae94a578c8a6fbddbdff3646ea05a7998bb251c2e97283bb358ae183196f32830771af94a578c8a6fbddbdff3646ea05a7998bb251c2e97283bc4c7ee183196f33830771b094a578c8a6fbddbdff3646ea05a7998bb251c2e97283bce826e183196f34830771b1942c885c22321746ab958980a5d060be90cd3fa79b83bcb59be183196f35830771b294a578c8a6fbddbdff3646ea05a7998bb251c2e97283bca420e183196f36830771b394a578c8a6fbddbdff3646ea05a7998bb251c2e97283bc1dd0e183196f37830771b4942c885c22321746ab958980a5d060be90cd3fa79b83bbe0dae183196f38830771b594a578c8a6fbddbdff3646ea05a7998bb251c2e97283bb714ce183196f39830771b6942c885c22321746ab958980a5d060be90cd3fa79b83bc3c1de183196f3a830771b794a578c8a6fbddbdff3646ea05a7998bb251c2e97283bc2726e183196f3b830771b894a1c52afa77d87796b8cd34f4801e062fb54e7df683ad94c3e183196f3c830771b994a578c8a6fbddbdff3646ea05a7998bb251c2e97283bad3ed" diff --git a/portalnetwork/history/types.go b/portalnetwork/history/types.go index 77989961391e..6c78ab73a3db 100644 --- a/portalnetwork/history/types.go +++ b/portalnetwork/history/types.go @@ -6,7 +6,7 @@ import ( ssz "github.com/ferranbt/fastssz" ) -//go:generate sszgen --path types.go --exclude-objs BlockHeaderProof +//go:generate sszgen --path types.go --exclude-objs BlockHeaderProof,PortalReceipts type BlockHeaderProofType uint8 @@ -106,3 +106,87 @@ func (p *BlockHeaderProof) SizeSSZ() (size int) { func (p *BlockHeaderProof) HashTreeRootWith(hh ssz.HashWalker) (err error) { panic("implement me") } + +type PortalReceipts struct { + Receipts [][]byte `ssz-max:"134217728,16384"` +} + +// MarshalSSZ ssz marshals the PortalReceipts object +func (p *PortalReceipts) MarshalSSZ() ([]byte, error) { + return ssz.MarshalSSZ(p) +} + +// MarshalSSZTo ssz marshals the PortalReceipts object to a target array +func (p *PortalReceipts) MarshalSSZTo(buf []byte) (dst []byte, err error) { + dst = buf + + if size := len(p.Receipts); size > 134217728 { + err = ssz.ErrListTooBigFn("PortalReceipts.Receipts", size, 134217728) + return + } + { + offset := 4 * len(p.Receipts) + for ii := 0; ii < len(p.Receipts); ii++ { + dst = ssz.WriteOffset(dst, offset) + offset += len(p.Receipts[ii]) + } + } + for ii := 0; ii < len(p.Receipts); ii++ { + if size := len(p.Receipts[ii]); size > 16384 { + err = ssz.ErrBytesLengthFn("PortalReceipts.Receipts[ii]", size, 16384) + return + } + dst = append(dst, p.Receipts[ii]...) + } + + return +} + +// UnmarshalSSZ ssz unmarshals the PortalReceipts object +func (p *PortalReceipts) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 4 { + return ssz.ErrSize + } + // Field (0) 'Receipts' + { + num, err := ssz.DecodeDynamicLength(buf, 134217728) + if err != nil { + return err + } + p.Receipts = make([][]byte, num) + err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { + if len(buf) > 16384 { + return ssz.ErrBytesLength + } + if cap(p.Receipts[indx]) == 0 { + p.Receipts[indx] = make([]byte, 0, len(buf)) + } + p.Receipts[indx] = append(p.Receipts[indx], buf...) + return nil + }) + if err != nil { + return err + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the PortalReceipts object +func (p *PortalReceipts) SizeSSZ() (size int) { + size = 0 + + // Field (0) 'Receipts' + for ii := 0; ii < len(p.Receipts); ii++ { + size += 4 + size += len(p.Receipts[ii]) + } + + return +} + +// HashTreeRootWith ssz hashes the PortalReceipts object with a hasher +func (p *PortalReceipts) HashTreeRootWith(hh ssz.HashWalker) (err error) { + panic("implement me") +}