diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index a8412236a85f..5add55be7a47 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -1641,15 +1641,15 @@ func setEnableRollupVerify(ctx *cli.Context, cfg *ethconfig.Config) { func setDA(ctx *cli.Context, cfg *ethconfig.Config) { if ctx.IsSet(DASyncEnabledFlag.Name) { cfg.EnableDASyncing = ctx.Bool(DASyncEnabledFlag.Name) - if ctx.IsSet(DABlobScanAPIEndpointFlag.Name) { - cfg.DA.BlobScanAPIEndpoint = ctx.String(DABlobScanAPIEndpointFlag.Name) - } - if ctx.IsSet(DABlockNativeAPIEndpointFlag.Name) { - cfg.DA.BlockNativeAPIEndpoint = ctx.String(DABlockNativeAPIEndpointFlag.Name) - } - if ctx.IsSet(DABeaconNodeAPIEndpointFlag.Name) { - cfg.DA.BeaconNodeAPIEndpoint = ctx.String(DABeaconNodeAPIEndpointFlag.Name) - } + } + if ctx.IsSet(DABlobScanAPIEndpointFlag.Name) { + cfg.DA.BlobScanAPIEndpoint = ctx.String(DABlobScanAPIEndpointFlag.Name) + } + if ctx.IsSet(DABlockNativeAPIEndpointFlag.Name) { + cfg.DA.BlockNativeAPIEndpoint = ctx.String(DABlockNativeAPIEndpointFlag.Name) + } + if ctx.IsSet(DABeaconNodeAPIEndpointFlag.Name) { + cfg.DA.BeaconNodeAPIEndpoint = ctx.String(DABeaconNodeAPIEndpointFlag.Name) } } diff --git a/core/rawdb/accessors_rollup_event.go b/core/rawdb/accessors_rollup_event.go index 1b60f6e4f0d8..e5daffcc5965 100644 --- a/core/rawdb/accessors_rollup_event.go +++ b/core/rawdb/accessors_rollup_event.go @@ -18,7 +18,8 @@ type ChunkBlockRange struct { // CommittedBatchMeta holds metadata for committed batches. type CommittedBatchMeta struct { - Version uint8 + Version uint8 + // BlobVersionedHashes are the versioned hashes of the blobs in the batch. Currently unused. Left for compatibility. BlobVersionedHashes []common.Hash ChunkBlockRanges []*ChunkBlockRange } diff --git a/eth/backend.go b/eth/backend.go index a119708e52be..bd432cb7131c 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -245,7 +245,7 @@ func New(stack *node.Node, config *ethconfig.Config, l1Client l1.Client) (*Ether if config.EnableRollupVerify { // initialize and start rollup event sync service - eth.rollupSyncService, err = rollup_sync_service.NewRollupSyncService(context.Background(), chainConfig, eth.chainDb, l1Client, eth.blockchain, stack) + eth.rollupSyncService, err = rollup_sync_service.NewRollupSyncService(context.Background(), chainConfig, eth.chainDb, l1Client, eth.blockchain, stack, config.DA) if err != nil { return nil, fmt.Errorf("cannot initialize rollup event sync service: %w", err) } diff --git a/params/version.go b/params/version.go index 260a9bafbb7f..b63a3765575d 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ import ( const ( VersionMajor = 5 // Major version component of the current release VersionMinor = 8 // Minor version component of the current release - VersionPatch = 4 // Patch version component of the current release + VersionPatch = 5 // Patch version component of the current release VersionMeta = "mainnet" // Version metadata to append to the version string ) diff --git a/rollup/da_syncer/da/calldata_blob_source.go b/rollup/da_syncer/da/calldata_blob_source.go index a17ebdb0fc15..bf4a2a24ef2c 100644 --- a/rollup/da_syncer/da/calldata_blob_source.go +++ b/rollup/da_syncer/da/calldata_blob_source.go @@ -81,6 +81,10 @@ func (ds *CalldataBlobSource) NextData() (Entries, error) { return da, nil } +func (ds *CalldataBlobSource) SetL1Height(l1Height uint64) { + ds.l1Height = l1Height +} + func (ds *CalldataBlobSource) L1Height() uint64 { return ds.l1Height } @@ -106,10 +110,22 @@ func (ds *CalldataBlobSource) processRollupEventsToDA(rollupEvents l1.RollupEven } case l1.RevertEventType: - entry = NewRevertBatch(rollupEvent.BatchIndex().Uint64()) + revertEvent, ok := rollupEvent.(*l1.RevertBatchEvent) + // this should never happen because we just check event type + if !ok { + return nil, fmt.Errorf("unexpected type of rollup event: %T", rollupEvent) + } + + entry = NewRevertBatch(revertEvent) case l1.FinalizeEventType: - entry = NewFinalizeBatch(rollupEvent.BatchIndex().Uint64()) + finalizeEvent, ok := rollupEvent.(*l1.FinalizeBatchEvent) + // this should never happen because we just check event type + if !ok { + return nil, fmt.Errorf("unexpected type of rollup event: %T", rollupEvent) + } + + entry = NewFinalizeBatch(finalizeEvent) default: return nil, fmt.Errorf("unknown rollup event, type: %v", rollupEvent.Type()) diff --git a/rollup/da_syncer/da/commitV0.go b/rollup/da_syncer/da/commitV0.go index 2c4f07869da1..c8e34ec01a7e 100644 --- a/rollup/da_syncer/da/commitV0.go +++ b/rollup/da_syncer/da/commitV0.go @@ -6,6 +6,7 @@ import ( "github.com/scroll-tech/da-codec/encoding" + "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/rawdb" "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/ethdb" @@ -14,14 +15,14 @@ import ( ) type CommitBatchDAV0 struct { - version uint8 + version encoding.CodecVersion batchIndex uint64 parentTotalL1MessagePopped uint64 skippedL1MessageBitmap []byte chunks []*encoding.DAChunkRawTx l1Txs []*types.L1MessageTx - l1BlockNumber uint64 + event *l1.CommitBatchEvent } func NewCommitBatchDAV0(db ethdb.Database, @@ -36,16 +37,16 @@ func NewCommitBatchDAV0(db ethdb.Database, return nil, fmt.Errorf("failed to unpack chunks: %d, err: %w", commitEvent.BatchIndex().Uint64(), err) } - return NewCommitBatchDAV0WithChunks(db, uint8(codec.Version()), commitEvent.BatchIndex().Uint64(), parentBatchHeader, decodedChunks, skippedL1MessageBitmap, commitEvent.BlockNumber()) + return NewCommitBatchDAV0WithChunks(db, codec.Version(), commitEvent.BatchIndex().Uint64(), parentBatchHeader, decodedChunks, skippedL1MessageBitmap, commitEvent) } func NewCommitBatchDAV0WithChunks(db ethdb.Database, - version uint8, + version encoding.CodecVersion, batchIndex uint64, parentBatchHeader []byte, decodedChunks []*encoding.DAChunkRawTx, skippedL1MessageBitmap []byte, - l1BlockNumber uint64, + event *l1.CommitBatchEvent, ) (*CommitBatchDAV0, error) { parentTotalL1MessagePopped := getBatchTotalL1MessagePopped(parentBatchHeader) l1Txs, err := getL1Messages(db, parentTotalL1MessagePopped, skippedL1MessageBitmap, getTotalMessagesPoppedFromChunks(decodedChunks)) @@ -60,7 +61,7 @@ func NewCommitBatchDAV0WithChunks(db ethdb.Database, skippedL1MessageBitmap: skippedL1MessageBitmap, chunks: decodedChunks, l1Txs: l1Txs, - l1BlockNumber: l1BlockNumber, + event: event, }, nil } @@ -70,12 +71,28 @@ func NewCommitBatchDAV0Empty() *CommitBatchDAV0 { } } +func (c *CommitBatchDAV0) Version() encoding.CodecVersion { + return c.version +} + +func (c *CommitBatchDAV0) Chunks() []*encoding.DAChunkRawTx { + return c.chunks +} + +func (c *CommitBatchDAV0) BlobVersionedHashes() []common.Hash { + return nil +} + func (c *CommitBatchDAV0) Type() Type { return CommitBatchV0Type } func (c *CommitBatchDAV0) L1BlockNumber() uint64 { - return c.l1BlockNumber + return c.event.BlockNumber() +} + +func (c *CommitBatchDAV0) Event() l1.RollupEvent { + return c.event } func (c *CommitBatchDAV0) BatchIndex() uint64 { diff --git a/rollup/da_syncer/da/commitV1.go b/rollup/da_syncer/da/commitV1.go index 0433479c950b..6fdcf45b6d14 100644 --- a/rollup/da_syncer/da/commitV1.go +++ b/rollup/da_syncer/da/commitV1.go @@ -17,6 +17,8 @@ import ( type CommitBatchDAV1 struct { *CommitBatchDAV0 + + versionedHashes []common.Hash } func NewCommitBatchDAWithBlob(ctx context.Context, db ethdb.Database, @@ -33,11 +35,17 @@ func NewCommitBatchDAWithBlob(ctx context.Context, db ethdb.Database, return nil, fmt.Errorf("failed to unpack chunks: %v, err: %w", commitEvent.BatchIndex().Uint64(), err) } - versionedHash, err := l1Reader.FetchTxBlobHash(commitEvent.TxHash(), commitEvent.BlockHash()) + versionedHashes, err := l1Reader.FetchTxBlobHashes(commitEvent.TxHash(), commitEvent.BlockHash()) if err != nil { return nil, fmt.Errorf("failed to fetch blob hash, err: %w", err) } + // with CommitBatchDAV1 we expect only one versioned hash as we commit only one blob per batch submission + if len(versionedHashes) != 1 { + return nil, fmt.Errorf("unexpected number of versioned hashes: %d", len(versionedHashes)) + } + versionedHash := versionedHashes[0] + header, err := l1Reader.FetchBlockHeaderByNumber(commitEvent.BlockNumber()) if err != nil { return nil, fmt.Errorf("failed to get header by number, err: %w", err) @@ -70,14 +78,21 @@ func NewCommitBatchDAWithBlob(ctx context.Context, db ethdb.Database, return nil, fmt.Errorf("decodedChunks is nil after decoding") } - v0, err := NewCommitBatchDAV0WithChunks(db, uint8(codec.Version()), commitEvent.BatchIndex().Uint64(), parentBatchHeader, decodedChunks, skippedL1MessageBitmap, commitEvent.BlockNumber()) + v0, err := NewCommitBatchDAV0WithChunks(db, codec.Version(), commitEvent.BatchIndex().Uint64(), parentBatchHeader, decodedChunks, skippedL1MessageBitmap, commitEvent) if err != nil { return nil, err } - return &CommitBatchDAV1{v0}, nil + return &CommitBatchDAV1{ + CommitBatchDAV0: v0, + versionedHashes: versionedHashes, + }, nil } func (c *CommitBatchDAV1) Type() Type { return CommitBatchWithBlobType } + +func (c *CommitBatchDAV1) BlobVersionedHashes() []common.Hash { + return c.versionedHashes +} diff --git a/rollup/da_syncer/da/da.go b/rollup/da_syncer/da/da.go index 1ad618d7ba3d..cd7320f1c04f 100644 --- a/rollup/da_syncer/da/da.go +++ b/rollup/da_syncer/da/da.go @@ -3,7 +3,11 @@ package da import ( "math/big" + "github.com/scroll-tech/da-codec/encoding" + + "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/rollup/l1" ) type Type int @@ -25,11 +29,15 @@ type Entry interface { BatchIndex() uint64 L1BlockNumber() uint64 CompareTo(Entry) int + Event() l1.RollupEvent } type EntryWithBlocks interface { Entry Blocks() []*PartialBlock + Version() encoding.CodecVersion + Chunks() []*encoding.DAChunkRawTx + BlobVersionedHashes() []common.Hash } type Entries []Entry diff --git a/rollup/da_syncer/da/finalize.go b/rollup/da_syncer/da/finalize.go index 14d6c2a644cb..eab805d52482 100644 --- a/rollup/da_syncer/da/finalize.go +++ b/rollup/da_syncer/da/finalize.go @@ -1,14 +1,16 @@ package da -type FinalizeBatch struct { - batchIndex uint64 +import ( + "github.com/scroll-tech/go-ethereum/rollup/l1" +) - l1BlockNumber uint64 +type FinalizeBatch struct { + event *l1.FinalizeBatchEvent } -func NewFinalizeBatch(batchIndex uint64) *FinalizeBatch { +func NewFinalizeBatch(event *l1.FinalizeBatchEvent) *FinalizeBatch { return &FinalizeBatch{ - batchIndex: batchIndex, + event: event, } } @@ -17,11 +19,15 @@ func (f *FinalizeBatch) Type() Type { } func (f *FinalizeBatch) L1BlockNumber() uint64 { - return f.l1BlockNumber + return f.event.BlockNumber() } func (f *FinalizeBatch) BatchIndex() uint64 { - return f.batchIndex + return f.event.BatchIndex().Uint64() +} + +func (f *FinalizeBatch) Event() l1.RollupEvent { + return f.event } func (f *FinalizeBatch) CompareTo(other Entry) int { diff --git a/rollup/da_syncer/da/revert.go b/rollup/da_syncer/da/revert.go index d84f22ebaa7b..f8120fd3f150 100644 --- a/rollup/da_syncer/da/revert.go +++ b/rollup/da_syncer/da/revert.go @@ -1,14 +1,16 @@ package da -type RevertBatch struct { - batchIndex uint64 +import ( + "github.com/scroll-tech/go-ethereum/rollup/l1" +) - l1BlockNumber uint64 +type RevertBatch struct { + event *l1.RevertBatchEvent } -func NewRevertBatch(batchIndex uint64) *RevertBatch { +func NewRevertBatch(event *l1.RevertBatchEvent) *RevertBatch { return &RevertBatch{ - batchIndex: batchIndex, + event: event, } } @@ -17,10 +19,14 @@ func (r *RevertBatch) Type() Type { } func (r *RevertBatch) L1BlockNumber() uint64 { - return r.l1BlockNumber + return r.event.BlockNumber() } func (r *RevertBatch) BatchIndex() uint64 { - return r.batchIndex + return r.event.BatchIndex().Uint64() +} + +func (r *RevertBatch) Event() l1.RollupEvent { + return r.event } func (r *RevertBatch) CompareTo(other Entry) int { diff --git a/rollup/l1/abi.go b/rollup/l1/abi.go index c16123aa5e8b..dcf09f25fd13 100644 --- a/rollup/l1/abi.go +++ b/rollup/l1/abi.go @@ -158,6 +158,26 @@ type FinalizeBatchEvent struct { blockNumber uint64 } +func NewFinalizeBatchEvent( + batchIndex *big.Int, + batchHash common.Hash, + stateRoot common.Hash, + withdrawRoot common.Hash, + txHash common.Hash, + blockHash common.Hash, + blockNumber uint64, +) *FinalizeBatchEvent { + return &FinalizeBatchEvent{ + batchIndex: batchIndex, + batchHash: batchHash, + stateRoot: stateRoot, + withdrawRoot: withdrawRoot, + txHash: txHash, + blockHash: blockHash, + blockNumber: blockNumber, + } +} + func (f *FinalizeBatchEvent) TxHash() common.Hash { return f.txHash } diff --git a/rollup/l1/reader.go b/rollup/l1/reader.go index eddc77d71350..2902b48caefa 100644 --- a/rollup/l1/reader.go +++ b/rollup/l1/reader.go @@ -139,20 +139,23 @@ func (r *Reader) FetchTxData(txHash, blockHash common.Hash) ([]byte, error) { if err != nil { return nil, err } + return tx.Data(), nil } -// FetchTxBlobHash fetches tx blob hash corresponding to given event log -func (r *Reader) FetchTxBlobHash(txHash, blockHash common.Hash) (common.Hash, error) { +// FetchTxBlobHashes fetches tx blob hash corresponding to given event log +func (r *Reader) FetchTxBlobHashes(txHash, blockHash common.Hash) ([]common.Hash, error) { tx, err := r.fetchTx(txHash, blockHash) if err != nil { - return common.Hash{}, err + return nil, fmt.Errorf("failed to fetch tx, tx hash: %v, block hash: %v, err: %w", txHash.Hex(), blockHash.Hex(), err) } + blobHashes := tx.BlobHashes() if len(blobHashes) == 0 { - return common.Hash{}, fmt.Errorf("transaction does not contain any blobs, tx hash: %v", txHash.Hex()) + return nil, fmt.Errorf("transaction does not contain any blobs, tx hash: %v", txHash.Hex()) } - return blobHashes[0], nil + + return blobHashes, nil } // FetchRollupEventsInRange retrieves and parses commit/revert/finalize rollup events between block numbers: [from, to]. diff --git a/rollup/l1/types.go b/rollup/l1/types.go index 8c030815ec28..0adb734bac09 100644 --- a/rollup/l1/types.go +++ b/rollup/l1/types.go @@ -20,3 +20,41 @@ type Client interface { BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) } + +type MockNopClient struct{} + +func (m *MockNopClient) BlockNumber(ctx context.Context) (uint64, error) { + return 0, nil +} + +func (m *MockNopClient) ChainID(ctx context.Context) (*big.Int, error) { + return big.NewInt(0), nil +} + +func (m *MockNopClient) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) { + return nil, nil +} + +func (m *MockNopClient) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + return nil, nil +} + +func (m *MockNopClient) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { + return nil, nil +} + +func (m *MockNopClient) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + return nil, nil +} + +func (m *MockNopClient) TransactionByHash(ctx context.Context, txHash common.Hash) (tx *types.Transaction, isPending bool, err error) { + return nil, false, nil +} + +func (m *MockNopClient) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + return nil, nil +} + +func (m *MockNopClient) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + return nil, nil +} diff --git a/rollup/rollup_sync_service/abi.go b/rollup/rollup_sync_service/abi.go deleted file mode 100644 index 428413dec9c2..000000000000 --- a/rollup/rollup_sync_service/abi.go +++ /dev/null @@ -1,55 +0,0 @@ -package rollup_sync_service - -import ( - "fmt" - "math/big" - - "github.com/scroll-tech/go-ethereum/accounts/abi" - "github.com/scroll-tech/go-ethereum/accounts/abi/bind" - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" -) - -// ScrollChainMetaData contains ABI of the ScrollChain contract. -var ScrollChainMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"},{\"indexed\": true,\"internalType\": \"bytes32\",\"name\": \"batchHash\",\"type\": \"bytes32\"}],\"name\": \"CommitBatch\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"},{\"indexed\": true,\"internalType\": \"bytes32\",\"name\": \"batchHash\",\"type\": \"bytes32\"},{\"indexed\": false,\"internalType\": \"bytes32\",\"name\": \"stateRoot\",\"type\": \"bytes32\"},{\"indexed\": false,\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"}],\"name\": \"FinalizeBatch\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"},{\"indexed\": true,\"internalType\": \"bytes32\",\"name\": \"batchHash\",\"type\": \"bytes32\"}],\"name\": \"RevertBatch\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": false,\"internalType\": \"uint256\",\"name\": \"oldMaxNumTxInChunk\",\"type\": \"uint256\"},{\"indexed\": false,\"internalType\": \"uint256\",\"name\": \"newMaxNumTxInChunk\",\"type\": \"uint256\"}],\"name\": \"UpdateMaxNumTxInChunk\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"address\",\"name\": \"account\",\"type\": \"address\"},{\"indexed\": false,\"internalType\": \"bool\",\"name\": \"status\",\"type\": \"bool\"}],\"name\": \"UpdateProver\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"address\",\"name\": \"account\",\"type\": \"address\"},{\"indexed\": false,\"internalType\": \"bool\",\"name\": \"status\",\"type\": \"bool\"}],\"name\": \"UpdateSequencer\",\"type\": \"event\"},{\"inputs\": [{\"internalType\": \"uint8\",\"name\": \"version\",\"type\": \"uint8\"},{\"internalType\": \"bytes\",\"name\": \"parentBatchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes[]\",\"name\": \"chunks\",\"type\": \"bytes[]\"},{\"internalType\": \"bytes\",\"name\": \"skippedL1MessageBitmap\",\"type\": \"bytes\"}],\"name\": \"commitBatch\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint8\",\"name\": \"version\",\"type\": \"uint8\"},{\"internalType\": \"bytes\",\"name\": \"parentBatchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes[]\",\"name\": \"chunks\",\"type\": \"bytes[]\"},{\"internalType\": \"bytes\",\"name\": \"skippedL1MessageBitmap\",\"type\": \"bytes\"},{\"internalType\": \"bytes\",\"name\": \"blobDataProof\",\"type\": \"bytes\"}],\"name\": \"commitBatchWithBlobProof\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"}],\"name\": \"committedBatches\",\"outputs\": [{\"internalType\": \"bytes32\",\"name\": \"\",\"type\": \"bytes32\"}],\"stateMutability\": \"view\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"prevStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"}],\"name\": \"finalizeBatch\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"prevStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"blobDataProof\",\"type\": \"bytes\"}],\"name\": \"finalizeBatch4844\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"prevStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"aggrProof\",\"type\": \"bytes\"}],\"name\": \"finalizeBatchWithProof\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"prevStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"blobDataProof\",\"type\": \"bytes\"},{\"internalType\": \"bytes\",\"name\": \"aggrProof\",\"type\": \"bytes\"}],\"name\": \"finalizeBatchWithProof4844\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"}],\"name\": \"finalizeBundle\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"aggrProof\",\"type\": \"bytes\"}],\"name\": \"finalizeBundleWithProof\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"}],\"name\": \"finalizedStateRoots\",\"outputs\": [{\"internalType\": \"bytes32\",\"name\": \"\",\"type\": \"bytes32\"}],\"stateMutability\": \"view\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"_batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"_stateRoot\",\"type\": \"bytes32\"}],\"name\": \"importGenesisBatch\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"}],\"name\": \"isBatchFinalized\",\"outputs\": [{\"internalType\": \"bool\",\"name\": \"\",\"type\": \"bool\"}],\"stateMutability\": \"view\",\"type\": \"function\"},{\"inputs\": [],\"name\": \"lastFinalizedBatchIndex\",\"outputs\": [{\"internalType\": \"uint256\",\"name\": \"\",\"type\": \"uint256\"}],\"stateMutability\": \"view\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"uint256\",\"name\": \"count\",\"type\": \"uint256\"}],\"name\": \"revertBatch\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"}],\"name\": \"withdrawRoots\",\"outputs\": [{\"internalType\": \"bytes32\",\"name\": \"\",\"type\": \"bytes32\"}],\"stateMutability\": \"view\",\"type\": \"function\"}]", -} - -// L1CommitBatchEvent represents a CommitBatch event raised by the ScrollChain contract. -type L1CommitBatchEvent struct { - BatchIndex *big.Int - BatchHash common.Hash -} - -// L1RevertBatchEvent represents a RevertBatch event raised by the ScrollChain contract. -type L1RevertBatchEvent struct { - BatchIndex *big.Int - BatchHash common.Hash -} - -// L1FinalizeBatchEvent represents a FinalizeBatch event raised by the ScrollChain contract. -type L1FinalizeBatchEvent struct { - BatchIndex *big.Int - BatchHash common.Hash - StateRoot common.Hash - WithdrawRoot common.Hash -} - -// UnpackLog unpacks a retrieved log into the provided output structure. -func UnpackLog(c *abi.ABI, out interface{}, event string, log types.Log) error { - if log.Topics[0] != c.Events[event].ID { - return fmt.Errorf("event signature mismatch") - } - if len(log.Data) > 0 { - if err := c.UnpackIntoInterface(out, event, log.Data); err != nil { - return err - } - } - var indexed abi.Arguments - for _, arg := range c.Events[event].Inputs { - if arg.Indexed { - indexed = append(indexed, arg) - } - } - return abi.ParseTopics(out, indexed, log.Topics[1:]) -} diff --git a/rollup/rollup_sync_service/abi_test.go b/rollup/rollup_sync_service/abi_test.go deleted file mode 100644 index 550c950bb337..000000000000 --- a/rollup/rollup_sync_service/abi_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package rollup_sync_service - -import ( - "math/big" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/crypto" -) - -func TestEventSignatures(t *testing.T) { - scrollChainABI, err := ScrollChainMetaData.GetAbi() - if err != nil { - t.Fatal("failed to get scroll chain abi", "err", err) - } - - assert.Equal(t, crypto.Keccak256Hash([]byte("CommitBatch(uint256,bytes32)")), scrollChainABI.Events["CommitBatch"].ID) - assert.Equal(t, crypto.Keccak256Hash([]byte("RevertBatch(uint256,bytes32)")), scrollChainABI.Events["RevertBatch"].ID) - assert.Equal(t, crypto.Keccak256Hash([]byte("FinalizeBatch(uint256,bytes32,bytes32,bytes32)")), scrollChainABI.Events["FinalizeBatch"].ID) -} - -func TestUnpackLog(t *testing.T) { - scrollChainABI, err := ScrollChainMetaData.GetAbi() - require.NoError(t, err) - - mockBatchIndex := big.NewInt(123) - mockBatchHash := crypto.Keccak256Hash([]byte("mockBatch")) - mockStateRoot := crypto.Keccak256Hash([]byte("mockStateRoot")) - mockWithdrawRoot := crypto.Keccak256Hash([]byte("mockWithdrawRoot")) - - tests := []struct { - eventName string - mockLog types.Log - expected interface{} - out interface{} - }{ - { - "CommitBatch", - types.Log{ - Data: []byte{}, - Topics: []common.Hash{scrollChainABI.Events["CommitBatch"].ID, common.BigToHash(mockBatchIndex), mockBatchHash}, - }, - &L1CommitBatchEvent{BatchIndex: mockBatchIndex, BatchHash: mockBatchHash}, - &L1CommitBatchEvent{}, - }, - { - "RevertBatch", - types.Log{ - Data: []byte{}, - Topics: []common.Hash{scrollChainABI.Events["RevertBatch"].ID, common.BigToHash(mockBatchIndex), mockBatchHash}, - }, - &L1RevertBatchEvent{BatchIndex: mockBatchIndex, BatchHash: mockBatchHash}, - &L1RevertBatchEvent{}, - }, - { - "FinalizeBatch", - types.Log{ - Data: append(mockStateRoot.Bytes(), mockWithdrawRoot.Bytes()...), - Topics: []common.Hash{scrollChainABI.Events["FinalizeBatch"].ID, common.BigToHash(mockBatchIndex), mockBatchHash}, - }, - &L1FinalizeBatchEvent{ - BatchIndex: mockBatchIndex, - BatchHash: mockBatchHash, - StateRoot: mockStateRoot, - WithdrawRoot: mockWithdrawRoot, - }, - &L1FinalizeBatchEvent{}, - }, - } - - for _, tt := range tests { - t.Run(tt.eventName, func(t *testing.T) { - err := UnpackLog(scrollChainABI, tt.out, tt.eventName, tt.mockLog) - assert.NoError(t, err) - assert.Equal(t, tt.expected, tt.out) - }) - } -} diff --git a/rollup/rollup_sync_service/l1client.go b/rollup/rollup_sync_service/l1client.go deleted file mode 100644 index b6be3e0bc611..000000000000 --- a/rollup/rollup_sync_service/l1client.go +++ /dev/null @@ -1,158 +0,0 @@ -package rollup_sync_service - -import ( - "context" - "errors" - "fmt" - "math/big" - - "github.com/scroll-tech/go-ethereum" - "github.com/scroll-tech/go-ethereum/accounts/abi" - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/log" - "github.com/scroll-tech/go-ethereum/rpc" - - "github.com/scroll-tech/go-ethereum/rollup/sync_service" -) - -// L1Client is a wrapper around EthClient that adds -// methods for conveniently collecting rollup events of ScrollChain contract. -type L1Client struct { - ctx context.Context - client sync_service.EthClient - scrollChainAddress common.Address - l1CommitBatchEventSignature common.Hash - l1RevertBatchEventSignature common.Hash - l1FinalizeBatchEventSignature common.Hash -} - -// NewL1Client initializes a new L1Client instance with the provided configuration. -// It checks for a valid scrollChainAddress and verifies the chain ID. -func NewL1Client(ctx context.Context, l1Client sync_service.EthClient, l1ChainId uint64, scrollChainAddress common.Address, scrollChainABI *abi.ABI) (*L1Client, error) { - if scrollChainAddress == (common.Address{}) { - return nil, errors.New("must pass non-zero scrollChainAddress to L1Client") - } - - // sanity check: compare chain IDs - got, err := l1Client.ChainID(ctx) - if err != nil { - return nil, fmt.Errorf("failed to query L1 chain ID, err: %w", err) - } - if got.Cmp(big.NewInt(0).SetUint64(l1ChainId)) != 0 { - return nil, fmt.Errorf("unexpected chain ID, expected: %v, got: %v", l1ChainId, got) - } - - client := L1Client{ - ctx: ctx, - client: l1Client, - scrollChainAddress: scrollChainAddress, - l1CommitBatchEventSignature: scrollChainABI.Events["CommitBatch"].ID, - l1RevertBatchEventSignature: scrollChainABI.Events["RevertBatch"].ID, - l1FinalizeBatchEventSignature: scrollChainABI.Events["FinalizeBatch"].ID, - } - - return &client, nil -} - -// FetchRollupEventsInRange retrieves and parses commit/revert/finalize rollup events between block numbers: [from, to]. -func (c *L1Client) FetchRollupEventsInRange(from, to uint64) ([]types.Log, error) { - log.Trace("L1Client FetchRollupEventsInRange", "fromBlock", from, "toBlock", to) - - query := ethereum.FilterQuery{ - FromBlock: big.NewInt(int64(from)), // inclusive - ToBlock: big.NewInt(int64(to)), // inclusive - Addresses: []common.Address{ - c.scrollChainAddress, - }, - Topics: make([][]common.Hash, 1), - } - query.Topics[0] = make([]common.Hash, 3) - query.Topics[0][0] = c.l1CommitBatchEventSignature - query.Topics[0][1] = c.l1RevertBatchEventSignature - query.Topics[0][2] = c.l1FinalizeBatchEventSignature - - logs, err := c.client.FilterLogs(c.ctx, query) - if err != nil { - return nil, fmt.Errorf("failed to filter logs, err: %w", err) - } - return logs, nil -} - -// GetLatestFinalizedBlockNumber fetches the block number of the latest finalized block from the L1 chain. -func (c *L1Client) GetLatestFinalizedBlockNumber() (uint64, error) { - header, err := c.client.HeaderByNumber(c.ctx, big.NewInt(int64(rpc.FinalizedBlockNumber))) - if err != nil { - return 0, err - } - if !header.Number.IsInt64() { - return 0, fmt.Errorf("received unexpected block number in L1Client: %v", header.Number) - } - return header.Number.Uint64(), nil -} - -// FetchTxData fetches tx data corresponding to given event log -func (c *L1Client) FetchTxData(vLog *types.Log) ([]byte, error) { - tx, _, err := c.client.TransactionByHash(c.ctx, vLog.TxHash) - if err != nil { - log.Debug("failed to get transaction by hash, probably an unindexed transaction, fetching the whole block to get the transaction", - "tx hash", vLog.TxHash.Hex(), "block number", vLog.BlockNumber, "block hash", vLog.BlockHash.Hex(), "err", err) - block, err := c.client.BlockByHash(c.ctx, vLog.BlockHash) - if err != nil { - return nil, fmt.Errorf("failed to get block by hash, block number: %v, block hash: %v, err: %w", vLog.BlockNumber, vLog.BlockHash.Hex(), err) - } - - found := false - for _, txInBlock := range block.Transactions() { - if txInBlock.Hash() == vLog.TxHash { - tx = txInBlock - found = true - break - } - } - if !found { - return nil, fmt.Errorf("transaction not found in the block, tx hash: %v, block number: %v, block hash: %v", vLog.TxHash.Hex(), vLog.BlockNumber, vLog.BlockHash.Hex()) - } - } - - return tx.Data(), nil -} - -// FetchTxBlobHash fetches tx blob hash corresponding to given event log -func (c *L1Client) FetchTxBlobHash(vLog *types.Log) (common.Hash, error) { - tx, _, err := c.client.TransactionByHash(c.ctx, vLog.TxHash) - if err != nil { - log.Debug("failed to get transaction by hash, probably an unindexed transaction, fetching the whole block to get the transaction", - "tx hash", vLog.TxHash.Hex(), "block number", vLog.BlockNumber, "block hash", vLog.BlockHash.Hex(), "err", err) - block, err := c.client.BlockByHash(c.ctx, vLog.BlockHash) - if err != nil { - return common.Hash{}, fmt.Errorf("failed to get block by hash, block number: %v, block hash: %v, err: %w", vLog.BlockNumber, vLog.BlockHash.Hex(), err) - } - - found := false - for _, txInBlock := range block.Transactions() { - if txInBlock.Hash() == vLog.TxHash { - tx = txInBlock - found = true - break - } - } - if !found { - return common.Hash{}, fmt.Errorf("transaction not found in the block, tx hash: %v, block number: %v, block hash: %v", vLog.TxHash.Hex(), vLog.BlockNumber, vLog.BlockHash.Hex()) - } - } - blobHashes := tx.BlobHashes() - if len(blobHashes) == 0 { - return common.Hash{}, fmt.Errorf("transaction does not contain any blobs, tx hash: %v", vLog.TxHash.Hex()) - } - return blobHashes[0], nil -} - -// GetHeaderByNumber fetches the block header by number -func (c *L1Client) GetHeaderByNumber(blockNumber uint64) (*types.Header, error) { - header, err := c.client.HeaderByNumber(c.ctx, big.NewInt(0).SetUint64(blockNumber)) - if err != nil { - return nil, err - } - return header, nil -} diff --git a/rollup/rollup_sync_service/l1client_test.go b/rollup/rollup_sync_service/l1client_test.go deleted file mode 100644 index 394f455b80c5..000000000000 --- a/rollup/rollup_sync_service/l1client_test.go +++ /dev/null @@ -1,74 +0,0 @@ -package rollup_sync_service - -import ( - "context" - "math/big" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/scroll-tech/go-ethereum" - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/rlp" -) - -func TestL1Client(t *testing.T) { - ctx := context.Background() - mockClient := &mockEthClient{} - - scrollChainABI, err := ScrollChainMetaData.GetAbi() - if err != nil { - t.Fatal("failed to get scroll chain abi", "err", err) - } - scrollChainAddress := common.HexToAddress("0x0123456789abcdef") - l1Client, err := NewL1Client(ctx, mockClient, 11155111, scrollChainAddress, scrollChainABI) - require.NoError(t, err, "Failed to initialize L1Client") - - blockNumber, err := l1Client.GetLatestFinalizedBlockNumber() - assert.NoError(t, err, "Error getting latest confirmed block number") - assert.Equal(t, uint64(36), blockNumber, "Unexpected block number") - - logs, err := l1Client.FetchRollupEventsInRange(0, blockNumber) - assert.NoError(t, err, "Error fetching rollup events in range") - assert.Empty(t, logs, "Expected no logs from FetchRollupEventsInRange") -} - -type mockEthClient struct { - txRLP []byte -} - -func (m *mockEthClient) BlockNumber(ctx context.Context) (uint64, error) { - return 11155111, nil -} - -func (m *mockEthClient) ChainID(ctx context.Context) (*big.Int, error) { - return big.NewInt(11155111), nil -} - -func (m *mockEthClient) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) { - return []types.Log{}, nil -} - -func (m *mockEthClient) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { - return &types.Header{ - Number: big.NewInt(100 - 64), - }, nil -} - -func (m *mockEthClient) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { - return nil, nil -} - -func (m *mockEthClient) TransactionByHash(ctx context.Context, txHash common.Hash) (*types.Transaction, bool, error) { - var tx types.Transaction - if err := rlp.DecodeBytes(m.txRLP, &tx); err != nil { - return nil, false, err - } - return &tx, false, nil -} - -func (m *mockEthClient) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { - return nil, nil -} diff --git a/rollup/rollup_sync_service/rollup_sync_service.go b/rollup/rollup_sync_service/rollup_sync_service.go index bbb2b4940393..406895be1120 100644 --- a/rollup/rollup_sync_service/rollup_sync_service.go +++ b/rollup/rollup_sync_service/rollup_sync_service.go @@ -3,34 +3,31 @@ package rollup_sync_service import ( "context" "encoding/json" + "errors" "fmt" "os" - "reflect" "sync" "time" "github.com/scroll-tech/da-codec/encoding" - "github.com/scroll-tech/go-ethereum/accounts/abi" - "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core" "github.com/scroll-tech/go-ethereum/core/rawdb" - "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/ethdb" "github.com/scroll-tech/go-ethereum/log" "github.com/scroll-tech/go-ethereum/node" "github.com/scroll-tech/go-ethereum/params" + "github.com/scroll-tech/go-ethereum/rollup/da_syncer" + "github.com/scroll-tech/go-ethereum/rollup/da_syncer/blob_client" + "github.com/scroll-tech/go-ethereum/rollup/da_syncer/da" + "github.com/scroll-tech/go-ethereum/rollup/l1" "github.com/scroll-tech/go-ethereum/rollup/rcfg" - "github.com/scroll-tech/go-ethereum/rollup/sync_service" "github.com/scroll-tech/go-ethereum/rollup/withdrawtrie" ) const ( - // defaultFetchBlockRange is the number of blocks that we collect in a single eth_getLogs query. - defaultFetchBlockRange = uint64(100) - // defaultSyncInterval is the frequency at which we query for new rollup event. - defaultSyncInterval = 60 * time.Second + defaultSyncInterval = 30 * time.Second // defaultMaxRetries is the maximum number of retries allowed when the local node is not synced up to the required block height. defaultMaxRetries = 20 @@ -40,47 +37,27 @@ const ( // of a specific L1 batch finalize event. defaultGetBlockInRangeRetryDelay = 60 * time.Second - // defaultLogInterval is the frequency at which we print the latestProcessedBlock. + // defaultLogInterval is the frequency at which we print the latest processed block. defaultLogInterval = 5 * time.Minute ) // RollupSyncService collects ScrollChain batch commit/revert/finalize events and stores metadata into db. type RollupSyncService struct { - ctx context.Context - cancel context.CancelFunc - client *L1Client - db ethdb.Database - latestProcessedBlock uint64 - scrollChainABI *abi.ABI - l1CommitBatchEventSignature common.Hash - l1RevertBatchEventSignature common.Hash - l1FinalizeBatchEventSignature common.Hash - bc *core.BlockChain - stack *node.Node - stateMu sync.Mutex + ctx context.Context + cancel context.CancelFunc + db ethdb.Database + bc *core.BlockChain + stack *node.Node + stateMu sync.Mutex + + callDataBlobSource *da.CalldataBlobSource } -func NewRollupSyncService(ctx context.Context, genesisConfig *params.ChainConfig, db ethdb.Database, l1Client sync_service.EthClient, bc *core.BlockChain, stack *node.Node) (*RollupSyncService, error) { - // terminate if the caller does not provide an L1 client (e.g. in tests) - if l1Client == nil || (reflect.ValueOf(l1Client).Kind() == reflect.Ptr && reflect.ValueOf(l1Client).IsNil()) { - log.Warn("No L1 client provided, L1 rollup sync service will not run") - return nil, nil - } - +func NewRollupSyncService(ctx context.Context, genesisConfig *params.ChainConfig, db ethdb.Database, l1Client l1.Client, bc *core.BlockChain, stack *node.Node, config da_syncer.Config) (*RollupSyncService, error) { if genesisConfig.Scroll.L1Config == nil { return nil, fmt.Errorf("missing L1 config in genesis") } - scrollChainABI, err := ScrollChainMetaData.GetAbi() - if err != nil { - return nil, fmt.Errorf("failed to get scroll chain abi: %w", err) - } - - client, err := NewL1Client(ctx, l1Client, genesisConfig.Scroll.L1Config.L1ChainId, genesisConfig.Scroll.L1Config.ScrollChainAddress, scrollChainABI) - if err != nil { - return nil, fmt.Errorf("failed to initialize l1 client: %w", err) - } - // Initialize the latestProcessedBlock with the block just before the L1 deployment block. // This serves as a default value when there's no L1 rollup events synced in the database. var latestProcessedBlock uint64 @@ -94,23 +71,57 @@ func NewRollupSyncService(ctx context.Context, genesisConfig *params.ChainConfig latestProcessedBlock = *block } + var success bool ctx, cancel := context.WithCancel(ctx) + defer func() { + if !success { + cancel() + } + }() - service := RollupSyncService{ - ctx: ctx, - cancel: cancel, - client: client, - db: db, - latestProcessedBlock: latestProcessedBlock, - scrollChainABI: scrollChainABI, - l1CommitBatchEventSignature: scrollChainABI.Events["CommitBatch"].ID, - l1RevertBatchEventSignature: scrollChainABI.Events["RevertBatch"].ID, - l1FinalizeBatchEventSignature: scrollChainABI.Events["FinalizeBatch"].ID, - bc: bc, - stack: stack, + l1Reader, err := l1.NewReader(ctx, l1.Config{ + ScrollChainAddress: genesisConfig.Scroll.L1Config.ScrollChainAddress, + L1MessageQueueAddress: genesisConfig.Scroll.L1Config.L1MessageQueueAddress, + }, l1Client) + if err != nil { + return nil, fmt.Errorf("failed to initialize l1.Reader, err = %w", err) + } + + blobClientList := blob_client.NewBlobClients() + if config.BeaconNodeAPIEndpoint != "" { + beaconNodeClient, err := blob_client.NewBeaconNodeClient(config.BeaconNodeAPIEndpoint) + if err != nil { + log.Warn("failed to create BeaconNodeClient", "err", err) + } else { + blobClientList.AddBlobClient(beaconNodeClient) + } + } + if config.BlobScanAPIEndpoint != "" { + blobClientList.AddBlobClient(blob_client.NewBlobScanClient(config.BlobScanAPIEndpoint)) + } + if config.BlockNativeAPIEndpoint != "" { + blobClientList.AddBlobClient(blob_client.NewBlockNativeClient(config.BlockNativeAPIEndpoint)) + } + if blobClientList.Size() == 0 { + return nil, errors.New("no blob client is configured for rollup verifier. Please provide at least one blob client via command line flag") + } + + calldataBlobSource, err := da.NewCalldataBlobSource(ctx, latestProcessedBlock, l1Reader, blobClientList, db) + if err != nil { + return nil, fmt.Errorf("failed to create calldata blob source: %w", err) } - return &service, nil + success = true + + return &RollupSyncService{ + ctx: ctx, + cancel: cancel, + db: db, + bc: bc, + stack: stack, + + callDataBlobSource: calldataBlobSource, + }, nil } func (s *RollupSyncService) Start() { @@ -118,7 +129,7 @@ func (s *RollupSyncService) Start() { return } - log.Info("Starting rollup event sync background service", "latest processed block", s.latestProcessedBlock) + log.Info("Starting rollup event sync background service", "latest processed block", s.callDataBlobSource.L1Height()) go func() { syncTicker := time.NewTicker(defaultSyncInterval) @@ -132,9 +143,12 @@ func (s *RollupSyncService) Start() { case <-s.ctx.Done(): return case <-syncTicker.C: - s.fetchRollupEvents() + err := s.fetchRollupEvents() + if err != nil { + log.Error("failed to fetch rollup events", "err", err) + } case <-logTicker.C: - log.Info("Sync rollup events progress update", "latestProcessedBlock", s.latestProcessedBlock) + log.Info("Sync rollup events progress update", "latest processed block", s.callDataBlobSource.L1Height()) } } }() @@ -161,90 +175,79 @@ func (s *RollupSyncService) ResetStartSyncHeight(height uint64) { s.stateMu.Lock() defer s.stateMu.Unlock() - s.latestProcessedBlock = height + s.callDataBlobSource.SetL1Height(height) log.Info("Reset sync service", "height", height) } -func (s *RollupSyncService) fetchRollupEvents() { +func (s *RollupSyncService) fetchRollupEvents() error { s.stateMu.Lock() defer s.stateMu.Unlock() - latestConfirmed, err := s.client.GetLatestFinalizedBlockNumber() - if err != nil { - log.Warn("failed to get latest confirmed block number", "err", err) - return - } - - log.Trace("Sync service fetch rollup events", "latest processed block", s.latestProcessedBlock, "latest confirmed", latestConfirmed) + for { + prevL1Height := s.callDataBlobSource.L1Height() - // query in batches - for from := s.latestProcessedBlock + 1; from <= latestConfirmed; from += defaultFetchBlockRange { - if s.ctx.Err() != nil { - log.Info("Context canceled", "reason", s.ctx.Err()) - return - } + daEntries, err := s.callDataBlobSource.NextData() + if err != nil { + if errors.Is(err, da.ErrSourceExhausted) { + log.Trace("Sync service exhausted data source, waiting for next data") + return nil + } - to := from + defaultFetchBlockRange - 1 - if to > latestConfirmed { - to = latestConfirmed + return fmt.Errorf("failed to get next data: %w", err) } - logs, err := s.client.FetchRollupEventsInRange(from, to) - if err != nil { - log.Error("failed to fetch rollup events in range", "from block", from, "to block", to, "err", err) - return + if err = s.updateRollupEvents(daEntries); err != nil { + // Reset the L1 height to the previous value to retry fetching the same data. + s.callDataBlobSource.SetL1Height(prevL1Height) + return fmt.Errorf("failed to parse and update rollup event logs: %w", err) } - if err := s.parseAndUpdateRollupEventLogs(logs, to); err != nil { - log.Error("failed to parse and update rollup event logs", "err", err) - return - } + log.Trace("Sync service fetched rollup events", "latest processed L1 block", s.callDataBlobSource.L1Height(), "latest finalized L1 block", s.callDataBlobSource.L1Finalized()) - s.latestProcessedBlock = to + // note: the batch updates in updateRollupEvents are idempotent, if we crash + // before this line and re-execute the previous steps, we will get the same result. + rawdb.WriteRollupEventSyncedL1BlockNumber(s.db, s.callDataBlobSource.L1Height()) } } -func (s *RollupSyncService) parseAndUpdateRollupEventLogs(logs []types.Log, endBlockNumber uint64) error { - for _, vLog := range logs { - switch vLog.Topics[0] { - case s.l1CommitBatchEventSignature: - event := &L1CommitBatchEvent{} - if err := UnpackLog(s.scrollChainABI, event, "CommitBatch", vLog); err != nil { - return fmt.Errorf("failed to unpack commit rollup event log, err: %w", err) +func (s *RollupSyncService) updateRollupEvents(daEntries da.Entries) error { + for _, entry := range daEntries { + switch entry.Type() { + case da.CommitBatchV0Type, da.CommitBatchWithBlobType: + log.Trace("found new CommitBatch event", "batch index", entry.BatchIndex()) + + entryWithBlocks, ok := entry.(da.EntryWithBlocks) + if !ok { + return fmt.Errorf("failed to cast to EntryWithBlocks, batch index: %v", entry.BatchIndex()) } - batchIndex := event.BatchIndex.Uint64() - log.Trace("found new CommitBatch event", "batch index", batchIndex) - committedBatchMeta, err := s.getCommittedBatchMeta(batchIndex, &vLog) + committedBatchMeta, err := s.getCommittedBatchMeta(entryWithBlocks) if err != nil { - return fmt.Errorf("failed to get chunk ranges, batch index: %v, err: %w", batchIndex, err) + return fmt.Errorf("failed to get committed batch meta, batch index: %v, err: %w", entry.BatchIndex(), err) } - rawdb.WriteCommittedBatchMeta(s.db, batchIndex, committedBatchMeta) - case s.l1RevertBatchEventSignature: - event := &L1RevertBatchEvent{} - if err := UnpackLog(s.scrollChainABI, event, "RevertBatch", vLog); err != nil { - return fmt.Errorf("failed to unpack revert rollup event log, err: %w", err) - } - batchIndex := event.BatchIndex.Uint64() - log.Trace("found new RevertBatch event", "batch index", batchIndex) + rawdb.WriteCommittedBatchMeta(s.db, entry.BatchIndex(), committedBatchMeta) - rawdb.DeleteCommittedBatchMeta(s.db, batchIndex) + case da.RevertBatchType: + log.Trace("found new RevertBatch event", "batch index", entry.BatchIndex()) + rawdb.DeleteCommittedBatchMeta(s.db, entry.BatchIndex()) - case s.l1FinalizeBatchEventSignature: - event := &L1FinalizeBatchEvent{} - if err := UnpackLog(s.scrollChainABI, event, "FinalizeBatch", vLog); err != nil { - return fmt.Errorf("failed to unpack finalized rollup event log, err: %w", err) + case da.FinalizeBatchType: + event, ok := entry.Event().(*l1.FinalizeBatchEvent) + // This should never happen because we just checked the batch type + if !ok { + return fmt.Errorf("failed to cast to FinalizeBatchEvent, batch index: %v", entry.BatchIndex()) } - batchIndex := event.BatchIndex.Uint64() + + batchIndex := entry.BatchIndex() log.Trace("found new FinalizeBatch event", "batch index", batchIndex) lastFinalizedBatchIndex := rawdb.ReadLastFinalizedBatchIndex(s.db) - // After darwin, FinalizeBatch event emitted every bundle, which contains multiple batches. - // Therefore there are a range of finalized batches need to be saved into db. + // After Darwin, FinalizeBatch event emitted every bundle, which contains multiple batches. + // Therefore, there are a range of finalized batches need to be saved into db. // - // The range logic also applies to the batches before darwin when FinalizeBatch event emitted + // The range logic also applies to the batches before Darwin when FinalizeBatch event emitted // per single batch. In this situation, `batchIndex` just equals to `*lastFinalizedBatchIndex + 1` // and only one batch is processed through the for loop. startBatchIndex := batchIndex @@ -293,14 +296,10 @@ func (s *RollupSyncService) parseAndUpdateRollupEventLogs(logs []types.Log, endB log.Debug("write finalized l2 block number", "batch index", batchIndex, "finalized l2 block height", highestFinalizedBlockNumber) default: - return fmt.Errorf("unknown event, topic: %v, tx hash: %v", vLog.Topics[0].Hex(), vLog.TxHash.Hex()) + return fmt.Errorf("unknown daEntry, type: %d, batch index: %d", entry.Type(), entry.BatchIndex()) } } - // note: the batch updates above are idempotent, if we crash - // before this line and reexecute the previous steps, we will - // get the same result. - rawdb.WriteRollupEventSyncedL1BlockNumber(s.db, endBlockNumber) return nil } @@ -355,8 +354,8 @@ func (s *RollupSyncService) getLocalChunksForBatch(chunkBlockRanges []*rawdb.Chu return chunks, nil } -func (s *RollupSyncService) getCommittedBatchMeta(batchIndex uint64, vLog *types.Log) (*rawdb.CommittedBatchMeta, error) { - if batchIndex == 0 { +func (s *RollupSyncService) getCommittedBatchMeta(commitedBatch da.EntryWithBlocks) (*rawdb.CommittedBatchMeta, error) { + if commitedBatch.BatchIndex() == 0 { return &rawdb.CommittedBatchMeta{ Version: 0, BlobVersionedHashes: nil, @@ -364,111 +363,16 @@ func (s *RollupSyncService) getCommittedBatchMeta(batchIndex uint64, vLog *types }, nil } - tx, _, err := s.client.client.TransactionByHash(s.ctx, vLog.TxHash) - if err != nil { - log.Debug("failed to get transaction by hash, probably an unindexed transaction, fetching the whole block to get the transaction", - "tx hash", vLog.TxHash.Hex(), "block number", vLog.BlockNumber, "block hash", vLog.BlockHash.Hex(), "err", err) - block, err := s.client.client.BlockByHash(s.ctx, vLog.BlockHash) - if err != nil { - return nil, fmt.Errorf("failed to get block by hash, block number: %v, block hash: %v, err: %w", vLog.BlockNumber, vLog.BlockHash.Hex(), err) - } - - if block == nil { - return nil, fmt.Errorf("failed to get block by hash, block not found, block number: %v, block hash: %v", vLog.BlockNumber, vLog.BlockHash.Hex()) - } - - found := false - for _, txInBlock := range block.Transactions() { - if txInBlock.Hash() == vLog.TxHash { - tx = txInBlock - found = true - break - } - } - if !found { - return nil, fmt.Errorf("transaction not found in the block, tx hash: %v, block number: %v, block hash: %v", vLog.TxHash.Hex(), vLog.BlockNumber, vLog.BlockHash.Hex()) - } - } - - var commitBatchMeta rawdb.CommittedBatchMeta - - if tx.Type() == types.BlobTxType { - blobVersionedHashes := tx.BlobHashes() - if blobVersionedHashes == nil { - return nil, fmt.Errorf("invalid blob transaction, blob hashes is nil, tx hash: %v", tx.Hash().Hex()) - } - commitBatchMeta.BlobVersionedHashes = blobVersionedHashes - } - - version, ranges, err := s.decodeBatchVersionAndChunkBlockRanges(tx.Data()) + chunkRanges, err := blockRangesFromChunks(commitedBatch.Chunks()) if err != nil { - return nil, fmt.Errorf("failed to decode chunk block ranges, batch index: %v, err: %w", batchIndex, err) - } - - commitBatchMeta.Version = version - commitBatchMeta.ChunkBlockRanges = ranges - return &commitBatchMeta, nil -} - -// decodeBatchVersionAndChunkBlockRanges decodes version and chunks' block ranges in a batch based on the commit batch transaction's calldata. -func (s *RollupSyncService) decodeBatchVersionAndChunkBlockRanges(txData []byte) (uint8, []*rawdb.ChunkBlockRange, error) { - const methodIDLength = 4 - if len(txData) < methodIDLength { - return 0, nil, fmt.Errorf("transaction data is too short, length of tx data: %v, minimum length required: %v", len(txData), methodIDLength) - } - - method, err := s.scrollChainABI.MethodById(txData[:methodIDLength]) - if err != nil { - return 0, nil, fmt.Errorf("failed to get method by ID, ID: %v, err: %w", txData[:methodIDLength], err) - } - - values, err := method.Inputs.Unpack(txData[methodIDLength:]) - if err != nil { - return 0, nil, fmt.Errorf("failed to unpack transaction data using ABI, tx data: %v, err: %w", txData, err) - } - - if method.Name == "commitBatch" { - type commitBatchArgs struct { - Version uint8 - ParentBatchHeader []byte - Chunks [][]byte - SkippedL1MessageBitmap []byte - } - - var args commitBatchArgs - if err = method.Inputs.Copy(&args, values); err != nil { - return 0, nil, fmt.Errorf("failed to decode calldata into commitBatch args, values: %+v, err: %w", values, err) - } - - chunkRanges, err := decodeBlockRangesFromEncodedChunks(encoding.CodecVersion(args.Version), args.Chunks) - if err != nil { - return 0, nil, fmt.Errorf("failed to decode block ranges from encoded chunks, version: %v, chunks: %+v, err: %w", args.Version, args.Chunks, err) - } - - return args.Version, chunkRanges, nil - } else if method.Name == "commitBatchWithBlobProof" { - type commitBatchWithBlobProofArgs struct { - Version uint8 - ParentBatchHeader []byte - Chunks [][]byte - SkippedL1MessageBitmap []byte - BlobDataProof []byte - } - - var args commitBatchWithBlobProofArgs - if err = method.Inputs.Copy(&args, values); err != nil { - return 0, nil, fmt.Errorf("failed to decode calldata into commitBatchWithBlobProofArgs args, values: %+v, err: %w", values, err) - } - - chunkRanges, err := decodeBlockRangesFromEncodedChunks(encoding.CodecVersion(args.Version), args.Chunks) - if err != nil { - return 0, nil, fmt.Errorf("failed to decode block ranges from encoded chunks, version: %v, chunks: %+v, err: %w", args.Version, args.Chunks, err) - } - - return args.Version, chunkRanges, nil + return nil, fmt.Errorf("failed to decode block ranges from chunks, batch index: %v, err: %w", commitedBatch.BatchIndex(), err) } - return 0, nil, fmt.Errorf("unexpected method name: %v", method.Name) + return &rawdb.CommittedBatchMeta{ + Version: uint8(commitedBatch.Version()), + ChunkBlockRanges: chunkRanges, + BlobVersionedHashes: commitedBatch.BlobVersionedHashes(), + }, nil } // validateBatch verifies the consistency between the L1 contract and L2 node data. @@ -494,7 +398,7 @@ func (s *RollupSyncService) decodeBatchVersionAndChunkBlockRanges(txData []byte) // Note: This function is compatible with both "finalize by batch" and "finalize by bundle" methods. // In "finalize by bundle", only the last batch of each bundle is fully verified. // This check still ensures the correctness of all batch hashes in the bundle due to the parent-child relationship between batch hashes. -func validateBatch(batchIndex uint64, event *L1FinalizeBatchEvent, parentFinalizedBatchMeta *rawdb.FinalizedBatchMeta, committedBatchMeta *rawdb.CommittedBatchMeta, chunks []*encoding.Chunk, stack *node.Node) (uint64, *rawdb.FinalizedBatchMeta, error) { +func validateBatch(batchIndex uint64, event *l1.FinalizeBatchEvent, parentFinalizedBatchMeta *rawdb.FinalizedBatchMeta, committedBatchMeta *rawdb.CommittedBatchMeta, chunks []*encoding.Chunk, stack *node.Node) (uint64, *rawdb.FinalizedBatchMeta, error) { if len(chunks) == 0 { return 0, nil, fmt.Errorf("invalid argument: length of chunks is 0, batch index: %v", batchIndex) } @@ -540,15 +444,15 @@ func validateBatch(batchIndex uint64, event *L1FinalizeBatchEvent, parentFinaliz // Only check when batch index matches the index of the event. This is compatible with both "finalize by batch" and "finalize by bundle": // - finalize by batch: check all batches // - finalize by bundle: check the last batch, because only one event (containing the info of the last batch) is emitted per bundle - if batchIndex == event.BatchIndex.Uint64() { - if localStateRoot != event.StateRoot { - log.Error("State root mismatch", "batch index", event.BatchIndex.Uint64(), "start block", startBlock.Header.Number.Uint64(), "end block", endBlock.Header.Number.Uint64(), "parent batch hash", parentFinalizedBatchMeta.BatchHash.Hex(), "l1 finalized state root", event.StateRoot.Hex(), "l2 state root", localStateRoot.Hex()) + if batchIndex == event.BatchIndex().Uint64() { + if localStateRoot != event.StateRoot() { + log.Error("State root mismatch", "batch index", event.BatchIndex().Uint64(), "start block", startBlock.Header.Number.Uint64(), "end block", endBlock.Header.Number.Uint64(), "parent batch hash", parentFinalizedBatchMeta.BatchHash.Hex(), "l1 finalized state root", event.StateRoot().Hex(), "l2 state root", localStateRoot.Hex()) stack.Close() os.Exit(1) } - if localWithdrawRoot != event.WithdrawRoot { - log.Error("Withdraw root mismatch", "batch index", event.BatchIndex.Uint64(), "start block", startBlock.Header.Number.Uint64(), "end block", endBlock.Header.Number.Uint64(), "parent batch hash", parentFinalizedBatchMeta.BatchHash.Hex(), "l1 finalized withdraw root", event.WithdrawRoot.Hex(), "l2 withdraw root", localWithdrawRoot.Hex()) + if localWithdrawRoot != event.WithdrawRoot() { + log.Error("Withdraw root mismatch", "batch index", event.BatchIndex().Uint64(), "start block", startBlock.Header.Number.Uint64(), "end block", endBlock.Header.Number.Uint64(), "parent batch hash", parentFinalizedBatchMeta.BatchHash.Hex(), "l1 finalized withdraw root", event.WithdrawRoot().Hex(), "l2 withdraw root", localWithdrawRoot.Hex()) stack.Close() os.Exit(1) } @@ -556,8 +460,8 @@ func validateBatch(batchIndex uint64, event *L1FinalizeBatchEvent, parentFinaliz // Verify batch hash // This check ensures the correctness of all batch hashes in the bundle // due to the parent-child relationship between batch hashes - if localBatchHash != event.BatchHash { - log.Error("Batch hash mismatch", "batch index", event.BatchIndex.Uint64(), "start block", startBlock.Header.Number.Uint64(), "end block", endBlock.Header.Number.Uint64(), "parent batch hash", parentFinalizedBatchMeta.BatchHash.Hex(), "parent TotalL1MessagePopped", parentFinalizedBatchMeta.TotalL1MessagePopped, "l1 finalized batch hash", event.BatchHash.Hex(), "l2 batch hash", localBatchHash.Hex()) + if localBatchHash != event.BatchHash() { + log.Error("Batch hash mismatch", "batch index", event.BatchIndex().Uint64(), "start block", startBlock.Header.Number.Uint64(), "end block", endBlock.Header.Number.Uint64(), "parent batch hash", parentFinalizedBatchMeta.BatchHash.Hex(), "parent TotalL1MessagePopped", parentFinalizedBatchMeta.TotalL1MessagePopped, "l1 finalized batch hash", event.BatchHash().Hex(), "l2 batch hash", localBatchHash.Hex()) chunksJson, err := json.Marshal(chunks) if err != nil { log.Error("marshal chunks failed", "err", err) @@ -581,22 +485,12 @@ func validateBatch(batchIndex uint64, event *L1FinalizeBatchEvent, parentFinaliz return endBlock.Header.Number.Uint64(), finalizedBatchMeta, nil } -// decodeBlockRangesFromEncodedChunks decodes the provided chunks into a list of block ranges. -func decodeBlockRangesFromEncodedChunks(codecVersion encoding.CodecVersion, chunks [][]byte) ([]*rawdb.ChunkBlockRange, error) { - codec, err := encoding.CodecFromVersion(codecVersion) - if err != nil { - return nil, fmt.Errorf("failed to get codec from version: %v, err: %w", codecVersion, err) - } - - daChunksRawTx, err := codec.DecodeDAChunksRawTx(chunks) - if err != nil { - return nil, fmt.Errorf("failed to decode DA chunks, version: %v, err: %w", codecVersion, err) - } - +// blockRangesFromChunks decodes the provided chunks into a list of block ranges. +func blockRangesFromChunks(chunks []*encoding.DAChunkRawTx) ([]*rawdb.ChunkBlockRange, error) { var chunkBlockRanges []*rawdb.ChunkBlockRange - for _, daChunkRawTx := range daChunksRawTx { + for _, daChunkRawTx := range chunks { if len(daChunkRawTx.Blocks) == 0 { - return nil, fmt.Errorf("no blocks found in DA chunk, version: %v", codecVersion) + return nil, fmt.Errorf("no blocks found in DA chunk, chunk: %+v", daChunkRawTx) } chunkBlockRanges = append(chunkBlockRanges, &rawdb.ChunkBlockRange{ diff --git a/rollup/rollup_sync_service/rollup_sync_service_test.go b/rollup/rollup_sync_service/rollup_sync_service_test.go index f1b09a37a1f2..dca18285d2c0 100644 --- a/rollup/rollup_sync_service/rollup_sync_service_test.go +++ b/rollup/rollup_sync_service/rollup_sync_service_test.go @@ -2,12 +2,10 @@ package rollup_sync_service import ( "context" - "encoding/hex" "encoding/json" "math/big" "os" "testing" - "time" "github.com/scroll-tech/da-codec/encoding" "github.com/stretchr/testify/assert" @@ -16,415 +14,86 @@ import ( "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core" "github.com/scroll-tech/go-ethereum/core/rawdb" - "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/ethdb/memorydb" "github.com/scroll-tech/go-ethereum/node" "github.com/scroll-tech/go-ethereum/params" + "github.com/scroll-tech/go-ethereum/rollup/da_syncer" + "github.com/scroll-tech/go-ethereum/rollup/da_syncer/da" + "github.com/scroll-tech/go-ethereum/rollup/l1" ) -func TestRollupSyncServiceStartAndStop(t *testing.T) { +func TestGetCommittedBatchMetaCodecV0(t *testing.T) { genesisConfig := ¶ms.ChainConfig{ Scroll: params.ScrollConfig{ L1Config: ¶ms.L1Config{ - L1ChainId: 11155111, - ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), + L1ChainId: 11155111, + ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), + L1MessageQueueAddress: common.HexToAddress("0x0000000000000000000000000000000000000001"), }, }, } db := rawdb.NewDatabase(memorydb.New()) - l1Client := &mockEthClient{} - bc := &core.BlockChain{} - stack, err := node.New(&node.DefaultConfig) - if err != nil { - t.Fatalf("Failed to new P2P node: %v", err) - } - defer stack.Close() - service, err := NewRollupSyncService(context.Background(), genesisConfig, db, l1Client, bc, stack) - if err != nil { - t.Fatalf("Failed to new rollup sync service: %v", err) - } - - assert.NotNil(t, service) - service.Start() - time.Sleep(10 * time.Millisecond) - service.Stop() -} - -func TestDecodeBatchVersionAndChunkBlockRangesCodecv0(t *testing.T) { - scrollChainABI, err := ScrollChainMetaData.GetAbi() - require.NoError(t, err) - - service := &RollupSyncService{ - scrollChainABI: scrollChainABI, - } - - data, err := os.ReadFile("./testdata/commitBatch_input_codecv0.json") - require.NoError(t, err, "Failed to read json file") - - type tx struct { - Input string `json:"input"` - } - var commitBatch tx - err = json.Unmarshal(data, &commitBatch) - require.NoError(t, err, "Failed to unmarshal transaction json") - - testTxData, err := hex.DecodeString(commitBatch.Input[2:]) - if err != nil { - t.Fatalf("Failed to decode string: %v", err) - } - - version, ranges, err := service.decodeBatchVersionAndChunkBlockRanges(testTxData) - if err != nil { - t.Fatalf("Failed to decode chunk ranges: %v", err) - } - - assert.Equal(t, encoding.CodecV0, encoding.CodecVersion(version)) - - expectedRanges := []*rawdb.ChunkBlockRange{ - {StartBlockNumber: 4435142, EndBlockNumber: 4435142}, - {StartBlockNumber: 4435143, EndBlockNumber: 4435144}, - {StartBlockNumber: 4435145, EndBlockNumber: 4435145}, - {StartBlockNumber: 4435146, EndBlockNumber: 4435146}, - {StartBlockNumber: 4435147, EndBlockNumber: 4435147}, - {StartBlockNumber: 4435148, EndBlockNumber: 4435148}, - {StartBlockNumber: 4435149, EndBlockNumber: 4435150}, - {StartBlockNumber: 4435151, EndBlockNumber: 4435151}, - {StartBlockNumber: 4435152, EndBlockNumber: 4435152}, - {StartBlockNumber: 4435153, EndBlockNumber: 4435153}, - {StartBlockNumber: 4435154, EndBlockNumber: 4435154}, - {StartBlockNumber: 4435155, EndBlockNumber: 4435155}, - {StartBlockNumber: 4435156, EndBlockNumber: 4435156}, - {StartBlockNumber: 4435157, EndBlockNumber: 4435157}, - {StartBlockNumber: 4435158, EndBlockNumber: 4435158}, - } - - if len(expectedRanges) != len(ranges) { - t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(ranges)) - } - - for i := range ranges { - if *expectedRanges[i] != *ranges[i] { - t.Errorf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) - } - } -} - -func TestDecodeBatchVersionAndChunkBlockRangesCodecv1(t *testing.T) { - scrollChainABI, err := ScrollChainMetaData.GetAbi() - require.NoError(t, err) - service := &RollupSyncService{ - scrollChainABI: scrollChainABI, - } - - data, err := os.ReadFile("./testdata/commitBatch_input_codecv1.json") - require.NoError(t, err, "Failed to read json file") - - type tx struct { - Input string `json:"input"` - } - var commitBatch tx - err = json.Unmarshal(data, &commitBatch) - require.NoError(t, err, "Failed to unmarshal transaction json") - - testTxData, err := hex.DecodeString(commitBatch.Input[2:]) - if err != nil { - t.Fatalf("Failed to decode string: %v", err) - } - - version, ranges, err := service.decodeBatchVersionAndChunkBlockRanges(testTxData) - if err != nil { - t.Fatalf("Failed to decode chunk ranges: %v", err) - } - - assert.Equal(t, encoding.CodecV1, encoding.CodecVersion(version)) - - expectedRanges := []*rawdb.ChunkBlockRange{ - {StartBlockNumber: 1690, EndBlockNumber: 1780}, - {StartBlockNumber: 1781, EndBlockNumber: 1871}, - {StartBlockNumber: 1872, EndBlockNumber: 1962}, - {StartBlockNumber: 1963, EndBlockNumber: 2053}, - {StartBlockNumber: 2054, EndBlockNumber: 2144}, - {StartBlockNumber: 2145, EndBlockNumber: 2235}, - {StartBlockNumber: 2236, EndBlockNumber: 2326}, - {StartBlockNumber: 2327, EndBlockNumber: 2417}, - {StartBlockNumber: 2418, EndBlockNumber: 2508}, - } - - if len(expectedRanges) != len(ranges) { - t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(ranges)) - } - - for i := range ranges { - if *expectedRanges[i] != *ranges[i] { - t.Errorf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) - } - } -} - -func TestDecodeBatchVersionAndChunkBlockRangesCodecv2(t *testing.T) { - scrollChainABI, err := ScrollChainMetaData.GetAbi() - require.NoError(t, err) - - service := &RollupSyncService{ - scrollChainABI: scrollChainABI, - } - - data, err := os.ReadFile("./testdata/commitBatch_input_codecv2.json") - require.NoError(t, err, "Failed to read json file") - - type tx struct { - Input string `json:"input"` - } - var commitBatch tx - err = json.Unmarshal(data, &commitBatch) - require.NoError(t, err, "Failed to unmarshal transaction json") - - testTxData, err := hex.DecodeString(commitBatch.Input[2:]) - if err != nil { - t.Fatalf("Failed to decode string: %v", err) - } - - version, ranges, err := service.decodeBatchVersionAndChunkBlockRanges(testTxData) - if err != nil { - t.Fatalf("Failed to decode chunk ranges: %v", err) - } - - assert.Equal(t, encoding.CodecV2, encoding.CodecVersion(version)) - - expectedRanges := []*rawdb.ChunkBlockRange{ - {StartBlockNumber: 200, EndBlockNumber: 290}, - {StartBlockNumber: 291, EndBlockNumber: 381}, - {StartBlockNumber: 382, EndBlockNumber: 472}, - {StartBlockNumber: 473, EndBlockNumber: 563}, - {StartBlockNumber: 564, EndBlockNumber: 654}, - {StartBlockNumber: 655, EndBlockNumber: 745}, - {StartBlockNumber: 746, EndBlockNumber: 836}, - {StartBlockNumber: 837, EndBlockNumber: 927}, - {StartBlockNumber: 928, EndBlockNumber: 1018}, - } - - if len(expectedRanges) != len(ranges) { - t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(ranges)) - } - - for i := range ranges { - if *expectedRanges[i] != *ranges[i] { - t.Errorf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) - } - } -} - -func TestDecodeBatchVersionAndChunkBlockRangesCodecv3(t *testing.T) { - scrollChainABI, err := ScrollChainMetaData.GetAbi() - require.NoError(t, err) - - service := &RollupSyncService{ - scrollChainABI: scrollChainABI, - } - - data, err := os.ReadFile("./testdata/commitBatchWithBlobProof_input_codecv3.json") - require.NoError(t, err, "Failed to read json file") - - type tx struct { - Input string `json:"input"` - } - var commitBatch tx - err = json.Unmarshal(data, &commitBatch) - require.NoError(t, err, "Failed to unmarshal transaction json") - - testTxData, err := hex.DecodeString(commitBatch.Input[2:]) - if err != nil { - t.Fatalf("Failed to decode string: %v", err) - } - - version, ranges, err := service.decodeBatchVersionAndChunkBlockRanges(testTxData) - if err != nil { - t.Fatalf("Failed to decode chunk ranges: %v", err) - } - - assert.Equal(t, encoding.CodecV3, encoding.CodecVersion(version)) - - expectedRanges := []*rawdb.ChunkBlockRange{ - {StartBlockNumber: 1, EndBlockNumber: 9}, - {StartBlockNumber: 10, EndBlockNumber: 20}, - {StartBlockNumber: 21, EndBlockNumber: 21}, - {StartBlockNumber: 22, EndBlockNumber: 22}, - {StartBlockNumber: 23, EndBlockNumber: 23}, - {StartBlockNumber: 24, EndBlockNumber: 24}, - {StartBlockNumber: 25, EndBlockNumber: 25}, - {StartBlockNumber: 26, EndBlockNumber: 26}, - {StartBlockNumber: 27, EndBlockNumber: 27}, - {StartBlockNumber: 28, EndBlockNumber: 28}, - {StartBlockNumber: 29, EndBlockNumber: 29}, - {StartBlockNumber: 30, EndBlockNumber: 30}, - {StartBlockNumber: 31, EndBlockNumber: 31}, - {StartBlockNumber: 32, EndBlockNumber: 32}, - {StartBlockNumber: 33, EndBlockNumber: 33}, - {StartBlockNumber: 34, EndBlockNumber: 34}, - {StartBlockNumber: 35, EndBlockNumber: 35}, - {StartBlockNumber: 36, EndBlockNumber: 36}, - {StartBlockNumber: 37, EndBlockNumber: 37}, - {StartBlockNumber: 38, EndBlockNumber: 38}, - {StartBlockNumber: 39, EndBlockNumber: 39}, - {StartBlockNumber: 40, EndBlockNumber: 40}, - } - - if len(expectedRanges) != len(ranges) { - t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(ranges)) - } - - for i := range ranges { - if *expectedRanges[i] != *ranges[i] { - t.Errorf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) - } - } -} - -func TestGetCommittedBatchMetaCodecv0(t *testing.T) { - genesisConfig := ¶ms.ChainConfig{ - Scroll: params.ScrollConfig{ - L1Config: ¶ms.L1Config{ - L1ChainId: 11155111, - ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), - }, - }, - } - db := rawdb.NewDatabase(memorydb.New()) - - rlpData, err := os.ReadFile("./testdata/commitBatch_codecv0.rlp") - if err != nil { - t.Fatalf("Failed to read RLP data: %v", err) - } - l1Client := &mockEthClient{ - txRLP: rlpData, - } - bc := &core.BlockChain{} stack, err := node.New(&node.DefaultConfig) - if err != nil { - t.Fatalf("Failed to new P2P node: %v", err) - } + require.NoError(t, err, "Failed to create new P2P node") defer stack.Close() - service, err := NewRollupSyncService(context.Background(), genesisConfig, db, l1Client, bc, stack) - if err != nil { - t.Fatalf("Failed to new rollup sync service: %v", err) - } - vLog := &types.Log{ - TxHash: common.HexToHash("0x0"), - } - metadata, err := service.getCommittedBatchMeta(1, vLog) + service, err := NewRollupSyncService(context.Background(), genesisConfig, db, &l1.MockNopClient{}, &core.BlockChain{}, stack, da_syncer.Config{ + BlobScanAPIEndpoint: "http://dummy-endpoint:1234", + }) require.NoError(t, err) - assert.Equal(t, encoding.CodecV0, encoding.CodecVersion(metadata.Version)) - expectedRanges := []*rawdb.ChunkBlockRange{ {StartBlockNumber: 911145, EndBlockNumber: 911151}, {StartBlockNumber: 911152, EndBlockNumber: 911155}, {StartBlockNumber: 911156, EndBlockNumber: 911159}, } - if len(expectedRanges) != len(metadata.ChunkBlockRanges) { - t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(metadata.ChunkBlockRanges)) - } - - for i := range metadata.ChunkBlockRanges { - if *expectedRanges[i] != *metadata.ChunkBlockRanges[i] { - t.Fatalf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *metadata.ChunkBlockRanges[i]) + var chunks []*encoding.DAChunkRawTx + for _, r := range expectedRanges { + var blocks []encoding.DABlock + for i := r.StartBlockNumber; i <= r.EndBlockNumber; i++ { + blocks = append(blocks, &mockDABlock{number: i}) } + chunks = append(chunks, &encoding.DAChunkRawTx{Blocks: blocks}) } -} -func TestGetCommittedBatchMetaCodecv1(t *testing.T) { - genesisConfig := ¶ms.ChainConfig{ - Scroll: params.ScrollConfig{ - L1Config: ¶ms.L1Config{ - L1ChainId: 11155111, - ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), - }, - }, - } - db := rawdb.NewDatabase(memorydb.New()) - - rlpData, err := os.ReadFile("./testdata/commitBatch_codecv1.rlp") - if err != nil { - t.Fatalf("Failed to read RLP data: %v", err) - } - l1Client := &mockEthClient{ - txRLP: rlpData, - } - bc := &core.BlockChain{} - stack, err := node.New(&node.DefaultConfig) - if err != nil { - t.Fatalf("Failed to new P2P node: %v", err) - } - defer stack.Close() - service, err := NewRollupSyncService(context.Background(), genesisConfig, db, l1Client, bc, stack) - if err != nil { - t.Fatalf("Failed to new rollup sync service: %v", err) + committedBatch := mockEntryWithBlocks{ + batchIndex: 1, + version: encoding.CodecV0, + chunks: chunks, } - vLog := &types.Log{ - TxHash: common.HexToHash("0x1"), - } - metadata, err := service.getCommittedBatchMeta(1, vLog) + metadata, err := service.getCommittedBatchMeta(committedBatch) require.NoError(t, err) - assert.Equal(t, encoding.CodecV1, encoding.CodecVersion(metadata.Version)) - - expectedRanges := []*rawdb.ChunkBlockRange{ - {StartBlockNumber: 1, EndBlockNumber: 11}, - } - - if len(expectedRanges) != len(metadata.ChunkBlockRanges) { - t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(metadata.ChunkBlockRanges)) - } - - for i := range metadata.ChunkBlockRanges { - if *expectedRanges[i] != *metadata.ChunkBlockRanges[i] { - t.Fatalf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *metadata.ChunkBlockRanges[i]) - } - } + require.Equal(t, encoding.CodecV0, encoding.CodecVersion(metadata.Version)) + require.EqualValues(t, expectedRanges, metadata.ChunkBlockRanges) } -func TestGetCommittedBatchMetaCodecv2(t *testing.T) { +func TestGetCommittedBatchMetaCodecV1(t *testing.T) { genesisConfig := ¶ms.ChainConfig{ Scroll: params.ScrollConfig{ L1Config: ¶ms.L1Config{ - L1ChainId: 11155111, - ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), + L1ChainId: 11155111, + ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), + L1MessageQueueAddress: common.HexToAddress("0x0000000000000000000000000000000000000001"), }, }, } db := rawdb.NewDatabase(memorydb.New()) - rlpData, err := os.ReadFile("./testdata/commitBatch_codecv2.rlp") - if err != nil { - t.Fatalf("Failed to read RLP data: %v", err) - } - l1Client := &mockEthClient{ - txRLP: rlpData, - } - bc := &core.BlockChain{} stack, err := node.New(&node.DefaultConfig) - if err != nil { - t.Fatalf("Failed to new P2P node: %v", err) - } + require.NoError(t, err, "Failed to create new P2P node") defer stack.Close() - service, err := NewRollupSyncService(context.Background(), genesisConfig, db, l1Client, bc, stack) - if err != nil { - t.Fatalf("Failed to new rollup sync service: %v", err) - } - vLog := &types.Log{ - TxHash: common.HexToHash("0x2"), - } - metadata, err := service.getCommittedBatchMeta(1, vLog) + service, err := NewRollupSyncService(context.Background(), genesisConfig, db, &l1.MockNopClient{}, &core.BlockChain{}, stack, da_syncer.Config{ + BlobScanAPIEndpoint: "http://localhost:8080", + }) require.NoError(t, err) - assert.Equal(t, encoding.CodecV2, encoding.CodecVersion(metadata.Version)) - expectedRanges := []*rawdb.ChunkBlockRange{ + {StartBlockNumber: 100, EndBlockNumber: 142}, {StartBlockNumber: 143, EndBlockNumber: 143}, {StartBlockNumber: 144, EndBlockNumber: 144}, {StartBlockNumber: 145, EndBlockNumber: 145}, @@ -456,99 +125,115 @@ func TestGetCommittedBatchMetaCodecv2(t *testing.T) { {StartBlockNumber: 174, EndBlockNumber: 174}, } - if len(expectedRanges) != len(metadata.ChunkBlockRanges) { - t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(metadata.ChunkBlockRanges)) - } - - for i := range metadata.ChunkBlockRanges { - if *expectedRanges[i] != *metadata.ChunkBlockRanges[i] { - t.Fatalf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *metadata.ChunkBlockRanges[i]) + var chunks []*encoding.DAChunkRawTx + for _, r := range expectedRanges { + var blocks []encoding.DABlock + for i := r.StartBlockNumber; i <= r.EndBlockNumber; i++ { + blocks = append(blocks, &mockDABlock{number: i}) } + chunks = append(chunks, &encoding.DAChunkRawTx{Blocks: blocks}) } -} -func TestGetCommittedBatchMetaCodecv3(t *testing.T) { - genesisConfig := ¶ms.ChainConfig{ - Scroll: params.ScrollConfig{ - L1Config: ¶ms.L1Config{ - L1ChainId: 11155111, - ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), - }, - }, + expectedVersionedHashes := []common.Hash{ + common.HexToHash("0x1"), + common.HexToHash("0x2"), } - db := rawdb.NewDatabase(memorydb.New()) - rlpData, err := os.ReadFile("./testdata/commitBatchWithBlobProof_codecv3.rlp") - if err != nil { - t.Fatalf("Failed to read RLP data: %v", err) - } - l1Client := &mockEthClient{ - txRLP: rlpData, - } - bc := &core.BlockChain{} - stack, err := node.New(&node.DefaultConfig) - if err != nil { - t.Fatalf("Failed to new P2P node: %v", err) - } - defer stack.Close() - service, err := NewRollupSyncService(context.Background(), genesisConfig, db, l1Client, bc, stack) - if err != nil { - t.Fatalf("Failed to new rollup sync service: %v", err) + committedBatch := mockEntryWithBlocks{ + batchIndex: 1, + version: encoding.CodecV1, + chunks: chunks, + versionedHashes: expectedVersionedHashes, } - vLog := &types.Log{ - TxHash: common.HexToHash("0x3"), - } - metadata, err := service.getCommittedBatchMeta(1, vLog) + metadata, err := service.getCommittedBatchMeta(committedBatch) require.NoError(t, err) - assert.Equal(t, encoding.CodecV3, encoding.CodecVersion(metadata.Version)) + require.Equal(t, encoding.CodecV1, encoding.CodecVersion(metadata.Version)) + require.EqualValues(t, expectedRanges, metadata.ChunkBlockRanges) + require.EqualValues(t, expectedVersionedHashes, metadata.BlobVersionedHashes) +} - expectedRanges := []*rawdb.ChunkBlockRange{ - {StartBlockNumber: 41, EndBlockNumber: 41}, - {StartBlockNumber: 42, EndBlockNumber: 42}, - {StartBlockNumber: 43, EndBlockNumber: 43}, - {StartBlockNumber: 44, EndBlockNumber: 44}, - {StartBlockNumber: 45, EndBlockNumber: 45}, - {StartBlockNumber: 46, EndBlockNumber: 46}, - {StartBlockNumber: 47, EndBlockNumber: 47}, - {StartBlockNumber: 48, EndBlockNumber: 48}, - {StartBlockNumber: 49, EndBlockNumber: 49}, - {StartBlockNumber: 50, EndBlockNumber: 50}, - {StartBlockNumber: 51, EndBlockNumber: 51}, - {StartBlockNumber: 52, EndBlockNumber: 52}, - {StartBlockNumber: 53, EndBlockNumber: 53}, - {StartBlockNumber: 54, EndBlockNumber: 54}, - {StartBlockNumber: 55, EndBlockNumber: 55}, - {StartBlockNumber: 56, EndBlockNumber: 56}, - {StartBlockNumber: 57, EndBlockNumber: 57}, - {StartBlockNumber: 58, EndBlockNumber: 58}, - {StartBlockNumber: 59, EndBlockNumber: 59}, - {StartBlockNumber: 60, EndBlockNumber: 60}, - {StartBlockNumber: 61, EndBlockNumber: 61}, - {StartBlockNumber: 62, EndBlockNumber: 62}, - {StartBlockNumber: 63, EndBlockNumber: 63}, - {StartBlockNumber: 64, EndBlockNumber: 64}, - {StartBlockNumber: 65, EndBlockNumber: 65}, - {StartBlockNumber: 66, EndBlockNumber: 66}, - {StartBlockNumber: 67, EndBlockNumber: 67}, - {StartBlockNumber: 68, EndBlockNumber: 68}, - {StartBlockNumber: 69, EndBlockNumber: 69}, - {StartBlockNumber: 70, EndBlockNumber: 70}, - } - - if len(expectedRanges) != len(metadata.ChunkBlockRanges) { - t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(metadata.ChunkBlockRanges)) - } - - for i := range metadata.ChunkBlockRanges { - if *expectedRanges[i] != *metadata.ChunkBlockRanges[i] { - t.Fatalf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *metadata.ChunkBlockRanges[i]) - } - } +type mockEntryWithBlocks struct { + batchIndex uint64 + version encoding.CodecVersion + chunks []*encoding.DAChunkRawTx + versionedHashes []common.Hash +} + +func (m mockEntryWithBlocks) Type() da.Type { + panic("implement me") } -func TestValidateBatchCodecv0(t *testing.T) { +func (m mockEntryWithBlocks) BatchIndex() uint64 { + return m.batchIndex +} + +func (m mockEntryWithBlocks) L1BlockNumber() uint64 { + panic("implement me") +} + +func (m mockEntryWithBlocks) CompareTo(entry da.Entry) int { + panic("implement me") +} + +func (m mockEntryWithBlocks) Event() l1.RollupEvent { + panic("implement me") +} + +func (m mockEntryWithBlocks) Blocks() []*da.PartialBlock { + panic("implement me") +} + +func (m mockEntryWithBlocks) Version() encoding.CodecVersion { + return m.version +} + +func (m mockEntryWithBlocks) Chunks() []*encoding.DAChunkRawTx { + return m.chunks +} + +func (m mockEntryWithBlocks) BlobVersionedHashes() []common.Hash { + return m.versionedHashes +} + +type mockDABlock struct { + number uint64 +} + +func (b *mockDABlock) Encode() []byte { + panic("implement me") +} + +func (b *mockDABlock) Decode(bytes []byte) error { + panic("implement me") +} + +func (b *mockDABlock) NumTransactions() uint16 { + panic("implement me") +} + +func (b *mockDABlock) NumL1Messages() uint16 { + panic("implement me") +} + +func (b *mockDABlock) Timestamp() uint64 { + panic("implement me") +} + +func (b *mockDABlock) BaseFee() *big.Int { + panic("implement me") +} + +func (b *mockDABlock) GasLimit() uint64 { + panic("implement me") +} + +func (b *mockDABlock) Number() uint64 { + return b.number +} + +func TestValidateBatchCodecV0(t *testing.T) { block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} @@ -559,18 +244,21 @@ func TestValidateBatchCodecv0(t *testing.T) { chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} parentFinalizedBatchMeta1 := &rawdb.FinalizedBatchMeta{} - event1 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(0), - BatchHash: common.HexToHash("0xfd3ecf106ce993adc6db68e42ce701bfe638434395abdeeb871f7bd395ae2368"), - StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, - WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, - } + event1 := l1.NewFinalizeBatchEvent( + big.NewInt(0), + common.HexToHash("0xfd3ecf106ce993adc6db68e42ce701bfe638434395abdeeb871f7bd395ae2368"), + chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta1 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV0), BlobVersionedHashes: nil, } - endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex.Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, nil) + endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex().Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, nil) assert.NoError(t, err) assert.Equal(t, uint64(13), endBlock1) @@ -578,37 +266,41 @@ func TestValidateBatchCodecv0(t *testing.T) { chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} parentFinalizedBatchMeta2 := &rawdb.FinalizedBatchMeta{ - BatchHash: event1.BatchHash, + BatchHash: event1.BatchHash(), TotalL1MessagePopped: 11, - StateRoot: event1.StateRoot, - WithdrawRoot: event1.WithdrawRoot, + StateRoot: event1.StateRoot(), + WithdrawRoot: event1.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta2, finalizedBatchMeta1) - event2 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(1), - BatchHash: common.HexToHash("0xadb8e526c3fdc2045614158300789cd66e7a945efe5a484db00b5ef9a26016d7"), - StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, - WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, - } + + event2 := l1.NewFinalizeBatchEvent( + big.NewInt(1), + common.HexToHash("0xadb8e526c3fdc2045614158300789cd66e7a945efe5a484db00b5ef9a26016d7"), + chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 2, + ) committedBatchMeta2 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV0), BlobVersionedHashes: nil, } - endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex.Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk4}, nil) + endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex().Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk4}, nil) assert.NoError(t, err) assert.Equal(t, uint64(17), endBlock2) parentFinalizedBatchMeta3 := &rawdb.FinalizedBatchMeta{ - BatchHash: event2.BatchHash, + BatchHash: event2.BatchHash(), TotalL1MessagePopped: 42, - StateRoot: event2.StateRoot, - WithdrawRoot: event2.WithdrawRoot, + StateRoot: event2.StateRoot(), + WithdrawRoot: event2.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta3, finalizedBatchMeta2) } -func TestValidateBatchCodecv1(t *testing.T) { +func TestValidateBatchCodecV1(t *testing.T) { block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} @@ -619,18 +311,21 @@ func TestValidateBatchCodecv1(t *testing.T) { chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} parentFinalizedBatchMeta1 := &rawdb.FinalizedBatchMeta{} - event1 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(0), - BatchHash: common.HexToHash("0x73cb3310646716cb782702a0ec4ad33cf55633c85daf96b641953c5defe58031"), - StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, - WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, - } + event1 := l1.NewFinalizeBatchEvent( + big.NewInt(0), + common.HexToHash("0x73cb3310646716cb782702a0ec4ad33cf55633c85daf96b641953c5defe58031"), + chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta1 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV1), BlobVersionedHashes: []common.Hash{common.HexToHash("0x0129554070e4323800ca0e5ddd17bc447854601b306a70870002a058741214b3")}, } - endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex.Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, nil) + endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex().Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, nil) assert.NoError(t, err) assert.Equal(t, uint64(13), endBlock1) @@ -638,36 +333,39 @@ func TestValidateBatchCodecv1(t *testing.T) { chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} parentFinalizedBatchMeta2 := &rawdb.FinalizedBatchMeta{ - BatchHash: event1.BatchHash, + BatchHash: event1.BatchHash(), TotalL1MessagePopped: 11, - StateRoot: event1.StateRoot, - WithdrawRoot: event1.WithdrawRoot, + StateRoot: event1.StateRoot(), + WithdrawRoot: event1.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta2, finalizedBatchMeta1) - event2 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(1), - BatchHash: common.HexToHash("0x7f230ce84b4bf86f8ee22ffb5c145e3ef3ddf2a76da4936a33f33cebdb63a48a"), - StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, - WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, - } + event2 := l1.NewFinalizeBatchEvent( + big.NewInt(1), + common.HexToHash("0x7f230ce84b4bf86f8ee22ffb5c145e3ef3ddf2a76da4936a33f33cebdb63a48a"), + chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta2 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV1), BlobVersionedHashes: []common.Hash{common.HexToHash("0x01a327088bb2b13151449d8313c281d0006d12e8453e863637b746898b6ad5a6")}, } - endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex.Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk4}, nil) + endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex().Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk4}, nil) assert.NoError(t, err) assert.Equal(t, uint64(17), endBlock2) parentFinalizedBatchMeta3 := &rawdb.FinalizedBatchMeta{ - BatchHash: event2.BatchHash, + BatchHash: event2.BatchHash(), TotalL1MessagePopped: 42, - StateRoot: event2.StateRoot, - WithdrawRoot: event2.WithdrawRoot, + StateRoot: event2.StateRoot(), + WithdrawRoot: event2.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta3, finalizedBatchMeta2) } -func TestValidateBatchCodecv2(t *testing.T) { +func TestValidateBatchCodecV2(t *testing.T) { block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} @@ -678,18 +376,21 @@ func TestValidateBatchCodecv2(t *testing.T) { chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} parentFinalizedBatchMeta1 := &rawdb.FinalizedBatchMeta{} - event1 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(0), - BatchHash: common.HexToHash("0xaccf37a0b974f2058692d366b2ea85502c99db4a0bcb9b77903b49bf866a463b"), - StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, - WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, - } + event1 := l1.NewFinalizeBatchEvent( + big.NewInt(0), + common.HexToHash("0xaccf37a0b974f2058692d366b2ea85502c99db4a0bcb9b77903b49bf866a463b"), + chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta1 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV2), BlobVersionedHashes: []common.Hash{common.HexToHash("0x018d99636f4b20ccdc1dd11c289eb2a470e2c4dd631b1a7b48a6978805f49d18")}, } - endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex.Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, nil) + endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex().Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, nil) assert.NoError(t, err) assert.Equal(t, uint64(13), endBlock1) @@ -697,36 +398,39 @@ func TestValidateBatchCodecv2(t *testing.T) { chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} parentFinalizedBatchMeta2 := &rawdb.FinalizedBatchMeta{ - BatchHash: event1.BatchHash, + BatchHash: event1.BatchHash(), TotalL1MessagePopped: 11, - StateRoot: event1.StateRoot, - WithdrawRoot: event1.WithdrawRoot, + StateRoot: event1.StateRoot(), + WithdrawRoot: event1.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta2, finalizedBatchMeta1) - event2 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(1), - BatchHash: common.HexToHash("0x62ec61e1fdb334868ffd471df601f6858e692af01d42b5077c805a9fd4558c91"), - StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, - WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, - } + event2 := l1.NewFinalizeBatchEvent( + big.NewInt(1), + common.HexToHash("0x62ec61e1fdb334868ffd471df601f6858e692af01d42b5077c805a9fd4558c91"), + chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta2 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV2), BlobVersionedHashes: []common.Hash{common.HexToHash("0x015b4e3d3dcd64cc0eb6a5ad535d7a1844a8c4cdad366ec73557bcc533941370")}, } - endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex.Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk4}, nil) + endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex().Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk4}, nil) assert.NoError(t, err) assert.Equal(t, uint64(17), endBlock2) parentFinalizedBatchMeta3 := &rawdb.FinalizedBatchMeta{ - BatchHash: event2.BatchHash, + BatchHash: event2.BatchHash(), TotalL1MessagePopped: 42, - StateRoot: event2.StateRoot, - WithdrawRoot: event2.WithdrawRoot, + StateRoot: event2.StateRoot(), + WithdrawRoot: event2.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta3, finalizedBatchMeta2) } -func TestValidateBatchCodecv3(t *testing.T) { +func TestValidateBatchCodecV3(t *testing.T) { block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} @@ -737,19 +441,22 @@ func TestValidateBatchCodecv3(t *testing.T) { chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} parentFinalizedBatchMeta1 := &rawdb.FinalizedBatchMeta{} - event1 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(0), - BatchHash: common.HexToHash("0x015eb56fb95bf9a06157cfb8389ba7c2b6b08373e22581ac2ba387003708265d"), - StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, - WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, - } + event1 := l1.NewFinalizeBatchEvent( + big.NewInt(0), + common.HexToHash("0x015eb56fb95bf9a06157cfb8389ba7c2b6b08373e22581ac2ba387003708265d"), + chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta1 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV3), BlobVersionedHashes: []common.Hash{common.HexToHash("0x018d99636f4b20ccdc1dd11c289eb2a470e2c4dd631b1a7b48a6978805f49d18")}, } - endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex.Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, nil) + endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex().Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, nil) assert.NoError(t, err) assert.Equal(t, uint64(13), endBlock1) @@ -757,31 +464,34 @@ func TestValidateBatchCodecv3(t *testing.T) { chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} parentFinalizedBatchMeta2 := &rawdb.FinalizedBatchMeta{ - BatchHash: event1.BatchHash, + BatchHash: event1.BatchHash(), TotalL1MessagePopped: 11, - StateRoot: event1.StateRoot, - WithdrawRoot: event1.WithdrawRoot, + StateRoot: event1.StateRoot(), + WithdrawRoot: event1.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta2, finalizedBatchMeta1) - event2 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(1), - BatchHash: common.HexToHash("0x382cb0d507e3d7507f556c52e05f76b05e364ad26205e7f62c95967a19c2f35d"), - StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, - WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, - } + event2 := l1.NewFinalizeBatchEvent( + big.NewInt(1), + common.HexToHash("0x382cb0d507e3d7507f556c52e05f76b05e364ad26205e7f62c95967a19c2f35d"), + chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta2 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV3), BlobVersionedHashes: []common.Hash{common.HexToHash("0x015b4e3d3dcd64cc0eb6a5ad535d7a1844a8c4cdad366ec73557bcc533941370")}, } - endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex.Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk4}, nil) + endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex().Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk4}, nil) assert.NoError(t, err) assert.Equal(t, uint64(17), endBlock2) parentFinalizedBatchMeta3 := &rawdb.FinalizedBatchMeta{ - BatchHash: event2.BatchHash, + BatchHash: event2.BatchHash(), TotalL1MessagePopped: 42, - StateRoot: event2.StateRoot, - WithdrawRoot: event2.WithdrawRoot, + StateRoot: event2.StateRoot(), + WithdrawRoot: event2.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta3, finalizedBatchMeta2) } @@ -791,19 +501,22 @@ func TestValidateBatchUpgrades(t *testing.T) { chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} parentFinalizedBatchMeta1 := &rawdb.FinalizedBatchMeta{} - event1 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(0), - BatchHash: common.HexToHash("0x4605465b7470c8565b123330d7186805caf9a7f2656d8e9e744b62e14ca22c3d"), - StateRoot: chunk1.Blocks[len(chunk1.Blocks)-1].Header.Root, - WithdrawRoot: chunk1.Blocks[len(chunk1.Blocks)-1].WithdrawRoot, - } + event1 := l1.NewFinalizeBatchEvent( + big.NewInt(0), + common.HexToHash("0x4605465b7470c8565b123330d7186805caf9a7f2656d8e9e744b62e14ca22c3d"), + chunk1.Blocks[len(chunk1.Blocks)-1].Header.Root, + chunk1.Blocks[len(chunk1.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta1 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV0), BlobVersionedHashes: nil, } - endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex.Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1}, nil) + endBlock1, finalizedBatchMeta1, err := validateBatch(event1.BatchIndex().Uint64(), event1, parentFinalizedBatchMeta1, committedBatchMeta1, []*encoding.Chunk{chunk1}, nil) assert.NoError(t, err) assert.Equal(t, uint64(2), endBlock1) @@ -811,23 +524,26 @@ func TestValidateBatchUpgrades(t *testing.T) { chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} parentFinalizedBatchMeta2 := &rawdb.FinalizedBatchMeta{ - BatchHash: event1.BatchHash, + BatchHash: event1.BatchHash(), TotalL1MessagePopped: 0, - StateRoot: event1.StateRoot, - WithdrawRoot: event1.WithdrawRoot, + StateRoot: event1.StateRoot(), + WithdrawRoot: event1.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta2, finalizedBatchMeta1) - event2 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(1), - BatchHash: common.HexToHash("0xc4af33bce87aa702edc3ad4b7d34730d25719427704e250787f99e0f55049252"), - StateRoot: chunk2.Blocks[len(chunk2.Blocks)-1].Header.Root, - WithdrawRoot: chunk2.Blocks[len(chunk2.Blocks)-1].WithdrawRoot, - } + event2 := l1.NewFinalizeBatchEvent( + big.NewInt(1), + common.HexToHash("0xc4af33bce87aa702edc3ad4b7d34730d25719427704e250787f99e0f55049252"), + chunk2.Blocks[len(chunk2.Blocks)-1].Header.Root, + chunk2.Blocks[len(chunk2.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta2 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV1), BlobVersionedHashes: []common.Hash{common.HexToHash("0x01a688c6e137310df38a62f5ad1e5119b8cb0455c386a9a4079b14fe92a239aa")}, } - endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex.Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk2}, nil) + endBlock2, finalizedBatchMeta2, err := validateBatch(event2.BatchIndex().Uint64(), event2, parentFinalizedBatchMeta2, committedBatchMeta2, []*encoding.Chunk{chunk2}, nil) assert.NoError(t, err) assert.Equal(t, uint64(3), endBlock2) @@ -835,23 +551,26 @@ func TestValidateBatchUpgrades(t *testing.T) { chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} parentFinalizedBatchMeta3 := &rawdb.FinalizedBatchMeta{ - BatchHash: event2.BatchHash, + BatchHash: event2.BatchHash(), TotalL1MessagePopped: 0, - StateRoot: event2.StateRoot, - WithdrawRoot: event2.WithdrawRoot, + StateRoot: event2.StateRoot(), + WithdrawRoot: event2.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta3, finalizedBatchMeta2) - event3 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(2), - BatchHash: common.HexToHash("0x9f87f2de2019ed635f867b1e61be6a607c3174ced096f370fd18556c38833c62"), - StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, - WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, - } + event3 := l1.NewFinalizeBatchEvent( + big.NewInt(2), + common.HexToHash("0x9f87f2de2019ed635f867b1e61be6a607c3174ced096f370fd18556c38833c62"), + chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta3 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV1), BlobVersionedHashes: []common.Hash{common.HexToHash("0x01ea66c4de196d36e2c3a5d7c0045100b9e46ef65be8f7a921ef20e6f2e99ebd")}, } - endBlock3, finalizedBatchMeta3, err := validateBatch(event3.BatchIndex.Uint64(), event3, parentFinalizedBatchMeta3, committedBatchMeta3, []*encoding.Chunk{chunk3}, nil) + endBlock3, finalizedBatchMeta3, err := validateBatch(event3.BatchIndex().Uint64(), event3, parentFinalizedBatchMeta3, committedBatchMeta3, []*encoding.Chunk{chunk3}, nil) assert.NoError(t, err) assert.Equal(t, uint64(13), endBlock3) @@ -859,31 +578,34 @@ func TestValidateBatchUpgrades(t *testing.T) { chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} parentFinalizedBatchMeta4 := &rawdb.FinalizedBatchMeta{ - BatchHash: event3.BatchHash, + BatchHash: event3.BatchHash(), TotalL1MessagePopped: 11, - StateRoot: event3.StateRoot, - WithdrawRoot: event3.WithdrawRoot, + StateRoot: event3.StateRoot(), + WithdrawRoot: event3.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta4, finalizedBatchMeta3) - event4 := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(3), - BatchHash: common.HexToHash("0xd33332aef8efbc9a0be4c4694088ac0dd052d2d3ad3ffda5e4c2010825e476bc"), - StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, - WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, - } + event4 := l1.NewFinalizeBatchEvent( + big.NewInt(3), + common.HexToHash("0xd33332aef8efbc9a0be4c4694088ac0dd052d2d3ad3ffda5e4c2010825e476bc"), + chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta4 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV3), BlobVersionedHashes: []common.Hash{common.HexToHash("0x015b4e3d3dcd64cc0eb6a5ad535d7a1844a8c4cdad366ec73557bcc533941370")}, } - endBlock4, finalizedBatchMeta4, err := validateBatch(event4.BatchIndex.Uint64(), event4, parentFinalizedBatchMeta4, committedBatchMeta4, []*encoding.Chunk{chunk4}, nil) + endBlock4, finalizedBatchMeta4, err := validateBatch(event4.BatchIndex().Uint64(), event4, parentFinalizedBatchMeta4, committedBatchMeta4, []*encoding.Chunk{chunk4}, nil) assert.NoError(t, err) assert.Equal(t, uint64(17), endBlock4) parentFinalizedBatchMeta5 := &rawdb.FinalizedBatchMeta{ - BatchHash: event4.BatchHash, + BatchHash: event4.BatchHash(), TotalL1MessagePopped: 42, - StateRoot: event4.StateRoot, - WithdrawRoot: event4.WithdrawRoot, + StateRoot: event4.StateRoot(), + WithdrawRoot: event4.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta5, finalizedBatchMeta4) } @@ -898,13 +620,15 @@ func TestValidateBatchInFinalizeByBundle(t *testing.T) { chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} - - event := &L1FinalizeBatchEvent{ - BatchIndex: big.NewInt(3), - BatchHash: common.HexToHash("0xaa6dc7cc432c8d46a9373e1e96d829a1e24e52fe0468012ff062793ea8f5b55e"), - StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, - WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, - } + event := l1.NewFinalizeBatchEvent( + big.NewInt(3), + common.HexToHash("0xaa6dc7cc432c8d46a9373e1e96d829a1e24e52fe0468012ff062793ea8f5b55e"), + chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + common.HexToHash("0x1"), + common.HexToHash("0x1"), + 1, + ) committedBatchMeta1 := &rawdb.CommittedBatchMeta{ Version: uint8(encoding.CodecV3), @@ -943,10 +667,10 @@ func TestValidateBatchInFinalizeByBundle(t *testing.T) { assert.Equal(t, uint64(17), endBlock4) parentFinalizedBatchMeta5 := &rawdb.FinalizedBatchMeta{ - BatchHash: event.BatchHash, + BatchHash: event.BatchHash(), TotalL1MessagePopped: 42, - StateRoot: event.StateRoot, - WithdrawRoot: event.WithdrawRoot, + StateRoot: event.StateRoot(), + WithdrawRoot: event.WithdrawRoot(), } assert.Equal(t, parentFinalizedBatchMeta5, finalizedBatchMeta4) } diff --git a/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_codecv3.rlp b/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_codecv3.rlp deleted file mode 100644 index 4640f8468741..000000000000 Binary files a/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_codecv3.rlp and /dev/null differ diff --git a/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_input_codecv3.json b/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_input_codecv3.json deleted file mode 100644 index ca13d9a749fc..000000000000 --- a/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_input_codecv3.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "blockHash": "0xb7f00b3235ef6066d61e5e5be5472cdd1edc0a64537b84f110f860e6614a4759", - "blockNumber": "0x187", - "from": "0xf472086186382fca55cd182de196520abd76f69d", - "gas": "0x3e052", - "gasPrice": "0x3b9aca07", - "maxFeePerGas": "0x3b9aca0e", - "maxPriorityFeePerGas": "0x3b9aca00", - "maxFeePerBlobGas": "0x2", - "hash": "0x8de0573f1f72ced727838df60088d9084333d27384a77bf331d520cac0e6a298", - "input": "0x86b053a9000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000000010a0000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000e5a938b077b60c939e58eeede33d4385228b532cf73e54aca76731a27acc86b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000ee0000000000000000000000000000000000000000000000000000000000000021d09000000000000000100000000668ebf810000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000200000000668ec0650000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000300000000668ec0680000000000000000000000000000000000000000000000000000000002e71a60000000000098968000070000000000000000000400000000668ec06b0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000500000000668ec08e0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000600000000668ec0910000000000000000000000000000000000000000000000000000000002e71a60000000000098968000080000000000000000000700000000668ec0940000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000800000000668ec0970000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000900000000668ec0b50000000000000000000000000000000000000000000000000000000002e71a6000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000002950b000000000000000a00000000668ec0b80000000000000000000000000000000000000000000000000000000002e71a60000000000098968000020000000000000000000b00000000668ec0bb0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000c00000000668ec1630000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000d00000000668ec1660000000000000000000000000000000000000000000000000000000002e71a60000000000098968000120000000000000000000e00000000668ec1690000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000f00000000668ec16e0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001000000000668ec1710000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001100000000668ec1740000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001200000000668ec17c0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001300000000668ec21b0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001400000000668ec21e0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003400000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001500000000668ec2210000000000000000000000000000000000000000000000000000000002e71a60000000000098968000400000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001600000000668ec2240000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001700000000668ec2270000000000000000000000000000000000000000000000000000000002e71a600000000000989680003f0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001800000000668ec22a0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000400000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001900000000668ec22d0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001a00000000668ec2300000000000000000000000000000000000000000000000000000000002e71a600000000000989680003e0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001b00000000668ec2330000000000000000000000000000000000000000000000000000000002e71a60000000000098968000400000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001c00000000668ec2360000000000000000000000000000000000000000000000000000000002e71a600000000000989680003f0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001d00000000668ec2390000000000000000000000000000000000000000000000000000000002e71a60000000000098968000410000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001e00000000668ec23c0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003e0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001f00000000668ec23f0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003f0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002000000000668ec2420000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002100000000668ec2450000000000000000000000000000000000000000000000000000000002e71a600000000000989680003a0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002200000000668ec2480000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002300000000668ec24b0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003e0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002400000000668ec24e0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003c0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002500000000668ec2510000000000000000000000000000000000000000000000000000000002e71a600000000000989680003b0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002600000000668ec2540000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002700000000668ec2570000000000000000000000000000000000000000000000000000000002e71a60000000000098968000370000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002800000000668ec25a0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00b3a20d1a749d0917ef837a9973e549be83321ecafc3b8388f25c5c247078e383e4b062167826f53032aa9bb0fc2a8ef610e1c4e5d0f70ee133a76b5020224a8b2428ba7ec725c61950716b2758aa21f1b0cc3f0bf1551474537093924829c170e3d74228be4c07acf24b5c1adb1adac92d25a32f79ba51731343fc0f52cb11e32bbcedb1969853cf854f61862e915744fb5fbc3d4ec8701fc0f626f5c97211b", - "nonce": "0x1", - "to": "0x475652655309fa7cb1397537bee9a7fbafdc11ca", - "transactionIndex": "0x0", - "value": "0x0", - "type": "0x3", - "accessList": [ - { - "address": "0x3d9a28f7692cb94740bb64f08cb5cd19aa5cd3dd", - "storageKeys": [] - } - ], - "chainId": "0x1b207", - "blobVersionedHashes": [ - "0x0132d1238782d359051322a61d997a57f5b2f86d6f36c2aad4eda0118e3a213a" - ], - "v": "0x0", - "r": "0xe8f6ca4ef76a295dc6aa0099e0e9c4a2902cb0ffaeff0c4bae258575d00cae94", - "s": "0x20682493a94948fb97b8cb67e8ae86f444a96e39c5945f10d1008cf1a0508851", - "yParity": "0x0" -} diff --git a/rollup/rollup_sync_service/testdata/commitBatch_codecv0.rlp b/rollup/rollup_sync_service/testdata/commitBatch_codecv0.rlp deleted file mode 100644 index e0b42dc0a581..000000000000 Binary files a/rollup/rollup_sync_service/testdata/commitBatch_codecv0.rlp and /dev/null differ diff --git a/rollup/rollup_sync_service/testdata/commitBatch_codecv1.rlp b/rollup/rollup_sync_service/testdata/commitBatch_codecv1.rlp deleted file mode 100644 index b0feda0443cd..000000000000 Binary files a/rollup/rollup_sync_service/testdata/commitBatch_codecv1.rlp and /dev/null differ diff --git a/rollup/rollup_sync_service/testdata/commitBatch_codecv2.rlp b/rollup/rollup_sync_service/testdata/commitBatch_codecv2.rlp deleted file mode 100644 index cbb35f1579f1..000000000000 Binary files a/rollup/rollup_sync_service/testdata/commitBatch_codecv2.rlp and /dev/null differ diff --git a/rollup/rollup_sync_service/testdata/commitBatch_input_codecv0.json b/rollup/rollup_sync_service/testdata/commitBatch_input_codecv0.json deleted file mode 100644 index ab2bb62c06d5..000000000000 --- a/rollup/rollup_sync_service/testdata/commitBatch_input_codecv0.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "blockHash": "0xab5112f13fcfae4ce2e9b9ffac41aba17113fedded7c9864f332a8ef4195f1d5", - "blockNumber": "0x129dac3", - "hash": "0x5ec08d23bfc4340e3fc4f799daded1d66ccff2b6a31cc4799f3d3db5ceca8d82", - "yParity": "0x0", - "accessList": [ - { - "address": "0xfa148514d03420b7b1a13ec74da06d2ca875539c", - "storageKeys": [] - } - ], - "transactionIndex": "0x83", - "type": "0x2", - "nonce": "0x1fa2c", - "input": "0x1325aca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001c440000000000000000000000000000000000000000000000000000000000000005900000000000001fa2b0000000000000000000000000003c46d21938370953ecbc239ac066a14c60b16a637db1ca34f7c0ce8698b0bae71ceb8e6c4ba1924589e26d6eeb2f7cafb63a1af0cf38bac082e0b961c79783034a12600000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000498000000000000000000000000000000000000000000000000000000000000066e000000000000000000000000000000000000000000000000000000000000075800000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000cd40000000000000000000000000000000000000000000000000000000000000f3200000000000000000000000000000000000000000000000000000000000011ca00000000000000000000000000000000000000000000000000000000000013b600000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000197e0000000000000000000000000000000000000000000000000000000000001a020000000000000000000000000000000000000000000000000000000000001b860000000000000000000000000000000000000000000000000000000000000177b01000000000043acc6000000006603090600000000000000000000000000000000000000000000000000000000000000000000000000989680000e00000000027af90277830829f084202fbf00830a987c94581b26f362ad383f7b51ef8a165efa13dde398a48703328b944c4000b902048624ba07000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e5961c58754af82c631b06f68d19aef0329cc0b30000000000000000000000000000000000000000000000000003328b944c4000000000000000000000000000d3c20b5ce963b9d7ade66c01023f63aff68bc1cb000000000000000000000000000000000000000000000000000000000000759e000000000000000000000000f9d0b0b11c55defdb635c8bcc1a65ab5188ffe0400000000000000000000000000000000000000000000000000000000000001447efbdeef07f0f2080075d76d1d0afefa64aa41cfa08321d5135b2fa7fce56bda000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000038e280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec3a03fc0e58b12802aa5022458678375e4eb96a909c80d7f648c588aa9919917279fa0779517565c9954b15ff4d09ed715b0d02746bd32ec7e22036585d7ff5255cf23000000b1f8af831111ae841c29c7208301529c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c000000000000000000000000d799f02456cb96496af2e851ef42476ad43935160000000000000000000000000000000000000000000000000426ddfe67d28c0083104ec3a084139c52a998a8fe5c0bad1e014128efe4932091d06a9175b1e408c3acc6184aa05e8278540b7aef2b549c2d6a5e3050b680ca62e684539ace6aecdaa40576b6c7000000b1f8af831111af841c29c7208301529c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c0000000000000000000000001387206062803f7f343ccb79ebcadea44ebe2e2f0000000000000000000000000000000000000000000000000426ddfe67d28c0083104ec3a0af45bb15bc6ceaae0acc495e5795f6844fae52cc2afa3b39be198016342db6f6a0734ace753f76e53ea7b327d27fe64ddcee7aaa5a48d8ad9642e09aaa9e8dacd1000000aef8ac0b841c29c720830161379406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c6900000000000000000000000000000000000000000000000000000000004be11983104ec3a017077e130e10cb386969ec690af223056dfd65d6fb826a4e5f89bbaf295cc869a018d2c3d6cbf241f410aeafc1681a9721a4feeed24b3fded75cf67ca87648912b000002d0f902cd15841c29c72083040ea29480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000205efd70000000000000000000000000000000000000000000000000000018e7bed9871000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000021081cb000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000a0dae0ca50c5eb8dcafa71d416d3f77597fbe79c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a047aa0887bb2643e5ad31d4a254552a7216ee5046bb1b698455bf12e7c2ed7a90a05188da1bb93a6cec86c49b995d857c2d0a71184a7c5759e7740692cb79e7f55f00000390f9038d07841b6b0b008306f8669474670a3998d9d6622e32d0847ff5977c37e0ec9180b90324186aaba2000000000000000000000000ff428b209697c64f8d2d3e23d88e95e7ae2306fc000000000000000000000000ff428b209697c64f8d2d3e23d88e95e7ae2306fc000000000000000000000000c7cc19ef9a37cca9855402f14ee6ad16d36fb571000000000000000000000000c7cc19ef9a37cca9855402f14ee6ad16d36fb571000000000000000000000000000000000000000000000000000258000f07945b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000012f525c1dc6f6f54b506060a746110fd26f26864d2527168fbac027466a0441e26a37ab98d678c6d8229debfd490e5fc4406c456ff9a07a51c2964ff9c7effb67ec8817337bbe3cbe5f9ccaccc9bfd520b47159ae2a30869327359ea85b402965554b6d2f7870ad81601d62e81543fbf7dbe356996a3d7b669924cc579fc52ccfb0e2b1409265c9340e495b119360eb75523869643dce1ac006d980984c535620d8467de329641fd7b62bf0536946a92d746ae67931a2370ff3b957b9dee5eca57bf16a2e5482c98c4355318260bb0ec931c4561ce7a50485dd46f140c56a73fa1fe8adcde644b661dbad7adbd30864e795c1fd7ee0642771ed05d32a200eb24107efa080c8db5b35ec87bd296378a7513dc574a0a8d6712f01801a6a83b6db9140d1afaa0477d65bb15183b33daf3e1002fba63bb6b46f114fdc5a82ed18fb812c1329d1be59ebbf55e2284e6810c2c819fcc36bf71ac75d4e77782bcfb87a8909cb00622f7a5a32892f21306c0dc00234a47d4bdaa8fe0151446a745e770073ea0d6078ab324e8ed79a3393b6921ec837e7132364230e5274c765b95a8a1f74aad09099a1d3b42acdaa390cf8d9cd4135a55fcd66059ecfd4c3cd84a90db9847a8d921633b3d96fa2185f5a985e455a044c491972bb01970a5673492c8679dd08d48411e24b167dd4cdcdeee1e2b2955f04dfeb68ada073678aa0919d9608b5d278ed601865b3dfb9746459e64a573bb617c7f8e8a2639f10e41bed4ebc15ba4409fb296f7878186e544bf73d21bab49e97f4c5569b03439248ab023cb9a244683104ec4a05c64033e21e83f2852a67ac27709dddf292f43a0138ae58c38cb8aec7b17a3a2a01e28f0a406e2d13bcb72b99bd468771a55b65847772ae84c798c5bd6bae56ec700000210f9020d05841ad27480830267d294aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000320c56a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000000000000000000000033ed5bed42be70000000000000000000000000000000000000000000000000000000000000000083104ec3a02ba17e8b51764c6f68fe8e29e56576f51416f501e47298bd3b41be0789653c28a04f5c5688198e03d625e69c62a5860207949ff03890953e4027d8a66f797c1b0c000000adf8ab0e841ad2748082e89494f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a0ed0c29fb6307d37ad5b84d5280bc52c9faa2c435160f847b586f5acaa01dc1a1a074a986e7becf2b8c5e694f3f9b1a9de3219f2a878eb5e468d4c5221ad0406bcb00000072f87014841ad2748082ecff94a0d013b84fbaeff5abfc92a412a44572382dca08865af3107a4000841249c58b83104ec3a0a70ca4f4524a6109a046dd64de4ecb5138feed7c92b5a18eb65ce6cfde7005cfa028742449538c4c94a1ac3181ab4f2f6839f026b1a3643c63fd90c573284dda1b00000597f905940f841ad274808308e4fe944e998615ad430c1ca46a69d813ede6eb3ec55edb87038d7ea4c68000b90524301a3720000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000030275b89f5789800000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000066030b500000000000000000000000000000000000000000000000000000000000000003000000000000000000000000ab5819ac14dc28008e63ba0b8159495c06acde9e000000000000000000000000585245f79829fc75f8e2fd224b90d19449c6a0f6000000000000000000000000585245f79829fc75f8e2fd224b90d19449c6a0f6000000000000000000000000000000000000000000000000000000000000000300000000000000000000000083ffefbca071347df469c4e64820c95b01b957be000000000000000000000000a631b2a2c3469aa1bf5dc49977207f378d16d7d80000000000000000000000003bdb8ee4cabf15a7239cf0726f20ea37d190edd80000000000000000000000000000000000000000000000000000000000000004000000000000000000000000ab5819ac14dc28008e63ba0b8159495c06acde9e000000000000000000000000a631b2a2c3469aa1bf5dc49977207f378d16d7d80000000000000000000000003bdb8ee4cabf15a7239cf0726f20ea37d190edd80000000000000000000000004e998615ad430c1ca46a69d813ede6eb3ec55edb0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3cb000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000000000000000000400000000000000000000000006c1c420c04f4d563d6588a97693af902b87be5f100000000000000000000000000000000000000000000000000038d7ea4c6800083104ec4a0d8a6441660f20fc6c91ff8bf10cebdeff6db8d7e51354ecc58fb602683551563a032962f4928d52af98506c47bd1ef7599325b1a713b89cee840fe6b8cc456383d000000aef8ac63841ad2748083066ee494ec53c830f4444a8a56455c6836b5d2aa794289aa80b844962941780000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f0688000000000000000000000000000000000000000000000000000000000120668883104ec3a0eba3f5004bff6e9beddb1df6e0db58623d5ed8cbf1b767f2ca34a4d81409c651a02bfa80d7a63b1384398e80a7d61ec53d1ebafdaaf99d4ff8d741bddb6a5017b20000008cf88a45841ad2748082ab1a94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec3a042d14df620658bf6a551c06ccd30e2f04fb28d3492a97f359147354e5aac747ea0170b85008421c32336b8d89a682dfa1deeb4754949c98ac21bfec66251f335540000016ff9016c20841ad27480826e8e9447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000403633396637616538663934613464663630323961303366643830333761383837323264383064356136653265666131376537303530633738353730623463613300000000000000000000000000000000000000000000000000000000000000403430313462396265653466373934346264313839323561343361303163323864636331353037353562613436646333623636663136393130343238613763633783104ec4a08e3068a36c592243ad71c7ec408660d063985f3c12558320a36aca7335ea70c7a01b12c5c4a55abd5cc7a8ae3089ef7de1338498c67912f12fa9fc1da8cc5acfbf000000adf8ab10841ad2748082679a94b65ad8d81d1e4cb2975352338805af6e39ba8be880b844095ea7b30000000000000000000000002db0afd0045f3518c77ec6591a542e326befd3d7000000000000000000000000000000000000000000004ef81231e69da0fb63ee83104ec4a080b6d9c83ec16fa443cf544f283e44a9ee04689503a9d71e62e636502bbbc4c3a0641a349ea60010f88692a7545dea558dafc65e8a0fbfb06ffdcc39eec29c406500000000000000000000000000000000000000000000000000000000000000000000002fcc02000000000043acc7000000006603090900000000000000000000000000000000000000000000000000000000000000000000000000989680000f0000000000000043acc8000000006603090c00000000000000000000000000000000000000000000000000000000000000000000000000989680000f0000000000aef8ac258435a4e900830161139406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b30000000000000000000000000122960d6e391478bfe8fb2408ba412d5600f621000000000000000000000000000000010000000000000000000000000000000083104ec3a059385c2658560e9e1e62e652d3b6cbf85c4947bcd2e6dd8cf0e4f9f58e5e3b35a0492325e052fc52d7ad695c3e1c9c5c8ee95c891c9f1a706d5b1e5b7d8f345e9600000073f871068426be36808302067194978132d279905cdfd0d80af13bb9dd2066076099862d79883d2000841249c58b83104ec3a021b2c3bb04bdea993ba86308794373aa3547aa23adafeba9b4b64d3004e20430a0656d8ebe00433595082dcf3b47859ec3746dfcda6ffb0b302ec1cb9470964ad600000072f8708303a972841d8119c0827b0c942a03256195029f21594d03b71367e874b98369bb8703eb2c332ff0068083104ec3a0cedd197b18f95501ccb1938b0bfb791737b5a54846093a7c492695b7b9a32e04a02f4d44c199d3963f575eca6d07b14b82474b574437081ff6858cec10cb31abb500000095f89316841c9c380083018a43940241fb446d6793866245b936f2c3418f818bdcd3880b0e11a89e598000a4b6b55f250000000000000000000000000000000000000000000000000b086849b46f800083104ec3a09445d5975e0524ba981f5dff888f4b5235790f4e3784016b4cd1611a3647febea00c9e9bce629d48895925e2bcd377ab846b537de9a50dc764f9cd41221a096638000000aef8ac01841c9c3800830163539406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a04c4f4c22bad767e0912848437903d47587b30d659646bd601a862bbbb4366befa0431fe80c2c6b5f347940eb7c2341e5aeebf5469f904e95e0abde7c2290a1a523000000adf8ab0c841c29c72082eaba9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12f0000000000000000000000000000000000000000000000000000000000f9f16d83104ec3a00d8d15eb86c813dd8d3c8e6b503ecccaa0b9db8464d02d43b59694013e71196aa06ce267796ee24dc88369e49af8877072718c1cce8fb7010ea992d643156436a2000000adf8ab09841c29c72082eca29406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a0c34ae30a24a494a9eb4e9416287a24def677baaa6296941142ebcbf65e95caa2a01652b61e30c6e84d43ebb4611e70f8925c8925354150bc9ab1926eb7a59001b200000210f9020d1d841b6b0b008302b89794aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002154fd7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001000000000000000000000000000000000000000000000000022995260e51b1c0000000000000000000000000000000000000000000000000000000000000000083104ec3a001ac7b4e716fcd997508ef2ff0db4bb568f5fa64522d0e302d1162ac69907266a0530eb83f3ff54a7fa296e1cf2d1f1b4152a7d84cfc250586fb0d6a9f102d959f00000275f902720e841ad9524f830a90a7941502d025bfa624469892289d45c0352997251728854033d6d929b90204ac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016496f639ed000000000000000000000000ec9e48c59d388bf55d55fef2120d427cd3d5168c00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000002f3a0000000000000000000000000000000000000000000000000000000000002f7c400000000000000000000000000000000000000000000000000000000000003e40000000000000000000000000000000000000000000000000000004033d6d929000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066124b440000000000000000000000000000000000000000000000000000000083104ec4a0ffe3a30fdd5bca926295fa0b1d51bb45fb885c8288a5087a660790213238f5f0a026ac2b2e3e2959d18261176fa0dab6663676710a3e43b4eafe494be651cfe7f20000006ff86d18841ad27480827bb494a49a2afa779f4dfbf4e1c36952c1a5a4d9a8d96a8087646174613a2c3083104ec4a02e843fdc0ece6e86f7271a9e0e708a11ef90275bb115717cd7f7ebf82b504b16a03e6783607a46b6dad1e8f36aba497f21dbe923ae45436d09cb03ccd9cea90de1000000adf8ab13841ad2748082eb7a9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000018b71386418a9fca5ae7165e31c385a5130011b6000000000000000000000000000000000000000000000000000000000028124783104ec3a086ba8a486d0e641bb1b4ab77ea2ee73aadb531519bb890bfb46aded41b1660c5a07710a68ab768cbd9da53fc3f0c68a5ddea1ff8a8d5f7dceef772de521b5fd16b00000bd2f90bcf820696841ad27480830239c394ce16f69375520ab01377ce7b88f5ba8c48f8d66680b90b641a98b2e06bd74f273376604d935a488cbebbaa579001bd04a8876b22f71fc5802d0d194300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000087d0fe00000000000000000000000000000000000000000000000000000000000000046261736500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078636531364636393337353532306162303133373763653742383866354241384334384638443636360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000091dc314e8b095d8a0d04ca5353b4ab3b3a2b86f2000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f4052150000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f405215000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000044095ea7b300000000000000000000000033d91116e0370970444b0281ab117e161febfcdd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f4052150000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000033d91116e0370970444b0281ab117e161febfcdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f40521500000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000000000064000000000000000000000000ea749fd6ba492dbc14c24fe8a3d08769229b896c0000000000000000000000000000000000000000000000000000018e7bd2f218000000000000000000000000000000000000000000000000000000000087d1e40000000000000000000000000000000000000000000000000000000000868d610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f4052150000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000100000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000044095ea7b3000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000012418a13086000000000000000000000000000000000000000000000000000000000087d9220000000000000000000000000000000000000000000000000008b47f4b6a119600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000091dc314e8b095d8a0d04ca5353b4ab3b3a2b86f20000000000000000000000000000000000000000000000000000018e7bd2f219000000000000000000000000000000000000000000000000000000000000000100000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000761786c555344430000000000000000000000000000000000000000000000000083104ec3a00ba5486806127ab61a698a3a84fcb66f44131141b8c38622bfb87f5c4cace47ba077475ad41ee72bda3edb00843191e1eba6c6ecf55bf5c136642dbd648454f3f600000170f9016d81aa841ad27480826e8e9447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000406234303937326339353833383562353231306136306462333163313231376631303832366530353561303136316564643863333565616131366133323137376100000000000000000000000000000000000000000000000000000000000000403236613333663364383165373733396132613938616634383564383930316530333832376232613430393865313462303261383737653930386530376463633483104ec4a01af0c3728d0d7c11e424b472599ec77e0b0b15ad2d859da0290b8a0d8c756901a07c3dc394aa52bf1ed369ae938290329f1dd81f15c04ba9ac760f3c6cca47a7f9000007d7f907d426841ad2748083035dfe940cab6977a9c70e04458b740476b498b21401964187030429376a1000b90764a4d730410000000000059e1b6601d06d916bbe845c424dc9317e8b815ca18f207a12c84a03fe10bb5c151ba666295da9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0ca6319198958c74570a8e547538262ae993ca117a0e481f908209137a46268ebea49653b798e1cc5912de2b287648df6cd3a8dfdd14d938cc889223e29d06e430bf3320f1062480100f29d53789c2142cd1804081c1f2d765e838623dafc1d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000680040000000000000000000000068089c372275512e09f5359f82ce68a9d46ce19003201000000000000c803e8916bbe845c424dc9317e8b815ca18f207a12c84a0000000000030429376a100000000000000000000000000000000000000005c10000000000030429376a100000000000000000000000000000000000000004de0000000000030429376a100000000000000000000000000000000000000005d10000000000030429376a100000000000000000000000000000000000000003ed0000000000030429376a100000000000000000000000000000000000000004d70000000000030429376a100000000000000000000000000000000000000005c40000000000030429376a100000000000000000000000000000000000000005c20000000000030429376a100000000000000000000000000000000000000005c50000000000030429376a100000000000000000000000000000000000000004d30000000000030429376a100000000000000000000000000000000000000004d10000000000030429376a100000000000000000000000000000000000000004d20000000000030429376a100000000000000000000000000000000000000005c60000000000030429376a100000000000000000000000000000000000000004d60000000000030429376a100000000000000000000000000000000000000005c70000000000030429376a100000000000000000000000000000000000000004d50000000000030429376a100000000000000000000000000000000000000004d40000000000030429376a100000000000000000000000000000000000000006840000000000030429376a100000000000000000000000000000000000000005930000000000030429376a100000000000000000000000000000000000000005940000000000030429376a100000000000000000000000000000000000000005950000000000030429376a100000000000000000000000000000000000000005920000000000030429376a1000000000000000000000000000000000000000058c0000000000030429376a100000000000000000000000000000000000000006850000000000030429376a1000000000000000000000000000000000000000067e0000000000030429376a100000000000000000000000000000000000000005900000000000030429376a100000000000000000000000000000000000000006820000000000030429376a1000000000000000000000000000000000000000067c0000000000030429376a1000000000000000000000000000000000000000067f0000000000030429376a1000000000000000000000000000000000000000058d0000000000030429376a1000000000000000000000000000000000000000067d0000000000030429376a100000000000000000000000000000000000000006810000000000030429376a100000000000000000000000000000000000000005910000000000030429376a100000000000000000000000000000000000000006800000000000030429376a1000000000000000000000000000000000000000058f0000000000030429376a1000000000000000000000000000000000000000067b0000000000030429376a100000000000000000000000000000000000000006830000000000030429376a1000000000000000000000000000000000000000058e0000000000030429376a100000000000000000000000000000000000000005890000000000030429376a1000000000000000000000000000000000000000067a0000000000030429376a100000000000000000000000000000000000000006790000000000030429376a1000000000000000000000000000000000000000058a0000000000030429376a100000000000000000000000000000000000000005870000000000030429376a100000000000000000000000000000000000000007620000000000030429376a100000000000000000000000000000000000000005880000000000030429376a1000000000000000000000000000000000000000058b0000000000030429376a100000000000000000000000000000000000000006740000000000030429376a100000000000000000000000000000000000000005820000000000030429376a100000000000000000000000000000000000000006770000000000030429376a100000000000000000000000000000000000000005850000000000030429376a1000000000000000000000000000000000000000067383104ec4a0d7537cf71019beeeef38dec63e1552a493f7b93125ae44c25bff446c8fdd53e3a018221bb17b86f37e17a92bdd74885f288ed3c3088ee70707a88651088318f369000000cef8cc04841ad274808304029b9411fcfe756c05ad438e312a7fd934381537d3cffe80b86469328dec0000000000000000000000005300000000000000000000000000000000000004ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000073f9ce3e0f57c2b1756061b6890d69cf961fc71683104ec3a07ab506510c7b06ae1e9fdce1a9b665693ca7919c2d3ee09df0d11790414bd1cfa016478eed5cdf6b904a877df6d6a17174e74b02ec883f9dfa5b08a9badd8dd2a000000074f8721784283baec0827e609487627c7e586441eef9ee3c28b66662e897513f338807a58b94a73d800084db6b524683104ec4a09985a299a2ca70c4118d3afbea6c62ed59d80898ba8049ee8c8ea8408fa6a8cca02a1d4cf86bfad3cf126c1d3490b13165f92e141ecc094a6c1b431d11f0de28b2000000aef8ac0684202fbf00830120b094f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b3000000000000000000000000efeb222f8046aaa032c56290416c3192111c00850000000000000000000000000000000000000000000000000000000000569fa583104ec4a0df3ee7466d929537ed0ed740f5a2704f2050e679aad0e75d1d36098b57246986a02b89a5a1a62701fbeddca8165a8cfeaaef00c6a4888010a4dce6769a5af3bbc50000006df86b09841f78a4008302a43b94718aa132efee7c549cf0d732134f868a0f2c604d80841249c58b83104ec3a08a3d077978fd3e6076ea8b0e09ece3588244b6abcba043e19170ddf32ed3c07ba03bf98ef558e903bacf2ee402255e3825dfae38e2a0725e51baa5370362708ff9000000aef8ac20841d8119c083047cd994ec53c830f4444a8a56455c6836b5d2aa794289aa80b844830cbbbd000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000030c47107dca8e2083104ec3a08188c5d85db2fb3c428751ef565031fce3597a1e5ccec338570ead5d8c53edcba06cff8e0ddf358742d0731e67ec8ff9b436917365e969b3b2ffe95fd2aaeb617c00000093f8911a841ad27480830177109416c0baa8a2aa77fab8d0aece9b6947ee1b74b943865af3107a4000a440d097c3000000000000000000000000739815d56a5ffc21950271199d2cf9e23b944f1c83104ec3a042bc7d5b2ad88c6760278b9aa1dc611a8dae979944bbe5af180eba3ee79b3001a043e2cc45b6ec3a8bafa0f2c084a6ce23ac86e3ef96df0a75e4f545a17f3858a0000000adf8ab0a841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000000137083a83104ec4a0d16e001887481b4a553331a8f76b05e60b5a629b220e111263904169ca311139a058d4cebf1558fe8a3707045c4cc4eeabb8581f64faff114d3776cda413f0e897000000adf8ab0c841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000fc30937f5cde93df8d48acaf7e6f5d8d8a31f636000000000000000000000000000000000000000000000000000000000cf1a64b83104ec3a038fdfacb0355f6a3931ed712bb989ee8b4629ac4d65d4926a997eb7e6db178bca0036d3124c13c4dc4b1b54008adf0a5acd017da2c3a783b506667ae08f25b459700000217f9021417841ad2748083025b2294aaaaaaaacb71bf2c8cae522ea5fa455571a741068711c37937e08000b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa947100000000000000000000000000000000000000000000000000000000010f7945000000000000000000000000000000000000000000000000000000000000000083104ec4a065c7e33cd77a45b2bfd6751fbcb35526c5a1ed017a99968761f73f6a6ed53962a06f06ee3ce7a4d44baf84b18b404709aa3164c77c114005ee919131e3f8a202ac00000210f9020d2c841ad27480830267d294aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2c7c530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000100000000000000000000000000000000000000000000000000f9a085e877a3a4000000000000000000000000000000000000000000000000000000000000000083104ec4a026e5a0043a217b6556efe3c85a1e7ed9b5c800422acb45d2ee089abc7e61c04ea04eaa7703fb3f29a1353c0343c925be4b2e24299764b49eb06221b57cd6f7820300000073f87102841ad274808302067194c110be1cb504502504623f043dc7a3fadf242c72862d79883d2000841249c58b83104ec3a0913d18d1a8909bd664838a1aa807d7b21e43916fddef32764601f89756390fc2a0743b5cc93d16a7956cd45c45923d787dc9abcefd09f06837638038744e85aca100000073f87111841ad2748083020671949fa57d91d457059f03fa323d60c410a32884e396862d79883d2000841249c58b83104ec3a050f5a8624efccc88ad5d58bba87eeb9813fad2d534367ac7ace528ff52b55ba7a04d59c00b2524ae66e72589a8aa512c2bff925d1c092e7312e5f1bfe624b8af4400000281f9027e01841ad27480830249f08086b5e620f48000b9022360806040527389a512a24e9d63e98e41f681bf77f27a7ef89eb76000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161009f90610185565b60006040518083038185875af1925050503d80600081146100dc576040519150601f19603f3d011682016040523d82523d6000602084013e6100e1565b606091505b5050905080610125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011c9061019a565b60405180910390fd5b506101d6565b60006101386007836101c5565b91507f4661696c757265000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006101786000836101ba565b9150600082019050919050565b60006101908261016b565b9150819050919050565b600060208201905081810360008301526101b38161012b565b9050919050565b600081905092915050565b600082825260208201905092915050565b603f806101e46000396000f3fe6080604052600080fdfea264697066735822122095fed2c557b62b9f55f8b3822b0bdc6d15fd93abb95f37503d3f788da6cbb30064736f6c6343000800003383104ec3a0ab015f7c152ac6cf727e71b7d563e4eaa7cf172067a80b72a27b725696946620a05d590c8fa01e05871908cb03b2fcf93823c9311b1511f06939609fe06834734900000210f9020d04841ad27480830267ba94aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000000000000000000000000fd4f0b43cdc1000000000000000000000000000000000000000000000000000000000000000083104ec3a080477cee851db13b7be8cbffc2f18c17af3d347bd6cfcd2793293861a475eb85a05a3c594e24f173b95a6e00a9ce4f523ba8d530a9fb721b96ddd4d95a9cf640c7000000aef8ac08841ad27480830999ff94ec53c830f4444a8a56455c6836b5d2aa794289aa80b8444b8a35290000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f0688000000000000000000000000000000000000000000000000000000012115208083104ec3a02494e24fdc3fe34a06d7251fc1359154f7797ceda668b6ca1c662644fbf1a215a01e338467d6c111789312da503e13094ef6a47d68b19ce6f95e3541b7563c85dd000000adf8ab098417d7840082c08d94f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000026cb8660eefcb2f7652e7796ed713c9fb8373f8e000000000000000000000000000000000000000000000000000000001ed2fcf183104ec3a0304c92fcd91dedddee46f1a09880dfc40bb35ad7b71d452f09ca53ebb828c54ea00c8f21732c451b5a382e081d5b5a65c119d6fd6a07e7ec14ed9a03d38415037000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d2f01000000000043acc9000000006603090f00000000000000000000000000000000000000000000000000000000000000000000000000989680000f000000000072f870830849fb84283baec0827b0c943b1d30d4a8d52ac398d80402941e11c65b4aa483873843aae74ed0308083104ec3a0360ca28be08a53b7eba64911972d829449c3aa1e5a48d22b18a8ec05e334f04ea035e7b18452cd67e54483e30f7217e2a33b16fcb7670322982b7a833229dd33db0000017df9017a12841dcd65008301adb98080b9012560806040526000805461ffff1916905534801561001b57600080fd5b5060fb8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c55699c146037578063b49004e914605b575b600080fd5b60005460449061ffff1681565b60405161ffff909116815260200160405180910390f35b60616063565b005b60008054600191908190607a90849061ffff166096565b92506101000a81548161ffff021916908361ffff160217905550565b61ffff81811683821601908082111560be57634e487b7160e01b600052601160045260246000fd5b509291505056fea2646970667358221220666c87ec501268817295a4ca1fc6e3859faf241f38dd688f145135970920009264736f6c6343000812003383104ec4a0ad518686cd77228e8f062597a92cf773a0470a15eadd8b9dc8c54910d37e7a66a06e148d29a567d8eb4d8921c358682f5cdf056143346b0a5d4342e38a3e99df9b000000aef8ac07841c29c720830149aa9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c6900000000000000000000000000000000000000000000000000000000008f24cc83104ec3a0442ed8380de187b862f5eaf2017d8c33a02fd7f71d180280d8dd6cf6c7a6fd0fa0071b96b62316b5f9717542ff6595b4438a537e98c6744c43a1edef235b24d7ea000000aef8ac18841c29c720830149cc9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a741060000000000000000000000000000000000000000000000000000000002031e8383104ec3a0ef27913a67a82a170f0412967c0c5487fa4145c286ff6353d49f8c473b36d5dea01d3701ea33351d082de532e400f06eaa5faef235b9a9ddd5fbb666bd10722029000000b5f8b308841c29c7208303fe7d94ec53c830f4444a8a56455c6836b5d2aa794289aa870a521505129000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000000a52150512900083104ec4a086c70539d84a46c289c3774baf27161d96eca84432d3ad0fcdde26e52c23ea44a03d565b139e80d3dda4e8048220d05500fc9bdadaaa7f36e8e7966217ab261bd1000000aef8ac11841c29c720830149bb9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c690000000000000000000000000000000000000000000000000000000002b0ec2083104ec3a092f06c1af9d099c8e5c192696eff2ebea11a01d25fa0083851edd90fc93a9184a05d811acfbb7161d9ffd8c57cee86c092db32c01dfb56fc6fd27c7dac7e1127c5000002b7f902b41f841b5bc8c08306b798942db0afd0045f3518c77ec6591a542e326befd3d787740818d25d4000b90244ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000014475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a5ddba6fdd5c599a4b0b9379fe28cbf318687ff300000000000000000000000000000000000000000000000000740818d25d40000000000000000000000000000000000000000000000000000000000006ed9d030000000000000000000000000000000000000000000000000000000066030b5d000000000000000000000000000000000000000000000000000000000000004253000000000000000000000000000000000000040001f406efdbff2a14a7c8e15944d1f4a48f9f95f663a40001f4f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec4a04a015249d635ebe05905dc3721c2db492d5490c2fba87d0e5098a92fef1d4a56a050ee7894564d32e9bb1b9862e354864defca236097a8da03a401d4d1530e2b01000000b4f8b22d841ad2748083043a87947dac480d20f322d2ef108a59a465ccb5749371c4860edcee952ec8b844f5c358c6000000000000000000000000000000000000000000000000000000000000a4ec0000000000000000000000000000000000000000000000000000000016a6f3c383104ec3a0f564e165f7d0ec60f0fdf4cf5ee5f86273cb24a87815f6fa3e30b4d24193b335a0767c356448ead916337c9bb7a48b9b61031bf897f707b7cad837f34eb4989f8100000a17f90a141b841ad274808305e1d1946352a56caadc4f1e25cd6c75970fa768a3304e6487470de4df820000b909a490411a320000000000000000000000008d2b7e5501eb6d92f8e349f2febe785dd070be74000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000008d2b7e5501eb6d92f8e349f2febe785dd070be74000000000000000000000000bf646598aae1aebffff243b7460c299e19610d9800000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000000000000000438ee63000000000000000000000000000000000000000000000000000000000443d98500000000000000000000000000000000000000000000000000000000000000000000000000000000000000003487ef9f9b36547e43268b8f0e2349a226c70b5300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000005600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004d0e30db000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002449f8654220000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001045761880400000000000000000000000096cfa2a369ec67a93c324a35e693fbeea11c0594000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008d2b7e5501eb6d92f8e349f2febe785dd070be7400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003f8c7d3063579bdb0b90997e18a770eae32e1ebb0853000000000000000000000000000000000000040001f406efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000648a6a1e8500000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000353c1f0bc78fbbc245b3c93ef77b1dcc5b77d2a0000000000000000000000000000000000000000000000000000000000443d98500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f86542200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f9900000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000bf646598aae1aebffff243b7460c299e19610d980000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec3a0e976d4e03f5dbc387027934cc0eab6d42d995b1dcb41514d28712794e89dddd5a0390e8545628ddd1e88860718a4b3855adf9d99173bb11e1237de28009970afa1000002d0f902cd09841ad274808302a1349480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000cad3995af2f2680000000000000000000000000000000000000000000000000000000066030dad00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000c9f18d500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000003d5870b727f347bedf045f3f55ee430587b22c9d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a052096576a969f41097a5f04e1d1cd03791e6ffdb75658c6617279c5e77636e3aa04b652d544c1f8b07d001116ff199762fdce2c4055b165b865f8b5def2e553b91000002d7f902d40a841ad2748083028d879480e38291e06339d10aab483c65695d004dbd5c698731bced02db0000b902642cc4081e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000002ed863800000000000000000000000000000000000000000000000000000000660337e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031bced02db00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000078ea8e533c834049de625e05f0b4deffe9db5f6e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000703de8951c7042c3262943168217ce94c89810220000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0e79f5801cc87a91aba5476097bf3054bbbe6797470d33642052b7589acb7461ba02e05d051900972bbdc2341793dc757ddab68d7aa026c6836ddf825709a66b994000000b6f8b432841ad274808304e68094ec53c830f4444a8a56455c6836b5d2aa794289aa88061cc1d9010541f2b844abdb5ea8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000061cc1d9010541f283104ec3a0160427007cd65553c28d9f87cd50394cc8be13082bb3d20216a09035e926164da01f68d16b088b8d317e8f6607455b07162e14f767724811d85a8f00ed1c54458500000310f9030d03841ad274808304bead9480e38291e06339d10aab483c65695d004dbd5c6980b902a4353766c6000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c7000000000000000000000000000000000000000000000000000000004001cfee300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c3ace79098d291c10489c165d72bc7089aa9790a000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000119abb000000000000000000000000000000000000000000000000000124a38acc3e770000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337e3000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000411334a2a2b1c2bb18463bf09af0b8e3be7d7c783652fad4eff628f2c263cbb7b00adbcd75494a604d8f6e3a8cdab02ad0164d6adc8894c64a721105ece52f0e411b0000000000000000000000000000000000000000000000000000000000000083104ec4a0cad600fae8943c28e2d9da00b98cdad5747c3516b3118b16cafe19fc3a579aaba00cdb657c43fc1f595f41af5574fe01824eca228bd308a6405ca259672a1d94db0000006cf86a0d841ad2748082678094ffc3b2cf9bc079c26ddf8837cdae426fd30f72c68084b49004e983104ec4a041b17b2571a62e11d0b13a0d7a5a9adc336e0fac3b1cac45f20c22792d7aeda6a01a7bc2cc94ad11637bef6575f0e088b2573d21a84ff141ec765dc3c965ae3733000000adf8ab1c841ad2748082eb869406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a7410600000000000000000000000000000000000000000000000000000000001b9d6383104ec3a007030700fc9386c23723fd9577f2165a320d7791b04f48647f8fdda243e7d85ea051c87d5d16d09410bd626530123c4476c09cd2c46fa661960f379924472b8e1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7701000000000043acca000000006603091200000000000000000000000000000000000000000000000000000000000000000000000000989680000e000000000190f9018d0a8422de64408302ca6b94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a13086000000000000000000000000000000000000000000000000000000000002e006000000000000000000000000000000000000000000000000007d80813d322df800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000475f01342d61234767c2099b100fb52f06eb77cc0000000000000000000000000000000000000000000000000000000066030b0100000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf10000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec4a05212bbd6dd8ee6b233c4bcc02fccdfa727f743663008ba00e302880590998374a060b933ae52509ff098304815d8a6b7f6cd6409f06696dc53ce6ad797bf4ce6a100000190f9018d098422de64408302ca6b94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a130860000000000000000000000000000000000000000000000000000000000021a30000000000000000000000000000000000000000000000000005c9b7aab58cbf000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000092ce7f1504a8cb95627be59e916bdc6ee69c23ad0000000000000000000000000000000000000000000000000000000066030b0100000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf10000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec3a0d33b7ddf0505d1acca3b5a86737bf0293b3851d2689c6c9bfcf50e9c9b7fe4f4a039419f6b00e623699dfe35f7ffad0ffd34046e2512d51ce4844a11db7f410a9100000070f86e15841d8119c0827b0c94e4edb277e41dc89ab076a1f049f4a3efa700bce8880cc4ed5711fd37aa8083104ec3a023fc2e8fee511b3aa3e1d04dfda83b7170630de49664bcb23dc2c087e8f0dd73a031acc3a189928da5c02546227c3b8fd3647c10548eb5315c764d4abdec6f1f62000000adf8ab13841ad274808271b894530000000000000000000000000000000000000480b844095ea7b30000000000000000000000006352a56caadc4f1e25cd6c75970fa768a3304e64000000000000000000000000000000000000000000000000000000000000000083104ec4a0e5b98f5710c6803cef3aeaa136e56f9cfad5b2f213e80318de8537ff5e243768a01e4a0ac5d0bec90d791b8436af2047362e82a28689fa10da0fcac1099794f169000000b5f8b302841ad274808303dc7994ec53c830f4444a8a56455c6836b5d2aa794289aa8712cf6e5bdccaccb844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c0000000000000000000000000000000000000000000000000012cf6e5bdccacc83104ec3a068eeb09d6e2492dabb83bea9c7f8bed36890d3a6dd3ce0409f3bad932e658bf4a03395a3f0fc0bc7dc03ffa64c0ca1c35af3787a1216b182a53cf3ff882f2c17f70000006df86b02841ad274808302067194f4d4e95c1a35381da8e2da1062dcabe9d58fcc9c80841249c58b83104ec4a0d4ea964e2af54269d7f305891ba40f4d8de45cd3a62943ba339601de5832a2dfa050ae51a34909d4449c39ff4b129cba5d698a46ef7e92f741a36cf510d749913a0000008df88b8182841ad2748082ab1a94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec3a0c820bc9addd7e44bd58ad16e365c58eaaa1ef160181dd7cc6225e21a504df5d5a0628397057668b4dbcae996d6ada3a4e86e496d555c1e2281582636391fb0b59d000000adf8ab57841ad2748082c1dd94f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000025ab3efd52e6470681ce037cd546dc60726948d3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a03571e91e056c8ece33c49832d9bc894871da5b32edab58a91d5a9686ce24b364a0751fc29a0af97278eb59dad878a42168cf1a71f1a6b50a34d052b9f3e4daa44400000190f9018d15841ad274808303655c94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a1308600000000000000000000000000000000000000000000000000000000014fb180000000000000000000000000000000000000000000000000001580fb87f3bbcc00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a220c0137d2d5b01782298b38418bbb176b4b40d0000000000000000000000000000000000000000000000000000000066030d5c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec4a0bace7ef791e4a91852b296d4e2559b9323fd62a88309dfa358d0f50e497422fda033ab932efe329778875e0910d8c3112a5fcbbbc735b65615f3be9967d7b11c97000000adf8ab11841ad2748082d33c94ca77eb3fefe3725dc33bccb54edefc3d9f764f9780b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a07f8ce359b34b6f4cd44731e27dc28d77c06000076e9410b7449d37a20bb70195a004d168f42a20735ee67160787c97bb2ed0af47704b6881c948bc109f988e824900000073f8711b841ad274808302067194c2f494b48ad2f056a8044dbee2de2271decf9171862d79883d2000841249c58b83104ec3a0ab4334a7b07567d78b9c4dadfe8a1d5c0a961d11226b0a3aaaca3d036a798d2ca07500d734bcbc44d932c33e1ce9d176d0f55c0975b6f11548369afcb1a3eb61b800000074f8720e841ad27480830206719454a4c52cba8a270a04626a83a48a205c8b7981058701476b081e8000841249c58b83104ec3a0f12e8c70b01cf8f0b046c4b4401eb4ebff4045a98765d02d8d0dbf7e5332413da0617625a549d68692124872775f6bae1f6c8f51b8781fba5ac454915f65e20265000000b5f8b310841ad274808303dc5694ec53c830f4444a8a56455c6836b5d2aa794289aa87470de4df820000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c00000000000000000000000000000000000000000000000000470de4df82000083104ec3a054883d0ae061f43811276eb77ce1e4439ff1b0d6894ebd9df345c7c8d1ddc21da00c1c04b375d7b6a2dc5102306065b72a187488783c5d8a10fc6e4beb873bc79100000390f9038d16841ad27480830493d3944e998615ad430c1ca46a69d813ede6eb3ec55edb80b90324301a3720000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000076efcfcd0000000000000000000000000000000000000000000000000000000076a00992000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000066030b5c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000716fcc67dca500a91b4a28c9255262c398d8f971000000000000000000000000000000000000000000000000000000000000000100000000000000000000000025603aedf9b3ebf600a6058eb6be7b97349c002f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000025603aedf9b3ebf600a6058eb6be7b97349c002f0000000000000000000000004e998615ad430c1ca46a69d813ede6eb3ec55edb000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000006c1c420c04f4d563d6588a97693af902b87be5f1000000000000000000000000000000000000000000000000000000000000000083104ec4a0245a1efa8c2a36d51a30734634cabbfa3f67e04d9c18fe958aa180b5dfa057f3a03aa013180e456fd54b9cb35d2bae11a3e90d7fc057fefb8cfe3207ffae4a0b36000000000000000000000000000000000000000000000000000000000000000000000000000000164101000000000043accb00000000660309150000000000000000000000000000000000000000000000000000000000000000000000000098968000130000000002d7f902d4278435a4e9008303b2f99480e38291e06339d10aab483c65695d004dbd5c69871172e3116d22a0b902642cc4081e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000001095a610000000000000000000000000000000000000000000000000000000066124b500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001172e3116d22a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000530000000000000000000000000000000000000400000000000000000000000028b6778cd97e4dbd97f844981a3e82bf1a83858c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a091b3b4e1da13ccb99f5846d4a8a9928b2fcc0b52e63eb98bd7f8b8762aaa9711a04305a1ffbb3eff8004174a6db652246fb52ffbbbd08f310d14c0f0f985fe597000000073f87183070bf884283baec0827b0c94ac061f901252813ef3184af5f029f429296244f588042b617f68f690038083104ec4a02525c7c78955de896e6cc09faebe7595f41a4480d873ddaa477e6db7bd555543a04414a4e55ccd18a7b1b21ff6e4f3ee2b5f8047a0ac06a86781a1ef136a2524ae000000d6f8d401841d34ce8083046edf94ca8edcc306119143dd010a1d61f31c3380f409bb8813d8616c6ccf0000b864d2d0e066000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000013d8616c6ccf0000000000000000000000000000000000000000000000000000000000000000000083104ec3a00809d93e0e8d1154688426fe38e576caa9161351232271f2810a7d82779a7dc8a01639ecdbe179b6738865f56f5dc7eb5574ff169846fc47b9fc3a7ad4b14fc832000000aef8ac04841c29c72083014ba29406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a0e2fdde7125d66b7ad34b93aa61c7e94b97800cef1e66f4dcd278b806eff8deeea068d9f04054d3310700cf47d9a1cd71538f9d99f4a1547d0f01534ba8a686f16c000000aef8ac19841c29c720830149bb9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69000000000000000000000000000000000000000000000000000000000175eedb83104ec4a0997810c1d831894172cc6a3edf964f445b7d3219cd9e175d304f6f01382e46a7a0481fb7c83d5f098d1b855d3b3b9505bbb9a58528817917948c845de3c30ec92d000000eef8ec07841b6b0b008308225c94ff75a4b698e3ec95e608ac0f22a03b8368e05f5d80b88466514c9700000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe0000000000000000000000000000000000000000000000000340b0e6cfe31c000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0c88bfadc38c767d66658d14a8d87c4aa8e52f406752279f4aca4970ba148121ea05a7ff81741e9256b6dfadbe47fecaeef610d7e20dcf51096d6d5d1483d77a2ff00000075f87381c7841b6b0b0082cbdc945300000000000000000000000000000000000004880aaf96eb9d0d000084d0e30db083104ec3a07afd908a6efb57f87ca61a08fb1b1f78a6258a1f4385cc28b22f36af7e5badeaa010dd0da195b88e6e9401fd035861f048281a05c0d12f76674f052bf67f6ca524000000eef8ec07841b6b0b008308225c94ff75a4b698e3ec95e608ac0f22a03b8368e05f5d80b88466514c9700000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe00000000000000000000000000000000000000000000000003fcd703e6af70000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec4a0f97e0bdef170e5082759249ba90b25083ffeebc81309e33d56aa00405e93eda3a010a852996450a6678dcb73f27ccda0c57b2a5330f5ec115239d4b4f4ad7b9d4f000000eef8ec07841b6b0b008308225c94ff75a4b698e3ec95e608ac0f22a03b8368e05f5d80b88466514c9700000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe000000000000000000000000000000000000000000000000041f992c484787000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec4a0e6ca4e941cee6290a8637dadb1f62748eee2d0a4cd3b2aee8104e1c6f52bfac6a01135b72b72190c9f18fd83464610c897963894edfc69f743fe5f7eba745e72cd0000008df88b1e841b6b0b008301034c94eeb77b8d450ff62d71df3377e2e0abd0ec6b67e880a43fd1736600000000000000000000000000000000000000000000000000005a0a3bd5300083104ec3a09dbbafb683563d1085c00267fbe64a144ef56a0f0b1ee73d2066bf261cc257efa0541a6fd1fe125dc329a5cf5918209753850cf1318a3fccdedaf0ef06ee898038000000b5f8b30d841ad9524f8304155894ec53c830f4444a8a56455c6836b5d2aa794289aa87bb07303292d620b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c00000000000000000000000000000000000000000000000000bb07303292d62083104ec4a08c4b2fb7aa4927e2a62d9923810105306f268c5f5c6168952507993a399858cca07d2bdee13cbdcef332589d1a1270ae3c697cc3406d4efbf56ae26dc2814b5307000000adf8ab10841ad2748082eb869406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000018b71386418a9fca5ae7165e31c385a5130011b600000000000000000000000000000000000000000000000000000000021f2a0b83104ec3a00730a89b6d08dc9dcb55fc056da1f8d78c342a0f84b4e49f1f2275d036fec3b1a004b2befd07f362e0eccd84f1b03b2c4d10ba3403145cf35fbb78eadea2725bc500000190f9018d32841ad2748083034fd894abe292b291a18699b09608de86888d77ad6baf2380b90124b49c99b80000000000000000000000007f69b86bf797176cf5ff0833918fddf842761bae0000000000000000000000000000000000000000000000000000000066045a4c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000413df47d8dd1181c1cad3f5c1f4256a72c98385a9cf9b33de482422fe1b4f4f1130ac2d61af597e8c43e7e9106a22687ae819babeab243c1ec777277aeda5047c31b0000000000000000000000000000000000000000000000000000000000000083104ec4a0e3cdd4ca48e0a17148fb08398e079ca2c0def58f9829b277df38de805bb166dca025266cf7e107c0dbd66cb5c62abc6670ff5efe2879bd55c7aa5724147d6fe21b000000b6f8b428841ad2748083037b9e94ec53c830f4444a8a56455c6836b5d2aa794289aa8802978798d2c3f000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c00000000000000000000000000000000000000000000000002978798d2c3f00083104ec3a0399e99b24832643fe32dad689687d808c65f912f8ac090ff06c9ece0450d0e56a024c1ca39a8c0f1c0b216279e650e2a19ae2a780f4816217f936fa1e9525f4df500000217f9021409841ad27480830291a394aaaaaaaacb71bf2c8cae522ea5fa455571a74106873129b712748078b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002eba2880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000003129b712748078000000000000000000000000000000000000000000000000000000000000000083104ec4a08b53c9bec4781132ba9a95cae6a1bacc33e966f794280fcad2220defa329c49ba07eb696391a3369eefa5aa83f8cbbacd28af772bc5e4c222122ebd61ea0ce4d6d00000217f9021409841ad27480830291a394aaaaaaaacb71bf2c8cae522ea5fa455571a74106873339d59b8570ceb901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b01c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000003339d59b8570ce000000000000000000000000000000000000000000000000000000000000000083104ec4a03c697055bd0340b73938e35e22f7c6a510fcd1d17ea2218c6c397f2bb594b7f9a0091ff1628104e0a8eb7213359e676e262dc817a71dd0cb65e912cdf523dd668800000217f9021404841ad2748083024ecb94aaaaaaaacb71bf2c8cae522ea5fa455571a74106872a30be8873b8c5b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002819a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000002a30be8873b8c5000000000000000000000000000000000000000000000000000000000000000083104ec4a0fa226da93cf391710cc5349f7cc9f2c9ab81b65008c18122a7d73d2bfe79ef9ca0496d3c80e571adf5d7af291f0986ec2151ce64724e374ce02fd362fa99ce3fca000001d6f901d330841ad274808303521794734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a8601d1a94a2000b901642646478b000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000001d1a94a200000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000000001bbb0000000000000000000000005cff95c443c25796c21fd5ec8f40c5d3761d732f00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000700301ffff0201b6dacf7d94d871651a38e23ba8e4028ba604a605530000000000000000000000000000000000000404530000000000000000000000000000000000000400b6dacf7d94d871651a38e23ba8e4028ba604a605005cff95c443c25796c21fd5ec8f40c5d3761d732f000bb80000000000000000000000000000000083104ec3a068a18693e6093929d995b358eff06a2a4cfc4cf4693043373f2d49144d2d84c8a06d4ba3ed50ef3ccb4074dd5cf2ecaa9e7ee8083a77cc02972278e9ac9e7a1d56000000adf8ab0a841ad2748082d22894ca77eb3fefe3725dc33bccb54edefc3d9f764f9780b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000ea066b7f4835ce7e83104ec3a0fa17c5230902287bfe8dcec002746bd089249e02fa061410e78bed3cde636195a05865aa0bdc8168110be0af374e416ae995ede0b2bab62bd40d1ad3c8272efc630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c901000000000043accc000000006603091800000000000000000000000000000000000000000000000000000000000000000000000000989680001d0000000001b7f901b407841ad274808301e07d8080b9015f6080604052348015600e575f80fd5b506101438061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80632e64cec1146100385780636057361d14610056575b5f80fd5b610040610072565b60405161004d919061009b565b60405180910390f35b610070600480360381019061006b91906100e2565b61007a565b005b5f8054905090565b805f8190555050565b5f819050919050565b61009581610083565b82525050565b5f6020820190506100ae5f83018461008c565b92915050565b5f80fd5b6100c181610083565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100b4565b5b5f610104848285016100ce565b9150509291505056fea2646970667358221220a6710181372d0f08d0c328ad9dc690bcf7935799fa8c413722ea2563efaa104b64736f6c6343000819003383104ec4a07d86e83fe8d525583ea25ad5746e3a5d428266c22774fa533fd41b3b61bdd119a031b9770cdbf20152cd64bd7563d0612f9ea001c642e37ed939e8315e2da7ccce00000190f9018d0b8422de64408302d42f94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a13086000000000000000000000000000000000000000000000000000000000002e006000000000000000000000000000000000000000000000000007d80813d322df800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000475f01342d61234767c2099b100fb52f06eb77cc0000000000000000000000000000000000000000000000000000000066030b0700000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf10000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec3a01fe43be052ff70ac65495980d44c9b1e905704e44b16b3569fd3071c37f2197fa04bea0c740b627ab769101ea3eb2833ffc6edef1f1cdbe5f8d6bfe70d57fa80b000000190f9018d0a8422de64408302d42f94aa111c62cdeef205f70e6722d1e22274274ec12f80b9012418a130860000000000000000000000000000000000000000000000000000000000021a30000000000000000000000000000000000000000000000000005c9b7aab58cbf000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000092ce7f1504a8cb95627be59e916bdc6ee69c23ad0000000000000000000000000000000000000000000000000000000066030b0700000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf10000000000000000000000005300000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000083104ec3a0022effac4d868312603900cd778557bd2177e02ce3e5bdb1af420c8d25bdefc1a04fb515f79ae7212554dcf42672cf0afd153c6a95f1629155727dce7d6ebc43b800000170f9016d0784202fbf0083036e1294efeb222f8046aaa032c56290416c3192111c008580b9010418cbafe50000000000000000000000000000000000000000000000000000000000569fa5000000000000000000000000000000000000000000000000000559d5f0cee28600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000436e3d22c78fa52cdce1d4157d6dc45b16fba6a1000000000000000000000000000000000000000000000000000000006603171f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000530000000000000000000000000000000000000483104ec3a06591ac2c3771d33030b15fddc632b4d388b21035a1cf61bb31c19706a4c03a08a0316c8dfa0141045312ad539019fd50cd991eee11bdf69b0c70fbfb26608d732800000073f8718303a973841d8119c0827b0c94ca9ad076f2c25571c719df64b2ec1d4087e15f57880d7621dc582100068083104ec3a0791f46a56340e66c96eeff3e65ddc73e0d69e655e6c55b2beab5056b4442fb4aa01e31811b2b870035e2bee93bce3a399069385a72c437e93fb3d1a0fff01ec73500000070f86e0f841c9c3800827b0c94e4edb277e41dc89ab076a1f049f4a3efa700bce8880e0991e40e4ee33f8083104ec4a068ed29a368883c1df9dc94102fbf65601c6d544a752b8a701d02c162b8ce568ba037effe18ac5bb0fa1a75e8ad91fe9f2345300b8cc783aaa7331f011219242bd3000000aef8ac14841c29c720830149cc9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a741060000000000000000000000000000000000000000000000000000000001e76de283104ec3a034ad705da8eae066174b882040819580094c8e48fa0c4e36c787da23835d49c0a01ce3fc8f51c97a43dd58342a755084443e1bfa9003ed5aaa25eb8b6faca3b35100000217f902140a841ad27480830291a394aaaaaaaacb71bf2c8cae522ea5fa455571a74106874afbafabc68896b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004744a100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000004afbafabc68896000000000000000000000000000000000000000000000000000000000000000083104ec4a0e18d85930b47ef5cd0f1bfe0ad3058ab32dad5ca4b5ebc982783858adc0346e1a010f109560724d969d5b12fe0e4e3f899b8f6a1f52c9a5f99e8d2a65ba7607d050000017df9017a0e841ad274808301adb98080b9012560806040526000805461ffff1916905534801561001b57600080fd5b5060fb8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c55699c146037578063b49004e914605b575b600080fd5b60005460449061ffff1681565b60405161ffff909116815260200160405180910390f35b60616063565b005b60008054600191908190607a90849061ffff166096565b92506101000a81548161ffff021916908361ffff160217905550565b61ffff81811683821601908082111560be57634e487b7160e01b600052601160045260246000fd5b509291505056fea2646970667358221220666c87ec501268817295a4ca1fc6e3859faf241f38dd688f145135970920009264736f6c6343000812003383104ec4a0809fe6d0fa8e11ddc844d53883d94e78a96d45ee2c4f58ae1bb8d74b059a2116a0476e07c694de480314bcedc3d3bb773c38a63f171eabbb9f0f420aba9d07748e00000217f9021409841ad27480830291a394aaaaaaaacb71bf2c8cae522ea5fa455571a741068734194f1bce2714b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031848380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa94710000000000000000000000000000000000000000000000000034194f1bce2714000000000000000000000000000000000000000000000000000000000000000083104ec3a0c17ba1939911153ec8bb51c8e412d26f822772c7528891dbab6f95abdab3855aa057aababb1a6ca4e0d5cf4279104f5c613759e7de99f4a0e06055f5a56c7d25980000006df86b1d841ad274808302067194273e78151cd2db0dc9f4899828c18e521a2941cc80841249c58b83104ec4a019cbcd4f5bcc9cd4215e720ce55d25ff0f696ef249935f308e838447a69aa8b0a07f52c2efcc75fdcdbcfe0cd22662396e113a28dbd21f77c7d7ab7018cfa67d9f000001d0f901cd0a841ad274808303b81094734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a80b901642646478b000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000000000000000000000000000000000000001e5aa77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000001f30b02abb0daf000000000000000000000000425920b77a8b9819aa95c92c79e30fb68cf6c98a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007002f55bec9cafdbe8730f096aa55dad6d22d44099df01ffff01303260590c0e77d9974b6b20b7d6dd60f8254c3800734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a01530000000000000000000000000000000000000401ffff0200425920b77a8b9819aa95c92c79e30fb68cf6c98a0000000000000000000000000000000083104ec4a0910b6389a4f6a005b31c0ddc249d6de91ba655dec16336be0445cbc9873483f8a0137292aa1630013e6f64c3401262c9d009084a780406b24938bbd5f7124bf67500000270f9026d0c841ad274808303fdab94a6b71e26c5e0845f74c812102ca7114b6a896ab280b902041688f0b90000000000000000000000003e5c63644e683549055b9be8653de26e0b4cd36e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009d34dc9c5d525f26d8404e8272aa993739b970e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a0d7b9e6a51fab5e543f897840bb6fb5b622b31208f6d32227ac826fd2563e84baa02bb3b4fe383203cf39e972e8faf0ca2e7727736a3503eb7e503bc91b4db41c15000000aef8ac64841ad27480831e848094ec53c830f4444a8a56455c6836b5d2aa794289aa80b844f2b9fdb80000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f0688000000000000000000000000000000000000000000000000000000011046260083104ec3a0c960ea7ca90cda112eb232a65a2a2566827247a4b52028f6cbcdf94973a86bfaa02398cf26701b68b0a67338dfe9c49947e8fbade0e61d53b87ab7811b6e417ca7000000adf8ab1b841ad2748082c8b6949595910db7625ab963d2b32a60c2db5bb9fd20c980b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000000000000000000000000000006f05b59d3b20000083104ec3a01bf31301e3354ff3b9836ebf347b770d4fbee2db5c9e060192353cb297a502c0a07f1eccebe433649bf218911a7230bce64e62d4e194cd79026f614aab6afe2df400000270f9026d04841ad274808303fdab94a6b71e26c5e0845f74c812102ca7114b6a896ab280b902041688f0b90000000000000000000000003e5c63644e683549055b9be8653de26e0b4cd36e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000005f24e8fbfd0844ffa2cfb0418d60eff194142cc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a0e97d0d66ab74bd413d9521973f1f050accdd09ae8e9c384cd611e9fbeced5723a01e6293ef56b6ce7caed52cd8eb2e9bdf892c59c455283f9c28dfaff123f9d066000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001ee1a51083104ec3a0c20648081296674474f96547dedd9fa3f293584c0984b7ee61726f39732a7971a0788ce9cdb56532cef8ad8f33b13d3fb61579c281bc75666833bf4b07cb5c1691000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a741060000000000000000000000000000000000000000000000000000000022ccdc7883104ec3a020395401981a8262b6130d0fa38d0f615a349f9c68344df206fb876dd9e71aaca007711903efdc54267e0c8be83c57cb2db31846e9b2bf7d69c80026aacea4036a000000adf8ab16841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a741060000000000000000000000000000000000000000000000000000000020a9a69983104ec3a07d34952808501066143a63e5ba3cd6467c4ffd14617d9606ca7adcf062d0ebd6a05b6641b0fb4442541bd698c2c4d4da7840dd4aee3e4728f3d1a02ab9330d0328000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001f4bd9f783104ec3a042ccaf811871cd23a3d2c41e8146bd51ce4e6049e6b857df049d2f2b3567c19fa00cb2cad4f4794bc2626ccd432371b0f8db9326fd9649e4b89a2d64741ae079a3000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001ef0def183104ec4a093b449d504cc75f4192d97bd23c26390e70f345a8eaa8313b6691952f8fd51dda046985aeec26a2d570ed98ebe7674ce45e857aafc2e3d5137b7bc91f33b6771b1000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001fb6898c83104ec4a0fb31f9b731f4f5246dbb8c0a1bd005c91245c567adb04347597520bdadeca646a0077dcb8ebf14edc7fc49c59a240c900bff62cb9a70d98871fc8f039e2ac619d8000000f5f8f322841ad274808305573094ff75a4b698e3ec95e608ac0f22a03b8368e05f5d87038fc4b888fad5b88402c5fcf800000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe00000000000000000000000000000000000000000000000000038fc4b888fad500000000000000000000000000000000000000000000000000000000000000020000000000000000000000004b176a868b4a3803387bf3ce0ffedecc7e0fc50e83104ec3a098f1be3aea29b91cdbe18c1a3ce4f6143c9613d07207c6609d0d7105fe6802b8a02a6d49a7d36a09b3d5a6b7179211127a77885c3499a5a8e482d74ab3c365d1a7000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a7410600000000000000000000000000000000000000000000000000000000215ffd7f83104ec4a087cf97447b37eb7a9fc9b3d98d155ab1eef7a03079573468e10e0520039e8f28a0020dd50b494bc4c63218d11a194136e4a8c8cc481686494272082aa9975d08f0000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106000000000000000000000000000000000000000000000000000000001f981cd083104ec3a0ce0aab44f1aea8823a26f2a1838cf8311ed5739c71fb4e8471c8e76b4d6232c9a06e39e759e4d8b9ae186b104874ad4c90822eb7771c3a82ec3d8c773a61a66677000000adf8ab16841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a7410600000000000000000000000000000000000000000000000000000000219ce99f83104ec3a031ccb64003e742d6b516f1fa6eaac8aeca3648c54d9bfbecd9900bae4bde2365a010c709a9c49fd1e9c64909e3b0b4d2b841ef528541f28cac679ed6b5e48d857b000000adf8ab15841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a7410600000000000000000000000000000000000000000000000000000000204e59ec83104ec3a0500c9f36d00fbf063f8c5c4288099e3090dd2c2c5e733542ed820aa3c78e5ccfa00bbbc274c36543299e0450ed9a2e3ddf0cdec853fc71b041305b2009baea0957000000d6f8d480841ad27480830493e094ff75a4b698e3ec95e608ac0f22a03b8368e05f5d8801aa535d3d0c0000b864474cf53d00000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe000000000000000000000000f6871e3d0e0ae33b71c8e8c0abda6d3fe0d8cc2c000000000000000000000000000000000000000000000000000000000000000083104ec3a0e6a8685340b69454139172bd73c7ee6a04699f73e6a9f020f0b7d6d0cecae7caa06c939dbba762d7b5512863bbf2573fcc03d9a4c5aebaffd5fa26a6b0b71b6c3200000190f9018d0a8417d7840083033cba9426cb8660eefcb2f7652e7796ed713c9fb8373f8e80b9012438ed173900000000000000000000000000000000000000000000000000000000000493e000000000000000000000000000000000000000000000000b823b09640a0a2eab00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002cc5bb7daaff7d3d538f895e125b0eb2f616722e0000000000000000000000000000000000000000000000000000000066030dbc0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000ddeb23905f6987d5f786a93c00bbed3d97af1ccc83104ec4a00906883b81dde1ac570704c60b87171cc37ad8f5138350aa8023f73ed1099ae7a001194e98ebaf1db788fe3ff0cd5d7722978785c7212c7cd1076431ad4cf677d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201d02000000000043accd000000006603091b0000000000000000000000000000000000000000000000000000000000000000000000000098968000100000000000000043acce000000006603091e000000000000000000000000000000000000000000000000000000000000000000000000009896800009000000000072f87083070bf984283baec0827b0c946fd089754eafd49e4576776151eba0ea2ec11c7e8713b89ae725f0018083104ec3a02e52f968656b47a019b478218e644de12af47c208adedec9993dd62ad6a3c5aaa02ab7722012ee15c50450c4a3f04885845bad0aa021b51e80b5b25146ac4dd1620000006df86b0284202fbf008302a43b9419fa769fa67663ba72865ca555d6a86a986442a580841249c58b83104ec4a03990ddee11e2a81c24c4edb588dc8fe18fbf2235f9157873113242ba954d0891a06733d1369c4772d7659e48670e0c9a60491a954a167f821ed7efea4c50fa352900000132f9012f830829f184202fbf0083053db4948363302080e711e0cab978c081b9e69308d4980880b8c40894edf1000000000000000000000000000000000000000000000000000000000000004017ce55f79af7ac171133b22daecaadbda722b00cbe2e3a173fc10c51adbd6a7a00000000000000000000000000000000000000000000000000000000000000510100000000000001450000759e000000000000000000000000f9d0b0b11c55defdb635c8bcc1a65ab5188ffe0400007606000000000000000000000000d3c20b5ce963b9d7ade66c01023f63aff68bc1cb00000000000000000000000000000083104ec4a0fb6a1b9c8b18bc1f6db5985361b436313999ee600a7844345a555401e9d9d92da07819fc92d50a76b0712409cb043d21d3428169dcde380e01b4bdbb5bd629a90c00000072f8708303a974841d8119c0827b0c94dcb2127a1029df85fc795df2e12722d06191bcb08764b82cbf61e0068083104ec4a038c29ff67ba3ba42e210113b31143b06d501db9d9d26f92d73e4a45b74b5bf03a0594a213b08669c58c832b266286d03599fb0fda209b11643b343839b5717b27b00000217f9021414841d8119c08302ab6594aaaaaaaacb71bf2c8cae522ea5fa455571a7410687366d6517b24920b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000366d6517b249200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa947100000000000000000000000000000000000000000000000000000000032aeb28000000000000000000000000000000000000000000000000000000000000000083104ec3a07e2d92299c3ea8ca1525627883b58ed65d7e491065aa9eccc35f59556ee07d98a02cadcdc0410a9e6fc4adc6f7671496dbff27c82b76416291c9101289834072a6000000d1f8cf831111b0841c29c72083022cc49487627c7e586441eef9ee3c28b66662e897513f3380b8649c66c25d000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000006eb59d313dc6fbb976e5f435a9ca8c2cc6922d0000000000000000000000000000000000000000000000000000000011a02a4183104ec4a0f445c7875a4a42d7d7bf5b125f74afc1e3eef833cae50d9bfc8debd2bc76c229a059cce50a9e1b8a804cd09741d081b0829b1b36ac6a8ebff74cdee5b1511ad42a000000aef8ac0b841c29c72083010d8194f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b3000000000000000000000000aa111c62cdeef205f70e6722d1e22274274ec12f00000000000000000000000000000000000000000000000000000000006fe3e483104ec3a045e35c184a01d54a868458ae6ea066eb493e555878a0b6da96f50fe3b34d76efa06d56a84ac6ca303641c572d26b9cde60f4af3d143e1cc0e241a1deb22c0c9077000000b1f8af831111b1841c29c720830152849487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c000000000000000000000000b3261b2c33af77719b2dda538e667891b301ad7800000000000000000000000000000000000000000000000000f7e395631cdc0083104ec4a0d0856f1e34fbc599974afe5bd69142636d6858a71603ab9ab4882a1779dffe8ba04e7f9d7e956550b7681dba1e56979ca19cdd405d67c2cb0498c7635ecf8a031600000073f87105841ad2748083012fcb94a0d013b84fbaeff5abfc92a412a44572382dca08865af3107a4000841249c58b83104ec4a0847500e5ec91d53c265a5b8dcef136ae760a90fc7cdbcf75968330ad18be4fd2a02732b311ee5f57a5da93e836b1a27fde5320ab97fe757f9759325baf2ba773b800000281f9027e36841ad27480830269518086b5e620f48000b9022360806040527389a512a24e9d63e98e41f681bf77f27a7ef89eb76000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161009f90610185565b60006040518083038185875af1925050503d80600081146100dc576040519150601f19603f3d011682016040523d82523d6000602084013e6100e1565b606091505b5050905080610125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011c9061019a565b60405180910390fd5b506101d6565b60006101386007836101c5565b91507f4661696c757265000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006101786000836101ba565b9150600082019050919050565b60006101908261016b565b9150819050919050565b600060208201905081810360008301526101b38161012b565b9050919050565b600081905092915050565b600082825260208201905092915050565b603f806101e46000396000f3fe6080604052600080fdfea264697066735822122095fed2c557b62b9f55f8b3822b0bdc6d15fd93abb95f37503d3f788da6cbb30064736f6c6343000800003383104ec3a0f911e0e29e1258b995ae71042379cd740f391a691afbc36c3d2447c940ecdc1ea0720fdaee461776981172daccd0fc1944d4aa27516d6cb21c5965d9ff8de8ad0f00000210f9020d13841ad27480830256ea94aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8f16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000000000000000000000002f34d2636990f000000000000000000000000000000000000000000000000000000000000000083104ec4a0a27c402c1293b7a584e42af5fc7b70bd57cb198801e4670978265c0627718f38a05223a6e9be820d5cd3406e0c6d475df3e07f826345ccdcbf8b3c91a628b3e6a700000093f8911b841ad274808301771094c5471e35533e887f59df7a31f7c162eb98f367f7865af3107a4000a440d097c3000000000000000000000000739815d56a5ffc21950271199d2cf9e23b944f1c83104ec4a0c2692a2380475366525a34062460ff666ca8f1a32cd0cdabc7d9afeed238bbc8a03c0661ed2c1aafbd940c52cde49032dce96e4f21a8e23a6962d809637f838c650000006ff86d14841ad27480825208945e809a85aa182a9921edd10a4163745bb3e36284870b30e8870ae00c8083104ec3a029e98c9011caf0e63a1bb3d27b4a06c783e842d692b16b811d2d71b0ba90a483a04bba4b777a2a65c6a71182f1aa4aa925bc774d88d01a2983a5e3583b50022d3300000210f9020d23841ad27480830229c294aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000010164e6760b7e770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa9471000000000000000000000000000000000000000000000000000000000f49ff11000000000000000000000000000000000000000000000000000000000000000383104ec3a022b2fc4ab92c271c924991a2a579b67d8e6e369bba4fc3b731a4676475179040a05f910e519cd6443fe365fecc0744b727356ce39b4d965a98e7740bc2f606be50000001b0f901ad08841ad274808302a04e94734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a80b901442646478b00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000001e60b98d000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000000000000000000000000000000000001e5155d3000000000000000000000000b2daa35f73e7bd029430dd2abc0f97d453113c2400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000420206efdbff2a14a7c8e15944d1f4a48f9f95f663a401ffff01ae5aa896bb93f4c7c5660b7fc894b3892255d01501b2daa35f73e7bd029430dd2abc0f97d453113c2400000000000000000000000000000000000000000000000000000000000083104ec3a06ed42868188e9c95e2069c4e8e72579b9cc936079197847121a755e252e1537aa0348ded211a76b24ee3cc22fe14e8b378d3920b6acacd8360d10636aee263b9c0000000adf8ab18841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b30000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f0688000000000000000000000000000000000000000000000000000000000660b0c083104ec3a0ee48f7e6db2cb90da7519f8562532824bfaf9747b6bd9e56e1bcdba49f26a0fda02ae141d7002a4b0f64af376d74fb4d6855d78287329d4c7a66b79cdaf6c0e3ac00000073f8718303a975841d8119c0827b0c9469c24c302920836f04e886bd64d30c486a778f5788016345785d8a00068083104ec4a0fa64d94ae462bb48e0fcb4ad1d7dd4de3f30435b24ffc07d1ca1a08bbfa26427a02db84c6d7659fa4e44f83c933c97ba02297f4d81fa977d90f077e759db45de8400000238f9023502841c9c38008303dca794aaaaaaaacb71bf2c8cae522ea5fa455571a74106880159584f7fec4290b901c4a15112f9000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000002f3cc000000000000000000000000000000000000000000000000000000000002fba00000000000000000000000000000000000000000000000000000000011098e8d000000000000000000000000000000000000000000004048cbb95ee800000000000000000000000000000000000000000000000000004196d922175f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a081f17782e61ebe34e2007b6f3a16a781425e53becb932d6b7a449583ac9344f4a0443c468a02d4fb0f93cc3b4f85bbc369abdb0556575b754e891ce5a125ebc0310000006cf86a06841c03a18082aa4c94c6ca94b94315391617b3fa4428d28c0de17597fc8084b49004e983104ec3a0c66cd99d4c1d26bb853694c0ac5108a79ff1f254d0f601f293f528db768683ada0291e7aac3710358caab0ae265a077bd7335556e4f3cc7c86249de535f6c5a12e000003f0f903ed04841ad27480830526019474670a3998d9d6622e32d0847ff5977c37e0ec9180b90384186aaba2000000000000000000000000c450a132d34a6fc85b8a1c077d389ec7bdb4870c000000000000000000000000c450a132d34a6fc85b8a1c077d389ec7bdb4870c0000000000000000000000004e42d45540d04a828529df0c5290acfbf4cbea970000000000000000000000004e42d45540d04a828529df0c5290acfbf4cbea970000000000000000000000000000000000000000000000000002580019462e9b00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000159b1fb28aa415b48ab56e858df5a5b3ad869b1b76d6b72351047f5269f679a0713bb28bec106e0ed9e65f69b739f2c6d018ebf04fd6e0f137f67cbdc75b6334c0864f64b5a9b3cb613d31cdbcea38ae049ad9960a3e9cd81050fee68214bce9d58865a99a1f71ee55db2e9c07bd1e490c596e4dc2b10b18e0fcbed322398649b7e82f2165f4350d9157241cf461fa2836fa09d227cd2898e329181f54f1d80713c8e95c09efa040caa07abce478b5deff0f1f5a5371e81b3ff8961988f48e64c1d8c260b127d26806e1c1eaf5f14971d3ad3829bd62f04203ae7b1f9d41d648aab3eff2c7f89fe827ac5d55d015879a90ffbf5e468a184701e7ad7c81445083227f015c4f2f546dff8b3690e6a99e3ac159cf7dfcd2f595318140ece11123f821e0fa825f3c0ec7baf5a6b4331c799ed802207aa212eb874469c1261fd024da5cd502cccf84e7be4d847fa2f2de49f76966445e9e46316d744fb0aee51348642a0825785e0e6aa8b06a1e289b04c891f0277aa616f9cbcf8f26e76c9bcf65a850f39023e5258e80edbfdf92a61c0ec8af5a8012094c46d6165db2dab7c3b2f5f3abe9f79ea07b41c83d80e14bae4ae3b137e8098f8fd95879af3f73d09593d95e128867c4be9f258bb937de01fe3ba8cc5fdbcc208ed8faa160f262cbc27ef7bb901a3b1f9350982ce7c565af835f55700d83e417c02c5146b7f3f6a957d5649d2dbdd0d815f3158da3950ddd3eeb17486eb68bbdde553657b3b56e4d4605a97081d69cfa58131c093de2a3e8c4a785b9600716ab6230a56aec96f20e930c19c9f4b5357269464dcb91a44fa36a477da5a7611c663adee42398b8413237187ea66c2ecac3c1c4086691092198093106ff7b01548d972b65aebc95d415bbe288e5f764432b9d14c964dc5c5056592e9ef7a2c04322199a1efc9fe7d04930c6058983104ec3a0a65059d01fd97bbb95a91a91026dadbc5a723b8b52fbc56bb64cc71d10789e93a0612cce881c9d823ba69ea9d198b62f347852d6f510c1dd973dba16c9148ce21a00000217f9021402841ad274808302740b94aaaaaaaacb71bf2c8cae522ea5fa455571a74106872e8a616e8ec000b901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000002e8a616e8ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa94710000000000000000000000000000000000000000000000000000000002c3b5bf000000000000000000000000000000000000000000000000000000000000000083104ec3a02fccfc3b0f7b675350cd4193481ac9582dd301b5b8409b2ce00fdcdeb5b799aba032988936faa724d772033852d10bbe42784f35ed89d39ffae58d1ce704fd78f6000000adf8ab2d841ad2748082861b94f301805be1df81102c957f6d4ce29d2b8c056b2a80b844095ea7b3000000000000000000000000ff75a4b698e3ec95e608ac0f22a03b8368e05f5d00000000000000000000000000000000000000000000000006f05b5a143c3cf683104ec3a0ab48933e0547e0eb1a95b740c464a31099eec141d35720e1dcc568003910c818a048df38d59471b241b8fe72de7bdff81f2ffc44f393234316f0e4211e858ad93f000000f5f8f3822937841ad2748083060f8c94e124232389cce06ede97539700a9d27c1007bf2680b889f0cacc1a3c1bca5a656e69edcd0d4e36bebb3fcdaca60cf1f55bec9cafdbe8730f096aa55dad6d22d44099df5300000000000000000000000000000000000004080612b4137eaf6a46a871c5c8aec751a154e1ce1db790b12abb5bcb50c2aa6f1b54447046640010b3393300f8e0469c1dcbbc000000e8d4a5100026ac27292710271f020026f726f783104ec4a06a9c721361a1902f1b8a90b321047b1bc8ea20775603bc677dd48356f731dfe3a01323aa1b012d4ee1e15fb016b2bb5e59a257f49aabe9bf9f9437dc96866c6f370000006df86b0c841ad274808302067194bead4b41cec7c9c3d4d9573f022991d156ab8e6180841249c58b83104ec3a06e428d0c5bfeb2f25b4b56c16ed64e983c5414c73e1f79930757277b27b1867ea07d1761ef7a970e66583311301b6368d6575d01786b77a5855dbb81e2cdd38d12000002d6f902d308841ad2748083025b929480e38291e06339d10aab483c65695d004dbd5c6986fe021b375200b902642cc4081e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000d8b8c269b709b45000000000000000000000000000000000000000000000000000000006603172800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe021b37520000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b39880c7a0b752179d6d7d9ae594ab4c02d6e5b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000afc3e152db7f97eb0a731d622e868a482de840260000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0913f608b08d82ed936005e7045c17a25eebf4c9e7ed7b61b6b8cdf8d58392caba021657b08c7e7a910bff2dac689f0d5cd82ea2e60da6c793e34df9a90c0504cfa00000000000000000000000000000000000000000000000000000000000000000025a201000000000043accf00000000660309210000000000000000000000000000000000000000000000000000000000000000000000000098968000100000000002d6f902d3158459682f008302bb209480e38291e06339d10aab483c65695d004dbd5c69877ad8000bbf3601b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000738db3100000000000000000000000000000000000000000000000000000000660337f40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ad8000bbf360100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000482de86c457a243f2c9a11f00436f0808bdcc4a40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0f25f8b2b66dcfcb32ed84d164c3c2b9995d20dd0eb58f7c0d51d2d75b8b585159fd1996b114a0e1df967f8b59a20c60956693f091300a0f08e9db7e3cfcd5747000000b6f8b424841d8119c08304096f94ec53c830f4444a8a56455c6836b5d2aa794289aa88033663a70de5a000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000033663a70de5a00083104ec3a085e28b9f6882336f8b1eeba8dd6399842f566e005b8b9eac2317c0c3572560cba075c4fe034eeeac6b31070c2dc6407fa21a8ae75795a1e1fbffad0b220e3e167d000000a1f89f820631841c29c721832dc6c0949691a483309a9c51d951995c174b6848834981f380b6180166987c33180009c4b4137eaf6a46a871c5c8aec751a154e1ce1db79018040000530000000000000000000000000000000000000483104ec3a0915166da63dc4860eb874d0463a041587735a19a3dca107425c0b3345a671623a0659727ac2766c55fc3316b6c8459b2be507ec79e28eb78b2cf9abd4754555dfe00000170f9016d2e841c29c7208303fe569418b71386418a9fca5ae7165e31c385a5130011b680b9010418cbafe500000000000000000000000000000000000000000000000000000000005d5a500000000000000000000000000000000000000000000000000005c499538f2a6300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001febd2d5bdf7e504eb0fae7f6b805ab5b5934b790000000000000000000000000000000000000000000000000000000066031023000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec4a029555b419e79d7cd8fb4ba86debc6477dbf39dc1df0914bad81384d399471abca051a03e52d1b5965580ff399f964c56dec249665260adee246d8b0a097bb55439000000f5f8f38229a2841c29c720830c350094e124232389cce06ede97539700a9d27c1007bf2680b889f0cacc1a3c1bca5a656e69edcd0d4e36bebb3fcdaca60cf106efdbff2a14a7c8e15944d1f4a48f9f95f663a45300000000000000000000000000000000000004080612b4137eaf6a46a871c5c8aec751a154e1ce1db7906905c59be1a7ea32d1f257e302401ec9a1401c5200f8e33cbaf0b1b3000000e8cb4035ea26ac272927102729020026f726f283104ec4a01accbf9170c2af5f2a9184f1389b7ea25f521f0201bef361f597272a61965932a03cac18a2de505c9e8c0527d562fa22300c6afb3c0767f33430de01402568ad04000002d0f902cd11841ad274808303b627942db0afd0045f3518c77ec6591a542e326befd3d780b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002467d653f52850e8c0000000000000000000000000000000000000000000000000000002b83196b5acf00000000000000000000000000000000000000000000000000000000066030b36000000000000000000000000000000000000000000000000000000000000002bb65ad8d81d1e4cb2975352338805af6e39ba8be8002710530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c607178c0a0fe335b3880bac259bdc5ca685cad30000000000000000000000000000000000000000000000000000000083104ec3a03ef39feb6370ce664e954a457703c723f4942234f93d4bc874447f48b95a1fc2a002aed6594e91099ba2da28b97339007bb1485db9b6bdef34fc6ade35b6b97219000000adf8ab0e841ad2748082f4449406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b3000000000000000000000000aaaaaaaacb71bf2c8cae522ea5fa455571a74106ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a0da7a9d95bfba119e044558af8a4018b92dfc4f3f8b3d17b5ab4e0ef3f42ae128a05911620ad73109cc496bcf786c0285871783dcb45e6fff98e6c79ec5a48db0b700000410f9040d12841ad274808303710c9480e38291e06339d10aab483c65695d004dbd5c6980b903a42cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000259b8f93a088f200000000000000000000000000000000000000000000000000000000660337e6000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000000000000000000000000000000000000251723d0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001600000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000aff84642ba059a901208839e99c14185fc0773c10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a04b7db67703b4bb61b576b2887e19d49f434beaf5fa4d5710da0bd5822d44f2a5a07826b352886816ffc23ae5811637b97cb82e9024285dd38806464f9ff8432ab100000390f9038d0d841ad27480830345c09480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000eba4078b60eac00000000000000000000000000000000000000000000000000000000660337f6000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337ec000000000000000000000000000000000000000000000000000000000000001cfafffd218898da4dc45995b29a0b29fbd8bf86f900d23980fdfd1c880dc311bb3f453cc594f4b1441613b97c5eff5f2b971b6fdfe0095944a07a2e88757c7771000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000000000000000000000000000000000000000e87f8a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000078ea8e533c834049de625e05f0b4deffe9db5f6e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000d4916b6b4a95c945e903a1474bdd8183cfca47b30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a08686107f87ea482622221780459ca82c85c42c87a146c40e83cd44743f9da633a056bee0efe56aa55e1ba8cf7c758498c2b3ed524ea71c1762da4d786d4c1de00300000418f904150e841ad274808303cee49480e38291e06339d10aab483c65695d004dbd5c6988010c3494671ea766b903a42cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000fc43d2500000000000000000000000000000000000000000000000000000000660337f20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c3494671ea76600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000078ea8e533c834049de625e05f0b4deffe9db5f6e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000053000000000000000000000000000000000000040000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000002439654cf4ffc8ac1bf5e913a0aab8c25d32e5a10000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec3a0b8fe9aba8fd8a936667532c1d25ed7c4e5103fe8feb37c1ca3345e236454a438a04a6b919679e78ebdd52c8da87c67e20e826cc343d80a39750ce6a6abe8f3821e000002b7f902b402841ad274808305f10b942db0afd0045f3518c77ec6591a542e326befd3d7872e2f6e5e148000b90244ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000014475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000727813b43dd284a81051bef1ade82b387157d357000000000000000000000000000000000000000000000000002e2f6e5e1480000000000000000000000000000000000000000000000000000000000002c3ad2b0000000000000000000000000000000000000000000000000000000066030b6f000000000000000000000000000000000000000000000000000000000000004253000000000000000000000000000000000000040001f4f55bec9cafdbe8730f096aa55dad6d22d44099df0001f406efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec4a0e0b856fc711f140d980bb92545929c1b0745ae922e85179f2bfa75a314d115aaa06d977aa5ab9a2e50f80dac2e05f7f8d77dfcb258347d5f5e2f5be11a0ac07c1400000170f9016d11841ad274808302ed9c9418b71386418a9fca5ae7165e31c385a5130011b680b9010418cbafe500000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000fccf045a0ec600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e6c23a33b8492e2aa9eab7d37853e86c8600da2a0000000000000000000000000000000000000000000000000000000066030dc1000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec3a0f44ce0b36335854a8868118e9cb8d86d04731058c216b496a74c905ed19710a6a04a5393736bd4b36dd984d714deeaec876b191926e5bb874c37f93fa8805ec24200000094f8920a841ad2748083017bdb9422104ebeb88d45d7c5682edb461c73544ab791c8870193d0ce47c000a440d097c30000000000000000000000001943f0ec6cad494b11739525342674e939737f8a83104ec4a0d4c43bc669a0a6f03775e9f39bae0749ce20aa502cdbdc15a025d724b8a61a06a07c87a783473de35a0c468923c8f572cbce2081a1a99a921854b47c8fc6802f98000000f5f8f38228ca841ad27480830c350094e124232389cce06ede97539700a9d27c1007bf2680b889f0cacc1a3c1bca5a656e69edcd0d4e36bebb3fcdaca60cf106efdbff2a14a7c8e15944d1f4a48f9f95f663a45300000000000000000000000000000000000004080612b4137eaf6a46a871c5c8aec751a154e1ce1db7906905c59be1a7ea32d1f257e302401ec9a1401c5200f8e36c3d54b220000000e8ceaf2f0026ac272927102729020026f726f283104ec3a0022e2c05509973e3a9e296c09e793e07c6a39a79d4d498573196a6a04ea3ad3fa0460fd082794e439610bc9ad8b804a332e23240eba6cddc62a082572998c9c367000007d7f907d413841ad274808302e492940cab6977a9c70e04458b740476b498b21401964187030429376a1000b90764a4d730410000000000059e1b6601d06d916bbe845c424dc9317e8b815ca18f207a12c84a6ec522b6ca5e44ae66295da9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5f7d80e72b9202bf51c5bc387538262ae993ca117a0e481f908209137a46268ebea49653b798e1cc5912de2b287648df6cd3a8dfdd14d938cc889223e29d06e430bf3320f1062480100f29d53789c2142cd1804081c1f2d765e838623dafc1d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000680180000000000000000000000068089c372275512e09f5359f82ce68a9d46ce19003201000000000000c803e8916bbe845c424dc9317e8b815ca18f207a12c84a0000000000030429376a100000000000000000000000000000000000000005c10000000000030429376a100000000000000000000000000000000000000004de0000000000030429376a100000000000000000000000000000000000000005d10000000000030429376a100000000000000000000000000000000000000003ed0000000000030429376a100000000000000000000000000000000000000004d70000000000030429376a100000000000000000000000000000000000000005c40000000000030429376a100000000000000000000000000000000000000005c20000000000030429376a100000000000000000000000000000000000000005c50000000000030429376a100000000000000000000000000000000000000004d30000000000030429376a100000000000000000000000000000000000000004d10000000000030429376a100000000000000000000000000000000000000004d20000000000030429376a100000000000000000000000000000000000000005c60000000000030429376a100000000000000000000000000000000000000004d60000000000030429376a100000000000000000000000000000000000000005c70000000000030429376a100000000000000000000000000000000000000004d50000000000030429376a100000000000000000000000000000000000000004d40000000000030429376a100000000000000000000000000000000000000006840000000000030429376a100000000000000000000000000000000000000005930000000000030429376a100000000000000000000000000000000000000005940000000000030429376a100000000000000000000000000000000000000005950000000000030429376a100000000000000000000000000000000000000005920000000000030429376a1000000000000000000000000000000000000000058c0000000000030429376a100000000000000000000000000000000000000006850000000000030429376a1000000000000000000000000000000000000000067e0000000000030429376a100000000000000000000000000000000000000005900000000000030429376a100000000000000000000000000000000000000006820000000000030429376a1000000000000000000000000000000000000000067c0000000000030429376a1000000000000000000000000000000000000000067f0000000000030429376a1000000000000000000000000000000000000000058d0000000000030429376a1000000000000000000000000000000000000000067d0000000000030429376a100000000000000000000000000000000000000006810000000000030429376a100000000000000000000000000000000000000005910000000000030429376a100000000000000000000000000000000000000006800000000000030429376a1000000000000000000000000000000000000000058f0000000000030429376a1000000000000000000000000000000000000000067b0000000000030429376a100000000000000000000000000000000000000006830000000000030429376a1000000000000000000000000000000000000000058e0000000000030429376a100000000000000000000000000000000000000005890000000000030429376a1000000000000000000000000000000000000000067a0000000000030429376a100000000000000000000000000000000000000006790000000000030429376a1000000000000000000000000000000000000000058a0000000000030429376a100000000000000000000000000000000000000005870000000000030429376a100000000000000000000000000000000000000007620000000000030429376a100000000000000000000000000000000000000005880000000000030429376a1000000000000000000000000000000000000000058b0000000000030429376a100000000000000000000000000000000000000006740000000000030429376a100000000000000000000000000000000000000005820000000000030429376a100000000000000000000000000000000000000006770000000000030429376a100000000000000000000000000000000000000005850000000000030429376a1000000000000000000000000000000000000000067383104ec3a0c50c30a27cfc14080b1790771935d855fb83ed3c7fe51af2687f94603f4c02f5a010d2845c439255ec424463f2a6bcbd22e5b5e03db5dcdbf5425996d2513899e9000001d7f901d409841ad274808304ce8f94aa111c62cdeef205f70e6722d1e22274274ec12f873272d323cf8000b9016467ffb66a0000000000000000000000000000000000000000000000000000000003062b2a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000005e4819feb6ecf0a42422795527f22de8862778060000000000000000000000000000000000000000000000000000000066030b6f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000183104ec4a07ff55bc61e0268fc8ea612415bd4287fceef57ef2712ad9ce1126e9ad53c800ca01975d9200b39e90e7b662476e4ef261cca1b99d33ec3d5dea44bb3b40e992274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000295201000000000043acd00000000066030924000000000000000000000000000000000000000000000000000000000000000000000000009896800016000000000170f9016d268435a4e90083040896940122960d6e391478bfe8fb2408ba412d5600f62180b9010418cbafe50000000000000000000000000000000000000000000000000000000001d97a7a000000000000000000000000000000000000000000000000001e32e1c0e66f9c00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cb6daccc8334a87130fecf629a800ce89cd064810000000000000000000000000000000000000000000000000000000066124b5f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec4a0b6b31bd11522834787a9b10f3ee6958da517f3536692c20db2be4e80f9969a72a03d9f42f130cea4314c06e1698bbb83e379d91691dd913ba62a5d9dc0e3036aef00000273f902708307d3d084202fbf00831b24d094cb566e3b6934fa77258d68ea18e931fa75e1aaaa80b902046c459a2800000000000000000000000038de71124f7a447a01d67945a51edce9ff49125100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000066035d7b00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000084704316e5000000000000000000000000000000000000000000000000000000000000006e4f2f8cea88fc9da907cfce0e75b4c75ed47cba54817067bad30a5f6e64cf1dbf00000000000000000000000000000000000000000000000000000000000000144f2f8cea88fc9da907cfce0e75b4c75ed47cba54817067bad30a5f6e64cf1dbf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000822e7078be9c69af7894ac13390f2adf808a9d0c8243112403660494cfc693d4352feef8c781e100104bc63b14c178fd7469d60cde49b86699023b7d7a18c078391be1600ddc61d2cfb905b96a203e8e655c3a4b4075f9114cbb92f04c511d3fb88c4d2ca3574a41533d992079d7a09435a202b4de8089df61601c8f0b324534de571b00000000000000000000000000000000000000000000000000000000000083104ec3a06d44e5865d0f750648bf85f565b63c9f7733078e98d8e21c75695027d7380aeca026bd68ec8ced0b5baa7f36238018a843a89a35feb6ea00b67f99920e1baf201c00000870f9086d3184202fbf0083045a3f946131b5fae19ea4f9d964eac0408e4408b66337b580b90804e21fd0e90000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df0000000000000000000000009f5af55fbc3d34d69aae140cc5640a6c80ece46f0000000000000000000000000000000000000000000000000000000066030dcc0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000401b96cfd40000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000083ffefbca071347df469c4e64820c95b01b957be0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc89700000000000000000000000000000000000000000000000000317f8b88feb286fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd008d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000003200000000000000000000000002faf9320000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000009f5af55fbc3d34d69aae140cc5640a6c80ece46f00000000000000000000000000000000000000000000000000317f8b88feb2860000000000000000000000000000000000000000000000000000000002f8af3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000317f8b88feb28600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f07b22536f75726365223a226d6574617661756c74222c22416d6f756e74496e555344223a2234392e3937313432343931373637313137222c22416d6f756e744f7574555344223a2235302e303032323236222c22526566657272616c223a22222c22466c616773223a322c22496e74656772697479496e666f223a7b224b65794944223a2231222c225369676e6174757265223a224e35535949654d57494349374466514d64722f6a6242777a57376f4d7547717130486a7a4c3759777a59423839682f7a502b4e37786e6b35745335436a58396444765036382f7a78783831546c6e38716253544d596a71694b31656f2f746c383368793363415a37616c6746423437456c42682f43387a656b7052394a5950373157492f454a47316a6c425848396d4b482f4b5433595541376a3667516264574b2b79564d4d526e4a42514b51527939596c30475951426c3363445947416f346f3533795459446d765767447736735277463872697a506c6d784c626262666b313532355a6f6f49716f4867334e4e4e4e724d4c536a5774643131554674414a4e54376b4a5654434e46747a4e717851687178456b59456b542b44396166303267516f74363965706245726370646a4f4163503463594245724c4c484757696d2b4157644c446d486954436b785854674a61685133773d3d227d7d0000000000000000000000000000000083104ec4a0cbba86591e98a23aca6c46ee6232f976b0b1f495991a9f9a8b838da05e26cbf7a02999e4d9440d1b3896e176759898a00d2e3deacc245290c15f703280b54456f9000000b6f8b423841d8119c08305150b94ec53c830f4444a8a56455c6836b5d2aa794289aa88036f07ba018d1000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000036f07ba018d100083104ec4a08845d7939685aacd842e7cc6a6f3ef070024fd041ce57ba86981e6a4c301ccc6a00d4c39ae9c32907b28532afcbe9c85188f9333b738ea162d92bafdd7b6c1665d000000b1f8af831111b2841c29c7208301529c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c000000000000000000000000497083a97ec27e943fcccb05b0c3be315a5237e50000000000000000000000000000000000000000000000000426ddfe67d28c0083104ec4a034bf2f88c1909395607fd77fe449b8032a8af2b81473a2d4b8e3243a7afdc83fa066506c9a7ecf266f7480c8d0b10c0440bffdfda88d7985559a8389a6bb510544000000b1f8af831111b3841c29c7208301529c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c0000000000000000000000007f8e253a0d296cb512fe197f0a723cab3db8b4970000000000000000000000000000000000000000000000000426ddfe67d28c0083104ec3a0f095612f59dee211b900f1065b083b30aca80dc13d0e44bff0e4ca2de7624856a02f1cf415fdcdf985f865aeaad6fa90684d385c4737d474a67c25fc8bd49eb871000002d0f902cd04841c29c720830471269480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000017331090000000000000000000000000000000000000000000000000000018e7bede9e100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000017ac452000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000004d4c9fd42a9f6370a6ecffed46381a382acf581c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a0c00566b4777fe8c98a4ab657e384d4db9a34e71e1d1fcba4254c00b0b87ba804a06775eece4cb8d89d74bee1ab37aca074166c5f5550bff76c73d6dcc52e0a174b0000016ff9016c10841c29c72082a5d59447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000406364653563313734333834653633643133653730663033376136633038613034313838653265633162306163313064343763303331613731353963323231623200000000000000000000000000000000000000000000000000000000000000403538666630333132333839356232613234613363623130623736666662303666373332636464393837363332666535616461633534393266396237316139336183104ec4a019a7f935bf8ad662c5269838b441a3f6ce0d0f05b2166a08e817ac1d829d57cea05579fb3baad45daa1b8cef817de3a24b10602dca5b0f8c0f2f83cf0069a44d8a00000230f9022d09841c29c7208305e4459480e38291e06339d10aab483c65695d004dbd5c6980b901c46cbe96fa0000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000d27e4e3f596c8667000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000085640f000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000008551020000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a26393f297ffcba780a312d21264b3ad2935664a000000000000000000000000000000000000000000000000000000000000000083104ec4a09e6fc75f445c81588913a169437ffc19794b625b4a70c6fda91b62c48ce866e0a0433e97d8799d0e469d422d45f2045cba9bf62933dc35ff14befc0dd81e563f32000001b6f901b304841b6b0b0083038fe2940cab6977a9c70e04458b740476b498b2140196418612309ce54000b90144a4d73041000000000000011c660308b167d33407b2067a1804fbd7ff7527c8db5cd89658a71211acedcc9a1e662a87c2eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee522b81b0de4ea8129a340aff7538262ae993ca117a0e481f908209137a46268e6db2214ef5c92f791dfc2b1701329b53b6a91ba9436ccbb1cc6a60e4cccc04031e39613e9e8fffd6469c812f4b3a82de6472c03c5328182372b0378db683640600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ad0ddcabeffe2898b4435ed2dd41c8308b39d5cb000101000000000000c80000000000000000000000000000000000000000000000000000000012309ce54000000000000000000000000000000000000000087e83104ec3a08dffadaf4cf756735a740a6a341584ad43ff1b7c601faeb4e5e318154e6736a0a06877796bd75fccb048e22fd0b226e19d2c14c3fe78e0d8ee965472523cbf93a100000074f87204841b6b0b008301300e945300000000000000000000000000000000000004879536c70891000084d0e30db083104ec4a090ae57a72c2751dee34c57ad2f5667202d49e6cdff572a25b7a8cef52684d4c6a01e3cc759cb99621587e4257652ca43f21b67063b5b0dd1fb55ee7e856ee4d65b00000390f9038d03841b6b0b008304e83c9480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000009d760dd9f127400000000000000000000000000000000000000000000000000000000660337f80000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000066033753000000000000000000000000000000000000000000000000000000000000001b974edf9c4d26a7c047313e6c7a2b7e259969cd1aa96b279c0050bfcca6c157c53c9c6a2d47642dc4c515a84398bea5abca7e57eec6057b55529c968a0d61f9820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf100000000000000000000000000000000000000000000000000000000000038f600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000914995cb63da121f14d51bc094ca72fc967b1f4600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf100000000000000000000000093b12677eed78e71ec8f482ff59962415e2926350000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a05b23f65b38915274611a3ec219effb113d09c1501d2da60a753d5b3e54b82a5ba0693e59be5321c36c6dac368bc411fbf42a801c14fc8561e4cc27396c3db6c2510000008bf88929841ad2748082c8a194530000000000000000000000000000000000000480a42e1a7d4d0000000000000000000000000000000000000000000000000011c37937e0800083104ec3a0c017d3d1e9b6b10c726a4bb6554658453744c28489a12795cea6acaede82fff69f6e1f0d2448f1cbf0af1e0c7e4a29f8292696373d0e77ac5c56ef7c7b4140c40000008cf88a02841ad2748082ab1a94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec4a00bb6f56929e36899c692136eb7daa609c7607afdb18b3f0794b64bcfb3a5f83ca05d9696dd8a4c7bdc3c1e0f1cd2f37e7288a40d799281cbb7690e3b877f13848e000000adf8ab1a841ad2748082b4cc94530000000000000000000000000000000000000480b844095ea7b300000000000000000000000063fdafa50c09c49f594f47ea7194b721291ec50f00000000000000000000000000000000000000000000000006623f9014ae000083104ec4a0f43a56a1f7bba744f94c40c3ec87d9d12ee7d97af9e2b5b62686b8d00af6df17a01776bd9b0a8b5b0f76314d15a81f39a65e7231a02a353d6d580011b458f6441a00000390f9038d0a841ad27480830371949480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000001f996833659b34e00000000000000000000000000000000000000000000000000000000660337f700000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337eb000000000000000000000000000000000000000000000000000000000000001b79c59d96ed5d03a724a90b2cab3795ca1fd38e077ae436cd3f1e6167435e7256755203f012d18ab1b76cb8b52d16f6802abdd045d9b978307dc0dad61f4b454300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000001e8d679f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000098a8c69a29722880b508a970b1668d0fc6eab1260000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a051a4447e1a845e1b2163ed2bebb296ec094aed08e9dc8c7e6ac8887ac7c4c283a07244e775208917d692c84241117d1ba9439c45a93448ba631405d72c84ca7562000000b5f8b380841ad27480830f424094ec53c830f4444a8a56455c6836b5d2aa794289aa871ff973cafa8000b844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000001ff973cafa800083104ec4a0bf951a93c45d70a13f126e433da961fc8cdcd7245ea3478a09619ec447a20098a018a11dd3082811c963e682bb8cc664d20c5c44db33d1ed400b3c9a4ed9b03e9b000001b1f901ae81a0841ad274808303f38994fb5f26851e03449a0403ca945ebb4201415fd1fc80b901443d719cd900000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000003c1bca5a656e69edcd0d4e36bebb3fcdaca60cf100000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000340b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100020000000000000000000000000000000000000000000000000000000008c3c03b000000000000000000000000000000000000000000000000000000000000000083104ec4a0fd9c5526d247de99f2afd0ef0634e41458cef3d5a8236c18a198a21401180b17a0416e9338612c08422a0dceb63b5c7a139cf03ec1621a846eee8edf774842b9d8000002d0f902cd0f841ad274808303ce969480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000014dd5380000000000000000000000000000000000000000000000000000000066030d4700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000014fb180000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000e50df781ee0f3f92803dab2d7421d1806bc46e3a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a0baa6ce4d43355ae757091ca1e027ab34bc31a3e45a81dd994b613840562478aba07867046db34b860ecd8a1fc55b02f391926d2f4573aed2501cd90b3d4d157c2a00000111f9010e828699841ad27480830182249425ab3efd52e6470681ce037cd546dc60726948d380b8a4ab115fd80100000014508000000000002aee6b82000000007b0066031db32750ff0324ff7929f4ff61bebdb61ce5af22fb4b9ba65956a4d9f4c861c77c95ac6f2fcc3bfde928921da7eaf534c3b4ce0ce712012f92fbe1d8c70e800226ef2e014ef9d04f000000000000000000000000f66f8cef0a1fbf4ba83f70da5e9dce197f634b08000000000000000000000000f66f8cef0a1fbf4ba83f70da5e9dce197f634b0883104ec4a07809dacd469c9d272d20319b7d0aa3a3038ca09839f77635b051bda38089cc01a018e494e7357fcd65d76a58c2c7b73a7d0fbdeb47116a3846d5595c269fa6fc7900000111f9010e82869a841ad27480830172789425ab3efd52e6470681ce037cd546dc60726948d380b8a4ab115fd801000000157cc0000000000060a9433a00000000760066031db72750ffe708ff53b38a9dc2360d783efc3941881d94ea6f77bdec23fcd27ae0e2577042d9b53869d7268d735d8c497ab8ad765cf9909df7195980ce54db79f94fdab2f3b64f06000000000000000000000000c12b60fca11708c0c1165ed2ad5d6d3f92ce0a43000000000000000000000000c12b60fca11708c0c1165ed2ad5d6d3f92ce0a4383104ec3a07ff7c2e48d6be5526dfe0bbd9e9677b57145f82583afdef9114830792e54f89ba057c71cd46464ac066644da081339495576cb56f00ea663d16a7d253b8037ec0a0000017df9017a2e841ad274808301adb98080b9012560806040526000805461ffff1916905534801561001b57600080fd5b5060fb8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c55699c146037578063b49004e914605b575b600080fd5b60005460449061ffff1681565b60405161ffff909116815260200160405180910390f35b60616063565b005b60008054600191908190607a90849061ffff166096565b92506101000a81548161ffff021916908361ffff160217905550565b61ffff81811683821601908082111560be57634e487b7160e01b600052601160045260246000fd5b509291505056fea2646970667358221220666c87ec501268817295a4ca1fc6e3859faf241f38dd688f145135970920009264736f6c6343000812003383104ec4a0d8f52be7cb793636437516143249947c3dbab8d9ade0a1efe422dadac07f880da055d2569431f08bdba22f11f5756dfc388057a57ba6d86d448ff3a7fafb82f3e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8601000000000043acd10000000066030927000000000000000000000000000000000000000000000000000000000000000000000000009896800013000000000390f9038d0884202fbf008305950e9480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000001e941960000000000000000000000000000000000000000000000000000000066034f6f00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000066034f6f000000000000000000000000000000000000000000000000000000000000001c969b7742745bc5e08fb9730f0a2f17be6e6cc26c6173f48c6d088423fdc0d6d9576b70a9b434344bada4322d2432f7206f1a101e3547eaeb52e0de9a7782630800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000020301ab000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000436e3d22c78fa52cdce1d4157d6dc45b16fba6a10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a08001aef8d9905dc5d99d5b7cbc6e17a624daaa1ded23cad4592e14294ab519c0a04d185c502be6ed70581762be3d1d879932c5b0f0c9b65f2704b016ad806e06fb000002d0f902cd10841c29c7208305090d942db0afd0045f3518c77ec6591a542e326befd3d780b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab9723000000000000000000000000000000000000000000000000000a8e05c261cda30000000000000000000000000000000000000000000000000000000066031027000000000000000000000000000000000000000000000000000000000000002bf55bec9cafdbe8730f096aa55dad6d22d44099df0001f4530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000000a8e05c261cda3000000000000000000000000af9bd2da810ecf5d1b904df15914a0c2bfc98a490000000000000000000000000000000000000000000000000000000083104ec4a087ee766709bc3e7ddb928cb0750cf129902c76ff5749fc44fb585548b9ed435aa0603bed8a267d5ffbfdaf5282492a5b4b31dd7d603d195e3ec05872900f83b782000000aef8ac07841c29c72083010f4494530000000000000000000000000000000000000480b844095ea7b3000000000000000000000000b31d07f716b5cd5c47e5d46e6955d7185f04fd2400000000000000000000000000000000000000000000000002adc7c324fe600083104ec4a0db4ca357ab235ee930ecf57e130c8d17a4229e801c6effbf075fd8f7eea3865aa067eb53db5e813fa178507182704e639853b514c71c21566297c9fae8ada6b5fa000003f0f903ed01841b6b0b00830704f79474670a3998d9d6622e32d0847ff5977c37e0ec9180b90384186aaba2000000000000000000000000274fb07a03b1f1a8ba0b058c55700699fdf00e04000000000000000000000000274fb07a03b1f1a8ba0b058c55700699fdf00e0400000000000000000000000008fb641cafdbaa043545c352dc64df6200ec3e7400000000000000000000000008fb641cafdbaa043545c352dc64df6200ec3e74000000000000000000000000000000000000000000000000000258001dbc2eab00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000153ddcec2b903b14c728ae966fdb7d3fad7a9043fa5f2c06fd79efa8e98f33b03f99a7f65d969c0580c2b79241e73372315bca0aa4c17ce12ae88549e7ac7e095e6784e01e237297eb75e617817474841735318532f1977895d3ee734f75dba75ecee69a95473ab6ed96e1fc05ce087ef6d945a5b1baf9c4b7d810a07163d95d139b704a8fbeb0a4456c7753332d694992f241ff56194659854b5fb975bcf2cd4208fc59b10078e8217f3d7cfe208975c5b3ee9446e98ae2d37326de93a3232b7291c6dad09a16880971a07797b9f0fbaaf17b073223c1f5636d1fecbb4d9325b97cc17112f854b4f30edb0593b369f7290ad1f57c25a8e05e4bf005b367b6172571df3b44fa5931d9ff85e553e2fa5d5f6f9c1decfcd60224dbd6961c283e387e4774a8510512d946b77ccf56b491c7feb857a8b203e3eec3e0124c31c40a2e8a8d6e3a226e1d2940051384dbe56e5b752c5dfae5b9a700a5223cf3592a61ceb4849244a8a99d91af6fd4e7e9ae4ece99af7575790b6d45c9d3a79cc369a1044083ca79c0cbc858038b81f02badbea2d1e63fd594b5f57787cc644c6fd439ac71ef49c7984d2b776dc15564c5540a93074857bd34addfc295569a2032791baf17d799aad761201a56b2b3f52c52d4bb73974dd36a9d605277be82f91c6006528906e1fd88b12ef616ed440023536b9ed4722f3c61006333a1cbda62df1f99653a92e1fab15fafad07c26758935854d825f112b3570da7978033b85934c728d3446efd0f9eaffd40c2fa21708b8edea304a878f18b5d69cbb6dc7deace32b583173a2e95e80c52686a9d2a76a27b7f6a347bec875545a99b41dc3b0095c466a4c4b3b10ec65242e82a46a0b49a819478c227b7d4bb1ecbc24fa9aa28b19940d677f764432b9d14c964dc5c5056592e9ef7a2c04322199a1efc9fe7d04930c6058983104ec3a07d3b7a3f9a7d9339a32a712c4a957f5855bee068b960baac0b39087c62743c60a07f227271a3afc8134e54d33027a112b7c49654803ae39dc28bc5dfd16bac843c000000f4f8f220841b5bc8c083035fc59426da582889f59eaae9da1f063be0140cd93e6a4f861695c574e6a8b88489a281b60000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a5ddba6fdd5c599a4b0b9379fe28cbf318687ff30000000000000000000000000000000000000000000000000000000000000001000075ad0000000000000000000000000000000000000000001bcfcc20b1f80083104ec3a0ac8cce4586d99f8f4f212cc6fd69866bb20a6bc9c27f092ea4192f010c9ac3b8a0623e6da348ed2c59b40eb87c5c64064636423f787a684cbfeea2b7fcbd16d6370000008cf88a05841ad2748082ab1a94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec4a0bd34aa24943fdf4692eba7e816f835a3c4b3ab78c4fa572f6eabf2cec2b4ab80a062a1158cea4bee10cab416e4029c7a37fa72d433bb79c1a90daf0930c0e0dfd70000008df88b8183841ad274808265ea94e6feca764b7548127672c189d303eb956c3ba37280a4e95a644f000000000000000000000000000000000000000000000000000000000134d7c683104ec4a004bcb5158645fb97ade1c95e9dfed98f340c34b5fdbfd23bd2339891e89c6310a06b9156980b74e8ac18d9c1ec5c6db79de4cd4682d9d13810c48fdba50fb05a6700000111f9010e82869b841ad27480830182249425ab3efd52e6470681ce037cd546dc60726948d380b8a4ab115fd8010000000dac8000000000005230b4ad00000000700066031d902750ff2329ff0ba93a8a353999c857f7577522114c5b7beed91db3eab2cfabe95fedbcdb834ae4f99dd7fe2365055ad7a0d9e3c68c2780fa869aa6b9c00c3b2447cfbe83a043000000000000000000000000f8071664ac913d1520d3841337c430154a6e36f3000000000000000000000000f8071664ac913d1520d3841337c430154a6e36f383104ec3a0854d4d193d4c9aa575bb8a6a2bfb6620bb120211c4c3c8002eb9fb9e970bd4f7a07762d250a5cd6507f055631d4b42f3901cf4ec6e88cd4d523fabb809dfe94c7000000297f902943f841ad274808303d6eb942db0afd0045f3518c77ec6591a542e326befd3d7876a94d74f430000b90224ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000049936e3f4c691f9e59fdafa92f905e0e02a59fba000000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000005b5dd702a6ec680000000000000000000000000000000000000000000000000000000066030b68000000000000000000000000000000000000000000000000000000000000002b53000000000000000000000000000000000000040001f4f610a9dfb7c89644979b4a0f27063e9e7d7cda3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a0000000000000000000000000000000000000000000000000000000083104ec3a0b99f72627143fce405f82ced1ee59b155e7bcc9121a595cd550812112dc502b7a03f5b3cee9eab5c1c7ae3d148659084b2473c766ca493f25c93a379f878b9689a00000093f8910c841ad274808302329894609c2f307940b8f52190b6d3d3a41c762136884e865af3107a4000a440d097c3000000000000000000000000ed8b6576ac0d3eab09f2c2fed3f4a5d4c7b6d86883104ec3a0102f8907c7e15d20a3211d62323ac2aa01e97458b8f7f7fa2e3da00f5b5ae27fa075f7f7066e97aca844e343def9a35532ef28b79e5cc4cfa70e0d29fc44a587ba0000006df86b03841ad2748083020671944c826c813f7d622edacce46abe0d89be3478aa4580841249c58b83104ec3a0263d90c09d5116790e94d944cdf9742f5be2320b28bf9f73d98550ef0bec3f9aa02a6e194b3378f0fb4cc2922b80104adefccfa7f36ad7b2d8ab4939ad59725f3d00000074f87217841ad2748082cab49453000000000000000000000000000000000000048811a70d42ba4c000084d0e30db083104ec4a061047669df72ca970364ef39b62d4ecb6f722d911c4d331276f8942cb013fa2ca0011eea61400cbad2aac8a50343280af61276ab2773d3d9ff31b1a919a44356c1000000cef8cc03841ad27480831e848094ec53c830f4444a8a56455c6836b5d2aa794289aa80b864c299823800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c83104ec3a06df5dfcee74e958e1cd81a4103a5a26733827e683b423bce3b286a036bebea87a01082d0fe47ee3f079c58fa92e3f2a39645dba8b5159215c1a1765345c731e0f100000115f901123a841ad274808302eeda94781e90f1c8fc4611c9b7497c3b47f99ef6969cbc865af3107a4000b8a4b2267a7b000000000000000000000000a58694a524f459b8c0b79241ea28737ba0f7dbc200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a033e756fe05d8649a188250140352daea868b042aabba9635b747fc39d03bf69fa00b7b16f9bf5af1a299c38512435b26c94744c24c8ab44f943c3a3c11e25679e900000237f902340b841ad274808302931a94aaaaaaaacb71bf2c8cae522ea5fa455571a741068718a18092bd78bdb901c4a15112f9000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000002f3cc000000000000000000000000000000000000000000000000000000000002fba0000000000000000000000000000000000000000000000000000000000137083a000000000000000000000000000000000000000000004050425309fd00000000000000000000000000000000000000000000000000004196e8335d74000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a002f2f5db9cdec76ca0ef6410cad2b6a809ef3c7a867ce9ab9615daf4f728f217a0426a7f0c59807fcde28bc8f54327491affc64c967758dee4902b7b07d167eaf9000000adf8ab16841ad2748082eb929406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b30000000000000000000000002db0afd0045f3518c77ec6591a542e326befd3d70000000000000000000000000000000000000000000000000000000002fa7d0683104ec4a0e8fe569a3b05e8ef62155e790d8399e4c9cb45d1301121b4f291f04b234ee6cda03b51622a92f7b9ef6ed9b35d3895d28891b830330ff0953665eb5a3a4568be720000016ff9016c07841ad27480826e8e9447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000403332636565393739653333323031626266363131323362383239366164303066363931366265653336373439386237336533666537386561363235656232346600000000000000000000000000000000000000000000000000000000000000406132306164653661313434663437643362653737366337653336393035376139366466313765356338616536613632383736326662613436616534303532633883104ec4a05bf84d74b20d6d1383696f407432cd5edfd22ad85f4fe719edd5d148c0eca62ca01f55f37eaa5dd00761615a3382af98577fa0a9ed758ad3592cfb8f48f44d9e0a000002d0f902cd1f841ad274808302a1349480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000001104aaad3346eb000000000000000000000000000000000000000000000000000000006603380200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000010736d000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000009b04f868352a7e99f786d69dba25c4cc1b973cac0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a07fc513b4a9f86a1c8d4e54038618a96bd5bbe0d868a6a262341a3119c888bb3ba0408d16c496463ce3219e23a50157050016de578b2ac6dd63d57c3ef12a1e7f3c000002d0f902cd14841ad274808303e5e7942db0afd0045f3518c77ec6591a542e326befd3d780b90264ac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000012475ceafe6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026dfd1b0000000000000000000000000000000000000000000000000027c9d726ee04000000000000000000000000000000000000000000000000000000000066030dc7000000000000000000000000000000000000000000000000000000000000002b06efdbff2a14a7c8e15944d1f4a48f9f95f663a4000bb8530000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b2995f6803a963391cb537608ee1004e3408bb50000000000000000000000000000000000000000000000000000000083104ec3a08d957616c825f16ba7fff937e66289fe00f418daf6e0b0a833cb3d082fb99007a00d3a92ed753035e788374c5a160a31c9dba97335b35ce473ad21cd743fe830f30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136b01000000000043acd2000000006603092a0000000000000000000000000000000000000000000000000000000000000000000000000098968000100000000000b1f8af831111b4841c29c7208301526c9487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c00000000000000000000000083001915bc8ff18bf61539c86ae92c6870e2f3e6000000000000000000000000000000000000000000000000000e399b91a25c0083104ec4a0218607542f6c3bd9248dd00b40f8b0050904d8ef57604cdacab5ee9aaddcf4afa039e7e002c4ee7e40a59aca501571f7fe9d2cfcdd07a4f7ee9d845cffc17e322300000390f9038d0b841ad274808303719c9480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000338e73fb1d813f00000000000000000000000000000000000000000000000000000000660337fe00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337fa000000000000000000000000000000000000000000000000000000000000001c3eb375ee126532a0a2d281a53c39122a2176dd6f74835ef6cb5c2dbfb084a0f664cd66bed53fc82c4c5f56abfc748486f360eb4eacf32ce8feec8446f2cfb2ed00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000032d066900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000ac8d1da40dd0a213071f1157e4dd129bc292e3300000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a08b52b1e254a5c18cf7ecea2300c16fddf23fc5850ff5eea446181053fd3e128da0459927ef1f5401ad001524aa284b391167bdc3b3cfa1f2a895aaa30c3ac0cc5200000070f86e0f841ad274808252089480c67432656d59144ceff962e8faf8926599bcf88814b66cd7a745632a8083104ec4a04aa8984e35716d83ee39d89aec6f8d056e2cdcc6983a073df312f0cd22af5ff3a029cd303a66ad957783df9223b2fbc508763ae00eb61d1c4e961bd25482dc039400000072f87015841ad2748082ecff94a0d013b84fbaeff5abfc92a412a44572382dca08865af3107a4000841249c58b83104ec4a0f4a3357f1a6840697f7b4fc4228c84241e0083d80e7067bf8572df1d9bb0e5a4a06fd37d38b9d4806c01089e1110c7de09a046cf49c0d99d777ba38b49c578c8d000000390f9038d10841ad2748083035b039480e38291e06339d10aab483c65695d004dbd5c6980b90324e84d494b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000037acf7354f7de0000000000000000000000000000000000000000000000000000000066033801000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f97ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000660337fc000000000000000000000000000000000000000000000000000000000000001bee7d1346903cb919275690ccc0e94600301dcc96ac666a02b1b2ea33b2617f9d63e52af53436870aa3cddc6447000683ea075b4fe911ca3edd8c5d53fb132e84000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000031c4945c343d5f4900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b39880c7a0b752179d6d7d9ae594ab4c02d6e5b80000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f970000000000000000000000001af5b3906e388d1cdd56fc5dade1c71e133095770000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a0ff82628a2a1d8bb7db3e78b4becf869daafe100e7361e030aa8f492ad96800b9a0456269c095d7b2a02b91921c7bbcdbeefec75161e1690e88563655815c69e86e00000170f9016d14841ad274808302beb29418b71386418a9fca5ae7165e31c385a5130011b680b9010418cbafe50000000000000000000000000000000000000000000000000000000000281247000000000000000000000000000000000000000000000000000297e49304c9c100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cabadc213648370a9e1b097321a20e9cb3e181450000000000000000000000000000000000000000000000000000000066030dd1000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec3a098fba55df026cb91cada64cdea78a1e5d9862f53f761d1a834858e81e739ea30a0269ce5871a353ded4bff8eb4034e07a58d256ecb107657d371c6901ab627b80b00000073f87107841ad27480830206719483eb631112e4a73f645ad5a9af5925da84c46315862d79883d2000841249c58b83104ec4a0517fd0bf5d6e941035d56a1b379dfa2369df267e28d4bdd99bdca418f717399ca05c62361bd61d9b444a343f813cf02dddd3d7b442311283454fdf3249e616f9390000006ff86d0a841ad274808257ec945e809a85aa182a9921edd10a4163745bb3e3628487fc7927736af4878083104ec4a0ea8736d937c4b9e39fde4db96ff76cfc6a5ec7b3eb4ad1359aac6804ae82661fa07e55ae9a4dfa5dbcf4724f932c5fb7eca4577b6ecde3e1691414eb59e92e0c9a00000210f9020d0b841ad274808302529d94aaaaaaaacb71bf2c8cae522ea5fa455571a7410680b901a4a15112f90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca77eb3fefe3725dc33bccb54edefc3d9f764f9700000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea056927ef6980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000100000000000000000000000000000000000000000000000000107b1fb5bb53f8000000000000000000000000000000000000000000000000000000000000000083104ec3a0d5ccdaf3da7723ff61ddfa4815edebcbaffab22f22e609a8bc38f4ac507d0cd0a02e1e0999770fbd0a4a42fa822972c85e09b2d85b2f63cd24b4977fd16b7fbf65000000b5f8b30d841ad274808303dc7994ec53c830f4444a8a56455c6836b5d2aa794289aa872c7c770db8258ab844f2b9fdb8000000000000000000000000274c3795dadfebf562932992bf241ae087e0a98c000000000000000000000000000000000000000000000000002c7c770db8258a83104ec3a07acf779a50f703d17be89b6a8c7d3edf364f402fe4b02ba40c4c1d9cf4d59ad0a07ee59cdeee71ccb9094a2065acd374194fe00d7384dda118f599c1eff0ad648700000070f86e1e841ad27480825208942fc617e933a52713247ce25730f6695920b3befe8805ef7ee24a6f40008083104ec3a00284ef3e7c41461d8380aba5d4cff5f3f3ea8b976757e426cce8cfe87b6bd55ba0122d5e066cdf8d958416d36e64e19009d15566e246e677862f5e8995ef5448ab0000008cf88a02841ad2748082a73194530000000000000000000000000000000000000480a42e1a7d4d000000000000000000000000000000000000000000000000004380663abb800083104ec4a02535ac88d720011b9259b5901fa978cfeb211286a8481780d9a94479a18f36b6a0029786c8e575ce7afbcde52d4dde703c4663602f7e49333cb8cb5a2e5504d9fc00000094f8920b841ad2748083017bdb94a3e728825a6e462399f12bd702c5d88ceaf32bda870193d0ce47c000a440d097c30000000000000000000000001943f0ec6cad494b11739525342674e939737f8a83104ec4a095c62186cbceef7c958927265d5273c88ef036847b10d73a1d9b212e1650cb2da061b931c8d9a571b232a4c779251064b1a2eaa0c38a5f5faf2e3c6de83f634254000000aef8ac19841ad2748083051f1c94ec53c830f4444a8a56455c6836b5d2aa794289aa80b844abdb5ea80000000000000000000000000d8f8e271dd3f2fc58e5716d3ff7041dbe3f068800000000000000000000000000000000000000000000000000000000064e890083104ec4a020061000ee2e9da025f3ab6ab6a6da82b8ea5b02aa67c139b00e93fe2400fd1da07cc43bf458ee5383be9ceb2ef298bfbdd2a7b38344003bb5044c469c7e60c84a000001d7f901d417841ad274808302860394734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a87470de4df820000b901642646478b000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000439a8a6000000000000000000000000fb57a1b563d78692636f198476a63b2b3e566e8500000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000700301ffff0201734583f62bb6ace3c9ba9bd5a53143ca2ce8c55a530000000000000000000000000000000000000401530000000000000000000000000000000000000401ffff01e64ae4128e725868e8fe52e771e3d272e787b04100fb57a1b563d78692636f198476a63b2b3e566e850000000000000000000000000000000083104ec4a02a8eaa57f513a3af4acf89777ba8d9674ed491cbb55592d211396f89d0045b6fa06db7057a3cf32cb457cb2db59be9478082212b207da5776c4f5f885a09e690150000010ff9010c58841ad274808301551b9425ab3efd52e6470681ce037cd546dc60726948d380b8a4c8173c4401000217ae76800000000000647d518400000fc73b0066031e1a2329092750022fb857f9ae326148176453a628f0aeb3a123ba854a6f394c428a5ad29750b9ebc9465f1430234b8ce02cd1bff277e5486c01954272be29a813b62bde8fdab6d40000000000000000000000001a8c1ce5ef00ae99d12a0d39c76e7ce6dea8f8440000000000000000000000001a8c1ce5ef00ae99d12a0d39c76e7ce6dea8f84483104ec3a0f3f420d6f1af631c3a86060824a9f314e7d836ee57472b99d6c1cabcf22ea16aa02dad8a3088d739975e293009e3cce080619d2ff74c3d583e3774b837289167a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048bb01000000000043acd3000000006603092d0000000000000000000000000000000000000000000000000000000000000000000000000098968000060000000000aef8ac08841c29c720830127cb94f610a9dfb7c89644979b4a0f27063e9e7d7cda3280b844095ea7b30000000000000000000000002db0afd0045f3518c77ec6591a542e326befd3d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a0a4783c5c1e7bedd5b0216bf850837033e7dd1cf180c9fc4b6450b6eea84bdf5ea0152fbb72147da90300cb8286144e70a8b58f43f1218638c75aa51415a927c94700000156f9015380841ad274808302ae0b9418b71386418a9fca5ae7165e31c385a5130011b68706276d3dae1000b8e47ff36ab500000000000000000000000000000000000000000000000000000000005d21690000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c3b765f3a6ffcc60c8a01f2e74f7c6450d24b3ac0000000000000000000000000000000000000000000000000000000066030dd80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000530000000000000000000000000000000000000400000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a483104ec3a0143070ac74d0a336d4f009c0eb0be4fc6ecd029aaaffa9e68c05d872ec6a6ecfa0183bc3cd059710fe834b09875503e015fe71fef45cc7aa36a76792e073ff66ae00004298f9429514841ad27480830c27d4947b2e3fc7510d1a51b3bef735f985446589219354880a70a55dd6c8524ab94224819bc4b9000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000013e31000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000ca9ad076f2c25571c719df64b2ec1d4087e15f5700000000000000000000000000000000000000000000000000000000000041a00000000000000000000000000000000000000000000000000a688906bd8b0000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000844e21fd0e90000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc897000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000000000000006603301300000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040e756cac1000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b0000000000000000000000005300000000000000000000000000000000000004000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c700000000000000000000000000000000000000000000000000a688906bd8b000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000f40442e1cb0bdfb496e8b7405d0c1c48a81bc8970000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000a760000000000000000000000009fab7486000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000a688906bd8b0000000000000000000000000000000000000000000000000000000000009edf13f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f17b22536f75726365223a22696e746572706f7274222c22416d6f756e74496e555344223a22323638392e343033353534353834373835222c22416d6f756e744f7574555344223a22323637382e3831333833222c22526566657272616c223a22222c22466c616773223a322c22496e74656772697479496e666f223a7b224b65794944223a2231222c225369676e6174757265223a224a4a2f533847356c7349654d6c2f7a624a676467716c436f6f34446854494a56424a4e2b6e48314f6d684c647054573066776e7437454f62782f61696a445a616c39697251774348764d59422f61684453446945422f386e592f31334b69573734326d364c757050765a7861564264557a30724a635359473639472f62324b47314a5068635648734f64684e316577374b6675615632696b756c73366c31767141687670527645414d337972434b566d6468464c7a4a664d6238786a374c30655772677849597338676836333941462b63682f36563233614352323348472b2b566d3430444d5a663542342b586147485a6b614c372f336f46306934322b78587345455653573861554356784b6e4a6c6273313856705350586f322b49623452506c67396c3847686d6d4142444172694231746552716d76717a4b752b4c494a654b584d447731365a726f48504c2b70664f756756773d3d227d7d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001c2000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000913802896bc9a6600000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000913802896bc9a660000000000000000000000000000000000000000000000000000a54fb72a1cc217b0000000000000000000000000000000000000000000000000a7d42d9bcf3a00a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000913802896bc9a660000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009112d57a6f8518a40000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000009112d57a6f8518a4000000000000000000000000000000000000000000000000000a5256679c22037c0000000000000000000000000000000000000000000000000a7a937f4771ccf500000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000009112d57a6f8518a4000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090eda86b73408ae80000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000090eda86b73408ae8000000000000000000000000000000000000000000000000000a4fb15c8cf8a1d40000000000000000000000000000000000000000000000000a77e424c84baffc00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000090eda86b73408ae8000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090c87b5c76fbfd2c0000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000090c87b5c76fbfd2c000000000000000000000000000000000000000000000000000a4d0c51744ffc4d0000000000000000000000000000000000000000000000000a7534ca3f8148ea00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000090c87b5c76fbfd2c000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090a34e4d7ab76f700000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f985446589219354000000000000000000000000000000000000000000000090a34e4d7ab76f70000000000000000000000000000000000000000000000000000a4a6746522812b70000000000000000000000000000000000000000000000000a72856fad12978c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000090a34e4d7ab76f70000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000907e213e7e72e1b40000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000088490411a320000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000004300000000000000000000000000000000000003000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f10000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000907e213e7e72e1b4000000000000000000000000000000000000000000000000000a47c23b2680e4dd0000000000000000000000000000000000000000000000000a6fd61510ff9bad00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b2e3fc7510d1a51b3bef735f98544658921935400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000104e5b07cdb0000000000000000000000007f0db0d77d0694f29c3f940b5b1f589fff6ef2e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000907e213e7e72e1b4000000000000000000000000009f92b2706c643ae6fdf2e9ca472f0e48497385f100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e43000000000000000000000000000000000000030001f4430000000000000000000000000000000000000400002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001649f8654220000000000000000000000004300000000000000000000000000000000000004000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000430000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000242e1a7d4d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a49f865422000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d1660f99000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000007b2e3fc7510d1a51b3bef735f9854465892193540000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000b527a00000000000000000000000000000000000000000000000000017d509f3b3a0583104ec3a071aa96a80804c6dfc1014244c659c0a290220ade2d2c79d9cd483495f650c54ea02cbb97df055bcd39a97a3edf63e03f8ac5b28ff611b9537d7f2fe8ca04046c4c000000adf8ab11841ad2748082e89494f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a05f31c45c3514b8248ae59b510e5264c1288aef2dd4d9a9d299756d630247db3aa07f8ce62a896f05e0dedca103e13544b5e81a10a649c24852be1b188738495519000000adf8ab1c841ad274808285ea949595910db7625ab963d2b32a60c2db5bb9fd20c980b844a9059cbb000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000000000000000000000000000001bc16d674ec8000083104ec3a017ca7389809af3cdb672e30a4d74cd15e6b400e3e36967aaddefa7abb53a4a1da019ca37ed89bb6c4ff4d6f3d643818b8854ccad4f7c63c8439c9abf397d7cc6fa00000270f9026d05841ad274808303fd9f94a6b71e26c5e0845f74c812102ca7114b6a896ab280b902041688f0b90000000000000000000000003e5c63644e683549055b9be8653de26e0b4cd36e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ba9d00bc72a74f426361a42a9b9e162dab996e5100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec3a032ad67f4218d4ea21645f1ab9d57e676f90ea8e7845b9f2cf53caf59bb8e0473a06943e034025509c4eef60fb5dd68f028a98c526c639bcd84c09b0367b7ea5be20000000000000000000000000000000000000000000000000000000000000000000000080501000000000043acd40000000066030930000000000000000000000000000000000000000000000000000000000000000000000000009896800007000000000279f90276830829f284202fbf00830a987c94581b26f362ad383f7b51ef8a165efa13dde398a4865af3107a4000b902048624ba07000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e35b8d65fbe2824e3a6bffa6a0799a224dd8723c00000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000d3c20b5ce963b9d7ade66c01023f63aff68bc1cb000000000000000000000000000000000000000000000000000000000000759e000000000000000000000000f9d0b0b11c55defdb635c8bcc1a65ab5188ffe040000000000000000000000000000000000000000000000000000000000000145c2b4914e4ceb8f50e13b6a0f74ec8db5fe92e6c34e8b37e038f2162b763ad424000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000038e280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a01fd1cda32a91e6d4be86c62d49dd1f235de2812004af66f01c21688ed1ac7e24a07acc1d7be6f563264dbfb4d8d0f4a647fb78efefc23399f04f9cc6784f6dd4d4000000aef8ac0b841c29c720830120c194f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c690000000000000000000000000000000000000000000000000000000001f6845783104ec4a0957e4f361b9bce36fc9c4ca7abd600fc7d44c70fde31c35a035532754dd96855a078256d219e17d2c625c972af5e811e803ab67cf9ddf0ac3d9bf210f08a465c7500000177f901740f841c29c72083045ef194aa111c62cdeef205f70e6722d1e22274274ec12f872461a3059c1e6bb9010467ffb66a000000000000000000000000000000000000000000000000000000000226a67b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000006de48b08c8f57403fa595a57f1032b406b68333a0000000000000000000000000000000000000000000000000000018e7bee22ea0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000530000000000000000000000000000000000000400000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000083104ec4a04608564b5478f5f1d462eb2789e7a05c821d17a70d7bafb2a069a3dadaa2607ca06be968c83acfc022cc4d0629ac225c971024408a017c8479685428a9318c7aef00000156f9015339841c29c72083041241940122960d6e391478bfe8fb2408ba412d5600f6218707de6f82e5db95b8e47ff36ab50000000000000000000000000000000000000000000000000000000000738f0c0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e8c91b44fead8e62794e934684ee3443fe84348800000000000000000000000000000000000000000000000000000000660310340000000000000000000000000000000000000000000000000000000000000002000000000000000000000000530000000000000000000000000000000000000400000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a483104ec3a00374b4cc43709b761889c76e9d8ae0a1645c34fce6e364dd14453bfc1e629e2ca056bf3d599cf64f2e832911fdcf2c0276a799d54e1517cace3f99c1fc621c94f700000073f87120841ad274808302067194953ef35fd705d3b835e12a7a80205c5224bd692d862d79883d2000841249c58b83104ec3a093d713ffa84b87ec85370982b511122f6afc66e1993748e8e46c0782781f673aa02356eca2bbb0746db7f95c6cddf8ef218ffa3381e687e54a6f41ce91e9464f96000000d5f8d309841ad274808303cfc394ff75a4b698e3ec95e608ac0f22a03b8368e05f5d870da175549c1800b864474cf53d00000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe000000000000000000000000e1587c4f84db5bce07f570178f34e52d6a57beaf000000000000000000000000000000000000000000000000000000000000000083104ec3a0ef5910a7cd86b54b8e09c91719a8b777b48d14001d2a6e8c57875981040345b4a024334e4abbddf796c19618ca2a502004bd5cb4022cabc4e530218d708ea8109900000070f86e818c841ad27480825208945e809a85aa182a9921edd10a4163745bb3e362848717a023c7c1a0048083104ec4a0b169ec51e7a5cde6ec404507acd37df96b55effe5792f6bfffcf34f7cf6174f5a0309c16020e714717ba1ff6d8e6458d4ef6d61781bd261958a39d3db219860229000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180e01000000000043acd5000000006603093300000000000000000000000000000000000000000000000000000000000000000000000000989680000f000000000073f871830849fc84283baec0827b0c9400076e1ea45645fa760e671326deb4281c676e8588111380206f7c40158083104ec3a098f1962d150c11bc3780b81743adc96debb75a390e63e774ac78cea601222638a05d3c1889320a8ec84861b87840a845844469ed0692f1581b5cafe29544ad9948000001faf901f7830829f384202fbf00830f8d5c94a658742d33ebd2ce2f0bdff73515aa797fd161d987470de4df820000b901840508941e000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000007dfb5e7808b5eb4fb8b9e7169537575f6ff1a2180000000000000000000000000000000000000000000000000000000000030d404f2f8cea88fc9da907cfce0e75b4c75ed47cba54817067bad30a5f6e64cf1dbf4f2f8cea88fc9da907cfce0e75b4c75ed47cba54817067bad30a5f6e64cf1dbf00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000ae314a21792fbce6427ceef079cc68e78300a0d700000000000000000000000000000000000000000000000000000000000000680000000000000000000000004d73adb72bc3dd368966edd0f0b2148401a178e2000000000000ffb0006e4ae8cebccd7027820ba83188dfd73ccad0a9280600d67dfb5e7808b5eb4fb8b9e7169537575f6ff1a218ae314a21792fbce6427ceef079cc68e78300a0d700000000000000000000000000000000000000000000000083104ec4a0ecd6065e08a5ac8507099acbeb75fe08e69a838d1f03edae01d6d5fc441f8bfba078521acacb1a0b0e03309e312b4ce859225d35a63a0fc94b7a30234f59cbae6b00000093f89107841f78a4008302329894609c2f307940b8f52190b6d3d3a41c762136884e865af3107a4000a440d097c3000000000000000000000000b4a726f320b429730b2f1d2165c2ce06b932808583104ec4a0496daeceb48a12606bc67f89f2b03248e6ca3db6cd1a3d7ebb6ba77fbc995adaa06905c3999444b450d9227c0e424749de85852bc03344387dc4665d27acf19ab1000002d0f902cd0c841c29c7208303f1bc9480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000004a9ae1aa764dd000000000000000000000000000000000000000000000000000000006603103400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000004be11900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c70000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000007141b84ef27b67b7192d95a672f70996e40c5c2d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec4a03c8bf9d078f6cf64ea8c373e4e84e822a9192dcb181b25ca6787e0fbaac94709a03b4d63b2394e6668a72d78339256c21152c324d5483cc0b9d0606d58417b218c000000adf8ab21841b5bc8c082c1dd94f55bec9cafdbe8730f096aa55dad6d22d44099df80b844095ea7b30000000000000000000000002db0afd0045f3518c77ec6591a542e326befd3d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec3a0f2cdb7edf3e4bad66d60d70f35c80187451ebb9578b3298a1ebd205543b9f615a07006b3ae108254c05843c6530c65e1c0e6e6ef40d3322544d079cf567f6d9007000000adf8ab08841b3337ac82fa7e9406efdbff2a14a7c8e15944d1f4a48f9f95f663a480b844095ea7b300000000000000000000000080e38291e06339d10aab483c65695d004dbd5c69ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83104ec4a0ce1fd84a4522db88cc05194f81d874ad55a7afde2664a33b5d107ebfcb5c8856a07c18899a7b9c2762e94c8d0a78d15e5ebebecedf491199d896ddab5c026a09c7000002d7f902d409841ad274808302bb2c9480e38291e06339d10aab483c65695d004dbd5c6987471b46d16ce0f0b902642cc4081e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000042378250000000000000000000000000000000000000000000000000000000066030dce000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000471b46d16ce0f000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005300000000000000000000000000000000000004000000000000000000000000cf60ec7ff940b6ab942ac77e2b689374139f36810000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a00d3755e9af3f8878385789c9cc678ce88df461a1468d9dee7752fbdd99e3bf36a07e8ba44daa4e1af80a2c499fbc6075270976a0ae8e4d0be45cdcf014adfb6b0f000002d0f902cd06841ad2748083051b0a94470ab53a2e939bee3cc9d0064034cff925a9c8c580b90264fc8791900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066124b6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044752414200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000449474f4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b516d61696d32667a7a6534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a01aea9c26624c7b6c4061991a9cb84f4693274de3388e77863e5667c6dfc26623a05900464b1c65ed2772b3d659555e3eb07a48adf404829b820bcb2ed2b77151f50000006cf86a2f841ad2748082aa4c94d55d9eae96ce441890f403329252c9f3812a68d68084b49004e983104ec4a07bb33cf4d6d742f6b1d82add55aa484d4d926e1f5bc7d97d3b4ed69e95414ca7a0529626e404c76ba49bd96396647187c6a91fd72d3e6e724ef6c774dd1889415d0000017df9017a05841ad274808301adb98080b9012560806040526000805461ffff1916905534801561001b57600080fd5b5060fb8061002a6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c55699c146037578063b49004e914605b575b600080fd5b60005460449061ffff1681565b60405161ffff909116815260200160405180910390f35b60616063565b005b60008054600191908190607a90849061ffff166096565b92506101000a81548161ffff021916908361ffff160217905550565b61ffff81811683821601908082111560be57634e487b7160e01b600052601160045260246000fd5b509291505056fea2646970667358221220666c87ec501268817295a4ca1fc6e3859faf241f38dd688f145135970920009264736f6c6343000812003383104ec3a04294f9d3dad1faf18c17393c72bf51c06060923599b57d5808f0892c468cc621a04942bc3d7938aa50a6a8e5835e437aadc04c431f906f3a8e04d5c016ffc11faa00000170f9016d11841ad274808302bebf9418b71386418a9fca5ae7165e31c385a5130011b680b9010418cbafe500000000000000000000000000000000000000000000000000000000021f2a0b00000000000000000000000000000000000000000000000000234773521cce3e00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000008c2a9e424048ce25cf317fa404c5a45521d0f09e0000000000000000000000000000000000000000000000000000000066030d4a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000530000000000000000000000000000000000000483104ec3a0ac939a12190ca5626c21c5d397e8ef424e5bcad972d719b6cc1a6d854688487ca05f8a2f1b745741a4707e167566ba205db072bdf49ba10894351353bd331f5d0400000218f902155e841ad27480830291ba94aaaaaaaacb71bf2c8cae522ea5fa455571a741068803a026b8759bd33eb901a4a15112f9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a400000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000372261400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff5433e2b3d8211706e6102aa947100000000000000000000000000000000000000000000000003a026b8759bd33e000000000000000000000000000000000000000000000000000000000000000083104ec4a0ade3e0d76fdb8797692b6193ab3830da8706c82d795d31d6f887a5b06ddacaf3a052849362e62694c712b31a96699e6f58cb5883f6f309539cb2f0b8c8b305ed6b00000073f8713f841ad2748083013072946e55472109e6abe4054a8e8b8d9edffcb31032c586f5904616e000841249c58b83104ec4a081a9664d9bd0e4525bd67d4024de958f4cef4a4c3803d7a84ba8656d6b5d11a1a0175e5fdf1184dc29a3fdd54f0876c01557565ea7e8086cfec82f5ac6893e776e000002d0f902cd18841ad2748083037d289480e38291e06339d10aab483c65695d004dbd5c6980b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000101f7200000000000000000000000000000000000000000000000000000000066030dcf00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000000000000000000000000000000000000001036640000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000002076d4632853fb165cf7c7e7fad592dac70f4fe1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000006000000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000009c248d7e81394c2226f33afb2e896b6af895bb380000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000083104ec3a038de7c589fc0050b4148025eae889997015b9d4fb82c190aaeb683ad893a8798a01732e54a4f3c1ce929aeb885ee7ffb836ca32c1d4e94748a5e0c978c84fa31fe00000210f9020d0d841ad274808302b7dc94fc30937f5cde93df8d48acaf7e6f5d8d8a31f63680b901a45ae401dc000000000000000000000000000000000000000000000000000000006603101800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000cf1a64b000000000000000000000000000000000000000000000000000000000ce1d9f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083104ec4a01f703e487e503c56700530ee5915457da31c2b8953a7c4f28ba8d7f6fe17b223a071a0b443345f8881e04621c1d8c2a7917cabc4765fce94a1493046f53b5fcae40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8c01000000000043acd60000000066030936000000000000000000000000000000000000000000000000000000000000000000000000009896800008000000000190f9018d10841c29c7208303ba9494aa111c62cdeef205f70e6722d1e22274274ec12f80b90124f41766d80000000000000000000000000000000000000000000000000000000000f4c3ec0000000000000000000000000000000000000000000000000000000000efdeba00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000130e2ffe04d96e0afc1bd7fba9eb0d7167e1b7c70000000000000000000000000000000000000000000000000000018e7bee2c5d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f55bec9cafdbe8730f096aa55dad6d22d44099df00000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a4000000000000000000000000000000000000000000000000000000000000000183104ec3a066299aa22610a71b7996bcc22aa2497c7956012faa9a14d831ba9774692a7581a07ced28f289f005e0e69035a3e4e4269c80203724218441cbd063b531d35c3aa6000000b1f8af831111b5841c29c720830152849487627c7e586441eef9ee3c28b66662e897513f3380b844535b355c000000000000000000000000a4e25ef85e8f8c987dadece5dd5d872628e5889500000000000000000000000000000000000000000000000000334a281f81f00083104ec3a0e72bba63a3428a02f6a5896b377b4db2bbbb89c0127f4eb7281169aa533bffffa03ad352dc0a155754425d719e04b4e7d9ee03a64c4dd2ccccdcc19d9eef848639000000f6f8f408841b6b0b008305815294ff75a4b698e3ec95e608ac0f22a03b8368e05f5d880342c5d306e41923b88402c5fcf800000000000000000000000011fcfe756c05ad438e312a7fd934381537d3cffe0000000000000000000000000000000000000000000000000342c5d306e419230000000000000000000000000000000000000000000000000000000000000002000000000000000000000000332a07d6dd6692f59b4359fb988b8f7bfd3b322c83104ec3a00c1a26211ee6bac59fa2b1c7c2042eb51477fb010823027a3b723f5c1dfa06e8a072b0dc3450f25ffc949744fe11f5beb607b762f188688808b0e39060e5d551f800000190f9018d0a841ad2748083039f009418b71386418a9fca5ae7165e31c385a5130011b680b9012438ed173900000000000000000000000000000000000000000000000000000000004c4b40000000000000000000000000000000000000000017182d390f56a4c3e6a980da00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cb5f02599139712f8923f531c1da87a8fcb2a36e0000000000000000000000000000000000000000000000000000000066030dba000000000000000000000000000000000000000000000000000000000000000300000000000000000000000006efdbff2a14a7c8e15944d1f4a48f9f95f663a40000000000000000000000005300000000000000000000000000000000000004000000000000000000000000ce3cfe8781e6dd5ee185d63100236743469acfa183104ec4a0be937dd9eb747650be9bb7db8749d79ba3dfded187127110d22637f90f122a15a0603cd263fbf8d147a4544d778701fb0690635d71691d35101ea2d4b98f3a71a200000074f8720f841ad274808302086994af52c2731e304e83cf2fb5763ffca5b0f62e2738870110d9316ec000841249c58b83104ec3a0635b99363f302765a25c23be555a8848f51bd55c478d83645905d8dc140a5a8aa07976482755a97fa022ccbd2dd70de4fc198db1c02a93a0e6f4c53ce4eaae3105000002d7f902d409841ad274808303b2e89480e38291e06339d10aab483c65695d004dbd5c69879fdf42f6e48000b902642cc4081e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000966846700000000000000000000000000000000000000000000000000000000660338040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fdf42f6e4800000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000814a23b053fd0f102aeeda0459215c2444799c700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000530000000000000000000000000000000000000400000000000000000000000065d0fe3f22babd624d0176f107c8147cb1a9d9ae0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000083104ec4a04d16b68da6b1e630b7269837f79f48df6729a7d40d2249e8a5feee62596d51d1a007772c00159a45754615df9bcbae675856cc8f2fd499e57b7dd21541cf10f7500000016ff9016c0b841ad27480826e8e9447fbe95e981c0df9737b6971b451fb15fdc989d980b901045b7d7482000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000406466383536346435636233363763383033336432343131666637653863393962386363376636376538336337346163633165366364363264313566336133396100000000000000000000000000000000000000000000000000000000000000406364613761373764643861373530366239393463663633626535303639373763646639343563316637656565363138306463623238656639663363313232643283104ec4a050bf755a953e1dc2aa2ab1e897050c96dd543ed46641a91e543bd562b4a118c8a0462656f64ce1fcdbe7c5a65a7a1d34915f0c13fbda39458c7e5fd006eaa046a5000000aef8ac1b841ad274808301b2599463fdafa50c09c49f594f47ea7194b721291ec50f80b84414fa10e10000000000000000000000003a2b90a49757175491d790085528cde6e169805d00000000000000000000000000000000000000000000000006623f9014ae000083104ec4a0fa3c84092d89f196844e32a9b8af395c2f36ae8a11758275753f7613bc52a35fa02c832c90d93dbd9fd8e7272e51d9d9d65892f636c485033bb97587849d04e3af00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "r": "0x936d6a4bdeac41d80fc8bc53c0426697c3994f6d27ea3017f06ea4965261ae0e", - "s": "0x471b21b32a9a7a52ea4f490d15ad9012a4cf790d2e8553e33c9fbcbcfe2a3936", - "chainId": "0x1", - "v": "0x0", - "gas": "0x18d8fe", - "maxPriorityFeePerGas": "0x989680", - "from": "0xcf2898225ed05be911d3709d9417e86e0b4cfc8f", - "to": "0xa13baf47339d63b743e7da8741db5456dac1e556", - "maxFeePerGas": "0x141619bae6", - "value": "0x0", - "gasPrice": "0x9af5330fe" -} diff --git a/rollup/rollup_sync_service/testdata/commitBatch_input_codecv1.json b/rollup/rollup_sync_service/testdata/commitBatch_input_codecv1.json deleted file mode 100644 index 43306d66d844..000000000000 --- a/rollup/rollup_sync_service/testdata/commitBatch_input_codecv1.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "blockHash": "0x4ca0d33ed0d052e0e77bfb37cf2a48ca33fe04ba3673b8d902e0b7609a37f6e8", - "blockNumber": "0x15d4", - "from": "0xf472086186382fca55cd182de196520abd76f69d", - "gas": "0x150916", - "gasPrice": "0x3b9aca07", - "maxFeePerGas": "0x3b9aca0e", - "maxPriorityFeePerGas": "0x3b9aca00", - "maxFeePerBlobGas": "0x2", - "hash": "0x36b78570eca623a486eb484066d8d082737ae9508b35f2213ef34c2928fbf875", - "input": "0x1325aca0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000c3e0000000000000000000000000000000000000000000000000000000000000007901000000000000000700000000000000000000000000000000bef7359ed0c915f1db15d599d1c17aad248915474964569f490a2aef2bfb75b401c0b331128cb2c6990fbf9c444e36511bcddb06e8eda91b52ae9adc1b1dc6349cb06474aa0b2d6c93864c0fb4a8fdb4225895c5eeea2d829a7a6f3d73188e64000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000016a00000000000000000000000000000000000000000000000000000000000002c2000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000057200000000000000000000000000000000000000000000000000000000000006ca0000000000000000000000000000000000000000000000000000000000000822000000000000000000000000000000000000000000000000000000000000097a0000000000000000000000000000000000000000000000000000000000000ad2000000000000000000000000000000000000000000000000000000000000015555b000000000000069a000000006602f9810000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069b000000006602f9840000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069c000000006602f9870000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069d000000006602f98b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069e000000006602f98e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000069f000000006602f991000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a0000000006602f994000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a1000000006602f997000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a2000000006602f99a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a3000000006602f99d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a4000000006602f9a0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a5000000006602f9a3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a6000000006602f9a6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a7000000006602f9aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a8000000006602f9ad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006a9000000006602f9b0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006aa000000006602f9b3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ab000000006602f9b7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ac000000006602f9ba000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ad000000006602f9bd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ae000000006602f9c0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006af000000006602f9c3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b0000000006602f9c6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b1000000006602f9c9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b2000000006602f9cc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b3000000006602f9cf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b4000000006602f9d2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b5000000006602f9d5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b6000000006602f9d9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b7000000006602f9dc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b8000000006602f9df000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006b9000000006602f9e2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ba000000006602f9e5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006bb000000006602f9e8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006bc000000006602f9ec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006bd000000006602f9ef000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006be000000006602f9f2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006bf000000006602f9f5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c0000000006602f9f8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c1000000006602f9fb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c2000000006602f9fe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c3000000006602fa01000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c4000000006602fa04000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c5000000006602fa08000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c6000000006602fa0b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c7000000006602fa0e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c8000000006602fa11000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006c9000000006602fa14000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ca000000006602fa18000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006cb000000006602fa1b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006cc000000006602fa1e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006cd000000006602fa21000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ce000000006602fa24000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006cf000000006602fa27000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d0000000006602fa2a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d1000000006602fa2d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d2000000006602fa30000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d3000000006602fa34000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d4000000006602fa37000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d5000000006602fa3a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d6000000006602fa3d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d7000000006602fa40000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d8000000006602fa44000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006d9000000006602fa47000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006da000000006602fa4a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006db000000006602fa4d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006dc000000006602fa50000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006dd000000006602fa53000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006de000000006602fa56000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006df000000006602fa5a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e0000000006602fa5d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e1000000006602fa60000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e2000000006602fa63000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e3000000006602fa66000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e4000000006602fa69000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e5000000006602fa6c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e6000000006602fa6f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e7000000006602fa72000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e8000000006602fa76000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006e9000000006602fa7a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ea000000006602fa7d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006eb000000006602fa80000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ec000000006602fa83000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ed000000006602fa86000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ee000000006602fa89000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ef000000006602fa8c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f0000000006602fa8f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f1000000006602fa93000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f2000000006602fa96000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f3000000006602fa99000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f4000000006602fa9c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000006f5000000006602fa9f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f6000000006602faa2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f7000000006602faa5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f8000000006602faa8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006f9000000006602faac000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fa000000006602faaf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fb000000006602fab2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fc000000006602fab5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fd000000006602fab8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006fe000000006602fabc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000006ff000000006602fabf00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000700000000006602fac200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000701000000006602fac500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000702000000006602fac800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000703000000006602facb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000704000000006602facf00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000705000000006602fad200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000706000000006602fad500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000707000000006602fad800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000708000000006602fadb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000709000000006602fade0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070a000000006602fae20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070b000000006602fae50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070c000000006602fae80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070d000000006602faeb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070e000000006602faee0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000070f000000006602faf100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000710000000006602faf400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000711000000006602faf800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000712000000006602fafb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000713000000006602fafe00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000714000000006602fb0100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000715000000006602fb0400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000716000000006602fb0700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000717000000006602fb0a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000718000000006602fb0d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000719000000006602fb100000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071a000000006602fb140000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071b000000006602fb170000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071c000000006602fb1a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071d000000006602fb1d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071e000000006602fb200000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000071f000000006602fb2300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000720000000006602fb2600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000721000000006602fb2900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000722000000006602fb2d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000723000000006602fb3000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000724000000006602fb3300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000725000000006602fb3600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000726000000006602fb3900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000727000000006602fb3d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000728000000006602fb4000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000729000000006602fb430000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072a000000006602fb460000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072b000000006602fb490000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072c000000006602fb4c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072d000000006602fb4f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072e000000006602fb520000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000072f000000006602fb5500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000730000000006602fb5800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000731000000006602fb5c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000732000000006602fb5f00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000733000000006602fb6200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000734000000006602fb6500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000735000000006602fb6800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000736000000006602fb6b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000737000000006602fb6e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000738000000006602fb7100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000739000000006602fb740000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073a000000006602fb770000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073b000000006602fb7b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073c000000006602fb7e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073d000000006602fb810000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073e000000006602fb840000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000073f000000006602fb8800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000740000000006602fb8b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000741000000006602fb8e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000742000000006602fb9100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000743000000006602fb9400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000744000000006602fb9700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000745000000006602fb9a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000746000000006602fb9d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000747000000006602fba000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000748000000006602fba400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000749000000006602fba70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074a000000006602fbaa0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074b000000006602fbad0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074c000000006602fbb00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074d000000006602fbb30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074e000000006602fbb70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000074f000000006602fbba0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000750000000006602fbbd00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000751000000006602fbc000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000752000000006602fbc300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000753000000006602fbc600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000754000000006602fbc900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000755000000006602fbcc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000756000000006602fbd000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000757000000006602fbd300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000758000000006602fbd600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000759000000006602fbd90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075a000000006602fbdc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075b000000006602fbdf0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075c000000006602fbe30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075d000000006602fbe60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075e000000006602fbe90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000075f000000006602fbec00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000760000000006602fbef00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000761000000006602fbf200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000762000000006602fbf600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000763000000006602fbf900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000764000000006602fbfc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000765000000006602fbff00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000766000000006602fc0200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000767000000006602fc0500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000768000000006602fc0800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000769000000006602fc0c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076a000000006602fc0f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076b000000006602fc120000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076c000000006602fc150000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076d000000006602fc180000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076e000000006602fc1b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000076f000000006602fc1e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000770000000006602fc2100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000771000000006602fc2500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000772000000006602fc2800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000773000000006602fc2b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000774000000006602fc2e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000775000000006602fc3100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000776000000006602fc3400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000777000000006602fc3700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000778000000006602fc3a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000779000000006602fc3d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077a000000006602fc400000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077b000000006602fc440000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077c000000006602fc470000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077d000000006602fc4a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077e000000006602fc4d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000077f000000006602fc5000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000780000000006602fc5300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000781000000006602fc5600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000782000000006602fc5900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000783000000006602fc5d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000784000000006602fc6000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000785000000006602fc6300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000786000000006602fc6600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000787000000006602fc6900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000788000000006602fc6c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000789000000006602fc6f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078a000000006602fc720000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078b000000006602fc750000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078c000000006602fc780000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078d000000006602fc7c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078e000000006602fc7f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000078f000000006602fc8200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000790000000006602fc8500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000791000000006602fc8800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000792000000006602fc8c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000793000000006602fc8f00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000794000000006602fc9200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000795000000006602fc9500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000796000000006602fc9800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000797000000006602fc9b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000798000000006602fc9e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000799000000006602fca10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079a000000006602fca40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079b000000006602fca70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079c000000006602fcab0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079d000000006602fcae0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079e000000006602fcb10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000079f000000006602fcb4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a0000000006602fcb7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a1000000006602fcbb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a2000000006602fcbe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a3000000006602fcc1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a4000000006602fcc4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a5000000006602fcc7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a6000000006602fcca000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a7000000006602fcce000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a8000000006602fcd1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007a9000000006602fcd4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007aa000000006602fcd70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000007ab000000006602fcda000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ac000000006602fcdd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ad000000006602fce0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ae000000006602fce3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007af000000006602fce6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b0000000006602fcea000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b1000000006602fced000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b2000000006602fcf1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b3000000006602fcf4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b4000000006602fcf7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b5000000006602fcfb000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b6000000006602fcfe000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b7000000006602fd01000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b8000000006602fd04000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007b9000000006602fd07000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ba000000006602fd0a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007bb000000006602fd0d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007bc000000006602fd10000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007bd000000006602fd14000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007be000000006602fd17000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007bf000000006602fd1a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c0000000006602fd1d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c1000000006602fd20000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c2000000006602fd23000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c3000000006602fd26000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c4000000006602fd2a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c5000000006602fd2d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c6000000006602fd30000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c7000000006602fd33000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c8000000006602fd36000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007c9000000006602fd3a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ca000000006602fd3d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007cb000000006602fd40000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007cc000000006602fd43000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007cd000000006602fd46000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ce000000006602fd49000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007cf000000006602fd4c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d0000000006602fd4f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d1000000006602fd52000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d2000000006602fd56000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d3000000006602fd59000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d4000000006602fd5c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d5000000006602fd5f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d6000000006602fd62000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d7000000006602fd65000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d8000000006602fd68000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007d9000000006602fd6b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007da000000006602fd6f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007db000000006602fd72000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007dc000000006602fd75000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007dd000000006602fd78000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007de000000006602fd7b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007df000000006602fd7e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e0000000006602fd81000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e1000000006602fd84000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e2000000006602fd87000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e3000000006602fd8b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e4000000006602fd8e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e5000000006602fd91000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e6000000006602fd94000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e7000000006602fd97000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e8000000006602fd9a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007e9000000006602fd9d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ea000000006602fda1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007eb000000006602fda4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ec000000006602fda7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ed000000006602fdaa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ee000000006602fdad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ef000000006602fdb0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f0000000006602fdb3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f1000000006602fdb6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f2000000006602fdb9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f3000000006602fdbc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f4000000006602fdc0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f5000000006602fdc3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f6000000006602fdc6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f7000000006602fdc9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f8000000006602fdcc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007f9000000006602fdd0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fa000000006602fdd3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fb000000006602fdd6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fc000000006602fdd9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fd000000006602fddd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007fe000000006602fde0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000007ff000000006602fde300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000800000000006602fde600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000801000000006602fde900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000802000000006602fdec00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000803000000006602fdef00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000804000000006602fdf200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000805000000006602fdf60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000806000000006602fdf900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000807000000006602fdfc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000808000000006602fdff00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000809000000006602fe020000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080a000000006602fe050000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080b000000006602fe090000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080c000000006602fe0c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080d000000006602fe0f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080e000000006602fe120000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000080f000000006602fe1500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000810000000006602fe1800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000811000000006602fe1c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000812000000006602fe1f00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000813000000006602fe2200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000814000000006602fe2500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000815000000006602fe2800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000816000000006602fe2b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000817000000006602fe2e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000818000000006602fe3100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000819000000006602fe350000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081a000000006602fe380000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081b000000006602fe3b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081c000000006602fe3e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081d000000006602fe420000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081e000000006602fe450000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000081f000000006602fe4800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000820000000006602fe4b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000821000000006602fe4e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000822000000006602fe5100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000823000000006602fe5500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000824000000006602fe5800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000825000000006602fe5b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000826000000006602fe5e00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000827000000006602fe6100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000828000000006602fe6400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000829000000006602fe670000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082a000000006602fe6b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082b000000006602fe6e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082c000000006602fe710000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082d000000006602fe740000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082e000000006602fe770000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000082f000000006602fe7a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000830000000006602fe7d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000831000000006602fe8000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000832000000006602fe8300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000833000000006602fe8700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000834000000006602fe8a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000835000000006602fe8d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000836000000006602fe9000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000837000000006602fe9300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000838000000006602fe9600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000839000000006602fe990000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083a000000006602fe9d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083b000000006602fea00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083c000000006602fea30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083d000000006602fea60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083e000000006602fea90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000083f000000006602feac00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000840000000006602feaf00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000841000000006602feb200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000842000000006602feb500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000843000000006602feb900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000844000000006602febc00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000845000000006602febf00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000846000000006602fec200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000847000000006602fec600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000848000000006602fec900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000849000000006602fecc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084a000000006602fecf0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084b000000006602fed20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084c000000006602fed50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084d000000006602fed80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084e000000006602fedb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000084f000000006602fede00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000850000000006602fee200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000851000000006602fee500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000852000000006602fee800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000853000000006602feeb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000854000000006602feef00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000855000000006602fef200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000856000000006602fef500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000857000000006602fef800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000858000000006602fefb00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000859000000006602fefe0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085a000000006602ff010000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085b000000006602ff040000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085c000000006602ff080000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085d000000006602ff0b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085e000000006602ff0e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000085f000000006602ff1100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000860000000006602ff140000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000861000000006602ff1700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000862000000006602ff1a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000863000000006602ff1d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000864000000006602ff2100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000865000000006602ff2400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000866000000006602ff2700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000867000000006602ff2a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000868000000006602ff2d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000869000000006602ff310000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086a000000006602ff340000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086b000000006602ff370000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086c000000006602ff3a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086d000000006602ff3d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086e000000006602ff400000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000086f000000006602ff4300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000870000000006602ff4600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000871000000006602ff4900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000872000000006602ff4d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000873000000006602ff5000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000874000000006602ff5300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000875000000006602ff5600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000876000000006602ff5a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000877000000006602ff5d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000878000000006602ff6100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000879000000006602ff640000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087a000000006602ff670000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087b000000006602ff6a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087c000000006602ff6d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087d000000006602ff700000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087e000000006602ff730000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000087f000000006602ff7700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000880000000006602ff7a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000881000000006602ff7d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000882000000006602ff8000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000883000000006602ff8300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000884000000006602ff8600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000885000000006602ff8a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000886000000006602ff8d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000887000000006602ff9000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000888000000006602ff9300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000889000000006602ff960000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088a000000006602ff9a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088b000000006602ff9d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088c000000006602ffa00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088d000000006602ffa40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088e000000006602ffa70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000088f000000006602ffaa00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000890000000006602ffad00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000891000000006602ffb000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000892000000006602ffb300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000893000000006602ffb600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000894000000006602ffba00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000895000000006602ffbd00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000896000000006602ffc000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000897000000006602ffc300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000898000000006602ffc600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000899000000006602ffc90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089a000000006602ffcc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089b000000006602ffd00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089c000000006602ffd30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089d000000006602ffd60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089e000000006602ffd90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000089f000000006602ffdc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a0000000006602ffdf000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a1000000006602ffe2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a2000000006602ffe5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a3000000006602ffe9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a4000000006602ffec000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a5000000006602ffef000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a6000000006602fff2000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a7000000006602fff5000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a8000000006602fff8000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008a9000000006602fffc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008aa000000006602ffff000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ab0000000066030002000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ac0000000066030005000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ad0000000066030008000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ae000000006603000b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008af000000006603000e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b00000000066030011000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b10000000066030014000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b20000000066030018000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b3000000006603001b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b4000000006603001e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b50000000066030021000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b60000000066030024000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b70000000066030027000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b8000000006603002b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008b9000000006603002e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ba0000000066030031000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008bb00000000660300340000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000008bc0000000066030037000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008bd000000006603003a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008be000000006603003d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008bf0000000066030040000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c00000000066030043000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c10000000066030047000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c2000000006603004a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c3000000006603004d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c40000000066030050000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c50000000066030053000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c60000000066030057000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c7000000006603005a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c8000000006603005d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008c90000000066030060000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ca0000000066030063000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008cb0000000066030067000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008cc000000006603006a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008cd000000006603006e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ce0000000066030071000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008cf0000000066030074000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d00000000066030077000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d1000000006603007a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d2000000006603007d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d30000000066030081000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d40000000066030084000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d50000000066030087000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d6000000006603008a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d7000000006603008d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d80000000066030090000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008d90000000066030094000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008da0000000066030097000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008db000000006603009a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008dc000000006603009d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008dd00000000660300a0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008de00000000660300a4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008df00000000660300a7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e000000000660300aa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e100000000660300ad000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e200000000660300b1000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e300000000660300b4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e400000000660300b7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e500000000660300ba000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e600000000660300bd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e700000000660300c0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e800000000660300c4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008e900000000660300c7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ea00000000660300ca000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008eb00000000660300cd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ec00000000660300d0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ed00000000660300d3000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ee00000000660300d6000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ef00000000660300d9000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f000000000660300dc000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f100000000660300e0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f200000000660300e4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f300000000660300e7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f400000000660300ea000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f500000000660300ed000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f600000000660300f0000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f700000000660300f4000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f800000000660300f7000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008f900000000660300fa000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fa00000000660300fd000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fb0000000066030100000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fc0000000066030103000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fd0000000066030106000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008fe000000006603010a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000008ff000000006603010d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000900000000006603011000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000901000000006603011300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000902000000006603011700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000903000000006603011a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000904000000006603011d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000905000000006603012000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000906000000006603012300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000907000000006603012600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000908000000006603012a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000909000000006603012e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090a00000000660301310000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090b00000000660301340000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090c00000000660301370000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090d000000006603013b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090e000000006603013e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000090f000000006603014100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000910000000006603014400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000911000000006603014700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000912000000006603014a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000913000000006603014d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091400000000660301500000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091500000000660301530000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091600000000660301560000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000917000000006603015a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000918000000006603015d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091900000000660301600000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091a00000000660301630000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091b00000000660301660000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091c00000000660301690000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091d000000006603016c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091e000000006603016f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000091f000000006603017300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000920000000006603017600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000921000000006603017a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000922000000006603017d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000923000000006603018000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000924000000006603018300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000925000000006603018600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000926000000006603018900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000927000000006603018c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092800000000660301900000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092900000000660301930000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092a00000000660301960000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092b00000000660301990000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092c000000006603019c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092d000000006603019f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092e00000000660301a30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000092f00000000660301a60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093000000000660301a90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093100000000660301ac0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093200000000660301af0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093300000000660301b20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093400000000660301b50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093500000000660301b90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093600000000660301bc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093700000000660301bf0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093800000000660301c20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093900000000660301c50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093a00000000660301c80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093b00000000660301cb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093c00000000660301cf0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093d00000000660301d20000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093e00000000660301d50000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000093f00000000660301d80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094000000000660301db0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094100000000660301de0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094200000000660301e10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094300000000660301e40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094400000000660301e80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094500000000660301eb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094600000000660301ee0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094700000000660301f10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094800000000660301f40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094900000000660301f80000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094a00000000660301fb0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094b00000000660301fe0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094c00000000660302010000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094d00000000660302040000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094e00000000660302070000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000094f000000006603020a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000950000000006603020d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000951000000006603021100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000952000000006603021400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000953000000006603021700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000954000000006603021a00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000955000000006603021d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000956000000006603022100000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000957000000006603022400000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000958000000006603022700000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000959000000006603022a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095a000000006603022d0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095b00000000660302300000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095c00000000660302330000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095d00000000660302370000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095e000000006603023a0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000095f000000006603023d00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000960000000006603024000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000961000000006603024300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000962000000006603024600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000963000000006603024900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000964000000006603024c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000965000000006603025000000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000966000000006603025300000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000967000000006603025600000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000968000000006603025900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000969000000006603025c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096a000000006603025f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096b00000000660302630000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096c00000000660302660000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096d00000000660302690000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096e000000006603026c0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000096f000000006603026f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097000000000660302720000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097100000000660302750000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b0000000000000972000000006603027900000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000973000000006603027c00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000974000000006603027f00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000975000000006603028200000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000976000000006603028500000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000977000000006603028800000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000978000000006603028b00000000000000000000000000000000000000000000000000000000000000000000000000989680000100000000000000000979000000006603028f0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097a00000000660302920000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097b00000000660302950000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097c00000000660302980000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097d000000006603029b0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097e000000006603029e0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000097f00000000660302a10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098000000000660302a40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098100000000660302a70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098200000000660302ab0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098300000000660302ae0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098400000000660302b10000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098500000000660302b40000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098600000000660302b70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098700000000660302ba0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098800000000660302bd0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098900000000660302c00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098a00000000660302c30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098b00000000660302c70000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098c00000000660302ca0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098d00000000660302cd0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098e00000000660302d00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000098f00000000660302d30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099000000000660302d60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099100000000660302d90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099200000000660302dd0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099300000000660302e00000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099400000000660302e30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099500000000660302e60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099600000000660302e90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099700000000660302ec0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099800000000660302ef0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099900000000660302f30000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099a00000000660302f60000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099b00000000660302f90000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099c00000000660302fc0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099d00000000660302ff0000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099e00000000660303020000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000099f0000000066030305000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a00000000066030308000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a1000000006603030c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a2000000006603030f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a30000000066030312000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a40000000066030315000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a50000000066030318000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a6000000006603031b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a7000000006603031f000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a80000000066030322000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009a90000000066030325000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009aa0000000066030328000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ab000000006603032b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ac000000006603032e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ad0000000066030331000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ae0000000066030334000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009af0000000066030338000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b0000000006603033b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b1000000006603033e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b20000000066030341000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b30000000066030344000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b40000000066030347000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b5000000006603034b000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b6000000006603034e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b70000000066030351000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b80000000066030354000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009b90000000066030357000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ba000000006603035a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009bb000000006603035e000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009bc0000000066030361000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009bd0000000066030364000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009be0000000066030367000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009bf000000006603036a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c0000000006603036d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c10000000066030370000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c20000000066030373000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c30000000066030377000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c4000000006603037a000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c5000000006603037d000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c60000000066030380000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c70000000066030383000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c80000000066030386000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009c90000000066030389000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009ca000000006603038c000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009cb0000000066030390000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000009cc0000000066030393000000000000000000000000000000000000000000000000000000000000000000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x8", - "to": "0x475652655309fa7cb1397537bee9a7fbafdc11ca", - "transactionIndex": "0x0", - "value": "0x0", - "type": "0x3", - "accessList": [ - { - "address": "0x3d9a28f7692cb94740bb64f08cb5cd19aa5cd3dd", - "storageKeys": [] - } - ], - "chainId": "0x1b207", - "blobVersionedHashes": [ - "0x017896a992b0cfbf966e0e3bec1c9f7fbb40bf02ef6926d8daa52cd3f06b62eb" - ], - "v": "0x1", - "r": "0x19e791f54c7337548fa819dd0ef50f9bfc762ef83804f154144c9e3e18c7d07f", - "s": "0x2fe18775bf12877844bed3651d3fec73296222db390a5d5cddd515fc6938b7cc", - "yParity": "0x1" -} diff --git a/rollup/rollup_sync_service/testdata/commitBatch_input_codecv2.json b/rollup/rollup_sync_service/testdata/commitBatch_input_codecv2.json deleted file mode 100644 index f32c20dec833..000000000000 --- a/rollup/rollup_sync_service/testdata/commitBatch_input_codecv2.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "blockHash": "0x3bfa6d98c4925d3b40613f7cd46ffb471735bcdd0c41c0756462ed72e2436c43", - "blockNumber": "0x812", - "from": "0xf472086186382fca55cd182de196520abd76f69d", - "gas": "0x1603be", - "gasPrice": "0x3b9aca07", - "maxFeePerGas": "0x3b9aca0e", - "maxPriorityFeePerGas": "0x3b9aca00", - "maxFeePerBlobGas": "0x2", - "hash": "0x17377279f654f557c71a2f518fe953c7c0c216a99bf547a534f7c39ebfb3ae69", - "input": "0x1325aca0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000c3e0000000000000000000000000000000000000000000000000000000000000007901000000000000000400000000000000000000000000000000ffa5ada7c54e9fbbe20058d9d2240992cb8811cc8da7896a184d8735e66a372901c0b8b6eeeb71d0dde63486ecd7f12e08745ff759309170a25d53dc57ccd8957b1fa86838e265da0b67f8a0b4fcdd5e9220aa5b1717065265e3f6c778bd0df8000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000016a00000000000000000000000000000000000000000000000000000000000002c2000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000057200000000000000000000000000000000000000000000000000000000000006ca0000000000000000000000000000000000000000000000000000000000000822000000000000000000000000000000000000000000000000000000000000097a0000000000000000000000000000000000000000000000000000000000000ad2000000000000000000000000000000000000000000000000000000000000015555b00000000000000c800000000664103eb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000c900000000664103ee0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000ca00000000664103f10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000cb00000000664103f40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000cc00000000664103f70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000cd00000000664103fa0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000ce00000000664103fd0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000cf00000000664104000000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d000000000664104030000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d100000000664104060000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d200000000664104090000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d3000000006641040c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d4000000006641040f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d500000000664104120000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d600000000664104150000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d700000000664104180000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d8000000006641041b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000d9000000006641041e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000da00000000664104220000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000db00000000664104250000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000dc00000000664104280000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000dd000000006641042b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000de000000006641042e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000df00000000664104310000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e000000000664104340000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e100000000664104370000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e2000000006641043a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e3000000006641043d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e400000000664104400000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e500000000664104430000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e600000000664104460000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e700000000664104490000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e8000000006641044c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000e9000000006641044f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000ea00000000664104520000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000eb00000000664104550000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000ec00000000664104580000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000ed000000006641045b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000ee000000006641045e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000ef00000000664104610000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f000000000664104640000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f100000000664104670000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f2000000006641046a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f3000000006641046d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f400000000664104700000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f500000000664104730000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f600000000664104760000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f700000000664104790000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f8000000006641047c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000f9000000006641047f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000fa00000000664104820000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000fb00000000664104850000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000fc00000000664104880000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000fd000000006641048b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000fe000000006641048e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000ff00000000664104910000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010000000000664104940000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010100000000664104970000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000102000000006641049b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000103000000006641049e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010400000000664104a10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010500000000664104a40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010600000000664104a70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010700000000664104aa0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010800000000664104ad0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010900000000664104b00000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010a00000000664104b30000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010b00000000664104b60000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010c00000000664104b90000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010d00000000664104bc0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010e00000000664104bf0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000010f00000000664104c20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011000000000664104c50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011100000000664104c80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011200000000664104cb0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011300000000664104ce0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011400000000664104d10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011500000000664104d40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011600000000664104d70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011700000000664104da0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011800000000664104dd0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011900000000664104e00000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011a00000000664104e30000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011b00000000664104e60000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011c00000000664104e90000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011d00000000664104ec0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011e00000000664104ef0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000011f00000000664104f20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012000000000664104f50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012100000000664104f80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012200000000664104fb0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b000000000000012300000000664104fe0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012400000000664105020000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012500000000664105050000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012600000000664105080000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000127000000006641050b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000128000000006641050e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012900000000664105110000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012a00000000664105140000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012b00000000664105170000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012c000000006641051a0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012d000000006641051d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012e00000000664105200000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000012f00000000664105230000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013000000000664105260000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013100000000664105290000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000132000000006641052c0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000133000000006641052f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013400000000664105320000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013500000000664105350000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013600000000664105380000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000137000000006641053b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000138000000006641053e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013900000000664105410000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013a00000000664105440000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013b00000000664105470000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013c000000006641054a0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013d000000006641054d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013e00000000664105500000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000013f00000000664105530000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014000000000664105560000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014100000000664105590000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000142000000006641055c0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000143000000006641055f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014400000000664105620000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014500000000664105660000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014600000000664105690000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000147000000006641056c0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000148000000006641056f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014900000000664105720000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014a00000000664105750000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014b00000000664105780000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014c000000006641057b0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014d000000006641057e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014e00000000664105810000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000014f00000000664105840000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015000000000664105870000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000151000000006641058a0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000152000000006641058d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015300000000664105900000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015400000000664105930000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015500000000664105960000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015600000000664105990000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000157000000006641059c0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000158000000006641059f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015900000000664105a20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015a00000000664105a50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015b00000000664105a80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015c00000000664105ab0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015d00000000664105ae0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015e00000000664105b10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000015f00000000664105b40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016000000000664105b70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016100000000664105ba0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016200000000664105bd0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016300000000664105c00000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016400000000664105c30000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016500000000664105c60000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016600000000664105c90000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016700000000664105cc0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016800000000664105cf0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016900000000664105d20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016a00000000664105d50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016b00000000664105d80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016c00000000664105db0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016d00000000664105de0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016e00000000664105e10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000016f00000000664105e40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017000000000664105e70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017100000000664105eb0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017200000000664105ee0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017300000000664105f10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017400000000664105f40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017500000000664105f70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017600000000664105fa0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017700000000664105fd0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017800000000664106000000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017900000000664106030000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017a00000000664106060000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017b00000000664106090000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017c000000006641060c0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017d000000006641060f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b000000000000017e00000000664106120000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000017f00000000664106150000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018000000000664106180000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000181000000006641061b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000182000000006641061e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018300000000664106210000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018400000000664106240000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018500000000664106270000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000186000000006641062a0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000187000000006641062d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018800000000664106300000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018900000000664106330000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018a00000000664106360000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018b00000000664106390000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018c000000006641063c0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018d000000006641063f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018e00000000664106420000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000018f00000000664106450000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019000000000664106480000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000191000000006641064b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000192000000006641064e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019300000000664106510000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019400000000664106540000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019500000000664106570000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000196000000006641065a0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000197000000006641065d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019800000000664106600000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019900000000664106630000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019a00000000664106660000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019b00000000664106690000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019c000000006641066d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019d00000000664106700000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019e00000000664106730000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000019f00000000664106760000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a000000000664106790000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a1000000006641067c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a2000000006641067f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a300000000664106820000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a400000000664106850000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a500000000664106880000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a6000000006641068b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a7000000006641068e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a800000000664106910000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001a900000000664106940000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001aa00000000664106970000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ab000000006641069a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ac000000006641069d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ad00000000664106a00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ae00000000664106a30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001af00000000664106a60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b000000000664106a90000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b100000000664106ac0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b200000000664106af0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b300000000664106b20000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b400000000664106b50000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b500000000664106b80000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b600000000664106bb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b700000000664106be0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b800000000664106c10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001b900000000664106c40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ba00000000664106c70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001bb00000000664106ca0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001bc00000000664106cd0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001bd00000000664106d00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001be00000000664106d30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001bf00000000664106d60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c000000000664106d90000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c100000000664106dc0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c200000000664106df0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c300000000664106e20000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c400000000664106e50000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c500000000664106e80000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c600000000664106eb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c700000000664106ee0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c800000000664106f20000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001c900000000664106f50000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ca00000000664106f80000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001cb00000000664106fb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001cc00000000664106fe0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001cd00000000664107010000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ce00000000664107040000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001cf00000000664107070000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d0000000006641070a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d1000000006641070d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d200000000664107100000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d300000000664107130000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d400000000664107160000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d500000000664107190000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d6000000006641071c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d7000000006641071f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001d800000000664107220000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000001d900000000664107250000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001da00000000664107280000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001db000000006641072b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001dc000000006641072e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001dd00000000664107310000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001de00000000664107340000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001df00000000664107370000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e0000000006641073a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e1000000006641073d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e200000000664107400000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e300000000664107430000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e400000000664107460000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e500000000664107490000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e6000000006641074c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e7000000006641074f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e800000000664107520000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001e900000000664107550000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ea00000000664107580000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001eb000000006641075b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ec000000006641075e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ed00000000664107610000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ee00000000664107640000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ef00000000664107670000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f0000000006641076a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f1000000006641076d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f200000000664107700000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f300000000664107730000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f400000000664107760000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f500000000664107790000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f6000000006641077d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f700000000664107800000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f800000000664107830000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001f900000000664107860000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001fa00000000664107890000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001fb000000006641078c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001fc000000006641078f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001fd00000000664107920000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001fe00000000664107950000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000001ff00000000664107980000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000200000000006641079b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000201000000006641079e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020200000000664107a10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020300000000664107a40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020400000000664107a70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020500000000664107aa0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020600000000664107ad0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020700000000664107b00000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020800000000664107b30000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020900000000664107b60000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020a00000000664107b90000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020b00000000664107bc0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020c00000000664107bf0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020d00000000664107c20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020e00000000664107c50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000020f00000000664107c80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021000000000664107cb0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021100000000664107ce0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021200000000664107d10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021300000000664107d40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021400000000664107d70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021500000000664107da0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021600000000664107dd0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021700000000664107e00000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021800000000664107e30000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021900000000664107e60000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021a00000000664107e90000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021b00000000664107ec0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021c00000000664107ef0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021d00000000664107f20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021e00000000664107f50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000021f00000000664107f80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022000000000664107fc0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022100000000664107ff0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022200000000664108020000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022300000000664108050000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022400000000664108080000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000225000000006641080b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000226000000006641080e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022700000000664108110000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022800000000664108140000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022900000000664108170000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022a000000006641081a0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022b000000006641081d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022c00000000664108200000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022d00000000664108230000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022e00000000664108260000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000022f00000000664108290000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000230000000006641082c0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000231000000006641082f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023200000000664108320000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023300000000664108350000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b000000000000023400000000664108380000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000235000000006641083b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000236000000006641083e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023700000000664108410000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023800000000664108440000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023900000000664108470000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023a000000006641084a0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023b000000006641084d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023c00000000664108500000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023d00000000664108530000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023e00000000664108560000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000023f00000000664108590000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000240000000006641085c0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000241000000006641085f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024200000000664108620000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024300000000664108650000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024400000000664108680000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000245000000006641086b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000246000000006641086e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024700000000664108710000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024800000000664108740000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024900000000664108770000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024a000000006641087b0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024b000000006641087e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024c00000000664108810000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024d00000000664108840000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024e00000000664108870000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000024f000000006641088a0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000250000000006641088d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025100000000664108900000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025200000000664108930000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025300000000664108960000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025400000000664108990000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000255000000006641089c0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000256000000006641089f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025700000000664108a20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025800000000664108a50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025900000000664108a80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025a00000000664108ab0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025b00000000664108ae0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025c00000000664108b10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025d00000000664108b40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025e00000000664108b70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000025f00000000664108ba0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026000000000664108bd0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026100000000664108c00000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026200000000664108c30000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026300000000664108c60000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026400000000664108c90000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026500000000664108cc0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026600000000664108cf0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026700000000664108d20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026800000000664108d50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026900000000664108d80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026a00000000664108db0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026b00000000664108de0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026c00000000664108e10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026d00000000664108e40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026e00000000664108e70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000026f00000000664108ea0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027000000000664108ed0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027100000000664108f00000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027200000000664108f30000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027300000000664108f60000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027400000000664108f90000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027500000000664108fc0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027600000000664109000000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027700000000664109030000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027800000000664109060000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027900000000664109090000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027a000000006641090c0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027b000000006641090f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027c00000000664109120000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027d00000000664109150000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027e00000000664109180000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000027f000000006641091b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000280000000006641091e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028100000000664109210000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028200000000664109240000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028300000000664109270000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000284000000006641092a0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000285000000006641092d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028600000000664109300000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028700000000664109330000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028800000000664109360000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028900000000664109390000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028a000000006641093c0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028b000000006641093f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028c00000000664109420000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028d00000000664109450000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000028e00000000664109480000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b000000000000028f000000006641094b0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000290000000006641094e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029100000000664109510000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029200000000664109540000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029300000000664109570000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000294000000006641095a0000000000000000000000000000000000000000000000000000000008f0d1800000000000989680000100000000000000000295000000006641095d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029600000000664109600000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029700000000664109630000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029800000000664109660000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029900000000664109690000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029a000000006641096c0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029b000000006641096f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029c00000000664109720000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029d00000000664109750000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029e00000000664109780000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000029f000000006641097b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a0000000006641097e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a100000000664109820000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a200000000664109850000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a300000000664109880000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a4000000006641098b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a5000000006641098e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a600000000664109910000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a700000000664109940000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a800000000664109970000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002a9000000006641099a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002aa000000006641099d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ab00000000664109a00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ac00000000664109a30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ad00000000664109a60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ae00000000664109a90000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002af00000000664109ac0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b000000000664109af0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b100000000664109b20000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b200000000664109b50000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b300000000664109b80000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b400000000664109bb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b500000000664109be0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b600000000664109c10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b700000000664109c40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b800000000664109c70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002b900000000664109ca0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ba00000000664109cd0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002bb00000000664109d00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002bc00000000664109d30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002bd00000000664109d60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002be00000000664109d90000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002bf00000000664109dc0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c000000000664109df0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c100000000664109e20000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c200000000664109e50000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c300000000664109e80000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c400000000664109eb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c500000000664109ee0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c600000000664109f10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c700000000664109f40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c800000000664109f70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002c900000000664109fb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ca00000000664109fe0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002cb0000000066410a010000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002cc0000000066410a040000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002cd0000000066410a070000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ce0000000066410a0a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002cf0000000066410a0d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d00000000066410a100000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d10000000066410a130000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d20000000066410a160000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d30000000066410a190000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d40000000066410a1c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d50000000066410a1f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d60000000066410a220000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d70000000066410a250000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d80000000066410a280000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002d90000000066410a2b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002da0000000066410a2e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002db0000000066410a310000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002dc0000000066410a340000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002dd0000000066410a370000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002de0000000066410a3a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002df0000000066410a3d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e00000000066410a400000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e10000000066410a430000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e20000000066410a460000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e30000000066410a490000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e40000000066410a4c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e50000000066410a4f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e60000000066410a520000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e70000000066410a550000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e80000000066410a580000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002e90000000066410a5b0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000002ea0000000066410a5e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002eb0000000066410a610000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ec0000000066410a640000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ed0000000066410a670000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ee0000000066410a6a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ef0000000066410a6d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f00000000066410a700000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f10000000066410a740000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f20000000066410a770000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f30000000066410a7a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f40000000066410a7d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f50000000066410a800000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f60000000066410a830000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f70000000066410a860000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f80000000066410a890000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002f90000000066410a8c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002fa0000000066410a8f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002fb0000000066410a920000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002fc0000000066410a950000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002fd0000000066410a980000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002fe0000000066410a9b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000002ff0000000066410a9e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003000000000066410aa10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003010000000066410aa40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003020000000066410aa70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003030000000066410aaa0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003040000000066410aad0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003050000000066410ab00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003060000000066410ab30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003070000000066410ab60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003080000000066410ab90000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003090000000066410abc0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000030a0000000066410abf0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000030b0000000066410ac20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000030c0000000066410ac50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000030d0000000066410ac80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000030e0000000066410acb0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000030f0000000066410ace0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003100000000066410ad10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003110000000066410ad40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003120000000066410ad70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003130000000066410ada0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003140000000066410add0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003150000000066410ae00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003160000000066410ae30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003170000000066410ae60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003180000000066410aea0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003190000000066410aed0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000031a0000000066410af00000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000031b0000000066410af30000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000031c0000000066410af60000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000031d0000000066410af90000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000031e0000000066410afc0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000031f0000000066410aff0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003200000000066410b020000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003210000000066410b050000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003220000000066410b080000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003230000000066410b0b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003240000000066410b0e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003250000000066410b110000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003260000000066410b140000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003270000000066410b170000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003280000000066410b1a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003290000000066410b1d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000032a0000000066410b200000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000032b0000000066410b230000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000032c0000000066410b260000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000032d0000000066410b290000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000032e0000000066410b2c0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000032f0000000066410b2f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003300000000066410b320000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003310000000066410b350000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003320000000066410b380000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003330000000066410b3b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003340000000066410b3e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003350000000066410b410000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003360000000066410b440000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003370000000066410b470000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003380000000066410b4a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003390000000066410b4d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000033a0000000066410b500000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000033b0000000066410b530000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000033c0000000066410b570000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000033d0000000066410b5a0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000033e0000000066410b5d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000033f0000000066410b600000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003400000000066410b630000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003410000000066410b660000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003420000000066410b690000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003430000000066410b6c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003440000000066410b6f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000003450000000066410b720000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003460000000066410b750000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003470000000066410b780000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003480000000066410b7b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003490000000066410b7e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000034a0000000066410b810000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000034b0000000066410b840000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000034c0000000066410b870000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000034d0000000066410b8a0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000034e0000000066410b8d0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000034f0000000066410b900000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003500000000066410b930000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003510000000066410b960000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003520000000066410b990000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003530000000066410b9c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003540000000066410b9f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003550000000066410ba20000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003560000000066410ba50000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003570000000066410ba80000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003580000000066410bab0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003590000000066410bae0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000035a0000000066410bb10000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000035b0000000066410bb40000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000035c0000000066410bb70000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000035d0000000066410bbb0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000035e0000000066410bbe0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000035f0000000066410bc10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003600000000066410bc40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003610000000066410bc70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003620000000066410bca0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003630000000066410bcd0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003640000000066410bd00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003650000000066410bd30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003660000000066410bd60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003670000000066410bd90000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003680000000066410bdc0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003690000000066410bdf0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000036a0000000066410be20000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000036b0000000066410be50000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000036c0000000066410be80000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000036d0000000066410beb0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000036e0000000066410bee0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000036f0000000066410bf10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003700000000066410bf40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003710000000066410bf70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003720000000066410bfa0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003730000000066410bfd0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003740000000066410c000000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003750000000066410c030000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003760000000066410c060000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003770000000066410c090000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003780000000066410c0c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003790000000066410c0f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000037a0000000066410c120000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000037b0000000066410c150000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000037c0000000066410c180000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000037d0000000066410c1b0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000037e0000000066410c1e0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000037f0000000066410c210000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003800000000066410c240000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003810000000066410c270000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003820000000066410c2a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003830000000066410c2d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003840000000066410c310000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003850000000066410c340000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003860000000066410c370000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003870000000066410c3a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003880000000066410c3d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003890000000066410c400000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000038a0000000066410c430000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000038b0000000066410c460000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000038c0000000066410c490000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000038d0000000066410c4c0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000038e0000000066410c4f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000038f0000000066410c520000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003900000000066410c550000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003910000000066410c580000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003920000000066410c5b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003930000000066410c5e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003940000000066410c610000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003950000000066410c640000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003960000000066410c670000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003970000000066410c6a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003980000000066410c6d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003990000000066410c700000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000039a0000000066410c730000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000039b0000000066410c760000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000039c0000000066410c790000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000039d0000000066410c7c0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000039e0000000066410c7f0000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000039f0000000066410c820000000000000000000000000000000000000000000000000000000008f0d180000000000098968000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000015555b00000000000003a00000000066410c850000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a10000000066410c880000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a20000000066410c8b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a30000000066410c8e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a40000000066410c910000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a50000000066410c940000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a60000000066410c970000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a70000000066410c9a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a80000000066410c9e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003a90000000066410ca10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003aa0000000066410ca40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ab0000000066410ca70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ac0000000066410caa0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ad0000000066410cad0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ae0000000066410cb00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003af0000000066410cb30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b00000000066410cb60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b10000000066410cb90000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b20000000066410cbc0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b30000000066410cbf0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b40000000066410cc20000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b50000000066410cc50000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b60000000066410cc80000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b70000000066410ccb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b80000000066410cce0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003b90000000066410cd10000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ba0000000066410cd40000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003bb0000000066410cd70000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003bc0000000066410cda0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003bd0000000066410cdd0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003be0000000066410ce00000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003bf0000000066410ce30000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c00000000066410ce60000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c10000000066410ce90000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c20000000066410cec0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c30000000066410cef0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c40000000066410cf20000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c50000000066410cf50000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c60000000066410cf80000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c70000000066410cfb0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c80000000066410cfe0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003c90000000066410d010000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ca0000000066410d040000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003cb0000000066410d070000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003cc0000000066410d0b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003cd0000000066410d0e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ce0000000066410d110000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003cf0000000066410d140000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d00000000066410d170000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d10000000066410d1a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d20000000066410d1d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d30000000066410d200000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d40000000066410d230000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d50000000066410d260000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d60000000066410d290000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d70000000066410d2c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d80000000066410d2f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003d90000000066410d320000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003da0000000066410d350000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003db0000000066410d380000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003dc0000000066410d3b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003dd0000000066410d3e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003de0000000066410d410000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003df0000000066410d440000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e00000000066410d470000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e10000000066410d4a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e20000000066410d4d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e30000000066410d500000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e40000000066410d530000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e50000000066410d560000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e60000000066410d590000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e70000000066410d5c0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e80000000066410d5f0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003e90000000066410d620000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ea0000000066410d650000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003eb0000000066410d680000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ec0000000066410d6b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ed0000000066410d6e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ee0000000066410d710000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003ef0000000066410d740000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f00000000066410d770000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f10000000066410d7b0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f20000000066410d7e0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f30000000066410d810000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f40000000066410d840000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f50000000066410d870000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f60000000066410d8a0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f70000000066410d8d0000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f80000000066410d900000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003f90000000066410d930000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000003fa0000000066410d960000000000000000000000000000000000000000000000000000000008f0d18000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x5", - "to": "0x475652655309fa7cb1397537bee9a7fbafdc11ca", - "transactionIndex": "0x0", - "value": "0x0", - "type": "0x3", - "accessList": [ - { - "address": "0x3d9a28f7692cb94740bb64f08cb5cd19aa5cd3dd", - "storageKeys": [] - } - ], - "chainId": "0x1b207", - "blobVersionedHashes": [ - "0x0138ec0ef36b96f09a9e0d1641acbccb7632ed91541049a3124b5fb0092aa5a9" - ], - "v": "0x0", - "r": "0x225ae50a31d44ef38e6e3bb4739718878d0a29dd591f7106ab5d17ff9761b5fc", - "s": "0x342bb7f264413342f17bfb62e97f080c4db525e723d89174567a6e35c8c02516", - "yParity": "0x0" -} diff --git a/trie/zk_trie_test.go b/trie/zk_trie_test.go index 6c23abc2764b..1aae33264db3 100644 --- a/trie/zk_trie_test.go +++ b/trie/zk_trie_test.go @@ -25,9 +25,8 @@ import ( "sync" "testing" - "github.com/stretchr/testify/assert" - zkt "github.com/scroll-tech/zktrie/types" + "github.com/stretchr/testify/assert" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/ethdb/leveldb"